diff options
Diffstat (limited to 'src/backend/optimizer/util')
-rw-r--r-- | src/backend/optimizer/util/clauses.c | 9 | ||||
-rw-r--r-- | src/backend/optimizer/util/pathnode.c | 21 | ||||
-rw-r--r-- | src/backend/optimizer/util/plancat.c | 23 | ||||
-rw-r--r-- | src/backend/optimizer/util/relnode.c | 11 |
4 files changed, 55 insertions, 9 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index dfc43149d3a..5570b33f485 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.215 2006/07/27 19:52:05 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.216 2006/08/02 01:59:46 joe Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -3351,6 +3351,10 @@ range_table_walker(List *rtable, if (walker(rte->funcexpr, context)) return true; break; + case RTE_VALUES: + if (walker(rte->values_lists, context)) + return true; + break; } } return false; @@ -3917,6 +3921,9 @@ range_table_mutator(List *rtable, case RTE_FUNCTION: MUTATE(newrte->funcexpr, rte->funcexpr, Node *); break; + case RTE_VALUES: + MUTATE(newrte->values_lists, rte->values_lists, List *); + break; } newrt = lappend(newrt, newrte); } diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 631d6087d8e..2cc79ed239e 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.131 2006/07/22 15:41:55 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/pathnode.c,v 1.132 2006/08/02 01:59:46 joe Exp $ * *------------------------------------------------------------------------- */ @@ -1083,6 +1083,25 @@ create_functionscan_path(PlannerInfo *root, RelOptInfo *rel) } /* + * create_valuesscan_path + * Creates a path corresponding to a scan of a VALUES list, + * returning the pathnode. + */ +Path * +create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel) +{ + Path *pathnode = makeNode(Path); + + pathnode->pathtype = T_ValuesScan; + pathnode->parent = rel; + pathnode->pathkeys = NIL; /* result is always unordered */ + + cost_valuesscan(pathnode, root, rel); + + return pathnode; +} + +/* * create_nestloop_path * Creates a pathnode corresponding to a nestloop join between two * relations. diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index bafe1b66731..f74faa5c977 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.122 2006/07/31 20:09:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.123 2006/08/02 01:59:46 joe Exp $ * *------------------------------------------------------------------------- */ @@ -493,9 +493,9 @@ relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte) * For now, we don't apply the physical-tlist optimization when there are * dropped cols. * - * We also support building a "physical" tlist for subqueries and functions, - * since the same optimization can occur in SubqueryScan and FunctionScan - * nodes. + * We also support building a "physical" tlist for subqueries, functions, + * and values lists, since the same optimization can occur in SubqueryScan, + * FunctionScan, and ValuesScan nodes. */ List * build_physical_tlist(PlannerInfo *root, RelOptInfo *rel) @@ -594,6 +594,21 @@ build_physical_tlist(PlannerInfo *root, RelOptInfo *rel) } break; + case RTE_VALUES: + expandRTE(rte, varno, 0, false /* dropped not applicable */ , + NULL, &colvars); + foreach(l, colvars) + { + var = (Var *) lfirst(l); + + tlist = lappend(tlist, + makeTargetEntry((Expr *) var, + var->varattno, + NULL, + false)); + } + break; + default: /* caller error */ elog(ERROR, "unsupported RTE kind %d in build_physical_tlist", diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index 8d06254a9f4..545b125197c 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.80 2006/07/31 20:09:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/relnode.c,v 1.81 2006/08/02 01:59:46 joe Exp $ * *------------------------------------------------------------------------- */ @@ -96,8 +96,13 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptKind reloptkind) break; case RTE_SUBQUERY: case RTE_FUNCTION: - /* Subquery or function --- set up attr range and arrays */ - /* Note: 0 is included in range to support whole-row Vars */ + case RTE_VALUES: + /* + * Subquery, function, or values list --- set up attr range + * and arrays + * + * Note: 0 is included in range to support whole-row Vars + */ rel->min_attr = 0; rel->max_attr = list_length(rte->eref->colnames); rel->attr_needed = (Relids *) |