diff -cpr head/src/backend/utils/adt/bool.c boolin_accepts_onoff/src/backend/utils/adt/bool.c *** head/src/backend/utils/adt/bool.c Mon Jan 5 00:22:25 2009 --- boolin_accepts_onoff/src/backend/utils/adt/bool.c Tue Feb 17 15:06:03 2009 *************** *** 20,25 **** --- 20,28 ---- #include "libpq/pqformat.h" #include "utils/builtins.h" + /* FIXME: Should include guc.h or move the prototype to another place? */ + extern bool parse_bool_with_len(const char *value, size_t len, bool *result); + /***************************************************************************** * USER I/O ROUTINES * *****************************************************************************/ *************** *** 27,34 **** /* * boolin - converts "t" or "f" to 1 or 0 * ! * Check explicitly for "true/false" and TRUE/FALSE, 1/0, YES/NO. ! * Reject other values. - thomas 1997-10-05 * * In the switch statement, check the most-used possibilities first. */ --- 30,37 ---- /* * boolin - converts "t" or "f" to 1 or 0 * ! * Check explicitly for "true/false" and TRUE/FALSE, 1/0, YES/NO, ON/OFF. ! * Reject other values. * * In the switch statement, check the most-used possibilities first. */ *************** boolin(PG_FUNCTION_ARGS) *** 38,43 **** --- 41,47 ---- const char *in_str = PG_GETARG_CSTRING(0); const char *str; size_t len; + bool result; /* * Skip leading and trailing whitespace *************** boolin(PG_FUNCTION_ARGS) *** 50,94 **** while (len > 0 && isspace((unsigned char) str[len - 1])) len--; ! switch (*str) ! { ! case 't': ! case 'T': ! if (pg_strncasecmp(str, "true", len) == 0) ! PG_RETURN_BOOL(true); ! break; ! ! case 'f': ! case 'F': ! if (pg_strncasecmp(str, "false", len) == 0) ! PG_RETURN_BOOL(false); ! break; ! ! case 'y': ! case 'Y': ! if (pg_strncasecmp(str, "yes", len) == 0) ! PG_RETURN_BOOL(true); ! break; ! ! case '1': ! if (pg_strncasecmp(str, "1", len) == 0) ! PG_RETURN_BOOL(true); ! break; ! ! case 'n': ! case 'N': ! if (pg_strncasecmp(str, "no", len) == 0) ! PG_RETURN_BOOL(false); ! break; ! ! case '0': ! if (pg_strncasecmp(str, "0", len) == 0) ! PG_RETURN_BOOL(false); ! break; ! ! default: ! break; ! } ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), --- 54,61 ---- while (len > 0 && isspace((unsigned char) str[len - 1])) len--; ! if (parse_bool_with_len(str, len, &result)) ! PG_RETURN_BOOL(result); ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), diff -cpr head/src/backend/utils/misc/guc.c boolin_accepts_onoff/src/backend/utils/misc/guc.c *** head/src/backend/utils/misc/guc.c Thu Jan 22 09:48:53 2009 --- boolin_accepts_onoff/src/backend/utils/misc/guc.c Tue Feb 17 15:06:03 2009 *************** ReportGUCOption(struct config_generic * *** 4096,4159 **** bool parse_bool(const char *value, bool *result) { ! size_t len = strlen(value); ! if (pg_strncasecmp(value, "true", len) == 0) ! { ! if (result) ! *result = true; ! } ! else if (pg_strncasecmp(value, "false", len) == 0) ! { ! if (result) ! *result = false; ! } ! else if (pg_strncasecmp(value, "yes", len) == 0) ! { ! if (result) ! *result = true; ! } ! else if (pg_strncasecmp(value, "no", len) == 0) ! { ! if (result) ! *result = false; ! } ! /* 'o' is not unique enough */ ! else if (pg_strncasecmp(value, "on", (len > 2 ? len : 2)) == 0) { ! if (result) ! *result = true; ! } ! else if (pg_strncasecmp(value, "off", (len > 2 ? len : 2)) == 0) ! { ! if (result) ! *result = false; ! } ! else if (pg_strcasecmp(value, "1") == 0) ! { ! if (result) ! *result = true; ! } ! else if (pg_strcasecmp(value, "0") == 0) ! { ! if (result) ! *result = false; } ! else ! { ! if (result) ! *result = false; /* suppress compiler warning */ ! return false; ! } ! return true; } - - /* * Try to parse value as an integer. The accepted formats are the * usual decimal, octal, or hexadecimal formats, optionally followed by --- 4096,4187 ---- bool parse_bool(const char *value, bool *result) { ! bool ok; ! bool r; ! ok = parse_bool_with_len(value, strlen(value), &r); ! if (result) ! *result = r; ! return ok; ! } ! bool ! parse_bool_with_len(const char *value, size_t len, bool *result) ! { ! AssertArg(value != NULL); ! AssertArg(result != NULL); ! switch (*value) { ! case 't': ! case 'T': ! if (pg_strncasecmp(value, "true", len) == 0) ! { ! *result = true; ! return true; ! } ! break; ! case 'f': ! case 'F': ! if (pg_strncasecmp(value, "false", len) == 0) ! { ! *result = false; ! return true; ! } ! break; ! case 'y': ! case 'Y': ! if (pg_strncasecmp(value, "yes", len) == 0) ! { ! *result = true; ! return true; ! } ! break; ! case 'n': ! case 'N': ! if (pg_strncasecmp(value, "no", len) == 0) ! { ! *result = false; ! return true; ! } ! break; ! case 'o': ! case 'O': ! /* 'o' is not unique enough */ ! if (pg_strncasecmp(value, "on", (len > 2 ? len : 2)) == 0) ! { ! *result = true; ! return true; ! } ! else if (pg_strncasecmp(value, "off", (len > 2 ? len : 2)) == 0) ! { ! *result = false; ! return true; ! } ! break; ! case '1': ! if (pg_strncasecmp(value, "1", len) == 0) ! { ! *result = true; ! return true; ! } ! break; ! case '0': ! if (pg_strncasecmp(value, "0", len) == 0) ! { ! *result = false; ! return true; ! } ! break; ! default: ! break; } ! *result = false; /* suppress compiler warning */ ! return false; } /* * Try to parse value as an integer. The accepted formats are the * usual decimal, octal, or hexadecimal formats, optionally followed by diff -cpr head/src/include/utils/guc.h boolin_accepts_onoff/src/include/utils/guc.h *** head/src/include/utils/guc.h Mon Jan 5 00:22:25 2009 --- boolin_accepts_onoff/src/include/utils/guc.h Tue Feb 17 15:06:03 2009 *************** extern void AtEOXact_GUC(bool isCommit, *** 258,263 **** --- 258,264 ---- extern void BeginReportingGUCOptions(void); extern void ParseLongOption(const char *string, char **name, char **value); extern bool parse_bool(const char *value, bool *result); + extern bool parse_bool_with_len(const char *value, size_t len, bool *result); extern bool parse_int(const char *value, int *result, int flags, const char **hintmsg); extern bool parse_real(const char *value, double *result);