• David Rowley's avatar
    Allow Memoize to operate in binary comparison mode · 6c32c097
    David Rowley authored
    Memoize would always use the hash equality operator for the cache key
    types to determine if the current set of parameters were the same as some
    previously cached set.  Certain types such as floating points where -0.0
    and +0.0 differ in their binary representation but are classed as equal by
    the hash equality operator may cause problems as unless the join uses the
    same operator it's possible that whichever join operator is being used
    would be able to distinguish the two values.  In which case we may
    accidentally return in the incorrect rows out of the cache.
    
    To fix this here we add a binary mode to Memoize to allow it to the
    current set of parameters to previously cached values by comparing
    bit-by-bit rather than logically using the hash equality operator.  This
    binary mode is always used for LATERAL joins and it's used for normal
    joins when any of the join operators are not hashable.
    
    Reported-by: Tom Lane
    Author: David Rowley
    Discussion: https://postgr.es/m/3004308.1632952496@sss.pgh.pa.us
    Backpatch-through: 14, where Memoize was added
    6c32c097
readfuncs.c 62.7 KB