mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Our interface code for Spencer's regexp package was checking for regexp
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.
This commit is contained in:
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/regexp.c,v 1.49.4.1 2004/02/03 17:56:04 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/regexp.c,v 1.49.4.2 2004/11/24 22:44:27 tgl Exp $
|
||||||
*
|
*
|
||||||
* Alistair Crooks added the code for the regex caching
|
* Alistair Crooks added the code for the regex caching
|
||||||
* agc - cached the regular expressions used - there's a good chance
|
* agc - cached the regular expressions used - there's a good chance
|
||||||
@ -106,6 +106,7 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
|
|||||||
int regcomp_result;
|
int regcomp_result;
|
||||||
int regexec_result;
|
int regexec_result;
|
||||||
cached_re_str re_temp;
|
cached_re_str re_temp;
|
||||||
|
char errMsg[100];
|
||||||
|
|
||||||
/* Convert data string to wide characters */
|
/* Convert data string to wide characters */
|
||||||
data = (pg_wchar *) palloc((dat_len + 1) * sizeof(pg_wchar));
|
data = (pg_wchar *) palloc((dat_len + 1) * sizeof(pg_wchar));
|
||||||
@ -143,7 +144,17 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
|
|||||||
|
|
||||||
pfree(data);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,11 +176,9 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
|
|||||||
|
|
||||||
pfree(pattern);
|
pfree(pattern);
|
||||||
|
|
||||||
if (regcomp_result != 0)
|
if (regcomp_result != REG_OKAY)
|
||||||
{
|
{
|
||||||
/* re didn't compile */
|
/* re didn't compile */
|
||||||
char errMsg[100];
|
|
||||||
|
|
||||||
pg_regerror(regcomp_result, &re_temp.cre_re, errMsg, sizeof(errMsg));
|
pg_regerror(regcomp_result, &re_temp.cre_re, errMsg, sizeof(errMsg));
|
||||||
/* XXX should we pg_regfree here? */
|
/* XXX should we pg_regfree here? */
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -221,7 +230,17 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len,
|
|||||||
|
|
||||||
pfree(data);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user