]> granicus.if.org Git - postgresql/commitdiff
Fix for select 1=1 or 2=2, select 1=1 and 2=2, and select sum(2+2).
authorBruce Momjian <bruce@momjian.us>
Mon, 22 Dec 1997 05:42:25 +0000 (05:42 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 22 Dec 1997 05:42:25 +0000 (05:42 +0000)
src/backend/commands/defind.c
src/backend/executor/nodeAgg.c
src/backend/optimizer/path/xfunc.c
src/backend/optimizer/plan/planmain.c
src/backend/optimizer/plan/planner.c
src/backend/optimizer/plan/setrefs.c
src/backend/optimizer/util/clauses.c
src/backend/optimizer/util/var.c
src/backend/parser/parse_agg.c
src/backend/parser/parser.c

index 66f5cb420588f778be1f01ba65b10ed41b6d8d83..9be89e1871adf768dc351ca34231b92636085516 100644 (file)
@@ -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");
index accc7b1fb7c07db54fee0ffe9f328b8b61371b11..5b6b180cb96f5d34fa5e6354710f110de603edce 100644 (file)
@@ -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.
         * ----------------
index c0213df36aceb333e09426891e3a114a1c9adeab..08f0b13cec8ffb295be6d2219adab99b2b8fe891 100644 (file)
@@ -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);
index d26e3eb8b49962126ba55f913c60a1b0f4f37bc4..8691215b46602fbbff3336a06c3da62f4313db27 100644 (file)
@@ -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
 
index 381c609493b278b29362f3b1c245a5fbafb38b16..ddfc42891738bc5e42ec71db08f0cad8c55d3133 100644 (file)
@@ -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);
        }
 
        /*
index 1d0f0963c5ac26cd47109bc841f2b806980aeaa6..7c8371a79c4adf25c09e3530ec128093930335da 100644 (file)
@@ -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 =
index c62eb04fcc66f43c15476359ffbcf263e8cb11d6..eab49abb1f5b12e6dae71c25d077541089f1487e 100644 (file)
@@ -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);
        }
index 2f7c080910d7a227da92ff45ba3589378504b78d..7ba3ce5d97572337ce18144f1be87a2e65580954 100644 (file)
@@ -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;
 
index e552d0aa8c205391abe6465e91d7cfe83330b93b..e776f695000bbd0bb808ef476a44907f6816b509 100644 (file)
@@ -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;
 
index 4bdecfa21249c6a7a055311d185172569ef9275e..d7e2344823ebbbcd09fa9d7bc868845991d97a4a 100644 (file)
@@ -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;