diff --git a/src/backend/commands/defind.c b/src/backend/commands/defind.c index 66f5cb420588f778be1f01ba65b10ed41b6d8d83..9be89e1871adf768dc351ca34231b92636085516 100644 --- a/src/backend/commands/defind.c +++ b/src/backend/commands/defind.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.17 1997/09/18 20:20:20 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.18 1997/12/22 05:41:49 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -385,9 +385,7 @@ CheckPredExpr(Node *predicate, List *rangeTable, Oid baseRelOid) CheckPredClause((Expr *) predicate, rangeTable, baseRelOid); return; } - else if (or_clause(predicate)) - clauses = ((Expr *) predicate)->args; - else if (and_clause(predicate)) + else if (or_clause(predicate) || and_clause(predicate)) clauses = ((Expr *) predicate)->args; else elog(WARN, "Unsupported partial-index predicate expression type"); diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index accc7b1fb7c07db54fee0ffe9f328b8b61371b11..5b6b180cb96f5d34fa5e6354710f110de603edce 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -534,6 +534,19 @@ ExecInitAgg(Agg *node, EState *estate, Plan *parent) outerPlan = outerPlan(node); ExecInitNode(outerPlan, estate, (Plan *) node); + /* + * Result runs in its own context, but make it use our aggregates + * fix for 'select sum(2+2)' + */ + if (nodeTag(outerPlan) == T_Result) + { + ((Result *)outerPlan)->resstate->cstate.cs_ProjInfo->pi_exprContext->ecxt_values = + econtext->ecxt_values; + ((Result *)outerPlan)->resstate->cstate.cs_ProjInfo->pi_exprContext->ecxt_nulls = + econtext->ecxt_nulls; + } + + /* ---------------- * initialize tuple type. * ---------------- diff --git a/src/backend/optimizer/path/xfunc.c b/src/backend/optimizer/path/xfunc.c index c0213df36aceb333e09426891e3a114a1c9adeab..08f0b13cec8ffb295be6d2219adab99b2b8fe891 100644 --- a/src/backend/optimizer/path/xfunc.c +++ b/src/backend/optimizer/path/xfunc.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/xfunc.c,v 1.8 1997/12/11 17:36:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/xfunc.c,v 1.9 1997/12/22 05:41:59 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -451,7 +451,7 @@ xfunc_local_expense(LispValue clause) (LispValue) get_funcargs(clause))); else if (fast_not_clause(clause)) return (xfunc_local_expense(lsecond(clause))); - else if (fast_or_clause(clause)) + else if (fast_or_clause(clause) || fast_and_clause(clause)) { /* find cost of evaluating each disjunct */ for (tmpclause = lnext(clause); tmpclause != LispNil; @@ -845,7 +845,7 @@ xfunc_find_references(LispValue clause) } else if (fast_not_clause(clause)) return (xfunc_find_references(lsecond(clause))); - else if (fast_or_clause(clause)) + else if (fast_or_clause(clause) || fast_and_clause(clause)) { /* string together result of all operands of OR */ for (tmpclause = lnext(clause); tmpclause != LispNil; @@ -1186,7 +1186,7 @@ xfunc_fixvars(LispValue clause, /* clause being pulled up */ xfunc_fixvars(lfirst(tmpclause), rel, varno); else if (fast_not_clause(clause)) xfunc_fixvars(lsecond(clause), rel, varno); - else if (fast_or_clause(clause)) + else if (fast_or_clause(clause) || fast_and_clause(clause)) for (tmpclause = lnext(clause); tmpclause != LispNil; tmpclause = lnext(tmpclause)) xfunc_fixvars(lfirst(tmpclause), rel, varno); diff --git a/src/backend/optimizer/plan/planmain.c b/src/backend/optimizer/plan/planmain.c index d26e3eb8b49962126ba55f913c60a1b0f4f37bc4..8691215b46602fbbff3336a06c3da62f4313db27 100644 --- a/src/backend/optimizer/plan/planmain.c +++ b/src/backend/optimizer/plan/planmain.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.12 1997/12/20 07:59:25 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.13 1997/12/22 05:42:04 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -69,7 +69,7 @@ query_planner(Query *root, List *qual) { List *constant_qual = NIL; - List *flattened_tlist = NIL; + List *var_only_tlist = NIL; List *level_tlist = NIL; Plan *subplan = (Plan *) NULL; @@ -109,16 +109,12 @@ query_planner(Query *root, * Create a target list that consists solely of (resdom var) target * list entries, i.e., contains no arbitrary expressions. */ - flattened_tlist = flatten_tlist(tlist); - if (flattened_tlist) - { - level_tlist = flattened_tlist; - } + var_only_tlist = flatten_tlist(tlist); + if (var_only_tlist) + level_tlist = var_only_tlist; else - { /* from old code. the logic is beyond me. - ay 2/95 */ level_tlist = tlist; - } /* * A query may have a non-variable target list and a non-variable @@ -126,7 +122,7 @@ query_planner(Query *root, * all-new tuples, or - the query is a replace (a scan must still be * done in this case). */ - if (flattened_tlist == NULL && qual == NULL) + if (var_only_tlist == NULL && qual == NULL) { switch (command_type) @@ -192,11 +188,30 @@ query_planner(Query *root, return (plan); } + /* + * fix up the flattened target list of the plan root node so that + * expressions are evaluated. this forces expression evaluations that + * may involve expensive function calls to be delayed to the very last + * stage of query execution. this could be bad. but it is joey's + * responsibility to optimally push these expressions down the plan + * tree. -- Wei + * + * But now nothing to do if there are GroupBy and/or Aggregates: 1. + * make_groupPlan fixes tlist; 2. flatten_tlist_vars does nothing with + * aggregates fixing only other entries (i.e. - GroupBy-ed and so + * fixed by make_groupPlan). - vadim 04/05/97 + */ + if (root->groupClause == NULL && root->qry_aggs == NULL) + { + subplan->targetlist = flatten_tlist_vars(tlist, + subplan->targetlist); + } + +#ifdef NOT_USED /* * Destructively modify the query plan's targetlist to add fjoin lists * to flatten functions that return sets of base types */ -#ifdef NOT_USED subplan->targetlist = generate_fjoin(subplan->targetlist); #endif diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 381c609493b278b29362f3b1c245a5fbafb38b16..ddfc42891738bc5e42ec71db08f0cad8c55d3133 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.14 1997/12/20 07:59:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.15 1997/12/22 05:42:08 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -74,7 +74,6 @@ planner(Query *parse) List *rangetable = parse->rtable; char *uniqueflag = parse->uniqueFlag; List *sortclause = parse->sortClause; - Agg *aggplan = NULL; Plan *result_plan = (Plan *) NULL; @@ -141,7 +140,7 @@ planner(Query *parse) */ if (parse->qry_aggs) { - aggplan = make_agg(tlist, + result_plan = (Plan *)make_agg(tlist, parse->qry_numAgg, parse->qry_aggs, result_plan); @@ -153,29 +152,8 @@ planner(Query *parse) * pointers, after a few dozen's of copying, they're not the same * as those in the target list.) */ - set_agg_tlist_references(aggplan); - set_agg_agglist_references(aggplan); - - result_plan = (Plan *) aggplan; - } - - /* - * fix up the flattened target list of the plan root node so that - * expressions are evaluated. this forces expression evaluations that - * may involve expensive function calls to be delayed to the very last - * stage of query execution. this could be bad. but it is joey's - * responsibility to optimally push these expressions down the plan - * tree. -- Wei - * - * But now nothing to do if there are GroupBy and/or Aggregates: 1. - * make_groupPlan fixes tlist; 2. flatten_tlist_vars does nothing with - * aggregates fixing only other entries (i.e. - GroupBy-ed and so - * fixed by make_groupPlan). - vadim 04/05/97 - */ - if (parse->groupClause == NULL && aggplan == NULL) - { - result_plan->targetlist = flatten_tlist_vars(tlist, - result_plan->targetlist); + set_agg_tlist_references((Agg *)result_plan); + set_agg_agglist_references((Agg *)result_plan); } /* diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 1d0f0963c5ac26cd47109bc841f2b806980aeaa6..7c8371a79c4adf25c09e3530ec128093930335da 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.9 1997/12/20 07:59:28 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.10 1997/12/22 05:42:10 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -329,6 +329,15 @@ replace_clause_joinvar_refs(Expr *clause, { return ((List *) clause); } + else if (and_clause((Node *) clause)) + { + List *andclause = + replace_subclause_joinvar_refs(((Expr *) clause)->args, + outer_tlist, + inner_tlist); + + return ((List *) make_andclause(andclause)); + } else if (or_clause((Node *) clause)) { List *orclause = diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index c62eb04fcc66f43c15476359ffbcf263e8cb11d6..eab49abb1f5b12e6dae71c25d077541089f1487e 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.12 1997/09/25 12:48:15 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.13 1997/12/22 05:42:14 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -431,7 +431,7 @@ contains_not(Node *clause) if (not_clause(clause)) return (true); - if (or_clause(clause)) + if (or_clause(clause) || and_clause(clause)) { List *a; @@ -518,7 +518,7 @@ fix_opid(Node *clause) { ; } - else if (or_clause(clause)) + else if (or_clause(clause) || and_clause(clause)) { fix_opids(((Expr *) clause)->args); } diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index 2f7c080910d7a227da92ff45ba3589378504b78d..7ba3ce5d97572337ce18144f1be87a2e65580954 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.6 1997/09/08 21:45:56 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.7 1997/12/22 05:42:16 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -85,7 +85,7 @@ contain_var_clause(Node *clause) return contain_var_clause(((Iter *) clause)->iterexpr); else if (single_node(clause)) return FALSE; - else if (or_clause(clause)) + else if (or_clause(clause) || and_clause(clause)) { List *temp; @@ -156,7 +156,7 @@ pull_var_clause(Node *clause) retval = pull_var_clause(((Iter *) clause)->iterexpr); else if (single_node(clause)) retval = NIL; - else if (or_clause(clause)) + else if (or_clause(clause) || and_clause(clause)) { List *temp; diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index e552d0aa8c205391abe6465e91d7cfe83330b93b..e776f695000bbd0bb808ef476a44907f6816b509 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.3 1997/11/26 03:42:37 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.4 1997/12/22 05:42:19 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -108,7 +108,7 @@ contain_agg_clause(Node *clause) return contain_agg_clause(((Iter *) clause)->iterexpr); else if (single_node(clause)) return FALSE; - else if (or_clause(clause)) + else if (or_clause(clause) || and_clause(clause)) { List *temp; diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c index 4bdecfa21249c6a7a055311d185172569ef9275e..d7e2344823ebbbcd09fa9d7bc868845991d97a4a 100644 --- a/src/backend/parser/parser.c +++ b/src/backend/parser/parser.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.30 1997/11/26 01:11:36 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.31 1997/12/22 05:42:25 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -141,7 +141,7 @@ define_sets(Node *clause) { return; } - else if (or_clause(clause)) + else if (or_clause(clause) || and_clause(clause)) { List *temp;