• Tom Lane's avatar
    Fix incorrect search for "x?" style matches in creviterdissect(). · 3694b4d7
    Tom Lane authored
    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
    173e29aa.  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.
    3694b4d7
regexec.c 32.6 KB