diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-04-16 20:07:35 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-04-16 20:07:35 +0000 |
commit | d8b1bf47918aafdc515729624ad1ec2db4b91d14 (patch) | |
tree | 666046eec1e911ef6593a5fe6db6b3e938607a73 /src/backend/executor/nodeHash.c | |
parent | 85eee28ceca0814384392020c6c9a8269f213510 (diff) | |
download | postgresql-d8b1bf47918aafdc515729624ad1ec2db4b91d14.tar.gz postgresql-d8b1bf47918aafdc515729624ad1ec2db4b91d14.zip |
Create a new 'MultiExecProcNode' call API for plan nodes that don't
return just a single tuple at a time. Currently the only such node
type is Hash, but I expect we will soon have indexscans that can return
tuple bitmaps. A side benefit is that EXPLAIN ANALYZE now shows the
correct tuple count for a Hash node.
Diffstat (limited to 'src/backend/executor/nodeHash.c')
-rw-r--r-- | src/backend/executor/nodeHash.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 97e6738bd32..c304d930a28 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -8,13 +8,13 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.92 2005/03/31 02:02:52 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.93 2005/04/16 20:07:35 tgl Exp $ * *------------------------------------------------------------------------- */ /* * INTERFACE ROUTINES - * ExecHash - generate an in-memory hash table of the relation + * MultiExecHash - generate an in-memory hash table of the relation * ExecInitHash - initialize node and subnodes * ExecEndHash - shutdown node and subnodes */ @@ -22,6 +22,7 @@ #include "executor/execdebug.h" #include "executor/hashjoin.h" +#include "executor/instrument.h" #include "executor/nodeHash.h" #include "executor/nodeHashjoin.h" #include "miscadmin.h" @@ -36,13 +37,26 @@ static void ExecHashIncreaseNumBatches(HashJoinTable hashtable); /* ---------------------------------------------------------------- * ExecHash * - * build hash table for hashjoin, doing partitioning if more - * than one batch is required. + * stub for pro forma compliance * ---------------------------------------------------------------- */ TupleTableSlot * ExecHash(HashState *node) { + elog(ERROR, "Hash node does not support ExecProcNode call convention"); + return NULL; +} + +/* ---------------------------------------------------------------- + * MultiExecHash + * + * build hash table for hashjoin, doing partitioning if more + * than one batch is required. + * ---------------------------------------------------------------- + */ +Node * +MultiExecHash(HashState *node) +{ PlanState *outerNode; List *hashkeys; HashJoinTable hashtable; @@ -50,6 +64,10 @@ ExecHash(HashState *node) ExprContext *econtext; uint32 hashvalue; + /* must provide our own instrumentation support */ + if (node->ps.instrument) + InstrStartNode(node->ps.instrument); + /* * get state info from node */ @@ -70,14 +88,24 @@ ExecHash(HashState *node) slot = ExecProcNode(outerNode); if (TupIsNull(slot)) break; - hashtable->hashNonEmpty = true; + hashtable->totalTuples += 1; /* We have to compute the hash value */ econtext->ecxt_innertuple = slot; hashvalue = ExecHashGetHashValue(hashtable, econtext, hashkeys); ExecHashTableInsert(hashtable, ExecFetchSlotTuple(slot), hashvalue); } - /* We needn't return a tuple slot or anything else */ + /* must provide our own instrumentation support */ + if (node->ps.instrument) + InstrStopNodeMulti(node->ps.instrument, hashtable->totalTuples); + + /* + * We do not return the hash table directly because it's not a subtype + * of Node, and so would violate the MultiExecProcNode API. Instead, + * our parent Hashjoin node is expected to know how to fish it out + * of our node state. Ugly but not really worth cleaning up, since + * Hashjoin knows quite a bit more about Hash besides that. + */ return NULL; } @@ -220,7 +248,7 @@ ExecHashTableCreate(Hash *node, List *hashOperators) hashtable->nbatch_original = nbatch; hashtable->nbatch_outstart = nbatch; hashtable->growEnabled = true; - hashtable->hashNonEmpty = false; + hashtable->totalTuples = 0; hashtable->innerBatchFile = NULL; hashtable->outerBatchFile = NULL; hashtable->spaceUsed = 0; |