mirror of
https://github.com/postgres/postgres.git
synced 2025-06-23 14:01:44 +03:00
Fix the general case of quantified regex back-references.
Cases where a back-reference is part of a larger subexpression that is quantified have never worked in Spencer's regex engine, because he used a compile-time transformation that neglected the need to check the back-reference match in iterations before the last one. (That was okay for capturing parens, and we still do it if the regex has *only* capturing parens ... but it's not okay for backrefs.) To make this work properly, we have to add an "iteration" node type to the regex engine's vocabulary of sub-regex nodes. Since this is a moderately large change with a fair risk of introducing new bugs of its own, apply to HEAD only, even though it's a fix for a longstanding bug.
This commit is contained in:
@ -11,3 +11,11 @@ select 'ccc' ~ '^([bc])\1*$' as t;
|
||||
select 'xxx' ~ '^([bc])\1*$' as f;
|
||||
select 'bbc' ~ '^([bc])\1*$' as f;
|
||||
select 'b' ~ '^([bc])\1*$' as t;
|
||||
|
||||
-- Test quantified backref within a larger expression
|
||||
select 'abc abc abc' ~ '^(\w+)( \1)+$' as t;
|
||||
select 'abc abd abc' ~ '^(\w+)( \1)+$' as f;
|
||||
select 'abc abc abd' ~ '^(\w+)( \1)+$' as f;
|
||||
select 'abc abc abc' ~ '^(.+)( \1)+$' as t;
|
||||
select 'abc abd abc' ~ '^(.+)( \1)+$' as f;
|
||||
select 'abc abc abd' ~ '^(.+)( \1)+$' as f;
|
||||
|
Reference in New Issue
Block a user