Refactor multirange_in()
authorAlexander Korotkov <akorotkov@postgresql.org>
Wed, 30 Dec 2020 18:11:31 +0000 (21:11 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Wed, 30 Dec 2020 18:17:34 +0000 (21:17 +0300)
This commit preserves the logic of multirange_in() but makes it more clear
what's going on.  Also, this commit fixes the compiler warning spotted by the
buildfarm.

Reported-by: Tom Lane
Discussion: https://postgr.es/m/2246043.1609290699%40sss.pgh.pa.us

src/backend/utils/adt/multirangetypes.c

index 2d4cee92bcced86f0828e04d2a86ddddf411856f..63867958cfd96eda30154847059fe8731b3e416f 100644 (file)
@@ -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: