• Tom Lane's avatar
    Fix erroneous hash calculations in gin_extract_jsonb_path(). · b23af458
    Tom Lane authored
    The jsonb_path_ops code calculated hash values inconsistently in some cases
    involving nested arrays and objects.  This would result in queries possibly
    not finding entries that they should find, when using a jsonb_path_ops GIN
    index for the search.  The problem cases involve JSONB values that contain
    both scalars and sub-objects at the same nesting level, for example an
    array containing both scalars and sub-arrays.  To fix, reset the current
    stack->hash after processing each value or sub-object, not before; and
    don't try to be cute about the outermost level's initial hash.
    
    Correcting this means that existing jsonb_path_ops indexes may now be
    inconsistent with the new hash calculation code.  The symptom is the same
    --- searches not finding entries they should find --- but the specific
    rows affected are likely to be different.  Users will need to REINDEX
    jsonb_path_ops indexes to make sure that all searches work as expected.
    
    Per bug #13756 from Daniel Cheng.  Back-patch to 9.4 where the faulty
    logic was introduced.
    b23af458
jsonb_gin.c 15.4 KB