pgsql: Fix hash join when inner hashkey expressions contain Params.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix hash join when inner hashkey expressions contain Params.
Date: 2023-06-20 21:48:09
Message-ID: E1qBjCq-002nDq-N7@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix hash join when inner hashkey expressions contain Params.

If the inner-side expressions contain PARAM_EXEC Params, we must
re-hash whenever the values of those Params change. The executor
mechanism for that exists already, but we failed to invoke it because
finalize_plan() neglected to search the Hash.hashkeys field for
Params. This allowed a previous scan's hash table to be re-used
when it should not be, leading to rows missing from the join's output.
(I believe incorrectly-included join rows are impossible however,
since checking the real hashclauses would reject false matches.)

This bug is very ancient, dating probably to d24d75ff1 of 7.4.
Sadly, this simple fix depends on the plan representational changes
made by 2abd7ae9b, so it will only work back to v12. I thought
about trying to make some kind of hack for v11, but I'm leery
of putting code significantly different from what is used in the
newer branches into a nearly-EOL branch. Seeing that the bug
escaped detection for a full twenty years, problematic cases
must be rare; so I don't feel too awful about leaving v11 as-is.

Per bug #17985 from Zuming Jiang. Back-patch to v12.

Discussion: https://postgr.es/m/17985-748b66607acd432e@postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/45392626c95c6345d48c1b1b7541add0102ba59f

Modified Files
--------------
src/backend/optimizer/plan/subselect.c | 6 +++++-
src/test/regress/expected/join_hash.out | 36 +++++++++++++++++++++++++++++++++
src/test/regress/sql/join_hash.sql | 19 +++++++++++++++++
3 files changed, 60 insertions(+), 1 deletion(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Nathan Bossart 2023-06-20 22:15:42 pgsql: Move bool parameter for vacuum_rel() to option bits.
Previous Message Bruce Momjian 2023-06-20 20:26:25 pgsql: docs: adjust tag indenting and add MERGE mention