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]

Reply via email to