• Tom Lane's avatar
    Fix code for re-finding scan position in a multicolumn GIN index. · 10564ee0
    Tom Lane authored
    collectMatchBitmap() needs to re-find the index tuple it was previously
    looking at, after transiently dropping lock on the index page it's on.
    The tuple should still exist and be at its prior position or somewhere
    to the right of that, since ginvacuum never removes tuples but
    concurrent insertions could add one.  However, there was a thinko in
    that logic, to the effect of expecting any inserted tuples to have the
    same index "attnum" as what we'd been scanning.  Since there's no
    physical separation of tuples with different attnums, it's not terribly
    hard to devise scenarios where this fails, leading to transient "lost
    saved point in index" errors.  (While I've duplicated this with manual
    testing, it seems impossible to make a reproducible test case with our
    available testing technology.)
    
    Fix by just continuing the scan when the attnum doesn't match.
    
    While here, improve the error message used if we do fail, so that it
    matches the wording used in btree for a similar case.
    
    collectMatchBitmap()'s posting-tree code path was previously not
    exercised at all by our regression tests.  While I can't make
    a regression test that exhibits the bug, I can at least improve
    the code coverage here, so do that.  The test case I made for this
    is an extension of one added by 4b754d6c, so it only works in
    HEAD and v13; didn't seem worth trying hard to back-patch it.
    
    Per bug #16595 from Jesse Kinkead.  This has been broken since
    multicolumn capability was added to GIN (commit 27cb66fd),
    so back-patch to all supported branches.
    
    Discussion: https://postgr.es/m/16595-633118be8eef9ce2@postgresql.org
    10564ee0
gin.sql 4.96 KB