Changeset: 3fa382121669 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3fa382121669
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/miscellaneous/Tests/groupby_error.sql
        sql/test/miscellaneous/Tests/groupby_error.stable.out
Branch: Oct2020
Log Message:

Generalize dropping distinct property on aggregates on atoms on global 
aggregates too


diffs (83 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
@@ -5969,9 +5969,9 @@ rel_groupby_distinct2(visitor *v, sql_re
 static sql_rel *
 rel_groupby_distinct(visitor *v, sql_rel *rel)
 {
+       node *n;
+
        if (is_groupby(rel->op) && !rel_is_ref(rel) && rel->exps && 
list_empty(rel->r)) {
-               node *n;
-
                for (n = rel->exps->h; n; n = n->next) {
                        sql_exp *e = n->data;
 
@@ -5983,13 +5983,21 @@ rel_groupby_distinct(visitor *v, sql_rel
                }
        }
 
+       /*if the input expressions are atoms, drop distinct property */
+       if (is_groupby(rel->op) && !list_empty(rel->exps)) {
+               for (n=rel->exps->h; n ; n = n->next) {
+                       sql_exp *e = n->data;
+                       if (e->type == e_aggr && need_distinct(e) && (!e->l || 
exps_are_atoms(e->l)))
+                               set_nodistinct(e);
+               }
+       }
+
        if (is_groupby(rel->op)) {
                sql_rel *l = rel->l;
                if (!l || is_groupby(l->op))
                        return rel;
        }
        if (is_groupby(rel->op) && rel->r && !rel_is_ref(rel)) {
-               node *n;
                int nr = 0;
                list *gbe, *ngbe, *arg, *exps, *nexps;
                sql_exp *distinct = NULL, *darg;
@@ -5998,12 +6006,8 @@ rel_groupby_distinct(visitor *v, sql_rel
                for (n=rel->exps->h; n && nr <= 2; n = n->next) {
                        sql_exp *e = n->data;
                        if (need_distinct(e)) {
-                               if (e->type == e_aggr && (!e->l || 
exps_are_atoms(e->l))) {
-                                       set_nodistinct(e);
-                               } else {
-                                       distinct = n->data;
-                                       nr++;
-                               }
+                               distinct = n->data;
+                               nr++;
                        }
                }
                if (nr < 1 || distinct->type != e_aggr)
diff --git a/sql/test/miscellaneous/Tests/groupby_error.sql 
b/sql/test/miscellaneous/Tests/groupby_error.sql
--- a/sql/test/miscellaneous/Tests/groupby_error.sql
+++ b/sql/test/miscellaneous/Tests/groupby_error.sql
@@ -192,6 +192,8 @@ SELECT CAST(COUNT ( DISTINCT + CAST ( NU
        -- 93
        -- 93
        -- 93
+select group_concat(distinct 'a') from tab0;
+       -- a,a,a
 INSERT INTO "tab0" VALUES (83, 0, 38), (26, 0, 79), (43, 81, 24);
 select group_concat(distinct col1, col2) from tab0 group by col0;
        -- 0
diff --git a/sql/test/miscellaneous/Tests/groupby_error.stable.out 
b/sql/test/miscellaneous/Tests/groupby_error.stable.out
--- a/sql/test/miscellaneous/Tests/groupby_error.stable.out
+++ b/sql/test/miscellaneous/Tests/groupby_error.stable.out
@@ -497,6 +497,14 @@ project (
 [ 93   ]
 [ 93   ]
 [ 93   ]
+#select group_concat(distinct 'a') from tab0;
+% .%1 # table_name
+% %1 # name
+% clob # type
+% 5 # length
+[ "a,a,a"      ]
+#INSERT INTO "tab0" VALUES (83, 0, 38), (26, 0, 79), (43, 81, 24);
+[ 3    ]
 #ROLLBACK;
 #START TRANSACTION;
 #CREATE TABLE tab2 ("col0" INTEGER,"col1" INTEGER,"col2" INTEGER);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to