diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2009-03-09 14:34:35 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2009-03-09 14:34:35 +0000 |
commit | 05a7db05826c5eb68173b6d7ef1553c19322ef48 (patch) | |
tree | 506fd6efe0071a52ff1fda06179a0abb613c7fbb /src/backend/utils/adt/bool.c | |
parent | fd497ab6506d3c4a751c22c03d31eeff1da90498 (diff) | |
download | postgresql-05a7db05826c5eb68173b6d7ef1553c19322ef48.tar.gz postgresql-05a7db05826c5eb68173b6d7ef1553c19322ef48.zip |
Accept 'on' and 'off' as input for boolean data type, unifying the syntax
that the data type and GUC accepts.
ITAGAKI Takahiro
Diffstat (limited to 'src/backend/utils/adt/bool.c')
-rw-r--r-- | src/backend/utils/adt/bool.c | 141 |
1 files changed, 99 insertions, 42 deletions
diff --git a/src/backend/utils/adt/bool.c b/src/backend/utils/adt/bool.c index 8584b3c2906..7d3f9e55a1c 100644 --- a/src/backend/utils/adt/bool.c +++ b/src/backend/utils/adt/bool.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/bool.c,v 1.45 2009/01/01 17:23:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/bool.c,v 1.46 2009/03/09 14:34:34 petere Exp $ * *------------------------------------------------------------------------- */ @@ -20,6 +20,99 @@ #include "libpq/pqformat.h" #include "utils/builtins.h" +/* + * Try to interpret value as boolean value. Valid values are: true, + * false, yes, no, on, off, 1, 0; as well as unique prefixes thereof. + * If the string parses okay, return true, else false. + * If okay and result is not NULL, return the value in *result. + */ +bool +parse_bool(const char *value, bool *result) +{ + return parse_bool_with_len(value, strlen(value), result); +} + +bool +parse_bool_with_len(const char *value, size_t len, bool *result) +{ + switch (*value) + { + case 't': + case 'T': + if (pg_strncasecmp(value, "true", len) == 0) + { + if (result) + *result = true; + return true; + } + break; + case 'f': + case 'F': + if (pg_strncasecmp(value, "false", len) == 0) + { + if (result) + *result = false; + return true; + } + break; + case 'y': + case 'Y': + if (pg_strncasecmp(value, "yes", len) == 0) + { + if (result) + *result = true; + return true; + } + break; + case 'n': + case 'N': + if (pg_strncasecmp(value, "no", len) == 0) + { + if (result) + *result = false; + return true; + } + break; + case 'o': + case 'O': + /* 'o' is not unique enough */ + if (pg_strncasecmp(value, "on", (len > 2 ? len : 2)) == 0) + { + if (result) + *result = true; + return true; + } + else if (pg_strncasecmp(value, "off", (len > 2 ? len : 2)) == 0) + { + if (result) + *result = false; + return true; + } + break; + case '1': + if (len == 1) + { + if (result) + *result = true; + return true; + } + break; + case '0': + if (len == 1) + { + if (result) + *result = false; + return true; + } + break; + default: + break; + } + + *result = false; /* suppress compiler warning */ + return false; +} + /***************************************************************************** * USER I/O ROUTINES * *****************************************************************************/ @@ -27,8 +120,8 @@ /* * 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 + * 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. */ @@ -38,6 +131,7 @@ boolin(PG_FUNCTION_ARGS) const char *in_str = PG_GETARG_CSTRING(0); const char *str; size_t len; + bool result; /* * Skip leading and trailing whitespace @@ -50,45 +144,8 @@ boolin(PG_FUNCTION_ARGS) 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; - } + if (parse_bool_with_len(str, len, &result)) + PG_RETURN_BOOL(result); ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), |