• Tom Lane's avatar
    Prevent incorrect updates of pg_index while reindexing pg_index itself. · 4b6106cc
    Tom Lane authored
    The places that attempt to change pg_index.indcheckxmin during a reindexing
    operation cannot be executed safely if pg_index itself is the subject of
    the operation.  This is the explanation for a couple of recent reports of
    VACUUM FULL failing with
    	ERROR:  duplicate key value violates unique constraint "pg_index_indexrelid_index"
    	DETAIL:  Key (indexrelid)=(2678) already exists.
    
    However, there isn't any real need to update indcheckxmin in such a
    situation, if we assume that pg_index can never contain a truly broken HOT
    chain.  This assumption holds if new indexes are never created on it during
    concurrent operations, which is something we don't consider safe for any
    system catalog, not just pg_index.  Accordingly, modify the code to not
    manipulate indcheckxmin when reindexing any system catalog.
    
    Back-patch to 8.3, where HOT was introduced.  The known failure scenarios
    involve 9.0-style VACUUM FULL, so there might not be any real risk before
    9.0, but let's not assume that.
    4b6106cc
index.c 93.3 KB