Changeset: 0ca8afac5a34 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0ca8afac5a34
Modified Files:
        sql/server/rel_optimizer.c
Branch: Oct2020
Log Message:

add fix for issue 7108
ie make sure we have all group by expressions when we optimize a groupby/union.


diffs (45 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -4220,10 +4220,6 @@ rel_push_aggr_down(visitor *v, sql_rel *
                        }
                }
 
-               u = rel_setop(v->sql->sa, ul, ur, op_union);
-               rel_setop_set_exps(v->sql, u, rel_projections(v->sql, ul, NULL, 
1, 1));
-               set_processed(u);
-
                if (rel->r) {
                        list *ogbe = rel->r;
 
@@ -4231,15 +4227,27 @@ rel_push_aggr_down(visitor *v, sql_rel *
                        for (n = ogbe->h; n; n = n->next) {
                                sql_exp *e = n->data, *ne;
 
+                               /* group by in aggreation list */
                                ne = exps_uses_exp( rel->exps, e);
-                               if (!ne)
-                                       continue;
-                               ne = list_find_exp( u->exps, ne);
+                               if (ne)
+                                       ne = list_find_exp( ul->exps, ne);
+                               if (!ne) {
+                                       /* e only in the ul/ur->r (group by 
list) */
+                                       ne = exp_ref(v->sql, e);
+                                       list_append(ul->exps, ne);
+                                       ne = exp_ref(v->sql, e);
+                                       list_append(ur->exps, ne);
+                               }
                                assert(ne);
                                ne = exp_ref(v->sql, ne);
                                append(gbe, ne);
                        }
                }
+
+               u = rel_setop(v->sql->sa, ul, ur, op_union);
+               rel_setop_set_exps(v->sql, u, rel_projections(v->sql, ul, NULL, 
1, 1));
+               set_processed(u);
+
                exps = new_exp_list(v->sql->sa);
                for (n = u->exps->h, m = rel->exps->h; n && m; n = n->next, m = 
m->next) {
                        sql_exp *ne, *e = n->data, *oa = m->data;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to