summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-10-26 14:19:39 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-10-26 14:19:39 -0400
commit7e951ba6e1de7bb77aef4ea2d0ef7d2be860f389 (patch)
tree1a86d992b07d546ae32ad7fdb5a998793f64978f
parent725fa25e20248800461b06802f5ee9a203825618 (diff)
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.
-rw-r--r--src/backend/optimizer/path/equivclass.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c
index ce37b6c5784..349bd537e5e 100644
--- a/src/backend/optimizer/path/equivclass.c
+++ b/src/backend/optimizer/path/equivclass.c
@@ -769,7 +769,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);
@@ -777,7 +782,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);