Changeset: 74651779bfdc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/74651779bfdc
Modified Files:
        MonetDB.spec
        debian/control
        gdk/gdk_hash.c
        sql/test/BugTracker-2026/Tests/All
Branch: default
Log Message:

Merge with Dec2025 branch.


diffs (truncated from 803 to 300 lines):

diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -858,3 +858,4 @@ b4c2936c46f28ad6b3e59ed5a1a844726d521994
 691e862e16ceb7f720536063ed6d3c2e3d11e33a Dec2025_5
 691e862e16ceb7f720536063ed6d3c2e3d11e33a Dec2025_SP2_release
 1d742c123cb0e622d9a137b10bfbd7e4c446fde2 Dec2025_7
+1d742c123cb0e622d9a137b10bfbd7e4c446fde2 Dec2025_SP3_release
diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -155,6 +155,7 @@ Summary: MonetDB development files
 Group: Applications/Databases
 Requires: %{name}%{?_isa} = %{version}-%{release}
 Requires: %{name}-stream-devel%{?_isa} = %{version}-%{release}
+Requires: %{name}-client-devel%{?_isa} = %{version}-%{release}
 
 %description devel
 MonetDB is a database management system that is developed from a
diff --git a/debian/control b/debian/control
--- a/debian/control
+++ b/debian/control
@@ -34,7 +34,8 @@ Package: libmonetdb-dev
 Architecture: any
 Depends: ${shlibs:Depends}, ${misc:Depends},
  libmonetdb31 (= ${source:Version}),
- libmonetdb-stream-dev (= ${source:Version})
+ libmonetdb-stream-dev (= ${source:Version}),
+ libmonetdb-client-dev (= ${source:Version})
 Description: MonetDB development files
  MonetDB is a database management system that is developed from a
  main-memory perspective with use of a fully decomposed storage model,
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -343,7 +343,10 @@ HASHgrowbucket(BAT *b)
            HASHupgradehashheap(b) != GDK_SUCCEED)
                return GDK_FAIL;
 
-       while (h->nunique >= (nbucket = h->nbucket) * 7 / 8) {
+       if (h->nunique < (nbucket = h->nbucket) * 7 / 8)
+               return GDK_SUCCEED;
+       BATiter bi = bat_iterator(b);
+       do {
                BUN new = h->nbucket;
                BUN old = new & h->mask1;
                BUN mask = h->mask1 + 1; /* == h->mask2 - h->mask1 */
@@ -353,6 +356,7 @@ HASHgrowbucket(BAT *b)
                        if (HEAPextend(&h->heapbckt,
                                       h->heapbckt.size + GDK_mmap_pagesize,
                                       true) != GDK_SUCCEED) {
+                               bat_iterator_end(&bi);
                                return GDK_FAIL;
                        }
                        h->Bckt = h->heapbckt.base + HASH_HEADER_SIZE * 
SIZEOF_SIZE_T;
@@ -364,15 +368,16 @@ HASHgrowbucket(BAT *b)
                        if (h->width < SIZEOF_BUN &&
                            h->mask2 == ((BUN) 1 << (h->width * 8)) - 1) {
                                /* time to widen the hash table */
-                               if (HASHupgradehashheap(b) != GDK_SUCCEED)
+                               if (HASHupgradehashheap(b) != GDK_SUCCEED) {
+                                       bat_iterator_end(&bi);
                                        return GDK_FAIL;
+                               }
                        }
                }
                h->nbucket++;
                h->heapbckt.free += h->width;
                BUN lold, lnew, hb;
                lold = lnew = BUN_NONE;
-               BATiter bi = bat_iterator(b);
                if ((hb = HASHget(h, old)) != BUN_NONE) {
                        h->nheads--;
                        do {
@@ -399,7 +404,6 @@ HASHgrowbucket(BAT *b)
                                hb = HASHgetlink(h, hb);
                        } while (hb != BUN_NONE);
                }
-               bat_iterator_end(&bi);
                if (lnew == BUN_NONE)
                        HASHput(h, new, BUN_NONE);
                else
@@ -408,9 +412,8 @@ HASHgrowbucket(BAT *b)
                        HASHput(h, old, BUN_NONE);
                else
                        HASHputlink(h, lold, BUN_NONE);
-       }
-       h->heapbckt.dirty = true;
-       h->heaplink.dirty = true;
+       } while (h->nunique >= (nbucket = h->nbucket) * 7 / 8);
+       bat_iterator_end(&bi);
        TRC_DEBUG_IF(ACCELERATOR) if (h->nbucket > onbucket) {
                TRC_DEBUG_ENDIF(ACCELERATOR, ALGOBATFMT " " BUNFMT
                        " -> " BUNFMT " buckets (" LLFMT " usec)\n",
diff --git 
a/sql/test/BugTracker-2026/Tests/7945-GDKanalyticalnthvalue-crash.test 
b/sql/test/BugTracker-2026/Tests/7945-GDKanalyticalnthvalue-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7945-GDKanalyticalnthvalue-crash.test
@@ -0,0 +1,43 @@
+query RTR rowsort
+SELECT x
+ , nth_value ( 'bug' , 1 ) OVER ( RANGE BETWEEN UNBOUNDED PRECEDING AND 
CURRENT ROW )
+ , max ( x ) OVER ( ORDER BY x DESC RANGE BETWEEN CURRENT ROW AND 1 FOLLOWING )
+  FROM ( SELECT sql_div ( 3.400000 , locate ( '5.6' , 
'0.1.2.3.5.4.5.6.8.5.6.8' , 7 ) ) AS x
+       )
+----
+0.262
+bug
+0.262
+
+query RR rowsort
+SELECT x
+-- , nth_value ( 'bug' , 1 ) OVER ( RANGE BETWEEN UNBOUNDED PRECEDING AND 
CURRENT ROW )
+ , max ( x ) OVER ( ORDER BY x DESC RANGE BETWEEN CURRENT ROW AND 1 FOLLOWING )
+  FROM ( SELECT sql_div ( 3.400000 , locate ( '5.6' , 
'0.1.2.3.5.4.5.6.8.5.6.8' , 7 ) ) AS x
+         EXCEPT SELECT 11 AS x UNION SELECT 12 AS x UNION SELECT 13 AS x )
+----
+0.262
+0.262
+12.000
+12.000
+13.000
+13.000
+
+-- next reported query crashes in GDKanalyticalnthvalue (b=0x7f8d537a2cd8 
<BBP0+209048>, s=0x0, e=0x0, t=0x0, nth=0, tpe=18) at 
gdk/gdk_analytic_func.c:561
+query RTR rowsort
+SELECT x
+ , nth_value ( 'bug' , 1 ) OVER ( RANGE BETWEEN UNBOUNDED PRECEDING AND 
CURRENT ROW )
+ , max ( x ) OVER ( ORDER BY x DESC RANGE BETWEEN CURRENT ROW AND 1 FOLLOWING )
+  FROM ( SELECT sql_div ( 3.400000 , locate ( '5.6' , 
'0.1.2.3.5.4.5.6.8.5.6.8' , 7 ) ) AS x
+         EXCEPT SELECT 11 AS x UNION SELECT 12 AS x UNION SELECT 13 AS x )
+----
+0.262
+bug
+0.262
+12.000
+bug
+12.000
+13.000
+bug
+13.000
+
diff --git 
a/sql/test/BugTracker-2026/Tests/7946-GDKanalyticalnthvalue-crash.test 
b/sql/test/BugTracker-2026/Tests/7946-GDKanalyticalnthvalue-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7946-GDKanalyticalnthvalue-crash.test
@@ -0,0 +1,48 @@
+-- next query with commented out 'UNION SELECT nth_value()' part works
+query II rowsort
+SELECT DISTINCT x
+ , CASE WHEN x > 12 THEN 1 WHEN x <= 0.080000 THEN 4 ELSE 0 END AS x
+  FROM ( SELECT 1 , 3 , 3 FROM generate_series ( 42749 , 5 ) ) AS x
+     , ( SELECT 10 AS x
+          UNION
+         SELECT 11 AS x
+--        UNION
+--       SELECT nth_value ( - 51 * - - 12 * - 27 * CASE WHEN NOT '_b_' IN ( - 
69 , ( SUM ( DISTINCT CAST( NULL AS INTEGER ) ) ) + MAX ( - 6 ) + - COUNT ( * ) 
/ - - ( 77 ) + 37 , 44 , - - 0 * 23 , - - 86 , '_b%' , 'abc' , ( SELECT 10 ) , 
FALSE ) THEN 'three' WHEN NOT - 21 / - 95 IS NOT NULL THEN 63 END , '1' ) OVER 
( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING )
+          UNION
+         SELECT 13 AS x
+      )
+----
+10
+0
+11
+0
+13
+1
+
+-- test the crashing 'SELECT nth_value()' query independently
+query I rowsort
+SELECT nth_value ( - 51 * - - 12 * - 27 * CASE WHEN NOT '_b_' IN ( - 69 , ( 
SUM ( DISTINCT CAST( NULL AS INTEGER ) ) ) + MAX ( - 6 ) + - COUNT ( * ) / - - 
( 77 ) + 37 , 44 , - - 0 * 23 , - - 86 , '_b%' , 'abc' , ( SELECT 10 ) , FALSE 
) THEN 'three' WHEN NOT - 21 / - 95 IS NOT NULL THEN 63 END , '1' ) OVER ( 
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING )
+----
+
+-- the orginal reported query, but with added DISTINCT to reduce output
+-- it crashes in GDKanalyticalnthvalue (b=0x7f3d7ef99a68 <BBP0+171560>, s=0x0, 
e=0x0, t=0x7f3d7ef9a348 <BBP0+173832>, nth=0, tpe=9) at 
gdk/gdk_analytic_func.c:474
+query II rowsort
+SELECT DISTINCT x
+ , CASE WHEN x > 12 THEN 1 WHEN x <= 0.080000 THEN 4 ELSE 0 END AS x
+  FROM ( SELECT 1 , 3 , 3 FROM generate_series ( 42749 , 5 ) ) AS x
+     , ( SELECT 10 AS x
+          UNION
+         SELECT 11 AS x
+          UNION
+         SELECT nth_value ( - 51 * - - 12 * - 27 * CASE WHEN NOT '_b_' IN ( - 
69 , ( SUM ( DISTINCT CAST( NULL AS INTEGER ) ) ) + MAX ( - 6 ) + - COUNT ( * ) 
/ - - ( 77 ) + 37 , 44 , - - 0 * 23 , - - 86 , '_b%' , 'abc' , ( SELECT 10 ) , 
FALSE ) THEN 'three' WHEN NOT - 21 / - 95 IS NOT NULL THEN 63 END , '1' ) OVER 
( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING )
+          UNION
+         SELECT 13 AS x
+       )
+----
+10
+0
+11
+0
+13
+1
+
diff --git a/sql/test/BugTracker-2026/Tests/7947-exp_bin-crash.test 
b/sql/test/BugTracker-2026/Tests/7947-exp_bin-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7947-exp_bin-crash.test
@@ -0,0 +1,41 @@
+-- next query with commented out 'UNION SELECT - endsWith () ...' part works
+query I rowsort
+SELECT lead ( x ) OVER ( PARTITION BY ( x % 10 ) ) = 0 AS x
+ FROM ( SELECT 1 AS x
+         UNION
+        SELECT 1.500000 AS x
+--         UNION
+--        SELECT - endsWith ( 'johndoe' , 'doe' ) - 12 * - 27 * CASE WHEN NOT 
NULL IN
+--         ( - 69 , ( SELECT ( SELECT repeat ( 'a' , 66000 ) ) LIMIT 1 OFFSET 
1 ) > ANY ( CASE - ( 0 ) WHEN 18 + - 60 THEN NULL WHEN - CASE - 67 WHEN - 79 * 
COUNT ( * ) OVER ( ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) / 30 - 32 * 69 
THEN MAX ( DISTINCT 34 ) / 0 ELSE NULL END * ( 45 ) + 19 * 552 THEN 20 WHEN SUM 
( 78 ) + 69 THEN 29 * 74 ELSE NULLIF ( 82 , 72 + 26 ) * 7 END * - 92 LIKE 
'%d%n' ) + 37 , 44 , - - 0 * 23 , - - 86 , 3 , 'e' ) THEN 41
+--          WHEN NOT - 21 / - 95 IS NOT NULL THEN 63 END AS x
+      )
+WHERE x NOT IN ( SELECT sum ( SUBSTRING ( x , 1 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + NULLIF ( NULL , 0 ) + 0.100000 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + 0.100000 + 3 ) ) OVER ( ROWS BETWEEN CURRENT ROW AND 
CURRENT ROW ) AS x
+                 UNION SELECT 2 AS x
+                 UNION SELECT 3 AS x )
+----
+
+-- test the crashing 'SELECT - endsWith () ...' query independently
+-- it crashes in exp_bin (be=0x7fa90c1a6180, e=0x7fa90c1b3f40, 
left=0x7fa90c1460f0, right=0x0, grp=0x0, ext=0x0, cnt=0x0, sel=0x0, depth=15, 
reduce=0, push=1) at sql/backends/monet5/rel_bin.c:1736
+query I rowsort
+SELECT - endsWith ( 'johndoe' , 'doe' ) - 12 * - 27 * CASE WHEN NOT NULL IN
+         ( - 69 , ( SELECT ( SELECT repeat ( 'a' , 66000 ) ) LIMIT 1 OFFSET 1 
) > ANY ( CASE - ( 0 ) WHEN 18 + - 60 THEN NULL WHEN - CASE - 67 WHEN - 79 * 
COUNT ( * ) OVER ( ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) / 30 - 32 * 69 
THEN MAX ( DISTINCT 34 ) / 0 ELSE NULL END * ( 45 ) + 19 * 552 THEN 20 WHEN SUM 
( 78 ) + 69 THEN 29 * 74 ELSE NULLIF ( 82 , 72 + 26 ) * 7 END * - 92 LIKE 
'%d%n' ) + 37 , 44 , - - 0 * 23 , - - 86 , 3 , 'e' ) THEN 41
+          WHEN NOT - 21 / - 95 IS NOT NULL THEN 63 END AS x
+----
+
+-- the orginal reported query
+-- it crashes in exp_bin (be=0x7fa90c1a6180, e=0x7fa90c1b3f40, 
left=0x7fa90c1460f0, right=0x0, grp=0x0, ext=0x0, cnt=0x0, sel=0x0, depth=15, 
reduce=0, push=1) at sql/backends/monet5/rel_bin.c:1736
+query I rowsort
+SELECT lead ( x ) OVER ( PARTITION BY ( x % 10 ) ) = 0 AS x
+ FROM ( SELECT 1 AS x
+         UNION
+        SELECT 1.500000 AS x
+         UNION
+        SELECT - endsWith ( 'johndoe' , 'doe' ) - 12 * - 27 * CASE WHEN NOT 
NULL IN
+         ( - 69 , ( SELECT ( SELECT repeat ( 'a' , 66000 ) ) LIMIT 1 OFFSET 1 
) > ANY ( CASE - ( 0 ) WHEN 18 + - 60 THEN NULL WHEN - CASE - 67 WHEN - 79 * 
COUNT ( * ) OVER ( ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) / 30 - 32 * 69 
THEN MAX ( DISTINCT 34 ) / 0 ELSE NULL END * ( 45 ) + 19 * 552 THEN 20 WHEN SUM 
( 78 ) + 69 THEN 29 * 74 ELSE NULLIF ( 82 , 72 + 26 ) * 7 END * - 92 LIKE 
'%d%n' ) + 37 , 44 , - - 0 * 23 , - - 86 , 3 , 'e' ) THEN 41
+          WHEN NOT - 21 / - 95 IS NOT NULL THEN 63 END AS x
+      )
+WHERE x NOT IN ( SELECT sum ( SUBSTRING ( x , 1 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + NULLIF ( NULL , 0 ) + 0.100000 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + 0.100000 + 3 ) ) OVER ( ROWS BETWEEN CURRENT ROW AND 
CURRENT ROW ) AS x
+                 UNION SELECT 2 AS x
+                 UNION SELECT 3 AS x )
+----
+
diff --git a/sql/test/BugTracker-2026/Tests/7948-exp_bin-first_value-crash.test 
b/sql/test/BugTracker-2026/Tests/7948-exp_bin-first_value-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7948-exp_bin-first_value-crash.test
@@ -0,0 +1,8 @@
+query I nosort
+SELECT MIN ( x )
+  FROM ( WITH RECURSIVE x ( x ) AS ( SELECT RANK ( ) OVER ( ORDER BY x , x ) 
AS x FROM ( SELECT 1 AS x ) WHERE x IN ( SELECT ( row_number ( ) OVER ( ) ) 
FROM ( SELECT CAST( NULL AS INT ) AS x , 'v1' AS x , 1 AS x , 2 AS x UNION 
SELECT NULL , 'v1' , 1 , 2 ) AS x ) )
+         SELECT x * ( not_like ( 'abc' , '_C_' , NULLIF ( ( SELECT sum ( x ) 
OVER ( ROWS BETWEEN CURRENT ROW AND CURRENT ROW ) AS x UNION SELECT 2 AS x 
UNION SELECT 3 AS x ) , 1 ) NOT IN ( 2 , 3 , FIRST_VALUE ( 999 ) OVER ( ) ) , 
TRUE ) + x ) AS x
+           FROM x ) AS x
+----
+1
+
diff --git a/sql/test/BugTracker-2026/Tests/7949-exp_match-crash.test 
b/sql/test/BugTracker-2026/Tests/7949-exp_match-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7949-exp_match-crash.test
@@ -0,0 +1,19 @@
+-- the query without the 'GROUP BY CUBE ( x , x , x )' part doesn't crash
+query I rowsort
+SELECT * FROM (
+ SELECT * FROM (
+  SELECT 1 AS x )
+ WHERE x IN ( SELECT DISTINCT - 82 * 26 - 12 * - 27 * CASE WHEN NOT NULL IN ( 
- 69 , 1 * CASE x * ( CAST( 1 AS REAL ) ) + 1 + 1 + 1 + 1 + 1 + 1 + 1.000000 - 
( SELECT CAST( 1 AS CHAR ( 1 ) ) AS x WHERE x LIKE 1.000000 ) + 1 + 1 * x * ( 
SELECT 1 ) + x + 1 + 1 + 1.000000 + 1 + 1 + 1 WHEN x THEN 1 WHEN 'x' THEN 'x' 
END + 37 , 44 , - - 0 * 23 , - 3421 * MAX ( - 94 * 0 ) , 3 , 12 ) THEN 41 WHEN 
NOT - 21 / - 95 IS NOT NULL THEN 63 END AS x )
+             )
+----
+
+-- the orginal reported query
+-- it crashes in exp_match (e1=0x7f840000001c, e2=0x7f84981bef20) at 
sql/server/rel_exp.c:1259
+query I rowsort
+SELECT * FROM (
+ SELECT * FROM (
+  SELECT 1 AS x )
+ WHERE x IN ( SELECT DISTINCT - 82 * 26 - 12 * - 27 * CASE WHEN NOT NULL IN ( 
- 69 , 1 * CASE x * ( CAST( 1 AS REAL ) ) + 1 + 1 + 1 + 1 + 1 + 1 + 1.000000 - 
( SELECT CAST( 1 AS CHAR ( 1 ) ) AS x WHERE x LIKE 1.000000 ) + 1 + 1 * x * ( 
SELECT 1 ) + x + 1 + 1 + 1.000000 + 1 + 1 + 1 WHEN x THEN 1 WHEN 'x' THEN 'x' 
END + 37 , 44 , - - 0 * 23 , - 3421 * MAX ( - 94 * 0 ) , 3 , 12 ) THEN 41 WHEN 
NOT - 21 / - 95 IS NOT NULL THEN 63 END AS x GROUP BY CUBE ( x , x , x ) )
+             )
+----
+
diff --git a/sql/test/BugTracker-2026/Tests/7950-exp_set_type-crash.test 
b/sql/test/BugTracker-2026/Tests/7950-exp_set_type-crash.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2026/Tests/7950-exp_set_type-crash.test
@@ -0,0 +1,32 @@
+-- query without the complex 'ORDER BY x IN ( SELECT ... ) ASC' part doesn't 
crash
+query TR rowsort
+SELECT nth_value ( ( EXISTS ( SELECT 1 WHERE x > 0.100000 + 0.100000 + 
0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 0.100000 + 
0.100000 + 0.100000 + 0.100000 + 0.100000 * 0.100000 + 0.100000 AND ( x IS NULL 
OR x IS NULL )
+                            )
+                   ) IN ( ( SELECT FALSE
+                          )
+                        ) , 1 ) OVER ( )
+ , LOG ( DISTINCT x )
+  FROM ( SELECT CAST( NULL AS VARCHAR ) AS x
+          UNION
+         SELECT CAST( NULL AS VARCHAR ) AS x )
+----
+True
+NULL
+
+-- the orginal reported query
+-- it crashes in exp_set_type (v=0x7fba7ce35790, rel=0x7fba4821cca0, 
e=0x7fba481be3f0, depth=0) at sql/server/rel_unnest.c:2786
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to