]> granicus.if.org Git - postgresql/commitdiff
Oops, missed one fix for EquivalenceClass rearrangement.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Oct 2010 18:44:49 +0000 (14:44 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 29 Oct 2010 18:44:49 +0000 (14:44 -0400)
Now that we're expecting a mergeclause's left_ec/right_ec to persist from
the initial assignments, we can't just blithely zero these out when
transforming such a clause in adjust_appendrel_attrs.  But really it should
be okay to keep the parent's values, since a child table's derived Var
ought to be equivalent to the parent Var for all EquivalenceClass purposes.
(Indeed, I'm wondering whether we couldn't find a way to dispense with
add_child_rel_equivalences altogether.  But this is wrong in any case.)

src/backend/optimizer/prep/prepunion.c

index 0d3a739175a10fde956263c4c83cfb1678d2d03b..45ecde416f93bff38cbecd6776e30bc492795dcf 100644 (file)
@@ -1682,13 +1682,13 @@ adjust_appendrel_attrs_mutator(Node *node, AppendRelInfo *context)
 
                /*
                 * Reset cached derivative fields, since these might need to have
-                * different values when considering the child relation.
+                * different values when considering the child relation.  Note we
+                * don't reset left_ec/right_ec: each child variable is implicitly
+                * equivalent to its parent, so still a member of the same EC if any.
                 */
                newinfo->eval_cost.startup = -1;
                newinfo->norm_selec = -1;
                newinfo->outer_selec = -1;
-               newinfo->left_ec = NULL;
-               newinfo->right_ec = NULL;
                newinfo->left_em = NULL;
                newinfo->right_em = NULL;
                newinfo->scansel_cache = NIL;