aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/regex/regprefix.c10
-rw-r--r--src/test/regress/expected/regex.out8
-rw-r--r--src/test/regress/sql/regex.sql1
3 files changed, 13 insertions, 6 deletions
diff --git a/src/backend/regex/regprefix.c b/src/backend/regex/regprefix.c
index e78faf39960..ce41620a0b4 100644
--- a/src/backend/regex/regprefix.c
+++ b/src/backend/regex/regprefix.c
@@ -162,14 +162,12 @@ findprefix(struct cnfa * cnfa,
thiscolor = COLORLESS;
for (ca = cnfa->states[st]; ca->co != COLORLESS; ca++)
{
- /* We ignore lookahead constraints */
- if (ca->co >= cnfa->ncolors)
- continue;
- /* We can also ignore BOS/BOL arcs */
+ /* We can ignore BOS/BOL arcs */
if (ca->co == cnfa->bos[0] || ca->co == cnfa->bos[1])
continue;
- /* ... but EOS/EOL arcs terminate the search */
- if (ca->co == cnfa->eos[0] || ca->co == cnfa->eos[1])
+ /* ... but EOS/EOL arcs terminate the search, as do LACONs */
+ if (ca->co == cnfa->eos[0] || ca->co == cnfa->eos[1] ||
+ ca->co >= cnfa->ncolors)
{
thiscolor = COLORLESS;
break;
diff --git a/src/test/regress/expected/regex.out b/src/test/regress/expected/regex.out
index 320f5e88c37..be151858a38 100644
--- a/src/test/regress/expected/regex.out
+++ b/src/test/regress/expected/regex.out
@@ -153,6 +153,14 @@ explain (costs off) select * from pg_proc where proname ~ '^(abc)?d';
Filter: (proname ~ '^(abc)?d'::text)
(2 rows)
+explain (costs off) select * from pg_proc where proname ~ '^abcd(x|(?=\w\w)q)';
+ QUERY PLAN
+------------------------------------------------------------------------
+ Index Scan using pg_proc_proname_args_nsp_index on pg_proc
+ Index Cond: ((proname >= 'abcd'::name) AND (proname < 'abce'::name))
+ Filter: (proname ~ '^abcd(x|(?=\w\w)q)'::text)
+(3 rows)
+
-- Test for infinite loop in pullback() (CVE-2007-4772)
select 'a' ~ '($|^)*';
?column?
diff --git a/src/test/regress/sql/regex.sql b/src/test/regress/sql/regex.sql
index 5412f6e1c58..c59fa35f24d 100644
--- a/src/test/regress/sql/regex.sql
+++ b/src/test/regress/sql/regex.sql
@@ -34,6 +34,7 @@ explain (costs off) select * from pg_proc where proname ~ '^abc+d';
explain (costs off) select * from pg_proc where proname ~ '^(abc)(def)';
explain (costs off) select * from pg_proc where proname ~ '^(abc)$';
explain (costs off) select * from pg_proc where proname ~ '^(abc)?d';
+explain (costs off) select * from pg_proc where proname ~ '^abcd(x|(?=\w\w)q)';
-- Test for infinite loop in pullback() (CVE-2007-4772)
select 'a' ~ '($|^)*';