Commit a5713ec4 authored by Tom Lane's avatar Tom Lane

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.
parent 054b78ba
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.64 2004/08/29 05:06:42 momjian Exp $
* $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.65 2004/09/17 18:28:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -603,12 +603,14 @@ ExecHashJoinNewBatch(HashJoinState *hjstate)
}
/*
* We can skip over any batches that are empty on either side. Release
* associated temp files right away.
* Normally we can skip over any batches that are empty on either side
* --- but for JOIN_LEFT, can only skip when left side is empty.
* Release associated temp files right away.
*/
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]);
hashtable->innerBatchFile[newbatch - 1] = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment