Changeset: 00d0b7c7499e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/00d0b7c7499e
Modified Files:
sql/test/BugTracker-2026/Tests/All
testing/Mtest.py.in
Branch: default
Log Message:
Merge with Dec2025 branch.
diffs (truncated from 870 to 300 lines):
diff --git
a/sql/test/BugTracker-2026/Tests/7963-having-sum-or-exists-or-sum-bug.test
b/sql/test/BugTracker-2026/Tests/7963-having-sum-or-exists-or-sum-bug.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7963-having-sum-or-exists-or-sum-bug.test
@@ -0,0 +1,73 @@
+statement ok
+CREATE TABLE rift_min_a (
+ g INT,
+ x INT
+)
+
+statement ok
+CREATE TABLE rift_min_b (
+ y INT
+)
+
+statement ok
+INSERT INTO rift_min_a VALUES
+ (1, 10),
+ (1, 20),
+ (2, 100)
+
+statement ok
+INSERT INTO rift_min_b VALUES
+ (1)
+
+-- Control query 1: succeeds.
+query II rowsort
+SELECT SUM(x) AS s, g
+FROM rift_min_a
+GROUP BY g
+HAVING EXISTS(SELECT 1 FROM rift_min_b) OR SUM(x) < 81
+----
+100
+2
+30
+1
+
+-- Control query 2: succeeds.
+query II rowsort
+SELECT SUM(x) AS s, g
+FROM rift_min_a
+GROUP BY g
+HAVING SUM(x) < 81 OR EXISTS(SELECT 1 FROM rift_min_b)
+----
+100
+2
+30
+1
+
+-- Control query 3: succeeds.
+query II rowsort
+SELECT SUM(x) AS s, g
+FROM rift_min_a
+GROUP BY g
+HAVING SUM(x) < 81 OR SUM(x) < 81
+----
+30
+1
+
+-- Failing query: should also be valid, but MonetDB rejects it.
+query II rowsort
+SELECT SUM(x) AS s, g
+FROM rift_min_a
+GROUP BY g
+HAVING SUM(x) < 81 OR EXISTS(SELECT 1 FROM rift_min_b) OR SUM(x) < 81
+----
+100
+2
+30
+1
+
+statement ok
+DROP TABLE IF EXISTS rift_min_b
+
+statement ok
+DROP TABLE IF EXISTS rift_min_a
+
diff --git a/sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
b/sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7964-optimize-limit-0-queries.test
@@ -0,0 +1,170 @@
+statement ok
+CREATE TABLE rift_digit (
+ d INT
+)
+
+statement ok
+INSERT INTO rift_digit VALUES
+ (0), (1), (2), (3), (4),
+ (5), (6), (7), (8), (9)
+
+statement ok
+CREATE TABLE rift_perf_a AS
+SELECT
+ d1.d * 1000 + d2.d * 100 + d3.d * 10 + d4.d AS id,
+ d1.d AS k,
+ 'payload' AS payload
+FROM rift_digit AS d1,
+ rift_digit AS d2,
+ rift_digit AS d3,
+ rift_digit AS d4
+WITH DATA
+
+statement ok
+CREATE TABLE rift_perf_b AS
+SELECT
+ d1.d * 1000 + d2.d * 100 + d3.d * 10 + d4.d AS id,
+ d4.d AS k,
+ 'payload' AS payload
+FROM rift_digit AS d1,
+ rift_digit AS d2,
+ rift_digit AS d3,
+ rift_digit AS d4
+WITH DATA
+
+query I nosort
+SELECT COUNT(*) FROM rift_perf_a
+----
+10000
+
+query I nosort
+SELECT COUNT(*) FROM rift_perf_b
+----
+10000
+
+-- Original query: returns zero rows because of LIMIT 0.
+-- In my test this query still kept a join plan.
+query IIT nosort
+SELECT
+ a.id AS aid,
+ b.id AS bid,
+ a.payload AS p
+FROM rift_perf_a AS a
+JOIN rift_perf_b AS b
+ ON a.k <> b.k
+WHERE a.id < 1000
+ AND b.id < 1000
+ AND (
+ a.k >= 0
+ OR EXISTS(SELECT 1 FROM rift_digit WHERE d = 1)
+ )
+ORDER BY a.payload, b.id
+LIMIT 0
+----
+
+-- show explain plan
+query T nosort
+EXPLAIN
+SELECT
+ a.id AS aid,
+ b.id AS bid,
+ a.payload AS p
+FROM rift_perf_a AS a
+JOIN rift_perf_b AS b
+ ON a.k <> b.k
+WHERE a.id < 1000
+ AND b.id < 1000
+ AND (
+ a.k >= 0
+ OR EXISTS(SELECT 1 FROM rift_digit WHERE d = 1)
+ )
+ORDER BY a.payload, b.id
+LIMIT 0
+----
+top N (
+| project (
+| | project (
+| | | select (
+| | | | left outer group join (
+| | | | | project (
+| | | | | | join (
+| | | | | | | select (
+| | | | | | | | table("sys"."rift_perf_a") [ "rift_perf_a"."id" as "a"."id",
"rift_perf_a"."k" as "a"."k", "rift_perf_a"."payload" as "a"."payload" ]
+| | | | | | | ) [ ("a"."id") < (int(17) "1000") ],
+| | | | | | | select (
+| | | | | | | | table("sys"."rift_perf_b") [ "rift_perf_b"."id" as "b"."id",
"rift_perf_b"."k" as "b"."k" ]
+| | | | | | | ) [ ("b"."id") < (int(17) "1000") ]
+| | | | | | ) [ ("a"."k") != ("b"."k") ]
+| | | | | ) [ "a"."id", "a"."k", "a"."payload", "b"."id" ],
+| | | | | project (
+| | | | | | select (
+| | | | | | | table("sys"."rift_digit") [ "rift_digit"."d" ]
+| | | | | | ) [ ("rift_digit"."d") = (int(4) "1") ]
+| | | | | ) [ tinyint(1) "1" as "%1"."%1" ]
+| | | | ) [ ] [ boolean(1) "true" as "%2"."%2" ]
+| | | ) [ (("a"."k") >= (int(4) "0")) or ("%2"."%2") ]
+| | ) [ "a"."id" as "aid", "b"."id" as "bid", "a"."payload" as "p" ]
+| ) [ "aid", "bid", "p" ] [ "p", "bid" ]
+) [ bigint(63) "0" ]
+
+
+-- Equivalent query: also returns zero rows.
+-- This version is optimized to a constant empty input.
+query IIT nosort
+SELECT
+ a.id AS aid,
+ b.id AS bid,
+ a.payload AS p
+FROM rift_perf_a AS a
+JOIN rift_perf_b AS b
+ ON a.k <> b.k
+WHERE a.id < 1000
+ AND b.id < 1000
+ AND (
+ a.k >= 0
+ OR EXISTS(SELECT 1 FROM rift_digit WHERE d = 1)
+ )
+ AND FALSE
+ORDER BY a.payload, b.id
+LIMIT 0
+----
+
+-- show explain plan
+query T nosort
+EXPLAIN
+SELECT
+ a.id AS aid,
+ b.id AS bid,
+ a.payload AS p
+FROM rift_perf_a AS a
+JOIN rift_perf_b AS b
+ ON a.k <> b.k
+WHERE a.id < 1000
+ AND b.id < 1000
+ AND (
+ a.k >= 0
+ OR EXISTS(SELECT 1 FROM rift_digit WHERE d = 1)
+ )
+ AND FALSE
+ORDER BY a.payload, b.id
+LIMIT 0
+----
+top N (
+| project (
+| | project (
+| | | select (
+| | | | [ int(17) NULL as "a"."id", varchar(7) NULL as "a"."payload", int(17)
NULL as "b"."id" ]
+| | | ) [ boolean(1) "false" ]
+| | ) [ "a"."id" as "aid", "b"."id" as "bid", "a"."payload" as "p" ]
+| ) [ "aid", "bid", "p" ] [ "p", "bid" ]
+) [ bigint(63) "0" ]
+
+statement ok
+DROP TABLE IF EXISTS rift_perf_b
+
+statement ok
+DROP TABLE IF EXISTS rift_perf_a
+
+statement ok
+DROP TABLE IF EXISTS rift_digit
+
diff --git a/sql/test/BugTracker-2026/Tests/7965-select-1-limit-0-bug.test
b/sql/test/BugTracker-2026/Tests/7965-select-1-limit-0-bug.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7965-select-1-limit-0-bug.test
@@ -0,0 +1,34 @@
+-- Failing query when using LIMIT 0
+query I nosort
+SELECT 1 LIMIT 0
+----
+
+-- Control query: succeeds and returns an empty result set.
+query I nosort
+SELECT 1 ORDER BY 1 LIMIT 0
+----
+
+-- query succeeds when using LIMIT 1
+query I nosort
+SELECT 1 LIMIT 1
+----
+1
+
+
+
+-- Failing query when using VALUES and LIMIT 0
+query I nosort
+SELECT * FROM (VALUES (1)) AS v(x) LIMIT 0
+----
+
+-- Control query using VALUES: succeeds and returns an empty result set.
+query I nosort
+SELECT * FROM (VALUES (1)) AS v(x) ORDER BY x LIMIT 0
+----
+
+-- query succeeds when using VALUES and LIMIT 1.
+query I nosort
+SELECT * FROM (VALUES (1)) AS v(x) LIMIT 1
+----
+1
+
diff --git
a/sql/test/BugTracker-2026/Tests/7966-optimize-select-distinct-from-union-queries.test
b/sql/test/BugTracker-2026/Tests/7966-optimize-select-distinct-from-union-queries.test
new file mode 100644
--- /dev/null
+++
b/sql/test/BugTracker-2026/Tests/7966-optimize-select-distinct-from-union-queries.test
@@ -0,0 +1,68 @@
+statement ok
+CREATE TABLE outer_distinct_union_t (
+ a INT
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]