]> granicus.if.org Git - postgresql/commitdiff
Prefer actual constants to pseudo-constants in equivalence class machinery.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 26 Oct 2012 18:19:47 +0000 (14:19 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 26 Oct 2012 18:19:47 +0000 (14:19 -0400)
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

index 00493d82e77863398b6082d0aaef7a1c094d3c3e..f84dcdfd1be531c42cc238740f7598371fa0c1cd 100644 (file)
@@ -768,7 +768,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);
@@ -776,7 +781,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);