aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/multirangetypes.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c
index 2d4cee92bcc..63867958cfd 100644
--- a/src/backend/utils/adt/multirangetypes.c
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -128,9 +128,9 @@ multirange_in(PG_FUNCTION_ARGS)
MultirangeType *ret;
MultirangeParseState parse_state;
const char *ptr = input_str;
- const char *range_str = NULL;
+ const char *range_str_begin = NULL;
int32 range_str_len;
- char *range_str_copy;
+ char *range_str;
cache = get_multirange_io_data(fcinfo, mltrngtypoid, IOFunc_input);
rangetyp = cache->typcache->rngtype;
@@ -170,7 +170,7 @@ multirange_in(PG_FUNCTION_ARGS)
case MULTIRANGE_BEFORE_RANGE:
if (ch == '[' || ch == '(')
{
- range_str = ptr;
+ range_str_begin = ptr;
parse_state = MULTIRANGE_IN_RANGE;
}
else if (ch == '}' && ranges_seen == 0)
@@ -191,14 +191,10 @@ multirange_in(PG_FUNCTION_ARGS)
errdetail("Expected range start.")));
break;
case MULTIRANGE_IN_RANGE:
- if (ch == '"')
- parse_state = MULTIRANGE_IN_RANGE_QUOTED;
- else if (ch == '\\')
- parse_state = MULTIRANGE_IN_RANGE_ESCAPED;
- else if (ch == ']' || ch == ')')
+ if (ch == ']' || ch == ')')
{
- range_str_len = ptr - range_str + 1;
- range_str_copy = pnstrdup(range_str, range_str_len);
+ range_str_len = ptr - range_str_begin + 1;
+ range_str = pnstrdup(range_str_begin, range_str_len);
if (range_capacity == range_count)
{
range_capacity *= 2;
@@ -207,7 +203,7 @@ multirange_in(PG_FUNCTION_ARGS)
}
ranges_seen++;
range = DatumGetRangeTypeP(InputFunctionCall(&cache->typioproc,
- range_str_copy,
+ range_str,
cache->typioparam,
typmod));
if (!RangeIsEmpty(range))
@@ -215,10 +211,22 @@ multirange_in(PG_FUNCTION_ARGS)
parse_state = MULTIRANGE_AFTER_RANGE;
}
else
- /* include it in range_str */ ;
+ {
+ if (ch == '"')
+ parse_state = MULTIRANGE_IN_RANGE_QUOTED;
+ else if (ch == '\\')
+ parse_state = MULTIRANGE_IN_RANGE_ESCAPED;
+ /*
+ * We will include this character into range_str once we
+ * find the end of the range value.
+ */
+ }
break;
case MULTIRANGE_IN_RANGE_ESCAPED:
- /* include it in range_str */
+ /*
+ * We will include this character into range_str once we find
+ * the end of the range value.
+ */
parse_state = MULTIRANGE_IN_RANGE;
break;
case MULTIRANGE_IN_RANGE_QUOTED:
@@ -232,8 +240,11 @@ multirange_in(PG_FUNCTION_ARGS)
parse_state = MULTIRANGE_IN_RANGE;
else if (ch == '\\')
parse_state = MULTIRANGE_IN_RANGE_QUOTED_ESCAPED;
- else
- /* include it in range_str */ ;
+
+ /*
+ * We will include this character into range_str once we
+ * find the end of the range value.
+ */
break;
case MULTIRANGE_AFTER_RANGE:
if (ch == ',')
@@ -248,7 +259,10 @@ multirange_in(PG_FUNCTION_ARGS)
errdetail("Expected comma or end of multirange.")));
break;
case MULTIRANGE_IN_RANGE_QUOTED_ESCAPED:
- /* include it in range_str */
+ /*
+ * We will include this character into range_str once we find
+ * the end of the range value.
+ */
parse_state = MULTIRANGE_IN_RANGE_QUOTED;
break;
default: