summaryrefslogtreecommitdiff
path: root/src/backend/optimizer
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r--src/backend/optimizer/plan/createplan.c38
-rw-r--r--src/backend/optimizer/plan/setrefs.c39
-rw-r--r--src/backend/optimizer/plan/subselect.c22
3 files changed, 46 insertions, 53 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index fdaed3d472e..4d3d926a167 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.224 2007/01/30 01:33:36 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.225 2007/02/19 02:23:12 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -96,9 +96,10 @@ static BitmapHeapScan *make_bitmap_heapscan(List *qptlist,
static TidScan *make_tidscan(List *qptlist, List *qpqual, Index scanrelid,
List *tidquals);
static FunctionScan *make_functionscan(List *qptlist, List *qpqual,
- Index scanrelid);
+ Index scanrelid, Node *funcexpr, List *funccolnames,
+ List *funccoltypes, List *funccoltypmods);
static ValuesScan *make_valuesscan(List *qptlist, List *qpqual,
- Index scanrelid);
+ Index scanrelid, List *values_lists);
static BitmapAnd *make_bitmap_and(List *bitmapplans);
static BitmapOr *make_bitmap_or(List *bitmapplans);
static NestLoop *make_nestloop(List *tlist,
@@ -1350,10 +1351,12 @@ create_functionscan_plan(PlannerInfo *root, Path *best_path,
{
FunctionScan *scan_plan;
Index scan_relid = best_path->parent->relid;
+ RangeTblEntry *rte;
/* it should be a function base rel... */
Assert(scan_relid > 0);
- Assert(best_path->parent->rtekind == RTE_FUNCTION);
+ rte = rt_fetch(scan_relid, root->parse->rtable);
+ Assert(rte->rtekind == RTE_FUNCTION);
/* Sort clauses into best execution order */
scan_clauses = order_qual_clauses(root, scan_clauses);
@@ -1361,7 +1364,11 @@ create_functionscan_plan(PlannerInfo *root, Path *best_path,
/* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
scan_clauses = extract_actual_clauses(scan_clauses, false);
- scan_plan = make_functionscan(tlist, scan_clauses, scan_relid);
+ scan_plan = make_functionscan(tlist, scan_clauses, scan_relid,
+ rte->funcexpr,
+ rte->eref->colnames,
+ rte->funccoltypes,
+ rte->funccoltypmods);
copy_path_costsize(&scan_plan->scan.plan, best_path);
@@ -1379,10 +1386,12 @@ create_valuesscan_plan(PlannerInfo *root, Path *best_path,
{
ValuesScan *scan_plan;
Index scan_relid = best_path->parent->relid;
+ RangeTblEntry *rte;
/* it should be a values base rel... */
Assert(scan_relid > 0);
- Assert(best_path->parent->rtekind == RTE_VALUES);
+ rte = rt_fetch(scan_relid, root->parse->rtable);
+ Assert(rte->rtekind == RTE_VALUES);
/* Sort clauses into best execution order */
scan_clauses = order_qual_clauses(root, scan_clauses);
@@ -1390,7 +1399,8 @@ create_valuesscan_plan(PlannerInfo *root, Path *best_path,
/* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
scan_clauses = extract_actual_clauses(scan_clauses, false);
- scan_plan = make_valuesscan(tlist, scan_clauses, scan_relid);
+ scan_plan = make_valuesscan(tlist, scan_clauses, scan_relid,
+ rte->values_lists);
copy_path_costsize(&scan_plan->scan.plan, best_path);
@@ -2342,7 +2352,11 @@ make_subqueryscan(List *qptlist,
static FunctionScan *
make_functionscan(List *qptlist,
List *qpqual,
- Index scanrelid)
+ Index scanrelid,
+ Node *funcexpr,
+ List *funccolnames,
+ List *funccoltypes,
+ List *funccoltypmods)
{
FunctionScan *node = makeNode(FunctionScan);
Plan *plan = &node->scan.plan;
@@ -2353,6 +2367,10 @@ make_functionscan(List *qptlist,
plan->lefttree = NULL;
plan->righttree = NULL;
node->scan.scanrelid = scanrelid;
+ node->funcexpr = funcexpr;
+ node->funccolnames = funccolnames;
+ node->funccoltypes = funccoltypes;
+ node->funccoltypmods = funccoltypmods;
return node;
}
@@ -2360,7 +2378,8 @@ make_functionscan(List *qptlist,
static ValuesScan *
make_valuesscan(List *qptlist,
List *qpqual,
- Index scanrelid)
+ Index scanrelid,
+ List *values_lists)
{
ValuesScan *node = makeNode(ValuesScan);
Plan *plan = &node->scan.plan;
@@ -2371,6 +2390,7 @@ make_valuesscan(List *qptlist,
plan->lefttree = NULL;
plan->righttree = NULL;
node->scan.scanrelid = scanrelid;
+ node->values_lists = values_lists;
return node;
}
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index bec0ddf7c4b..3d9f5486bcc 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.129 2007/02/16 03:49:04 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.130 2007/02/19 02:23:12 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -171,28 +171,15 @@ set_plan_references(Plan *plan, List *rtable)
/* Needs special treatment, see comments below */
return set_subqueryscan_references((SubqueryScan *) plan, rtable);
case T_FunctionScan:
- {
- RangeTblEntry *rte;
-
- fix_expr_references(plan, (Node *) plan->targetlist);
- fix_expr_references(plan, (Node *) plan->qual);
- rte = rt_fetch(((FunctionScan *) plan)->scan.scanrelid,
- rtable);
- Assert(rte->rtekind == RTE_FUNCTION);
- fix_expr_references(plan, rte->funcexpr);
- }
+ fix_expr_references(plan, (Node *) plan->targetlist);
+ fix_expr_references(plan, (Node *) plan->qual);
+ fix_expr_references(plan, ((FunctionScan *) plan)->funcexpr);
break;
case T_ValuesScan:
- {
- RangeTblEntry *rte;
-
- fix_expr_references(plan, (Node *) plan->targetlist);
- fix_expr_references(plan, (Node *) plan->qual);
- rte = rt_fetch(((ValuesScan *) plan)->scan.scanrelid,
- rtable);
- Assert(rte->rtekind == RTE_VALUES);
- fix_expr_references(plan, (Node *) rte->values_lists);
- }
+ fix_expr_references(plan, (Node *) plan->targetlist);
+ fix_expr_references(plan, (Node *) plan->qual);
+ fix_expr_references(plan,
+ (Node *) ((ValuesScan *) plan)->values_lists);
break;
case T_NestLoop:
set_join_references((Join *) plan);
@@ -369,10 +356,6 @@ set_subqueryscan_references(SubqueryScan *plan, List *rtable)
*lc;
sub_rtable = copyObject(rte->subquery->rtable);
- range_table_walker(sub_rtable,
- adjust_expr_varnos_walker,
- (void *) &rtoffset,
- QTW_IGNORE_RT_SUBQUERIES);
rtable = list_concat(rtable, sub_rtable);
/*
@@ -544,13 +527,15 @@ adjust_plan_varnos(Plan *plan, int rtoffset)
((FunctionScan *) plan)->scan.scanrelid += rtoffset;
adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
adjust_expr_varnos((Node *) plan->qual, rtoffset);
- /* rte was already fixed by set_subqueryscan_references */
+ adjust_expr_varnos(((FunctionScan *) plan)->funcexpr,
+ rtoffset);
break;
case T_ValuesScan:
((ValuesScan *) plan)->scan.scanrelid += rtoffset;
adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
adjust_expr_varnos((Node *) plan->qual, rtoffset);
- /* rte was already fixed by set_subqueryscan_references */
+ adjust_expr_varnos((Node *) ((ValuesScan *) plan)->values_lists,
+ rtoffset);
break;
case T_NestLoop:
adjust_expr_varnos((Node *) plan->targetlist, rtoffset);
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index e79991a0f60..af035d9b104 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
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.118 2007/02/06 02:59:11 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.119 2007/02/19 02:23:12 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1103,25 +1103,13 @@ finalize_plan(Plan *plan, List *rtable,
break;
case T_FunctionScan:
- {
- RangeTblEntry *rte;
-
- rte = rt_fetch(((FunctionScan *) plan)->scan.scanrelid,
- rtable);
- Assert(rte->rtekind == RTE_FUNCTION);
- finalize_primnode(rte->funcexpr, &context);
- }
+ finalize_primnode(((FunctionScan *) plan)->funcexpr,
+ &context);
break;
case T_ValuesScan:
- {
- RangeTblEntry *rte;
-
- rte = rt_fetch(((ValuesScan *) plan)->scan.scanrelid,
- rtable);
- Assert(rte->rtekind == RTE_VALUES);
- finalize_primnode((Node *) rte->values_lists, &context);
- }
+ finalize_primnode((Node *) ((ValuesScan *) plan)->values_lists,
+ &context);
break;
case T_Append: