diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index adbf95b31d..e6728f39fe 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -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 diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index 0255b646a3..dd08b19cb8 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -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)) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index cbd8d1b05d..8679e9ecf9 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.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. diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 95e5077d38..2322ec8c50 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -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 */ diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 187fa613ad..e45e559ce2 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -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 diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 4b49099568..9a32fd5845 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -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); diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index b5d618595f..dce10d6506 100644 --- a/src/include/optimizer/clauses.h +++ b/src/include/optimizer/clauses.h @@ -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); diff --git a/src/include/optimizer/plancat.h b/src/include/optimizer/plancat.h index 82b4c2200a..9e83549358 100644 --- a/src/include/optimizer/plancat.h +++ b/src/include/optimizer/plancat.h @@ -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);