aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-10-26 14:19:34 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-10-26 14:19:34 -0400
commit17804fa71b4a4e7a099f780616a7b53ea591774d (patch)
treecfce9d4014934bacc601a4d100a4eff646a94731 /src
parent5a39114fe7d19280f6477ce1eb0d88beafda13a4 (diff)
downloadpostgresql-17804fa71b4a4e7a099f780616a7b53ea591774d.tar.gz
postgresql-17804fa71b4a4e7a099f780616a7b53ea591774d.zip
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.
Diffstat (limited to 'src')
-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 9bc830bc35c..58553df3140 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);