]> granicus.if.org Git - postgresql/commitdiff
Our interface code for Spencer's regexp package was checking for regexp
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Nov 2004 22:44:07 +0000 (22:44 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Nov 2004 22:44:07 +0000 (22:44 +0000)
error conditions during regexp compile, but not during regexp execution;
any sort of "can't happen" errors would be treated as no-match instead
of being reported as they should be.  Noticed while trying to duplicate
a reported Tcl bug.

src/backend/utils/adt/regexp.c

index ff3ed832c61548ce6cf57883c79751426b58710e..09fedb99a9cf42885f775c31725562e4f495e426 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/regexp.c,v 1.54 2004/08/29 04:12:52 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/regexp.c,v 1.55 2004/11/24 22:44:07 tgl Exp $
  *
  *             Alistair Crooks added the code for the regex caching
  *             agc - cached the regular expressions used - there's a good chance
@@ -107,6 +107,7 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
        int                     regcomp_result;
        int                     regexec_result;
        cached_re_str re_temp;
+       char            errMsg[100];
 
        /* Convert data string to wide characters */
        data = (pg_wchar *) palloc((dat_len + 1) * sizeof(pg_wchar));
@@ -144,7 +145,17 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
 
                        pfree(data);
 
-                       return (regexec_result == 0);
+                       if (regexec_result != REG_OKAY && regexec_result != REG_NOMATCH)
+                       {
+                               /* re failed??? */
+                               pg_regerror(regexec_result, &re_array[0].cre_re,
+                                                       errMsg, sizeof(errMsg));
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
+                                                errmsg("regular expression failed: %s", errMsg)));
+                       }
+
+                       return (regexec_result == REG_OKAY);
                }
        }
 
@@ -166,11 +177,9 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
 
        pfree(pattern);
 
-       if (regcomp_result != 0)
+       if (regcomp_result != REG_OKAY)
        {
                /* re didn't compile */
-               char            errMsg[100];
-
                pg_regerror(regcomp_result, &re_temp.cre_re, errMsg, sizeof(errMsg));
                /* XXX should we pg_regfree here? */
                ereport(ERROR,
@@ -222,7 +231,17 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
 
        pfree(data);
 
-       return (regexec_result == 0);
+       if (regexec_result != REG_OKAY && regexec_result != REG_NOMATCH)
+       {
+               /* re failed??? */
+               pg_regerror(regexec_result, &re_array[0].cre_re,
+                                       errMsg, sizeof(errMsg));
+               ereport(ERROR,
+                               (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
+                                errmsg("regular expression failed: %s", errMsg)));
+       }
+
+       return (regexec_result == REG_OKAY);
 }