aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan')
-rw-r--r--src/backend/optimizer/plan/createplan.c56
-rw-r--r--src/backend/optimizer/plan/planner.c27
-rw-r--r--src/backend/optimizer/plan/setrefs.c65
-rw-r--r--src/backend/optimizer/plan/subselect.c27
4 files changed, 86 insertions, 89 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index f4a76a9b3b4..41e2edceb26 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.177 2005/03/27 06:29:38 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.178 2005/04/06 16:34:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -259,7 +259,7 @@ static List *
build_relation_tlist(RelOptInfo *rel)
{
List *tlist = NIL;
- int resdomno = 1;
+ int resno = 1;
ListCell *v;
foreach(v, rel->reltargetlist)
@@ -267,8 +267,11 @@ build_relation_tlist(RelOptInfo *rel)
/* Do we really need to copy here? Not sure */
Var *var = (Var *) copyObject(lfirst(v));
- tlist = lappend(tlist, create_tl_element(var, resdomno));
- resdomno++;
+ tlist = lappend(tlist, makeTargetEntry((Expr *) var,
+ resno,
+ NULL,
+ false));
+ resno++;
}
return tlist;
}
@@ -557,20 +560,18 @@ create_unique_plan(Query *root, UniquePath *best_path)
Node *uniqexpr = lfirst(l);
TargetEntry *tle;
- tle = tlistentry_member(uniqexpr, newtlist);
+ tle = tlist_member(uniqexpr, newtlist);
if (!tle)
{
- tle = makeTargetEntry(makeResdom(nextresno,
- exprType(uniqexpr),
- exprTypmod(uniqexpr),
- NULL,
- false),
- (Expr *) uniqexpr);
+ tle = makeTargetEntry((Expr *) uniqexpr,
+ nextresno,
+ NULL,
+ false);
newtlist = lappend(newtlist, tle);
nextresno++;
newitems = true;
}
- groupColIdx[groupColPos++] = tle->resdom->resno;
+ groupColIdx[groupColPos++] = tle->resno;
}
if (newitems)
@@ -1844,7 +1845,7 @@ make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
{
List *keysublist = (List *) lfirst(i);
PathKeyItem *pathkey = NULL;
- Resdom *resdom = NULL;
+ TargetEntry *tle = NULL;
ListCell *j;
/*
@@ -1863,11 +1864,11 @@ make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
{
pathkey = (PathKeyItem *) lfirst(j);
Assert(IsA(pathkey, PathKeyItem));
- resdom = tlist_member(pathkey->key, tlist);
- if (resdom)
+ tle = tlist_member(pathkey->key, tlist);
+ if (tle)
break;
}
- if (!resdom)
+ if (!tle)
{
/* No matching Var; look for a computable expression */
foreach(j, keysublist)
@@ -1901,14 +1902,11 @@ make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
/*
* Add resjunk entry to input's tlist
*/
- resdom = makeResdom(list_length(tlist) + 1,
- exprType(pathkey->key),
- exprTypmod(pathkey->key),
- NULL,
- true);
- tlist = lappend(tlist,
- makeTargetEntry(resdom,
- (Expr *) pathkey->key));
+ tle = makeTargetEntry((Expr *) pathkey->key,
+ list_length(tlist) + 1,
+ NULL,
+ true);
+ tlist = lappend(tlist, tle);
lefttree->targetlist = tlist; /* just in case NIL before */
}
@@ -1918,7 +1916,7 @@ make_sort_from_pathkeys(Query *root, Plan *lefttree, List *pathkeys)
* scenarios where multiple mergejoinable clauses mention the same
* var, for example.) So enter it only once in the sort arrays.
*/
- numsortkeys = add_sort_column(resdom->resno, pathkey->sortop,
+ numsortkeys = add_sort_column(tle->resno, pathkey->sortop,
numsortkeys, sortColIdx, sortOperators);
}
@@ -1964,7 +1962,7 @@ make_sort_from_sortclauses(Query *root, List *sortcls, Plan *lefttree)
* parser should have removed 'em, but no point in sorting
* redundantly.
*/
- numsortkeys = add_sort_column(tle->resdom->resno, sortcl->sortop,
+ numsortkeys = add_sort_column(tle->resno, sortcl->sortop,
numsortkeys, sortColIdx, sortOperators);
}
@@ -2020,7 +2018,7 @@ make_sort_from_groupcols(Query *root,
* parser should have removed 'em, but no point in sorting
* redundantly.
*/
- numsortkeys = add_sort_column(tle->resdom->resno, grpcl->sortop,
+ numsortkeys = add_sort_column(tle->resno, grpcl->sortop,
numsortkeys, sortColIdx, sortOperators);
grpno++;
}
@@ -2253,7 +2251,7 @@ make_unique(Plan *lefttree, List *distinctList)
SortClause *sortcl = (SortClause *) lfirst(slitem);
TargetEntry *tle = get_sortgroupclause_tle(sortcl, plan->targetlist);
- uniqColIdx[keyno++] = tle->resdom->resno;
+ uniqColIdx[keyno++] = tle->resno;
}
node->numCols = numCols;
@@ -2311,7 +2309,7 @@ make_setop(SetOpCmd cmd, Plan *lefttree,
SortClause *sortcl = (SortClause *) lfirst(slitem);
TargetEntry *tle = get_sortgroupclause_tle(sortcl, plan->targetlist);
- dupColIdx[keyno++] = tle->resdom->resno;
+ dupColIdx[keyno++] = tle->resno;
}
node->cmd = cmd;
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 5f3c7510cdd..9f898997f00 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.181 2005/03/28 00:58:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.182 2005/04/06 16:34:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1349,7 +1349,7 @@ hash_safe_grouping(Query *parse)
Operator optup;
bool oprcanhash;
- optup = equality_oper(tle->resdom->restype, true);
+ optup = equality_oper(exprType((Node *) tle->expr), true);
if (!optup)
return false;
oprcanhash = ((Form_pg_operator) GETSTRUCT(optup))->oprcanhash;
@@ -1467,18 +1467,16 @@ make_subplanTargetList(Query *parse,
}
if (!sl)
{
- te = makeTargetEntry(makeResdom(list_length(sub_tlist) + 1,
- exprType(groupexpr),
- exprTypmod(groupexpr),
- NULL,
- false),
- (Expr *) groupexpr);
+ te = makeTargetEntry((Expr *) groupexpr,
+ list_length(sub_tlist) + 1,
+ NULL,
+ false);
sub_tlist = lappend(sub_tlist, te);
*need_tlist_eval = true; /* it's not flat anymore */
}
/* and save its resno */
- grpColIdx[keyno++] = te->resdom->resno;
+ grpColIdx[keyno++] = te->resno;
}
}
@@ -1528,7 +1526,7 @@ locate_grouping_columns(Query *parse,
if (!sl)
elog(ERROR, "failed to locate grouping columns");
- groupColIdx[keyno++] = te->resdom->resno;
+ groupColIdx[keyno++] = te->resno;
}
}
@@ -1554,17 +1552,16 @@ postprocess_setop_tlist(List *new_tlist, List *orig_tlist)
TargetEntry *orig_tle;
/* ignore resjunk columns in setop result */
- if (new_tle->resdom->resjunk)
+ if (new_tle->resjunk)
continue;
Assert(orig_tlist_item != NULL);
orig_tle = (TargetEntry *) lfirst(orig_tlist_item);
orig_tlist_item = lnext(orig_tlist_item);
- if (orig_tle->resdom->resjunk) /* should not happen */
+ if (orig_tle->resjunk) /* should not happen */
elog(ERROR, "resjunk output columns are not implemented");
- Assert(new_tle->resdom->resno == orig_tle->resdom->resno);
- Assert(new_tle->resdom->restype == orig_tle->resdom->restype);
- new_tle->resdom->ressortgroupref = orig_tle->resdom->ressortgroupref;
+ Assert(new_tle->resno == orig_tle->resno);
+ new_tle->ressortgroupref = orig_tle->ressortgroupref;
}
if (orig_tlist_item != NULL)
elog(ERROR, "resjunk output columns are not implemented");
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index df3fbbe3aeb..075c6a339df 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.105 2004/12/31 22:00:09 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.106 2005/04/06 16:34:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -20,6 +20,7 @@
#include "optimizer/planmain.h"
#include "optimizer/tlist.h"
#include "optimizer/var.h"
+#include "parser/parse_expr.h"
#include "parser/parsetree.h"
#include "utils/lsyscache.h"
@@ -462,9 +463,9 @@ set_uppernode_references(Plan *plan, Index subvarno)
subvarno,
subplan_targetlist,
tlist_has_non_vars);
- output_targetlist = lappend(output_targetlist,
- makeTargetEntry(tle->resdom,
- (Expr *) newexpr));
+ tle = flatCopyTargetEntry(tle);
+ tle->expr = (Expr *) newexpr;
+ output_targetlist = lappend(output_targetlist, tle);
}
plan->targetlist = output_targetlist;
@@ -550,25 +551,25 @@ join_references_mutator(Node *node,
if (IsA(node, Var))
{
Var *var = (Var *) node;
- Resdom *resdom;
+ TargetEntry *tle;
/* First look for the var in the input tlists */
- resdom = tlist_member((Node *) var, context->outer_tlist);
- if (resdom)
+ tle = tlist_member((Node *) var, context->outer_tlist);
+ if (tle)
{
Var *newvar = (Var *) copyObject(var);
newvar->varno = OUTER;
- newvar->varattno = resdom->resno;
+ newvar->varattno = tle->resno;
return (Node *) newvar;
}
- resdom = tlist_member((Node *) var, context->inner_tlist);
- if (resdom)
+ tle = tlist_member((Node *) var, context->inner_tlist);
+ if (tle)
{
Var *newvar = (Var *) copyObject(var);
newvar->varno = INNER;
- newvar->varattno = resdom->resno;
+ newvar->varattno = tle->resno;
return (Node *) newvar;
}
@@ -582,33 +583,33 @@ join_references_mutator(Node *node,
/* Try matching more complex expressions too, if tlists have any */
if (context->tlists_have_non_vars)
{
- Resdom *resdom;
+ TargetEntry *tle;
- resdom = tlist_member(node, context->outer_tlist);
- if (resdom)
+ tle = tlist_member(node, context->outer_tlist);
+ if (tle)
{
/* Found a matching subplan output expression */
Var *newvar;
newvar = makeVar(OUTER,
- resdom->resno,
- resdom->restype,
- resdom->restypmod,
+ tle->resno,
+ exprType((Node *) tle->expr),
+ exprTypmod((Node *) tle->expr),
0);
newvar->varnoold = 0; /* wasn't ever a plain Var */
newvar->varoattno = 0;
return (Node *) newvar;
}
- resdom = tlist_member(node, context->inner_tlist);
- if (resdom)
+ tle = tlist_member(node, context->inner_tlist);
+ if (tle)
{
/* Found a matching subplan output expression */
Var *newvar;
newvar = makeVar(INNER,
- resdom->resno,
- resdom->restype,
- resdom->restypmod,
+ tle->resno,
+ exprType((Node *) tle->expr),
+ exprTypmod((Node *) tle->expr),
0);
newvar->varnoold = 0; /* wasn't ever a plain Var */
newvar->varoattno = 0;
@@ -668,32 +669,32 @@ replace_vars_with_subplan_refs_mutator(Node *node,
if (IsA(node, Var))
{
Var *var = (Var *) node;
- Resdom *resdom;
+ TargetEntry *tle;
Var *newvar;
- resdom = tlist_member((Node *) var, context->subplan_targetlist);
- if (!resdom)
+ tle = tlist_member((Node *) var, context->subplan_targetlist);
+ if (!tle)
elog(ERROR, "variable not found in subplan target list");
newvar = (Var *) copyObject(var);
newvar->varno = context->subvarno;
- newvar->varattno = resdom->resno;
+ newvar->varattno = tle->resno;
return (Node *) newvar;
}
/* Try matching more complex expressions too, if tlist has any */
if (context->tlist_has_non_vars)
{
- Resdom *resdom;
+ TargetEntry *tle;
- resdom = tlist_member(node, context->subplan_targetlist);
- if (resdom)
+ tle = tlist_member(node, context->subplan_targetlist);
+ if (tle)
{
/* Found a matching subplan output expression */
Var *newvar;
newvar = makeVar(context->subvarno,
- resdom->resno,
- resdom->restype,
- resdom->restypmod,
+ tle->resno,
+ exprType((Node *) tle->expr),
+ exprTypmod((Node *) tle->expr),
0);
newvar->varnoold = 0; /* wasn't ever a plain Var */
newvar->varoattno = 0;
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index f89f8a8af7e..c92fb315316 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.94 2004/12/31 22:00:09 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.95 2005/04/06 16:34:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -350,8 +350,9 @@ make_subplan(SubLink *slink, List *lefthand, bool isTopQual)
TargetEntry *te = linitial(plan->targetlist);
Param *prm;
- Assert(!te->resdom->resjunk);
- prm = generate_new_param(te->resdom->restype, te->resdom->restypmod);
+ Assert(!te->resjunk);
+ prm = generate_new_param(exprType((Node *) te->expr),
+ exprTypmod((Node *) te->expr));
node->setParam = list_make1_int(prm->paramid);
PlannerInitPlan = lappend(PlannerInitPlan, node);
result = (Node *) prm;
@@ -362,11 +363,11 @@ make_subplan(SubLink *slink, List *lefthand, bool isTopQual)
Oid arraytype;
Param *prm;
- Assert(!te->resdom->resjunk);
- arraytype = get_array_type(te->resdom->restype);
+ Assert(!te->resjunk);
+ arraytype = get_array_type(exprType((Node *) te->expr));
if (!OidIsValid(arraytype))
elog(ERROR, "could not find array type for datatype %s",
- format_type_be(te->resdom->restype));
+ format_type_be(exprType((Node *) te->expr)));
prm = generate_new_param(arraytype, -1);
node->setParam = list_make1_int(prm->paramid);
PlannerInitPlan = lappend(PlannerInitPlan, node);
@@ -525,15 +526,15 @@ convert_sublink_opers(List *lefthand, List *operOids,
Node *rightop;
Operator tup;
- Assert(!te->resdom->resjunk);
+ Assert(!te->resjunk);
if (rtindex)
{
/* Make the Var node representing the subplan's result */
rightop = (Node *) makeVar(rtindex,
- te->resdom->resno,
- te->resdom->restype,
- te->resdom->restypmod,
+ te->resno,
+ exprType((Node *) te->expr),
+ exprTypmod((Node *) te->expr),
0);
/*
@@ -547,8 +548,8 @@ convert_sublink_opers(List *lefthand, List *operOids,
/* Make the Param node representing the subplan's result */
Param *prm;
- prm = generate_new_param(te->resdom->restype,
- te->resdom->restypmod);
+ prm = generate_new_param(exprType((Node *) te->expr),
+ exprTypmod((Node *) te->expr));
/* Record its ID */
*righthandIds = lappend_int(*righthandIds, prm->paramid);
rightop = (Node *) prm;
@@ -575,7 +576,7 @@ convert_sublink_opers(List *lefthand, List *operOids,
leftop,
rightop,
exprType(leftop),
- te->resdom->restype));
+ exprType((Node *) te->expr)));
ReleaseSysCache(tup);