• Tom Lane's avatar
    Make construct_[md_]array return a valid empty array for zero-size input. · 716ea626
    Tom Lane authored
    If construct_array() or construct_md_array() were given a dimension of
    zero, they'd produce an array that contains no elements but has positive
    dimension.  This violates a general expectation that empty arrays should
    have ndims = 0; in particular, while arrays like this print as empty,
    they don't compare equal to other empty arrays.
    
    Up to now we've expected callers to avoid making such calls and instead
    be careful to call construct_empty_array() if there would be no elements.
    But this has always been an easily missed case, and we've repeatedly had to
    fix callers to do it right.  In bug #14826, Erwin Brandstetter pointed out
    yet another such oversight, in ts_lexize(); and a bit of examination of
    other call sites found at least two more with similar issues.  So let's
    fix the problem centrally and permanently by changing these two functions
    to construct a proper zero-D empty array whenever the array would be empty.
    
    This renders a few explicit calls of construct_empty_array() redundant,
    but the only such place I found that really seemed worth changing was in
    ExecEvalArrayExpr().
    
    Although this fixes some very old bugs, no back-patch: the problem is
    pretty minor and the risk of changing behavior seems to outweigh the
    benefit in stable branches.
    
    Discussion: https://postgr.es/m/20170923125723.1448.39412@wrigleys.postgresql.org
    Discussion: https://postgr.es/m/20570.1506198383@sss.pgh.pa.us
    716ea626
tsearch.sql 22.3 KB