pgsql: Fix incorrect logic for hashed IN / NOT IN with non-strict opera - Mailing list pgsql-committers

From David Rowley
Subject pgsql: Fix incorrect logic for hashed IN / NOT IN with non-strict opera
Date
Msg-id E1wG5tC-002Qe8-0h@gemulon.postgresql.org
Whole thread
List pgsql-committers
Fix incorrect logic for hashed IN / NOT IN with non-strict operators

ExecEvalHashedScalarArrayOp(), when using a strict equality function,
performs a short-circuit when looking up NULL values.  When the function
is non-strict, the code incorrectly looked up the hash table for a
zero-valued Datum, which could have resulted in an accidental true
return if the hash table contained zero valued Datum, or could result
in a crash for non-byval types.

Here we fix this by adding an extra step when we build the hash table to
check what the result of a NULL lookup would be.  This requires looping
over the array and checking what the non-hashed version of the code
would do.  We cache the results of that in the expression so that we can
reuse the result any time we're asked to search for a NULL value.

It's important to note that non-strict equality functions are free to
treat any NULL value as equal to any non-NULL value.  For example,
someone may wish to design a type that treats an empty string and NULL
as equal.

All built-in types have strict equality functions, so this could affect
custom / user-defined types.

Author: Chengpeng Yan <chengpeng_yan@outlook.com>
Author: David Rowley <dgrowleyml@gmail.com>
Reviewed-by: ChangAo Chen <cca5507@qq.com>
Discussion: https://postgr.es/m/A16187AE-2359-4265-9F5E-71D015EC2B2D@outlook.com
Backpatch-through: 14

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/94219a73f79d49c0f3576af57fa8241fbf230395

Modified Files
--------------
src/backend/executor/execExprInterp.c     | 116 +++++++++++++----
src/include/executor/execExpr.h           |   4 +
src/test/regress/expected/expressions.out | 203 +++++++++++++++++++++++++-----
src/test/regress/sql/expressions.sql      | 114 +++++++++++++++--
4 files changed, 369 insertions(+), 68 deletions(-)


pgsql-committers by date:

Previous
From: Fujii Masao
Date:
Subject: pgsql: pg_test_timing: fix unit in backward-clock warning
Next
From: David Rowley
Date:
Subject: pgsql: Fix incorrect logic for hashed IN / NOT IN with non-strict opera