]> granicus.if.org Git - postgresql/commitdiff
Minor code review for parse_phrase_operator().
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 26 Jun 2017 14:31:10 +0000 (10:31 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 26 Jun 2017 14:31:10 +0000 (10:31 -0400)
Fix its header comment, which described the old behavior of the <N>
phrase distance operator; we missed updating that in commit 028350f61.
Also, reset errno before strtol() call, to defend against the possibility
that it was already ERANGE at entry.  (The lack of complaints says that
it generally isn't, but this is at least a latent bug.)  Very minor
stylistic improvements as well.

Victor Drobny noted the obsolete comment, I noted the errno issue.
Back-patch to 9.6 where this code was added, just in case the errno
issue is a live bug in some cases.

Discussion: https://postgr.es/m/2b5382fdff9b1f79d5eb2c99c4d2cbe2@postgrespro.ru

src/backend/utils/adt/tsquery.c

index ee047bd8d57d4fcc2c644994fbfa595fb7d0b703..fdb041971e5228538b5edda16339abef378a9b77 100644 (file)
@@ -113,7 +113,7 @@ get_modifiers(char *buf, int16 *weight, bool *prefix)
  * Parse phrase operator. The operator
  * may take the following forms:
  *
- *             a <X> b (distance is no greater than X)
+ *             a <N> b (distance is exactly N lexemes)
  *             a <-> b (default distance = 1)
  *
  * The buffer should begin with '<' char
@@ -129,10 +129,9 @@ parse_phrase_operator(char *buf, int16 *distance)
                PHRASE_ERR,
                PHRASE_FINISH
        }                       state = PHRASE_OPEN;
-
        char       *ptr = buf;
        char       *endptr;
-       long            l = 1;
+       long            l = 1;                  /* default distance */
 
        while (*ptr)
        {
@@ -151,16 +150,17 @@ parse_phrase_operator(char *buf, int16 *distance)
                                        ptr++;
                                        break;
                                }
-                               else if (!t_isdigit(ptr))
+                               if (!t_isdigit(ptr))
                                {
                                        state = PHRASE_ERR;
                                        break;
                                }
 
+                               errno = 0;
                                l = strtol(ptr, &endptr, 10);
                                if (ptr == endptr)
                                        state = PHRASE_ERR;
-                               else if (errno == ERANGE || l > MAXENTRYPOS)
+                               else if (errno == ERANGE || l < 0 || l > MAXENTRYPOS)
                                        ereport(ERROR,
                                                        (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                         errmsg("distance in phrase operator should not be greater than %d",