Changeset: 191efb7c655b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/191efb7c655b
Modified Files:
        sql/server/rel_optimize_proj.c
        sql/server/rel_select.c
        sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test
Branch: Dec2023
Log Message:

in group_merge_exps create proper referencing expressions in the projection
in rel_push_project_up_ don't remove simple (single value) expressions in the 
expression list of the group by operator
this solves bug #7478


diffs (96 lines):

diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -691,7 +691,7 @@ rel_push_project_up_(visitor *v, sql_rel
                for (n = rel->exps->h; n && !fnd; n = n->next) {
                        sql_exp *e = n->data;
 
-                       if (e->type != e_aggr && e->type != e_column && e->type 
!= e_atom) {
+                       if (e->type != e_aggr && e->type != e_column && e->type 
!= e_atom && e->card > CARD_ATOM) {
                                fnd = 1;
                        }
                }
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5651,36 +5651,34 @@ group_merge_exps(mvc *sql, list *gexps, 
 {
        int nexps = list_length(gexps) + list_length(exps);
 
-       if (nexps < 5) {
-               return list_distinct(list_merge(gexps, exps, (fdup) NULL), 
(fcmp) exp_equal, (fdup) NULL);
-       } else { /* for longer lists, use hashing */
-               sql_hash *ht = hash_new(sql->ta, nexps, (fkeyvalue)&exp_key);
-
-               for (node *n = gexps->h; n ; n = n->next) { /* first add 
grouping expressions */
-                       sql_exp *e = n->data;
-                       int key = ht->key(e);
-
-                       hash_add(ht, key, e);
-               }
-
-               for (node *n = exps->h; n ; n = n->next) { /* then test if the 
new grouping expressions are already there */
-                       sql_exp *e = n->data;
-                       int key = ht->key(e);
-                       sql_hash_e *he = ht->buckets[key&(ht->size-1)];
-                       bool duplicates = false;
-
-                       for (; he && !duplicates; he = he->chain) {
-                               sql_exp *f = he->value;
-
-                               if (!exp_equal(e, f))
-                                       duplicates = true;
-                       }
-                       hash_add(ht, key, e);
-                       if (!duplicates)
-                               list_append(gexps, e);
-               }
-               return gexps;
-       }
+       sql_hash *ht = hash_new(sql->ta, nexps, (fkeyvalue)&exp_key);
+
+       for (node *n = gexps->h; n ; n = n->next) { /* first add grouping 
expressions */
+               sql_exp *e = n->data;
+               int key = ht->key(e);
+
+               hash_add(ht, key, e);
+       }
+
+       for (node *n = exps->h; n ; n = n->next) { /* then test if the new 
grouping expressions are already there */
+               sql_exp *e = n->data;
+               int key = ht->key(e);
+               sql_hash_e *he = ht->buckets[key&(ht->size-1)];
+               bool duplicates = false;
+
+               for (; he && !duplicates; he = he->chain) {
+                       sql_exp *f = he->value;
+
+                       if (!exp_equal(e, f))
+                               duplicates = true;
+               }
+               hash_add(ht, key, e);
+               if (!duplicates) {
+                       list_append(gexps, e);
+                       n->data = exp_ref(sql, e);
+               }
+       }
+       return gexps;
 }
 
 static list *
diff --git a/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test 
b/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test
--- a/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test
+++ b/sql/test/BugTracker-2024/Tests/exp_equal-Bug-7478.test
@@ -1,10 +1,10 @@
-skipif knownfail
 query T nosort
 WITH x AS ( SELECT NULL ) SELECT 'x' IN ( SELECT * FROM x GROUP BY 'x' )
 ----
+NULL
 
-skipif knownfail
 query T nosort
 SELECT ( WITH x AS ( SELECT NULL ) SELECT 'x' IN ( SELECT * FROM x GROUP BY 
'x' ) )
 ----
+NULL
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to