]> 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:33 +0000 (00:48 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 1 Apr 2008 00:48:33 +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 adbf95b31debba8d061c8881c7d496b33c3430b4..e6728f39fe49341ffa108e43101a81e1a3ff16e0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.169 2008/03/24 21:53:03 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.170 2008/04/01 00:48:33 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..dd08b19cb8371bbfedc80f36b3dc76fbb36b704d 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.139 2008/04/01 00:48:33 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 cbd8d1b05d71ecf32b552d986809a0d423e8898c..8679e9ecf9a616bd45281200cde2f51b065ba749 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.230 2008/03/29 00:15:28 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.231 2008/04/01 00:48:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -503,7 +503,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 95e5077d38cd5d9a3081252a221a36ef27c38580..2322ec8c509de13fe7a2f84fde6b3f7dcabc68b0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.256 2008/03/25 22:42:43 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.257 2008/04/01 00:48:33 tgl Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -1687,16 +1687,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 187fa613ad58b2f2430250b3250bff4228a73753..e45e559ce2fd949e0bb90b2041d2d332cd262ba9 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.144 2008/03/26 21:10:38 alvherre Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.145 2008/04/01 00:48:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,7 +47,8 @@ bool          constraint_exclusion = false;
 get_relation_info_hook_type get_relation_info_hook = NULL;
 
 
-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 4b49099568a2b3cb6324e32ab98f99332ea082ae..9a32fd5845e77556076ee63aa39545622fb351bb 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.269 2008/03/26 21:10:39 alvherre Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.270 2008/04/01 00:48:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3068,7 +3068,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
@@ -3138,7 +3138,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 b5d618595f74f08331ea83ea66155331e5d44c90..dce10d65066150f30f619db3f05ae9430a73f0db 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.89 2008/03/18 22:04:14 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/optimizer/clauses.h,v 1.90 2008/04/01 00:48:33 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 82b4c2200ad9d0b3e397db1ee30fd3b63d08e83c..9e835493582018ebb6afd45a9432eff397502cfd 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.48 2008/03/15 20:46:31 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/optimizer/plancat.h,v 1.49 2008/04/01 00:48:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -31,8 +31,8 @@ extern void get_relation_info(PlannerInfo *root, Oid relationObjectId,
 extern void estimate_rel_size(Relation rel, int32 *attr_widths,
                                                          BlockNumber *pages, double *tuples);
 
-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);