diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 91725db98cb..0e5abc34930 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.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 diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index 0255b646a3b..af0053b5670 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.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)) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 8f80a228c62..cf26483007e 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.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. diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index bee9c7a9dda..8f4a08da9dc 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.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 */ diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 5f927095edc..cbcdc5b8f40 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.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 diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 4c3669dfe81..e15a929d62c 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.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); diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index 0a2b3a2bb80..67bb0292378 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.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); diff --git a/src/include/optimizer/plancat.h b/src/include/optimizer/plancat.h index 42e24832495..e6aba7cd579 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.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);