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 -- [email protected]
To unsubscribe send an email to [email protected]