1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-28 18:48:04 +03:00

Hashed LEFT JOIN would miss outer tuples with no inner match if the join

was large enough to be batched and the tuples fell into a batch where
there were no inner tuples at all.  Thanks to Xiaoyu Wang for finding a
test case that exposed this long-standing bug.
This commit is contained in:
Tom Lane
2004-09-17 18:29:10 +00:00
parent 9a22b6fb59
commit 50ff806700

View File

@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.57.2.1 2003/11/25 19:17:16 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.57.2.2 2004/09/17 18:29:10 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@@ -602,12 +602,14 @@ ExecHashJoinNewBatch(HashJoinState *hjstate)
} }
/* /*
* We can skip over any batches that are empty on either side. Release * Normally we can skip over any batches that are empty on either side
* associated temp files right away. * --- but for JOIN_LEFT, can only skip when left side is empty.
* Release associated temp files right away.
*/ */
while (newbatch <= nbatch && while (newbatch <= nbatch &&
(innerBatchSize[newbatch - 1] == 0L || (outerBatchSize[newbatch - 1] == 0L ||
outerBatchSize[newbatch - 1] == 0L)) (innerBatchSize[newbatch - 1] == 0L &&
hjstate->js.jointype != JOIN_LEFT)))
{ {
BufFileClose(hashtable->innerBatchFile[newbatch - 1]); BufFileClose(hashtable->innerBatchFile[newbatch - 1]);
hashtable->innerBatchFile[newbatch - 1] = NULL; hashtable->innerBatchFile[newbatch - 1] = NULL;