• Tom Lane's avatar
    Fix performance bug in regexp's citerdissect/creviterdissect. · 57a2d4a1
    Tom Lane authored
    After detecting a sub-match "dissect" failure (i.e., a backref match
    failure) in the i'th sub-match of an iteration node, we should proceed
    by adjusting the attempted length of the i'th submatch.  As coded,
    though, these functions changed the attempted length of the *last*
    sub-match, and only after exhausting all possibilities for that would
    they back up to adjust the next-to-last sub-match, and then the
    second-from-last, etc; all of which is wasted effort, since only
    changing the start or length of the i'th sub-match can possibly make
    it succeed.  This oversight creates the possibility for exponentially
    bad performance.  Fortunately the problem is masked in most cases by
    optimizations or constraints applied elsewhere; which explains why
    we'd not noticed it before.  But it is possible to reach the problem
    with fairly simple, if contrived, regexps.
    
    Oversight in my commit 173e29aa.  That's pretty ancient now,
    so back-patch to all supported branches.
    
    Discussion: https://postgr.es/m/1808998.1629412269@sss.pgh.pa.us
    57a2d4a1
regexec.c 37 KB