提交 e3a47483 编写于 作者: T Tom Lane

Fix an oversight I made in a cleanup patch over a year ago:

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.
上级 f82277c8
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -205,7 +205,7 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
* set_append_rel_pathlist(). * set_append_rel_pathlist().
*/ */
if (rel->reloptkind == RELOPT_BASEREL && if (rel->reloptkind == RELOPT_BASEREL &&
relation_excluded_by_constraints(rel, rte)) relation_excluded_by_constraints(root, rel, rte))
{ {
set_dummy_rel_pathlist(rel); set_dummy_rel_pathlist(rel);
return; return;
...@@ -321,7 +321,7 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, ...@@ -321,7 +321,7 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
adjust_appendrel_attrs((Node *) rel->baserestrictinfo, adjust_appendrel_attrs((Node *) rel->baserestrictinfo,
appinfo); 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 * This child need not be scanned, so we can omit it from the
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -1219,7 +1219,7 @@ process_implied_equality(PlannerInfo *root,
/* If both constant, try to reduce to a boolean constant. */ /* If both constant, try to reduce to a boolean constant. */
if (both_const) 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 we produced const TRUE, just drop the clause */
if (clause && IsA(clause, Const)) if (clause && IsA(clause, Const))
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -496,7 +496,7 @@ preprocess_expression(PlannerInfo *root, Node *expr, int kind)
(root->parse->jointree->fromlist != NIL || (root->parse->jointree->fromlist != NIL ||
kind == EXPRKIND_QUAL || kind == EXPRKIND_QUAL ||
root->query_level > 1)) root->query_level > 1))
expr = eval_const_expressions(expr); expr = eval_const_expressions(root, expr);
/* /*
* If it's a qual or havingQual, canonicalize it. * If it's a qual or havingQual, canonicalize it.
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -1675,16 +1675,22 @@ rowtype_field_matches(Oid rowtypeid, int fieldnum, ...@@ -1675,16 +1675,22 @@ rowtype_field_matches(Oid rowtypeid, int fieldnum,
* We assume that the tree has already been type-checked and contains * We assume that the tree has already been type-checked and contains
* only operators and functions that are reasonable to try to execute. * 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 * NOTE: the planner assumes that this will always flatten nested AND and
* OR clauses into N-argument form. See comments in prepqual.c. * OR clauses into N-argument form. See comments in prepqual.c.
*-------------------- *--------------------
*/ */
Node * Node *
eval_const_expressions(Node *node) eval_const_expressions(PlannerInfo *root, Node *node)
{ {
eval_const_expressions_context context; 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.active_fns = NIL; /* nothing being recursively simplified */
context.case_val = NULL; /* no CASE being examined */ context.case_val = NULL; /* no CASE being examined */
context.estimate = false; /* safe transformations only */ context.estimate = false; /* safe transformations only */
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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; ...@@ -47,7 +47,8 @@ get_relation_info_hook_type get_relation_info_hook = NULL;
static void estimate_rel_size(Relation rel, int32 *attr_widths, static void estimate_rel_size(Relation rel, int32 *attr_widths,
BlockNumber *pages, double *tuples); 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); bool include_notnull);
...@@ -462,7 +463,8 @@ estimate_rel_size(Relation rel, int32 *attr_widths, ...@@ -462,7 +463,8 @@ estimate_rel_size(Relation rel, int32 *attr_widths,
* point in caching the data in RelOptInfo. * point in caching the data in RelOptInfo.
*/ */
static List * static List *
get_relation_constraints(Oid relationObjectId, RelOptInfo *rel, get_relation_constraints(PlannerInfo *root,
Oid relationObjectId, RelOptInfo *rel,
bool include_notnull) bool include_notnull)
{ {
List *result = NIL; List *result = NIL;
...@@ -497,7 +499,7 @@ get_relation_constraints(Oid relationObjectId, RelOptInfo *rel, ...@@ -497,7 +499,7 @@ get_relation_constraints(Oid relationObjectId, RelOptInfo *rel,
* stuff involving subqueries, however, since we don't allow any * stuff involving subqueries, however, since we don't allow any
* in check constraints.) * in check constraints.)
*/ */
cexpr = eval_const_expressions(cexpr); cexpr = eval_const_expressions(root, cexpr);
cexpr = (Node *) canonicalize_qual((Expr *) cexpr); cexpr = (Node *) canonicalize_qual((Expr *) cexpr);
...@@ -561,7 +563,8 @@ get_relation_constraints(Oid relationObjectId, RelOptInfo *rel, ...@@ -561,7 +563,8 @@ get_relation_constraints(Oid relationObjectId, RelOptInfo *rel,
* it can be called before filling in other fields of the RelOptInfo. * it can be called before filling in other fields of the RelOptInfo.
*/ */
bool bool
relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte) relation_excluded_by_constraints(PlannerInfo *root,
RelOptInfo *rel, RangeTblEntry *rte)
{ {
List *safe_restrictions; List *safe_restrictions;
List *constraint_pred; List *constraint_pred;
...@@ -600,7 +603,7 @@ relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte) ...@@ -600,7 +603,7 @@ relation_excluded_by_constraints(RelOptInfo *rel, RangeTblEntry *rte)
* OK to fetch the constraint expressions. Include "col IS NOT NULL" * OK to fetch the constraint expressions. Include "col IS NOT NULL"
* expressions for attnotnull columns, in case we can refute those. * 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 * We do not currently enforce that CHECK constraints contain only
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -3078,7 +3078,7 @@ RelationGetIndexExpressions(Relation relation)
* them to similarly-processed qual clauses, and may fail to detect valid * them to similarly-processed qual clauses, and may fail to detect valid
* matches without this. We don't bother with canonicalize_qual, however. * 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 * Also mark any coercion format fields as "don't care", so that the
...@@ -3148,7 +3148,7 @@ RelationGetIndexPredicate(Relation relation) ...@@ -3148,7 +3148,7 @@ RelationGetIndexPredicate(Relation relation)
* stuff involving subqueries, however, since we don't allow any in index * stuff involving subqueries, however, since we don't allow any in index
* predicates.) * predicates.)
*/ */
result = (List *) eval_const_expressions((Node *) result); result = (List *) eval_const_expressions(NULL, (Node *) result);
result = (List *) canonicalize_qual((Expr *) result); result = (List *) canonicalize_qual((Expr *) result);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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); ...@@ -75,7 +75,7 @@ extern Node *strip_implicit_coercions(Node *node);
extern void set_coercionform_dontcare(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); extern Node *estimate_expression_value(PlannerInfo *root, Node *node);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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; ...@@ -27,8 +27,8 @@ extern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;
extern void get_relation_info(PlannerInfo *root, Oid relationObjectId, extern void get_relation_info(PlannerInfo *root, Oid relationObjectId,
bool inhparent, RelOptInfo *rel); bool inhparent, RelOptInfo *rel);
extern bool relation_excluded_by_constraints(RelOptInfo *rel, extern bool relation_excluded_by_constraints(PlannerInfo *root,
RangeTblEntry *rte); RelOptInfo *rel, RangeTblEntry *rte);
extern List *build_physical_tlist(PlannerInfo *root, RelOptInfo *rel); extern List *build_physical_tlist(PlannerInfo *root, RelOptInfo *rel);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册