Changeset: 77f8a3ad521e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/77f8a3ad521e
Modified Files:
sql/server/rel_optimize_proj.c
sql/test/BugTracker-2025/Tests/All
Branch: default
Log Message:
merged with mar2025
diffs (125 lines):
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -1215,10 +1215,6 @@ static int
UUIDcompare(const void *L, const void *R)
{
const uuid *l = L, *r = R;
- if (is_uuid_nil(*r))
- return !is_uuid_nil(*l);
- if (is_uuid_nil(*l))
- return -1;
return memcmp(l->u, r->u, UUID_SIZE);
}
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
@@ -3347,19 +3347,13 @@ rel_merge_unions(visitor *v, sql_rel *re
list *l = rel->l;
for(node *n = l->h; n; ) {
node *next = n->next;
- sql_rel *oc = n->data;
- sql_rel *c = oc;
-
- /* account for any group-bys pushed down between
stacked munions */
- if (oc->op == op_groupby)
- c = oc->l;
-
+ sql_rel *c = n->data;
if (is_munion(c->op)) {
c = rel_dup(c);
list_remove_node(l, NULL, n);
l = list_merge(l, c->l, (fdup)NULL);
c->l = NULL;
- rel_destroy(oc);
+ rel_destroy(c);
if (!next)
next = l->h;
v->changes++;
diff --git a/sql/test/BugTracker-2025/Tests/7647-munion-optimizer-bug.test
b/sql/test/BugTracker-2025/Tests/7647-munion-optimizer-bug.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2025/Tests/7647-munion-optimizer-bug.test
@@ -0,0 +1,31 @@
+statement ok
+CREATE TABLE "test_bug_repro" (
+ "year_" TIMESTAMP,
+ "event_date_" TIMESTAMP,
+ "position_" BIGINT,
+ "final_rank_driver_" BIGINT
+)
+
+query I
+WITH "second_place_days" AS (
+ SELECT COUNT(DISTINCT "event_date_") AS "count" FROM "test_bug_repro" WHERE
"position_" = 2
+),
+"championship_years" AS (
+ SELECT COUNT(DISTINCT "year_") AS "count" FROM "test_bug_repro" WHERE
"final_rank_driver_" = 1
+),
+"race_days" AS (
+ SELECT COUNT(DISTINCT "event_date_") AS "count" FROM "test_bug_repro"
+),
+"podium_days" AS (
+ SELECT COUNT(DISTINCT "event_date_") AS "count" FROM "test_bug_repro" WHERE
"position_" IN (1, 2, 3)
+),
+"results" AS (
+ SELECT '2nd' FROM "second_place_days"
+ UNION ALL
+ SELECT 'Championships' FROM "championship_years"
+ UNION ALL
+ SELECT 'Podium finishes' FROM "podium_days", "race_days"
+)
+SELECT COUNT(*) FROM "results"
+----
+3
diff --git a/sql/test/BugTracker-2025/Tests/All
b/sql/test/BugTracker-2025/Tests/All
--- a/sql/test/BugTracker-2025/Tests/All
+++ b/sql/test/BugTracker-2025/Tests/All
@@ -16,6 +16,7 @@ 7643_select_0_optimizer_bug
7644_antijoin_crash
7645_not_likeselect
7646_leftjoin_crash
+7647-munion-optimizer-bug
7648_rightjoin_crash
7650_right_join_crash
7653_incorrect_join_results
diff --git a/sql/test/rel-optimizers/Tests/merge-unions.test
b/sql/test/rel-optimizers/Tests/merge-unions.test
--- a/sql/test/rel-optimizers/Tests/merge-unions.test
+++ b/sql/test/rel-optimizers/Tests/merge-unions.test
@@ -248,17 +248,25 @@ project (
| group by (
| | munion (
| | | group by (
-| | | | table("sys"."f1") [ "f1"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
-| | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ],
-| | | group by (
-| | | | table("sys"."f2") [ "f2"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
-| | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ],
+| | | | munion (
+| | | | | group by (
+| | | | | | table("sys"."f1") [ "f1"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
+| | | | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ],
+| | | | | group by (
+| | | | | | table("sys"."f2") [ "f2"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
+| | | | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ]
+| | | | ) [ "f_merge_rec"."n" NOT NULL, "%1"."%1" NOT NULL ]
+| | | ) [ "f_merge_rec"."n" NOT NULL ] [ "f_merge_rec"."n" NOT NULL,
"sys"."sum" no nil ("%1"."%1" NOT NULL) NOT NULL as "%1"."%1" ],
| | | group by (
-| | | | table("sys"."f3") [ "f3"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
-| | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ],
-| | | group by (
-| | | | table("sys"."f4") [ "f4"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
-| | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ]
+| | | | munion (
+| | | | | group by (
+| | | | | | table("sys"."f3") [ "f3"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
+| | | | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ],
+| | | | | group by (
+| | | | | | table("sys"."f4") [ "f4"."n" NOT NULL UNIQUE as "f_merge_rec"."n" ]
+| | | | | ) [ "f_merge_rec"."n" NOT NULL UNIQUE ] [ "f_merge_rec"."n" NOT NULL
UNIQUE, "sys"."count" no nil ("f_merge_rec"."n" NOT NULL UNIQUE) NOT NULL as
"%1"."%1" ]
+| | | | ) [ "f_merge_rec"."n" NOT NULL, "%1"."%1" NOT NULL ]
+| | | ) [ "f_merge_rec"."n" NOT NULL ] [ "f_merge_rec"."n" NOT NULL,
"sys"."sum" no nil ("%1"."%1" NOT NULL) NOT NULL as "%1"."%1" ]
| | ) [ "f_merge_rec"."n" NOT NULL, "%1"."%1" NOT NULL ]
| ) [ "f_merge_rec"."n" NOT NULL ] [ "f_merge_rec"."n" NOT NULL, "sys"."sum"
no nil ("%1"."%1" NOT NULL) NOT NULL as "%1"."%1" ]
) [ "f_merge_rec"."n" NOT NULL UNIQUE, "%1"."%1" NOT NULL ]
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]