pgsql: Fix incorrect pruning of NULL partition for boolean IS NOT claus

From: David Rowley <drowley(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix incorrect pruning of NULL partition for boolean IS NOT claus
Date: 2024-02-19 23:49:55
Message-ID: E1rcDOV-0075A8-W9@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix incorrect pruning of NULL partition for boolean IS NOT clauses

Partition pruning wrongly assumed that, for a table partitioned on a
boolean column, a clause in the form "boolcol IS NOT false" and "boolcol
IS NOT true" could be inverted to correspondingly become "boolcol IS true"
and "boolcol IS false". These are not equivalent as the NOT version
matches the opposite boolean value *and* NULLs. This incorrect assumption
meant that partition pruning pruned away partitions that could contain
NULL values.

Here we fix this by correctly not pruning partitions which could store
NULLs.

To be affected by this, the table must be partitioned by a NULLable boolean
column and queries would have to contain "boolcol IS NOT false" or "boolcol
IS NOT true". This could result in queries filtering out NULL values
with a LIST partitioned table and "ERROR: invalid strategy number 0"
for RANGE and HASH partitioned tables.

Reported-by: Alexander Lakhin
Bug: #18344
Discussion: https://postgr.es/m/18344-8d3f00bada6d09c6@postgresql.org
Backpatch-through: 12

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/4c2369ac5d0a108df4d65a2886657efa010d67ca

Modified Files
--------------
src/backend/partitioning/partprune.c | 56 +++++++++++++-
src/test/regress/expected/partition_prune.out | 103 ++++++++++++++++++++++++++
src/test/regress/sql/partition_prune.sql | 30 ++++++++
3 files changed, 187 insertions(+), 2 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message David Rowley 2024-02-19 23:50:25 pgsql: Fix incorrect pruning of NULL partition for boolean IS NOT claus
Previous Message Noah Misch 2024-02-19 20:57:02 pgsql: Bound waits in 035_standby_logical_decoding.pl.