• Tom Lane's avatar
    Avoid assuming that index-only scan data matches the index's rowtype. · 336c1d7a
    Tom Lane authored
    In general the data returned by an index-only scan should have the
    datatypes originally computed by FormIndexDatum.  If the index opclasses
    use "storage" datatypes different from their input datatypes, the scan
    tuple will not have the same rowtype attributed to the index; but we had
    a hard-wired assumption that that was true in nodeIndexonlyscan.c.  We'd
    already hacked around the issue for the one case where the types are
    different in btree indexes (btree name_ops), but this would definitely
    come back to bite us if we ever implement index-only scans in GiST.
    
    To fix, require the index AM to explicitly provide the tupdesc for the
    tuple it is returning.  btree can just pass back the index's tupdesc, but
    GiST will have to work harder when and if it supports index-only scans.
    
    I had previously proposed fixing this by allowing the index AM to fill the
    scan tuple slot directly; but on reflection that seemed like a module
    layering violation, since TupleTableSlots are creatures of the executor.
    At least in the btree case, it would also be less efficient, since the
    tuple deconstruction work would occur even for rows later found to be
    invisible to the scan's snapshot.
    336c1d7a
nbtree.c 31.7 KB