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]