]> git.ipfire.org Git - thirdparty/postgresql.git/commit
Fix incorrect partition pruning logic for boolean partitioned tables
authorDavid Rowley <drowley@postgresql.org>
Fri, 14 Apr 2023 04:22:11 +0000 (16:22 +1200)
committerDavid Rowley <drowley@postgresql.org>
Fri, 14 Apr 2023 04:22:11 +0000 (16:22 +1200)
commit6848f0c67c60dc721c4e4527778f83e2c8c08d01
tree5e21c7a9b4ddcce2d1cb8de67d6bdf3336526900
parent96c698e3ff8b4bc4ba19dcaf0f7e6429ad4e8dfc
Fix incorrect partition pruning logic for boolean partitioned tables

The partition pruning logic assumed that "b IS NOT true" was exactly the
same as "b IS FALSE".  This is not the case when considering NULL values.
Fix this so we correctly include any partition which could hold NULL
values for the NOT case.

Additionally, this fixes a bug in the partition pruning code which handles
partitioned tables partitioned like ((NOT boolcol)).  This is a seemingly
unlikely schema design, and it was untested and also broken.

Here we add tests for the ((NOT boolcol)) case and insert some actual data
into those tables and verify we do get the correct rows back when running
queries.  I've also adjusted the existing boolpart tests to include some
data and verify we get the correct results too.

Both the bugs being fixed here could lead to incorrect query results with
fewer rows being returned than expected.  No additional rows could have
been returned accidentally.

In passing, remove needless ternary expression.  It's more simple just to
pass !is_not_clause to makeBoolConst().  It makes sense to do this so the
code is consistent with the bug fix in the "else if" condition just below.

David Kimura did submit a patch to fix the first of the issues here, but
that's not what's being committed here.

Reported-by: David Kimura
Reviewed-by: Richard Guo, David Kimura
Discussion: https://postgr.es/m/CAHnPFjQ5qxs6J_p+g8=ww7GQvfn71_JE+Tygj0S7RdRci1uwPw@mail.gmail.com
Backpatch-through: 11, all supported versions
src/backend/partitioning/partprune.c
src/test/regress/expected/partition_prune.out
src/test/regress/sql/partition_prune.sql