diff --git a/src/backend/regex/regexec.c b/src/backend/regex/regexec.c index 3748a9c..0dba2d8 100644 --- a/src/backend/regex/regexec.c +++ b/src/backend/regex/regexec.c @@ -488,11 +488,8 @@ cfindloop(struct vars * v, return er; } if ((shorter) ? end == estop : end == begin) - { - /* no point in trying again */ - *coldp = cold; - return REG_NOMATCH; - } + break; /* Restart from begin + 1, so just break out */ + /* go around and try again */ if (shorter) estart = end + 1; diff --git a/src/test/regress/expected/regex.out b/src/test/regress/expected/regex.out index 757f2a4..9e3bc4e 100644 --- a/src/test/regress/expected/regex.out +++ b/src/test/regress/expected/regex.out @@ -173,3 +173,55 @@ select 'a' ~ '((((((a+|)+|)+|)+|)+|)+|)'; t (1 row) +-- Test backrefs with longer match +select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*\1','i'); + regexp_split_to_table +----------------------- + P + s + nux +(3 rows) + +-- Test backrefs with shorter match +select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*?\1','i'); + regexp_split_to_table +----------------------- + P + a + ers + nux +(4 rows) + +-- Test backrefs with shorter match in REGEXP_* functions +SELECT REGEXP_SPLIT_TO_TABLE('Programmer','(\w).*?\1'); + regexp_split_to_table +----------------------- + P + a + er +(3 rows) + +SELECT REGEXP_SPLIT_TO_ARRAY('Programmer','(\w).*?\1'); + regexp_split_to_array +----------------------- + {P,a,er} +(1 row) + +SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX'); + regexp_replace +---------------- + PXXammer +(1 row) + +SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX', 'g'); + regexp_replace +---------------- + PXXaXXer +(1 row) + +SELECT REGEXP_MATCHES('Programmer', '(\w).*?\1'); + regexp_matches +---------------- + {r} +(1 row) + diff --git a/src/test/regress/sql/regex.sql b/src/test/regress/sql/regex.sql index 1426562..fc01320 100644 --- a/src/test/regress/sql/regex.sql +++ b/src/test/regress/sql/regex.sql @@ -41,3 +41,14 @@ select 'a' ~ '($|^)*'; -- Test for infinite loop in fixempties() (Tcl bugs 3604074, 3606683) select 'a' ~ '((((((a)*)*)*)*)*)*'; select 'a' ~ '((((((a+|)+|)+|)+|)+|)+|)'; + +-- Test backrefs with longer match +select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*\1','i'); +-- Test backrefs with shorter match +select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*?\1','i'); +-- Test backrefs with shorter match in REGEXP_* functions +SELECT REGEXP_SPLIT_TO_TABLE('Programmer','(\w).*?\1'); +SELECT REGEXP_SPLIT_TO_ARRAY('Programmer','(\w).*?\1'); +SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX'); +SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX', 'g'); +SELECT REGEXP_MATCHES('Programmer', '(\w).*?\1');