Dec2025 (11.55)

The Dec2025 documentation can be found here.

Dec2025 Feature Release (11.55.1)

  • Extended MonetDB’s memory allocator framework from the SQL layer to all layers of the database server. The new memory allocator replaces all malloc() and free() function calls in the MonetDB (server) code base. The main features of the allocator framework include i) efficient processing of large numbers of memory allocation calls, and ii) efficient management of memory to avoid fragmentation. This update also enables fine-grained configuration and monitoring of memory usage per thread, per query, per client, etc.

  • This server is no longer compatible with the MonetDB Stethoscope.

  • Changed the way complex AND and OR expressions are handled. The new expression tree uses 2 new cmp flag (cmp_con/cmp_dis), both expressions hold lists of expressions. This structure reduces the need for stack space, allowing way larger expressions trees to be handled.

ODBC Driver

  • Corrected SQLColAttribute() and SQLGetDescField() for when FieldIdentifier is SQL_DESC_LITERAL_PREFIX or SQL_DESC_LITERAL_SUFFIX. They will now return the correct literal prefix or suffix string instead of an empty string depending on the datatype of the column.

MonetDB Common

  • log_tflush function, when flushnow flag is true, now passes bitmap array that indicates which bat id’s need to be sync’ed to disk, instead of passing NULL which would trigger a sync of the full catalog. If new bats are added to the catalog, they will be sync’ed always (see maxupdated flag).

MonetDB5 Server

  • We no longer persist querylog results. If you want to keep the data, make a copy into an SQL table.

  • The default_fast and minimal_fast optimizer pipelines have been removed. The default_pipe and minimal_pipe optimizers now use the “fast” path always.

  • The type “pcre” has been removed. There was no way to create a value of the type, and there was only one function that used a value of the type. That function (pcre.index) has also been removed.

SQL Frontend

  • New implementation for the CONTAINS filter function for string data types using a much faster algorithm based on the knowledge of the bigram occurrences of the to-be-filtered column.

  • Add functions to_hex(int) and to_hex(bigint). They return the unsigned hexadecimal string representation of their argument.

  • COPY BINARY has been optimized to be much faster when many string columns are involved.

  • The performance of COPY BINARY of blob column has also been improved.

  • The performance of COPY BINARY ON CLIENT has been much improved. It used to be much slower than ON SERVER, now it’s only a little slower.

  • The file format for COPY BINARY strings has been extended. If the same string occurs multiple times, later occurrences can refer back to earlier occurrences instead of including another copy of the string. This improves both file size and processing time.

  • A new example tool ‘backrefencode’ has been added that can introduce these back references or remove them again.

  • Experimental support for compressed ON CLIENT transfers has been added. If you write ON ‘algo’ CLIENT, with algo=lz4/gz/xz/b2, the server compresses downloaded data and decompresses uploaded data server-side using the given algorithm. It is up to the user to ensure that the uploaded data has indeed been compressed. This is not always easy because many clients automatically compress or decompress data when the file name contains .gz, .lz4, etc., which would lead to double compression and decompression.

  • Implemented aggregates sha1, sha224, sha256, sha384, sha512, and ripemd160 which calculate a checksum (digest) over a column of strings. It only makes sense to use these with an ordering, as SELECT sha256(name ORDER BY id) FROM table, since the ordering in which the values are fed into the digest algorithm is important and cannot otherwise be guaranteed.

  • EXPLAIN now supports a BEFORE/AFTER LOGICAL UNNEST/LOGICAL REWRITE/PHYSICAL clause to indicate which phase of query compilation to show. A plain EXPLAIN is equivalent to EXPLAIN AFTER REWRITE, which is what PLAN used to do. The old EXPLAIN is now EXPLAIN PHYSICAL. LOGICAL REWRITE also supports specifying two positive values, rewriter index number and optimizer loop cycle stop counter. SHOW DETAILS includes more information about properties, rewriters number of changes and time spent.

  • The PLAN keyword has been removed.

  • The TRACE prefix for SQL queries now no longer produces two result sets. Before, the first result set was the result of the query, and the second result set was timing information of the query execution. This second result set is no longer produced. Instead, use the (already existing) function sys.tracelog() or the view sys.tracelog to retrieve this information. As before, the table that is produced by the function/view is reset whenever a new TRACE prefixed query is executed.

  • Removed table returning function sys.optimizer_stats().

  • There are new types “inet4” and “inet6” which can hold respectively IPv4 and IPv6 internet addresses without CIDR network mask information. Netmask information can be held in a separate column if they are needed. The 0 address (0.0.0.0 and ::) are used as NULL value and can therefore not be used as addresses. Bitwise operations (AND, OR, XOR, NOT) are supported on the addresses, and there are various functions to check whether an address is contained in a (sub)net (where an extra CIDR netmask column is also needed).

  • Added the possibility to specify IF NOT EXISTS for the following CREATE statements: CREATE SEQUENCE IF NOT EXISTS seq_name … CREATE USER IF NOT EXISTS user_name … CREATE ROLE IF NOT EXISTS role_name … CREATE TYPE IF NOT EXISTS type_name … CREATE INDEX IF NOT EXISTS index_name ON … CREATE IMPRINTS INDEX IF NOT EXISTS index_name ON … CREATE ORDERED INDEX IF NOT EXISTS index_name ON … With IF NOT EXISTS specified these CREATE statements will not return an error when an object with the same name already exists. See doc: https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/

  • Added the possibility to specify IF EXISTS for the following DROP statements: DROP SEQUENCE IF EXISTS seq_name … DROP USER IF EXISTS user_name DROP ROLE IF EXISTS role_name DROP TYPE IF EXISTS type_name … DROP INDEX IF EXISTS index_name With IF EXISTS specified these statements will not return an error when the object does not exists. See doc: https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/drop-statement/

  • Added the possibility to specify IF EXISTS for two ALTER statements: ALTER SEQUENCE IF EXISTS seq_name … ALTER USER IF EXISTS user_name … With IF EXISTS specified these statements will not return an error when the object does not exists. See doc: https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/sequence-definition/ and https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/privileges/

  • It is now possible to change the type of a column by using a statement like ALTER TABLE t ALTER COLUMN c type;. The content of the column is converted to the new type using code similar to CAST(c AS type). If the conversion fails, the column type isn’t changed.

  • With COPY INTO, the USING DELIMITERS, DECIMAL, ESCAPE, NULL, BEST EFFORT and FWF clauses can now be given in any order. If a clause occurs multiple times, the last instance wins.

Bug Fixes

  • 7635: Unexpected Inner Join Crash

  • 7645: Unexpected Internal Error in Inner Join

  • 7651: Incorrect Anti Join Result

  • 7652: Incorrect Anti Join Result related to optimization

  • 7653: Incorrect Inner Join Result

  • 7663: Privilege Issue: the ALTER USER ... DEFAULT ROLE statement misses permission checks, which can cause privilege escalation to get other users’ privileges

  • 7664: Privilege Issue: the SET SESSION AUTHORIZATION statement will enable any user to alter other users’ MAX_WORKERS

  • 7665: MonetDB dev-builds crashes at sql_trans_drop_trigger()

  • 7666: MonetDB Mar2025-SP1 unexpectly shutdown with crafted GLOBAL TEMPORARY TABLE and ALTER TABLE statements

  • 7667: MonetDB Mar2025-SP1 crashes at rel_selects with a circular view

  • 7668: MonetDB Mar2025-SP1 crashes at key_dup()

  • 7669: MonetDB Mar2025-SP1 crashes at AUTHdecypherValue()

  • 7670: MonetDB Mar2025-SP1 crashes at exp_subtype()

  • 7672: MonetDB Mar2025-SP1 crashes at find_name()

  • 7673: MonetDB Mar2025-SP1 crashes at rel_value_exp2()

  • 7674: MonetDB Mar2025-SP1 crashes at rel_schemas()

  • 7677: Misleading error message “Could not allocate space”

  • 7689: Empty SQL result (no rows, no columns)

  • 7694: Unexpected execution result

  • 7695: Unexpected execution result

  • 7696: Unexpected execution result

  • 7697: Unexpected execution result

  • 7698: Unexpected Right Join Result

  • 7699: The OPTIMIZER string value in CREATE USER statement is not checked on validity.

  • 7701: Add possibility to set MAX_WORKERS to NO MAX_WORKERS in ALTER USER

  • 7702: Invalid handling of WHERE conditions

  • 7703: Unexpected Left Join Result

  • 7705: Unexpected Anti Join Result

  • 7706: Role (bob) missing

  • 7707: Unexpected Right Join Result

  • 7708: Unexpected Join Result

  • 7709: Monetdb crash when using field fcuntion

  • 7710: Monetdb crash when using char datatype

  • 7711: Unexpected Crash

  • 7712: Unexpected Out of Memory

  • 7713: Monetdb crashes when using group by

  • 7714: Monetdb crash when creating table using window function

  • 7715: Unexpected Anti Join Result

  • 7716: Unexpected Anti Join Result

  • 7717: a crash when executing sql

  • 7719: a crash using select

  • 7720: MonetDB server (Mar2025-SP2-release) crashes at stmt_cond

  • 7722: MonetDB server (Mar2025-SP2-release) crashes at rel_with_query

  • 7725: MonetDB server (Mar2025-SP2-release) crashes at bin_find_smallest_column

  • 7727: MonetDB server (Mar2025-SP2-release) crashes at exp_ref

  • 7730: Incorrect arithmetic in generate_series with month-based intervals

  • 7732: Missing column name in select expands to all columns in table

  • 7733: mserver5 assertion failure when started with -d2 –in-memory

  • 7734: ’epoch’ function doesn’t handle fractions with leading zeros correctly

  • 7735: crash in Monetdb

  • 7736: crash in MonetDB

  • 7737: SQL Query Optimizer / Performance Regression with Merge Tables in MonetDB 11.53

  • 7739: Unexpected Crash in Left Join

  • 7741: crash in MonetDB

  • 7742: crash in MonetDB

  • 7745: Unexpected Execution Results

  • 7748: MonetDB server crashes with “unexpected end of file” on UPDATE … RETURNING with EXISTS subquery

  • 7751: Continuation of Bug #7737

  • 7752: Internal error when executing a simple SQL query: TypeException:user.main[29]:‘mat.packIncrement’ undefined in: X_39:any := mat.packIncrement(X_37:bat[:lng], X_38:bat[:bte]);

  • 7753: mserver5.exe crashes when executing a simple query

  • 7763: MALexception throw in query with EXISTS and NULL