pgsql: Don't use partial unique indexes for unique proofs in the planne

From: David Rowley <drowley(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Don't use partial unique indexes for unique proofs in the planne
Date: 2023-06-19 01:03:35
Message-ID: E1qB3It-002TOz-9X@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Don't use partial unique indexes for unique proofs in the planner

Here we adjust relation_has_unique_index_for() so that it no longer makes
use of partial unique indexes as uniqueness proofs. It is incorrect to
use these as the predicates used by check_index_predicates() to set
predOK makes use of not only baserestrictinfo quals as proofs, but also
qual from join conditions. For relation_has_unique_index_for()'s case, we
need to know the relation is unique for a given set of columns before any
joins are evaluated, so if predOK was only set to true due to some join
qual, then it's unsafe to use such indexes in
relation_has_unique_index_for(). The final plan may not even make use
of that index, which could result in reading tuples that are not as
unique as the planner previously expected them to be.

Bug: #17975
Reported-by: Tor Erik Linnerud
Backpatch-through: 11, all supported versions
Discussion: https://postgr.es/m/17975-98a90c156f25c952%40postgresql.org

Branch
------
REL_11_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/f6345f03f358887877942b266d6992ed8be60153

Modified Files
--------------
src/backend/optimizer/path/indxpath.c | 9 ++++++---
src/backend/optimizer/plan/analyzejoins.c | 9 ++++-----
src/test/regress/expected/join.out | 17 +++++++++++++++++
src/test/regress/sql/join.sql | 9 +++++++++
4 files changed, 36 insertions(+), 8 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Andres Freund 2023-06-19 17:27:06 Re: could not extend file "base/5/3501" with FileFallocate(): Interrupted system call
Previous Message David Rowley 2023-06-19 01:03:07 pgsql: Don't use partial unique indexes for unique proofs in the planne