aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execAmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execAmi.c')
-rw-r--r--src/backend/executor/execAmi.c90
1 files changed, 72 insertions, 18 deletions
diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c
index 2349f32411e..759d17be4fd 100644
--- a/src/backend/executor/execAmi.c
+++ b/src/backend/executor/execAmi.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execAmi.c,v 1.16 1998/01/16 23:19:47 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execAmi.c,v 1.17 1998/02/13 03:26:36 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -37,6 +37,13 @@
#include "executor/nodeIndexscan.h"
#include "executor/nodeSort.h"
#include "executor/nodeTee.h"
+#include "executor/nodeMaterial.h"
+#include "executor/nodeNestloop.h"
+#include "executor/nodeHashjoin.h"
+#include "executor/nodeHash.h"
+#include "executor/nodeAgg.h"
+#include "executor/nodeResult.h"
+#include "executor/nodeSubplan.h"
#include "executor/execdebug.h"
#include "optimizer/internal.h" /* for _TEMP_RELATION_ID_ */
#include "access/genam.h"
@@ -287,35 +294,82 @@ ExecCloseR(Plan *node)
void
ExecReScan(Plan *node, ExprContext *exprCtxt, Plan *parent)
{
+
+ if ( node->chgParam != NULL ) /* Wow! */
+ {
+ List *lst;
+
+ foreach (lst, node->initPlan)
+ {
+ Plan *splan = ((SubPlan*) lfirst (lst))->plan;
+ if ( splan->extParam != NULL ) /* don't care about child locParam */
+ SetChangedParamList (splan, node->chgParam);
+ if ( splan->chgParam != NULL )
+ ExecReScanSetParamPlan ((SubPlan*) lfirst (lst), node);
+ }
+ foreach (lst, node->subPlan)
+ {
+ Plan *splan = ((SubPlan*) lfirst (lst))->plan;
+ if ( splan->extParam != NULL )
+ SetChangedParamList (splan, node->chgParam);
+ }
+ /* Well. Now set chgParam for left/right trees. */
+ if ( node->lefttree != NULL )
+ SetChangedParamList (node->lefttree, node->chgParam);
+ if ( node->righttree != NULL )
+ SetChangedParamList (node->righttree, node->chgParam);
+ }
+
switch (nodeTag(node))
{
- case T_SeqScan:
+ case T_SeqScan:
ExecSeqReScan((SeqScan *) node, exprCtxt, parent);
- return;
+ break;
case T_IndexScan:
ExecIndexReScan((IndexScan *) node, exprCtxt, parent);
- return;
+ break;
case T_Material:
+ ExecMaterialReScan((Material*) node, exprCtxt, parent);
+ break;
- /*
- * the first call to ExecReScan should have no effect because
- * everything is initialized properly already. the following
- * calls will be handled by ExecSeqReScan() because the nodes
- * below the Material node have already been materialized into
- * a temp relation.
- */
- return;
+ case T_NestLoop:
+ ExecReScanNestLoop((NestLoop*) node, exprCtxt, parent);
+ break;
+
+ case T_HashJoin:
+ ExecReScanHashJoin((HashJoin*) node, exprCtxt, parent);
+ break;
+
+ case T_Hash:
+ ExecReScanHash((Hash*) node, exprCtxt, parent);
+ break;
+
+ case T_Agg:
+ ExecReScanAgg((Agg*) node, exprCtxt, parent);
+ break;
+ case T_Result:
+ ExecReScanResult((Result*) node, exprCtxt, parent);
+ break;
+
+/*
+ * Tee is never used
case T_Tee:
ExecTeeReScan((Tee *) node, exprCtxt, parent);
break;
-
+ */
default:
- elog(ERROR, "ExecReScan: not a seqscan or indexscan node.");
+ elog(ERROR, "ExecReScan: node type %u not supported", nodeTag(node));
return;
}
+
+ if ( node->chgParam != NULL )
+ {
+ freeList (node->chgParam);
+ node->chgParam = NULL;
+ }
}
/* ----------------------------------------------------------------
@@ -352,7 +406,7 @@ ExecMarkPos(Plan *node)
{
switch (nodeTag(node))
{
- case T_SeqScan:
+ case T_SeqScan:
ExecSeqMarkPos((SeqScan *) node);
break;
@@ -365,7 +419,7 @@ ExecMarkPos(Plan *node)
break;
default:
- /* elog(DEBUG, "ExecMarkPos: unsupported node type"); */
+ elog(DEBUG, "ExecMarkPos: node type %u not supported", nodeTag(node));
break;
}
return;
@@ -382,7 +436,7 @@ ExecRestrPos(Plan *node)
{
switch (nodeTag(node))
{
- case T_SeqScan:
+ case T_SeqScan:
ExecSeqRestrPos((SeqScan *) node);
return;
@@ -395,7 +449,7 @@ ExecRestrPos(Plan *node)
return;
default:
- /* elog(DEBUG, "ExecRestrPos: node type not supported"); */
+ elog(DEBUG, "ExecRestrPos: node type %u not supported", nodeTag(node));
return;
}
}