]> granicus.if.org Git - postgresql/commitdiff
Fix an oversight I made in a cleanup patch over a year ago:
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 1 Apr 2008 00:48:44 +0000 (00:48 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 1 Apr 2008 00:48:44 +0000 (00:48 +0000)
eval_const_expressions needs to be passed the PlannerInfo ("root") structure,
because in some cases we want it to substitute values for Param nodes.
(So "constant" is not so constant as all that ...)  This mistake partially
disabled optimization of unnamed extended-Query statements in 8.3: in
particular the LIKE-to-indexscan optimization would never be applied if the
LIKE pattern was passed as a parameter, and constraint exclusion depending
on a parameter value didn't work either.

src/backend/optimizer/path/allpaths.c
src/backend/optimizer/plan/initsplan.c
src/backend/optimizer/plan/planner.c
src/backend/optimizer/util/clauses.c
src/backend/optimizer/util/plancat.c
src/backend/utils/cache/relcache.c
src/include/optimizer/clauses.h
src/include/optimizer/plancat.h

index 91725db98cb98b939b166d9ee87685c330106a43..0e5abc34930f4720f9661c9ac8c219275bdb56e3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.168.2.1 2008/03/24 21:53:12 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.168.2.2 2008/04/01 00:48:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -205,7 +205,7 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
         * set_append_rel_pathlist().
         */
        if (rel->reloptkind == RELOPT_BASEREL &&
-               relation_excluded_by_constraints(rel, rte))
+               relation_excluded_by_constraints(root, rel, rte))
        {
                set_dummy_rel_pathlist(rel);
                return;
@@ -321,7 +321,7 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
                        adjust_appendrel_attrs((Node *) rel->baserestrictinfo,
                                                                   appinfo);
 
-               if (relation_excluded_by_constraints(childrel, childRTE))
+               if (relation_excluded_by_constraints(root, childrel, childRTE))
                {
                        /*
                         * This child need not be scanned, so we can omit it from the
index 0255b646a3bdaa429b89a6f66639a786e9bcf591..af0053b5670a135bc81bdbaf1ae77a98d4ff1921 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.138 2008/01/09 20:42:28 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.138.2.1 2008/04/01 00:48:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1219,7 +1219,7 @@ process_implied_equality(PlannerInfo *root,
        /* If both constant, try to reduce to a boolean constant. */
        if (both_const)
        {
-               clause = (Expr *) eval_const_expressions((Node *) clause);
+               clause = (Expr *) eval_const_expressions(root, (Node *) clause);
 
                /* If we produced const TRUE, just drop the clause */
                if (clause && IsA(clause, Const))
index 8f80a228c625753fcf26fd622119c0ceadd87df6..cf26483007ed4a54354784b90e9b09b1d613fb8d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.226.2.2 2008/03/29 00:15:37 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.226.2.3 2008/04/01 00:48:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -496,7 +496,7 @@ preprocess_expression(PlannerInfo *root, Node *expr, int kind)
                (root->parse->jointree->fromlist != NIL ||
                 kind == EXPRKIND_QUAL ||
                 root->query_level > 1))
-               expr = eval_const_expressions(expr);
+               expr = eval_const_expressions(root, expr);
 
        /*
         * If it's a qual or havingQual, canonicalize it.
index bee9c7a9dda21e6f592e6250382fdea0082cad76..8f4a08da9dc6b7d7f657cc32f7ff839d2eea55f2 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.254 2008/01/11 18:39:40 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.254.2.1 2008/04/01 00:48:44 tgl Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -1675,16 +1675,22 @@ rowtype_field_matches(Oid rowtypeid, int fieldnum,
  * We assume that the tree has already been type-checked and contains
  * only operators and functions that are reasonable to try to execute.
  *
+ * NOTE: "root" can be passed as NULL if the caller never wants to do any
+ * Param substitutions.
+ *
  * NOTE: the planner assumes that this will always flatten nested AND and
  * OR clauses into N-argument form.  See comments in prepqual.c.
  *--------------------
  */
 Node *
-eval_const_expressions(Node *node)
+eval_const_expressions(PlannerInfo *root, Node *node)
 {
        eval_const_expressions_context context;
 
-       context.boundParams = NULL; /* don't use any bound params */
+       if (root)
+               context.boundParams = root->glob->boundParams;  /* bound Params */
+       else
+               context.boundParams = NULL;
        context.active_fns = NIL;       /* nothing being recursively simplified */
        context.case_val = NULL;        /* no CASE being examined */
        context.estimate = false;       /* safe transformations only */
index 5f927095edcd9198f831652b32db52a64bf63346..cbcdc5b8f4014bac07eaf33efbd2cfb2d14bc129 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.140 2008/01/12 00:11:39 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.140.2.1 2008/04/01 00:48:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,7 +47,8 @@ get_relation_info_hook_type get_relation_info_hook = NULL;
 
 static void estimate_rel_size(Relation rel, int32 *attr_widths,
                                  BlockNumber *pages, double *tuples);
-static List *get_relation_constraints(Oid relationObjectId, RelOptInfo *rel,
+static List *get_relation_constraints(PlannerInfo *root,
+                                                Oid relationObjectId, RelOptInfo *rel,
                                                 bool include_notnull);
 
 
@@ -462,7 +463,8 @@ estimate_rel_size(Relation rel, int32 *attr_widths,
  * point in caching the data in RelOptInfo.
  */
 static List *
-get_relation_constraints(Oid relationObjectId, RelOptInfo *rel,
+get_relation_constraints(PlannerInfo *root,
+                                                Oid relationObjectId, RelOptInfo *rel,
                                                 bool include_notnull)
 {
        List       *result = NIL;
@@ -497,7 +499,7 @@ get_relation_constraints(Oid relationObjectId, RelOptInfo *rel,
                         * stuff involving subqueries, however, since we don't allow any
                         * in check constraints.)
                         */
-                       cexpr = eval_const_expressions(cexpr);
+                       cexpr = eval_const_expressions(root, cexpr);
 
                        cexpr = (Node *) canonicalize_qual((Expr *) cexpr);
 
@@ -561,7 +563,8 @@ get_relation_constraints(Oid relationObjectId, RelOptInfo *rel,
  * it can be called before filling in other fields of the RelOptInfo.
  */
 bool
-relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte)
+relation_excluded_by_constraints(PlannerInfo *root,
+                                                                RelOptInfo *rel, RangeTblEntry *rte)
 {
        List       *safe_restrictions;
        List       *constraint_pred;
@@ -600,7 +603,7 @@ relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte)
         * OK to fetch the constraint expressions.  Include "col IS NOT NULL"
         * expressions for attnotnull columns, in case we can refute those.
         */
-       constraint_pred = get_relation_constraints(rte->relid, rel, true);
+       constraint_pred = get_relation_constraints(root, rte->relid, rel, true);
 
        /*
         * We do not currently enforce that CHECK constraints contain only
index 4c3669dfe81c670dcb11659eeb5895a406cc068d..e15a929d62c65efe2b69b6efe2a93be62815de10 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.266.2.1 2008/02/27 17:44:27 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.266.2.2 2008/04/01 00:48:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3078,7 +3078,7 @@ RelationGetIndexExpressions(Relation relation)
         * them to similarly-processed qual clauses, and may fail to detect valid
         * matches without this.  We don't bother with canonicalize_qual, however.
         */
-       result = (List *) eval_const_expressions((Node *) result);
+       result = (List *) eval_const_expressions(NULL, (Node *) result);
 
        /*
         * Also mark any coercion format fields as "don't care", so that the
@@ -3148,7 +3148,7 @@ RelationGetIndexPredicate(Relation relation)
         * stuff involving subqueries, however, since we don't allow any in index
         * predicates.)
         */
-       result = (List *) eval_const_expressions((Node *) result);
+       result = (List *) eval_const_expressions(NULL, (Node *) result);
 
        result = (List *) canonicalize_qual((Expr *) result);
 
index 0a2b3a2bb8033d5a22388da8f874143276f7f938..67bb02923788a553fc7d81912e6cf45c8447cb4c 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/optimizer/clauses.h,v 1.88 2008/01/01 19:45:58 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/optimizer/clauses.h,v 1.88.2.1 2008/04/01 00:48:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -75,7 +75,7 @@ extern Node *strip_implicit_coercions(Node *node);
 
 extern void set_coercionform_dontcare(Node *node);
 
-extern Node *eval_const_expressions(Node *node);
+extern Node *eval_const_expressions(PlannerInfo *root, Node *node);
 
 extern Node *estimate_expression_value(PlannerInfo *root, Node *node);
 
index 42e24832495bdee61fd2c3c8cfadf59a04f2bb17..e6aba7cd579416a3cfb9e44345e72554f4ad7f2a 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/optimizer/plancat.h,v 1.47 2008/01/01 19:45:58 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/optimizer/plancat.h,v 1.47.2.1 2008/04/01 00:48:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,8 +27,8 @@ extern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;
 extern void get_relation_info(PlannerInfo *root, Oid relationObjectId,
                                  bool inhparent, RelOptInfo *rel);
 
-extern bool relation_excluded_by_constraints(RelOptInfo *rel,
-                                                                RangeTblEntry *rte);
+extern bool relation_excluded_by_constraints(PlannerInfo *root,
+                                                                RelOptInfo *rel, RangeTblEntry *rte);
 
 extern List *build_physical_tlist(PlannerInfo *root, RelOptInfo *rel);