diff options
Diffstat (limited to 'src/backend/optimizer')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 38 | ||||
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 39 | ||||
-rw-r--r-- | src/backend/optimizer/plan/subselect.c | 22 |
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: |