]> granicus.if.org Git - postgresql/commit
Fix enforcement of restrictions inside regexp lookaround constraints.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 7 Nov 2015 17:43:24 +0000 (12:43 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 7 Nov 2015 17:43:24 +0000 (12:43 -0500)
commit8db652359c1739d4fc216d7f780c149671ed83c5
treec2ac56af02b2542048050034717d5b9e734c75bc
parent909a83df561246538e97c582521243025b78c161
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.
src/backend/regex/regcomp.c
src/test/regress/expected/regex.out
src/test/regress/sql/regex.sql