summaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeUnique.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/nodeUnique.c')
-rw-r--r--src/backend/executor/nodeUnique.c237
1 files changed, 0 insertions, 237 deletions
diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c
deleted file mode 100644
index b71403de0b8..00000000000
--- a/src/backend/executor/nodeUnique.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * nodeUnique.c
- * Routines to handle unique'ing of queries where appropriate
- *
- * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v 1.34 2002/06/20 20:29:28 momjian Exp $
- *
- *-------------------------------------------------------------------------
- */
-/*
- * INTERFACE ROUTINES
- * ExecUnique - generate a unique'd temporary relation
- * ExecInitUnique - initialize node and subnodes..
- * ExecEndUnique - shutdown node and subnodes
- *
- * NOTES
- * Assumes tuples returned from subplan arrive in
- * sorted order.
- *
- */
-
-#include "postgres.h"
-
-#include "access/heapam.h"
-#include "executor/executor.h"
-#include "executor/nodeGroup.h"
-#include "executor/nodeUnique.h"
-
-/* ----------------------------------------------------------------
- * ExecUnique
- *
- * This is a very simple node which filters out duplicate
- * tuples from a stream of sorted tuples from a subplan.
- * ----------------------------------------------------------------
- */
-TupleTableSlot * /* return: a tuple or NULL */
-ExecUnique(Unique *node)
-{
- UniqueState *uniquestate;
- TupleTableSlot *resultTupleSlot;
- TupleTableSlot *slot;
- Plan *outerPlan;
- TupleDesc tupDesc;
-
- /*
- * get information from the node
- */
- uniquestate = node->uniquestate;
- outerPlan = outerPlan((Plan *) node);
- resultTupleSlot = uniquestate->cstate.cs_ResultTupleSlot;
- tupDesc = ExecGetResultType(&uniquestate->cstate);
-
- /*
- * now loop, returning only non-duplicate tuples. We assume that the
- * tuples arrive in sorted order so we can detect duplicates easily.
- */
- for (;;)
- {
- /*
- * fetch a tuple from the outer subplan
- */
- slot = ExecProcNode(outerPlan, (Plan *) node);
- if (TupIsNull(slot))
- return NULL;
-
- /*
- * Always return the first tuple from the subplan.
- */
- if (uniquestate->priorTuple == NULL)
- break;
-
- /*
- * Else test if the new tuple and the previously returned tuple
- * match. If so then we loop back and fetch another new tuple
- * from the subplan.
- */
- if (!execTuplesMatch(slot->val, uniquestate->priorTuple,
- tupDesc,
- node->numCols, node->uniqColIdx,
- uniquestate->eqfunctions,
- uniquestate->tempContext))
- break;
- }
-
- /*
- * We have a new tuple different from the previous saved tuple (if
- * any). Save it and return it. We must copy it because the source
- * subplan won't guarantee that this source tuple is still accessible
- * after fetching the next source tuple.
- *
- * Note that we manage the copy ourselves. We can't rely on the result
- * tuple slot to maintain the tuple reference because our caller may
- * replace the slot contents with a different tuple (see junk filter
- * handling in execMain.c). We assume that the caller will no longer
- * be interested in the current tuple after he next calls us.
- */
- if (uniquestate->priorTuple != NULL)
- heap_freetuple(uniquestate->priorTuple);
- uniquestate->priorTuple = heap_copytuple(slot->val);
-
- ExecStoreTuple(uniquestate->priorTuple,
- resultTupleSlot,
- InvalidBuffer,
- false); /* tuple does not belong to slot */
-
- return resultTupleSlot;
-}
-
-/* ----------------------------------------------------------------
- * ExecInitUnique
- *
- * This initializes the unique node state structures and
- * the node's subplan.
- * ----------------------------------------------------------------
- */
-bool /* return: initialization status */
-ExecInitUnique(Unique *node, EState *estate, Plan *parent)
-{
- UniqueState *uniquestate;
- Plan *outerPlan;
-
- /*
- * assign execution state to node
- */
- node->plan.state = estate;
-
- /*
- * create new UniqueState for node
- */
- uniquestate = makeNode(UniqueState);
- node->uniquestate = uniquestate;
- uniquestate->priorTuple = NULL;
-
- /*
- * Miscellaneous initialization
- *
- * Unique nodes have no ExprContext initialization because they never
- * call ExecQual or ExecProject. But they do need a per-tuple memory
- * context anyway for calling execTuplesMatch.
- */
- uniquestate->tempContext =
- AllocSetContextCreate(CurrentMemoryContext,
- "Unique",
- ALLOCSET_DEFAULT_MINSIZE,
- ALLOCSET_DEFAULT_INITSIZE,
- ALLOCSET_DEFAULT_MAXSIZE);
-
-#define UNIQUE_NSLOTS 1
-
- /*
- * Tuple table initialization
- */
- ExecInitResultTupleSlot(estate, &uniquestate->cstate);
-
- /*
- * then initialize outer plan
- */
- outerPlan = outerPlan((Plan *) node);
- ExecInitNode(outerPlan, estate, (Plan *) node);
-
- /*
- * unique nodes do no projections, so initialize projection info for
- * this node appropriately
- */
- ExecAssignResultTypeFromOuterPlan((Plan *) node, &uniquestate->cstate);
- uniquestate->cstate.cs_ProjInfo = NULL;
-
- /*
- * Precompute fmgr lookup data for inner loop
- */
- uniquestate->eqfunctions =
- execTuplesMatchPrepare(ExecGetResultType(&uniquestate->cstate),
- node->numCols,
- node->uniqColIdx);
-
- return TRUE;
-}
-
-int
-ExecCountSlotsUnique(Unique *node)
-{
- return ExecCountSlotsNode(outerPlan(node)) +
- ExecCountSlotsNode(innerPlan(node)) +
- UNIQUE_NSLOTS;
-}
-
-/* ----------------------------------------------------------------
- * ExecEndUnique
- *
- * This shuts down the subplan and frees resources allocated
- * to this node.
- * ----------------------------------------------------------------
- */
-void
-ExecEndUnique(Unique *node)
-{
- UniqueState *uniquestate = node->uniquestate;
-
- ExecEndNode(outerPlan((Plan *) node), (Plan *) node);
-
- MemoryContextDelete(uniquestate->tempContext);
-
- /* clean up tuple table */
- ExecClearTuple(uniquestate->cstate.cs_ResultTupleSlot);
- if (uniquestate->priorTuple != NULL)
- {
- heap_freetuple(uniquestate->priorTuple);
- uniquestate->priorTuple = NULL;
- }
-}
-
-
-void
-ExecReScanUnique(Unique *node, ExprContext *exprCtxt, Plan *parent)
-{
- UniqueState *uniquestate = node->uniquestate;
-
- ExecClearTuple(uniquestate->cstate.cs_ResultTupleSlot);
- if (uniquestate->priorTuple != NULL)
- {
- heap_freetuple(uniquestate->priorTuple);
- uniquestate->priorTuple = NULL;
- }
-
- /*
- * if chgParam of subnode is not null then plan will be re-scanned by
- * first ExecProcNode.
- */
- if (((Plan *) node)->lefttree->chgParam == NULL)
- ExecReScan(((Plan *) node)->lefttree, exprCtxt, (Plan *) node);
-
-}