pgsql: Make construct_[md_]array return a valid empty array for zero-si

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Make construct_[md_]array return a valid empty array for zero-si
Date: 2017-09-25 15:55:30
Message-ID: E1dwVjG-0001MA-M8@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Make construct_[md_]array return a valid empty array for zero-size input.

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

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/716ea626a88ac510523ab3af5bc779d78eeced58

Modified Files
--------------
src/backend/executor/execExprInterp.c | 8 --------
src/backend/utils/adt/arrayfuncs.c | 10 ++++++----
src/test/regress/expected/tsearch.out | 11 +++++++++++
src/test/regress/sql/tsearch.sql | 4 ++++
4 files changed, 21 insertions(+), 12 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Eisentraut 2017-09-25 18:51:44 Re: pgsql: Give a better error for duplicate entries in VACUUM/ANALYZE colu
Previous Message Andrew Dunstan 2017-09-25 12:09:54 pgsql: Support building with Visual Studio 2017