• Tom Lane's avatar
    Fix subtly-incorrect matching of parent and child partitioned indexes. · 3bfea5cb
    Tom Lane authored
    When creating a partitioned index, DefineIndex tries to identify
    any existing indexes on the partitions that match the partitioned
    index, so that it can absorb those as child indexes instead of
    building new ones.  Part of the matching is to compare IndexInfo
    structs --- but that wasn't done quite right.  We're comparing
    the IndexInfo built within DefineIndex itself to one made from
    existing catalog contents by BuildIndexInfo.  Notably, while
    BuildIndexInfo will run index expressions and predicates through
    expression preprocessing, that has not happened to DefineIndex's
    struct.  The result is failure to match and subsequent creation
    of duplicate indexes.
    
    The easiest and most bulletproof fix is to build a new IndexInfo
    using BuildIndexInfo, thereby guaranteeing that the processing done
    is identical.
    
    While here, let's also extract the opfamily and collation data
    from the new partitioned index, removing ad-hoc logic that
    duplicated knowledge about how those are constructed.
    
    Per report from Christophe Pettus.  Back-patch to v11 where
    we invented partitioned indexes.
    
    Richard Guo and Tom Lane
    
    Discussion: https://postgr.es/m/8864BFAA-81FD-4BF9-8E06-7DEB8D4164ED@thebuild.com
    3bfea5cb
indexcmds.c 133 KB