mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08:00
Fix enforcement of restrictions inside regexp lookaround constraints.
Lookahead and lookbehind constraints aren't allowed to contain backrefs, and parentheses within them are always considered non-capturing. Or so says the manual. But the regexp parser forgot about these rules once inside a parenthesized subexpression, so that constructs like (\w)(?=(\1)) were accepted (but then not correctly executed --- a case like this acted like (\w)(?=\w), without any enforcement that the two \w's match the same text). And in (?=((foo))) the innermost parentheses would be counted as capturing parentheses, though no text would ever be captured for them. To fix, properly pass down the "type" argument to the recursive invocation of parse(). Back-patch to all supported branches; it was agreed that silent misexecution of such patterns is worse than throwing an error, even though new errors in minor releases are generally not desirable.
This commit is contained in:
parent
8d7396e509
commit
a43b4ab111
@ -951,7 +951,7 @@ parseqatom(struct vars * v,
|
||||
EMPTYARC(lp, s);
|
||||
EMPTYARC(s2, rp);
|
||||
NOERR();
|
||||
atom = parse(v, ')', PLAIN, s, s2);
|
||||
atom = parse(v, ')', type, s, s2);
|
||||
assert(SEE(')') || ISERR());
|
||||
NEXT();
|
||||
NOERR();
|
||||
|
@ -490,3 +490,8 @@ select 'a' ~ '()+\1';
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- Error conditions
|
||||
select 'xyz' ~ 'x(\w)(?=\1)'; -- no backrefs in LACONs
|
||||
ERROR: invalid regular expression: invalid backreference number
|
||||
select 'xyz' ~ 'x(\w)(?=(\1))';
|
||||
ERROR: invalid regular expression: invalid backreference number
|
||||
|
@ -117,3 +117,7 @@ select 'a' ~ '$()|^\1';
|
||||
select 'a' ~ '.. ()|\1';
|
||||
select 'a' ~ '()*\1';
|
||||
select 'a' ~ '()+\1';
|
||||
|
||||
-- Error conditions
|
||||
select 'xyz' ~ 'x(\w)(?=\1)'; -- no backrefs in LACONs
|
||||
select 'xyz' ~ 'x(\w)(?=(\1))';
|
||||
|
Loading…
Reference in New Issue
Block a user