Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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: