diff options
Diffstat (limited to 'src/backend/optimizer/plan')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 56 | ||||
-rw-r--r-- | src/backend/optimizer/plan/planner.c | 27 | ||||
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 65 | ||||
-rw-r--r-- | src/backend/optimizer/plan/subselect.c | 27 |
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); |