From 29d539b35fb9a5c82546918132f9a561c75f14d7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 26 Oct 2012 14:20:15 -0400 Subject: [PATCH] Prefer actual constants to pseudo-constants in equivalence class machinery. generate_base_implied_equalities_const() should prefer plain Consts over other em_is_const eclass members when choosing the "pivot" value that all the other members will be equated to. This makes it more likely that the generated equalities will be useful in constraint-exclusion proofs. Per report from Rushabh Lathia. --- src/backend/optimizer/path/equivclass.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 7f9a006995b..b9dbca3fb2c 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -601,7 +601,12 @@ generate_base_implied_equalities_const(PlannerInfo *root, } } - /* Find the constant member to use */ + /* + * Find the constant member to use. We prefer an actual constant to + * pseudo-constants (such as Params), because the constraint exclusion + * machinery might be able to exclude relations on the basis of generated + * "var = const" equalities, but "var = param" won't work for that. + */ foreach(lc, ec->ec_members) { EquivalenceMember *cur_em = (EquivalenceMember *) lfirst(lc); @@ -609,7 +614,8 @@ generate_base_implied_equalities_const(PlannerInfo *root, if (cur_em->em_is_const) { const_em = cur_em; - break; + if (IsA(cur_em->em_expr, Const)) + break; } } Assert(const_em != NULL);