• Michael Paquier's avatar
    Refactor attribute mappings used in logical tuple conversion · e1551f96
    Michael Paquier authored
    Tuple conversion support in tupconvert.c is able to convert rowtypes
    between two relations, inner and outer, which are logically equivalent
    but have a different ordering or even dropped columns (used mainly for
    inheritance tree and partitions).  This makes use of attribute mappings,
    which are simple arrays made of AttrNumber elements with a length
    matching the number of attributes of the outer relation.  The length of
    the attribute mapping has been treated as completely independent of the
    mapping itself until now, making it easy to pass down an incorrect
    mapping length.
    
    This commit refactors the code related to attribute mappings and moves
    it into an independent facility called attmap.c, extracted from
    tupconvert.c.  This merges the attribute mapping with its length,
    avoiding to try to guess what is the length of a mapping to use as this
    is computed once, when the map is built.
    
    This will avoid mistakes like what has been fixed in dc816e58, which has
    used an incorrect mapping length by matching it with the number of
    attributes of an inner relation (a child partition) instead of an outer
    relation (a partitioned table).
    
    Author: Michael Paquier
    Reviewed-by: Amit Langote
    Discussion: https://postgr.es/m/20191121042556.GD153437@paquier.xyz
    e1551f96
relation.c 12.2 KB