]> granicus.if.org Git - postgresql/commit
Fix cross-type case in partial row matching for hashed subplans.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 11 Oct 2012 16:21:02 +0000 (12:21 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 11 Oct 2012 16:21:02 +0000 (12:21 -0400)
commita963c8b85f8f109509d6b1815e42ef6c09e8aa28
tree04cedae554f8b1b570364245bf5d51cd0382e654
parent812d6db94327476f5b6ccd6b68ea1b315cd7f020
Fix cross-type case in partial row matching for hashed subplans.

When hashing a subplan like "WHERE (a, b) NOT IN (SELECT x, y FROM ...)",
findPartialMatch() attempted to match rows using the hashtable's internal
equality operators, which of course are for x and y's datatypes.  What we
need to use are the potentially cross-type operators for a=x, b=y, etc.
Failure to do that leads to wrong answers or even crashes.  The scope for
problems is limited to cases where we have different types with compatible
hash functions (else we'd not be using a hashed subplan), but for example
int4 vs int8 can cause the problem.

Per bug #7597 from Bo Jensen.  This has been wrong since the hashed-subplan
code was written, so patch all the way back.
src/backend/executor/nodeSubplan.c
src/test/regress/expected/subselect.out
src/test/regress/sql/subselect.sql