aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/subselect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/subselect.c')
-rw-r--r--src/backend/optimizer/plan/subselect.c58
1 files changed, 36 insertions, 22 deletions
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index 57930e9a502..556fe07b5cd 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.52 2002/05/12 20:10:03 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.53 2002/05/18 18:49:41 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -21,6 +21,7 @@
#include "optimizer/planmain.h"
#include "optimizer/planner.h"
#include "optimizer/subselect.h"
+#include "parser/parsetree.h"
#include "parser/parse_expr.h"
#include "parser/parse_oper.h"
#include "utils/syscache.h"
@@ -586,7 +587,7 @@ process_sublinks_mutator(Node *node, void *context)
}
List *
-SS_finalize_plan(Plan *plan)
+SS_finalize_plan(Plan *plan, List *rtable)
{
List *extParam = NIL;
List *locParam = NIL;
@@ -619,10 +620,20 @@ SS_finalize_plan(Plan *plan)
&results);
break;
- case T_Append:
- foreach(lst, ((Append *) plan)->appendplans)
- results.paramids = set_unioni(results.paramids,
- SS_finalize_plan((Plan *) lfirst(lst)));
+ case T_IndexScan:
+ finalize_primnode((Node *) ((IndexScan *) plan)->indxqual,
+ &results);
+
+ /*
+ * we need not look at indxqualorig, since it will have the
+ * same param references as indxqual, and we aren't really
+ * concerned yet about having a complete subplan list.
+ */
+ break;
+
+ case T_TidScan:
+ finalize_primnode((Node *) ((TidScan *) plan)->tideval,
+ &results);
break;
case T_SubqueryScan:
@@ -638,15 +649,22 @@ SS_finalize_plan(Plan *plan)
((SubqueryScan *) plan)->subplan->extParam);
break;
- case T_IndexScan:
- finalize_primnode((Node *) ((IndexScan *) plan)->indxqual,
- &results);
+ case T_FunctionScan:
+ {
+ RangeTblEntry *rte;
- /*
- * we need not look at indxqualorig, since it will have the
- * same param references as indxqual, and we aren't really
- * concerned yet about having a complete subplan list.
- */
+ rte = rt_fetch(((FunctionScan *) plan)->scan.scanrelid,
+ rtable);
+ Assert(rte->rtekind == RTE_FUNCTION);
+ finalize_primnode(rte->funcexpr, &results);
+ }
+ break;
+
+ case T_Append:
+ foreach(lst, ((Append *) plan)->appendplans)
+ results.paramids = set_unioni(results.paramids,
+ SS_finalize_plan((Plan *) lfirst(lst),
+ rtable));
break;
case T_NestLoop:
@@ -673,11 +691,6 @@ SS_finalize_plan(Plan *plan)
&results);
break;
- case T_TidScan:
- finalize_primnode((Node *) ((TidScan *) plan)->tideval,
- &results);
- break;
-
case T_Agg:
case T_SeqScan:
case T_Material:
@@ -686,7 +699,6 @@ SS_finalize_plan(Plan *plan)
case T_SetOp:
case T_Limit:
case T_Group:
- case T_FunctionScan:
break;
default:
@@ -696,9 +708,11 @@ SS_finalize_plan(Plan *plan)
/* Process left and right subplans, if any */
results.paramids = set_unioni(results.paramids,
- SS_finalize_plan(plan->lefttree));
+ SS_finalize_plan(plan->lefttree,
+ rtable));
results.paramids = set_unioni(results.paramids,
- SS_finalize_plan(plan->righttree));
+ SS_finalize_plan(plan->righttree,
+ rtable));
/* Now we have all the paramids and subplans */