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