]> granicus.if.org Git - postgresql/commit
Fix incorrect search for "x?" style matches in creviterdissect().
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Sep 2014 00:25:39 +0000 (20:25 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Sep 2014 00:25:39 +0000 (20:25 -0400)
commit3359a818c2dac930f68041c7230a8284e5584447
treec6e986bdc3b0a589cd6dfe0c53d2b07cc8d554b5
parent5ff8c2d7d60d0084f577a920c9d614221bde283a
Fix incorrect search for "x?" style matches in creviterdissect().

When the number of allowed iterations is limited (either a "?" quantifier
or a bound expression), the last sub-match has to reach to the end of the
target string.  The previous coding here first tried the shortest possible
match (one character, usually) and then gave up and back-tracked if that
didn't work, typically leading to failure to match overall, as shown in
bug #11478 from Christoph Berg.  The minimum change to fix that would be to
not decrement k before "goto backtrack"; but that would be a pretty stupid
solution, because we'd laboriously try each possible sub-match length
before finally discovering that only ending at the end can work.  Instead,
force the sub-match endpoint limit up to the end for even the first
shortest() call if we cannot have any more sub-matches after this one.

Bug introduced in my rewrite that added the iterdissect logic, commit
173e29aa5deefd9e71c183583ba37805c8102a72.  The shortest-first search code
was too closely modeled on the longest-first code, which hasn't got this
issue since it tries a match reaching to the end to start with anyway.
Back-patch to all affected branches.
src/backend/regex/regexec.c
src/test/regress/expected/regex.out
src/test/regress/sql/regex.sql