VersionDrift
Product

ClickHouse 26.6.8.7 → 26.9.24.8

93 releases · 81 breaking changes · 7 security fixes · 0 advisories fixed

7security81breaking0deprecated117feature744fix

Breaking changes

  • breaking Backported in: Remove object addresses from NATS, io_uring and HDFS messages. (Raúl Marín). in 26.9.24.8
  • breaking Backported in: Remove object addresses from logical error messages. (Raúl Marín). in 26.9.24.8
  • breaking Backported in: CREATE TABLE x AS src inherits the credentials embedded in the engine of src, which are masked in SHOW CREATE TABLE. It now requires the SELECT privilege on src when the inherited definition can carry credentials, instead of only SHOW COLUMNS. (Yarik Briukhovetskyi). in 26.9.21.9
  • breaking Backported in: Overriding a key that is stored in a named collection now requires SHOW NAMED COLLECTIONS SECRETS on that collection. This also applies to overrides through an alias (including flat kafka_* settings over nested kafka.* keys), through a SETTINGS clause of a table engine or table… in 26.9.20.23
  • breaking Backported in: Remove --icf=safe linker warnings about SHT_LLVM_ADDRSIG in the stripped Rust libraries. (Raúl Marín). in 26.9.8.3
  • breaking Backported in: Update the zxc library to v0.14.0, which changes the compressed block format of the experimental ZXC codec. Data written with CODEC(ZXC) by earlier versions cannot be read by the new version and fails with CANNOT_DECOMPRESS. If you used the experimental ZXC codec, re-encode the… in 26.9.6.6
  • breaking Backported in: A MySQL dictionary source created with a CREATE DICTIONARY query can no longer enable enable_local_infile, at the source or at one of its REPLICA entries; loading such a dictionary fails with BAD_ARGUMENTS, which with the default dictionaries_lazy_load is on first use rather than at… in 26.9.2.8
  • breaking The default compression method is changed from LZ4 to ZSTD(3). For client/server and server/server network communication it switches uniformly to ZSTD(3). For on-disk table data, MergeTree column data now uses a size-aware built-in default — LZ4 below 100 MB and ZSTD(3) at or above it, applied to… in 26.9.1.1629
  • breaking Removed the CatBoost integration. The catboostEvaluate function, the system.models table and the SYSTEM RELOAD MODEL(S) queries are no longer available. Queries, views and grants referring to them have to be migrated before the upgrade: in particular, revoke SYSTEM RELOAD MODEL from all users and… in 26.9.1.1629
  • breaking Fix setting temporary_files_buffer_size or format_avro_schema_registry_* to an out-of-range value making every subsequent query in the session fail, with no way to recover; the values are now bounded when they are set. (Pedro Ferreira). in 26.9.1.1629
  • breaking Fixed wrong results from runningConcurrency. Its value depends on the rows processed before it, but it declared itself deterministic within a query, so a predicate on it above a LEFT or ANY join let optimizer passes rewrite the join and change the row set it sees, and if, multiIf, and and or… in 26.9.1.1629
  • breaking The experimental WINDOW VIEW feature is removed, together with the WATCH statement and the windowID function. It has been non-functional since version 24.12 (inserts into the source table were silently not delivered to window views) and was never supported by the analyzer, which is enabled by… in 26.9.1.1629
  • breaking Removed the deprecated read_resource and write_resource disk options from storage_configuration. Attach a scheduler resource to a disk with CREATE RESOURCE name (READ DISK disk, WRITE DISK disk) instead. (Sergei Trifonov). in 26.9.1.1629
  • breaking Removed the WasmEdge engine for WebAssembly UDFs. wasmtime, which has always been the default, is now the only supported value of the webassembly_udf_engine server setting. A server configured with wasmedge will not start; remove that setting or set it to wasmtime. On binaries where wasmtime is… in 26.9.1.1629
  • breaking Removed the sharded GROUP BY aggregation (setting enable_sharding_aggregator, disabled by default) in favor of the adaptive aggregation (enable_adaptive_aggregator, enabled by default), which targets the same high cardinality workloads without the weaknesses on skewed or low-cardinality keys and… in 26.9.1.1629
  • breaking Backported in: Outbound TLS connections now verify that the server certificate names the host that was connected to. This affects clickhouse-client --secure, remoteSecure(), Distributed over the secure native protocol, secure Keeper connections, and HTTPS clients such as s3(), url(), HTTP… in 26.9.1.1629
  • breaking max_bytes_before_external_join and max_bytes_ratio_before_external_join are now the spill threshold for every hash-based join_algorithm, including grace_hash, which previously ignored them and spilled on max_rows_in_join / max_bytes_in_join instead. Those two are a hard cap again for every… in 26.9.1.1629
  • breaking Setting allow_experimental_codecs is obsolete. Use the per-codec settings enable__codec instead. (Raufs Dunamalijevs). in 26.9.1.1629
  • breaking Reading a File source with rename_files_after_processing set now requires the WRITE ON FILE grant on top of READ ON FILE, on the initiator for fileCluster: the setting renames the files a SELECT has read, which is a write to the source, and it used to happen for anyone who could read them. A query… in 26.9.1.1629
  • breaking The interface and http_method columns of system.query_log, system.query_thread_log and system.processes are now Enum8 instead of UInt8, over the value set system.session_log.interface already uses, plus Unknown for an unrecognized reported interface. Comparing to a number keeps working (WHERE… in 26.9.1.1629
  • breaking The analyzer can no longer be disabled: the enable_analyzer setting (and its old name allow_experimental_analyzer) is obsolete, an attempt to set it to 0 is rejected, and the compatibility setting no longer reverts it. The analyzer has been the default since 24.3, and the query analysis used… in 26.9.1.1629
  • breaking CREATE TABLE ... AS mergeTreeIndex(...) is no longer accepted, nor the same form over mergeTreeProjection, mergeTreeAnalyzeIndexes, mergeTreeAnalyzeIndexesUUID, mergeTreeTextIndex and mergeTreeCodecBlockCounts. The storage these functions return holds its source table's storage object, so once… in 26.9.1.1629
  • breaking Headers that Google Cloud Storage spells with an x-goog- prefix are now translated for every request, not only for server-side copies. Custom object metadata written to GCS over the S3 API without HMAC credentials — how ClickHouse Cloud on GCP accesses object storage — previously did not take… in 26.9.1.1629
  • breaking Nullable(Tuple(...)) is now generally available and enabled by default. Nullable(Tuple(...)) columns can be created without any setting, schema inference of nullable structs in the Parquet, Arrow, ORC, Avro and JSON formats returns Nullable(Tuple(...)), and a Tuple subcolumn extracted from a… in 26.9.1.1629
  • breaking Remove s3_disable_checksum, since checksum calculation for S3 does not read the source second time anymore (previously the problem was that sources has been read twice, once for sending data, second for checksum calculation). (Azat Khuzhin). in 26.9.1.1629
  • breaking CREATE TABLE ... AS timeSeriesSamples(...) is no longer accepted, nor over its alias timeSeriesData or over timeSeriesTags and timeSeriesMetrics. The persisted proxy renamed that live target table in memory on first read: DROP TABLE then dropped the user's table and destroyed its rows, and reads… in 26.9.1.1629
  • breaking New setting validate_group_by_all_key_types (default true) gates the key type validation that GROUP BY ALL applies to the grouping keys it expands the SELECT expressions into. Since 26.7 it rejects a Variant or Dynamic grouping key, for example an untyped JSON subpath, that earlier versions… in 26.9.1.1629
  • breaking Backported in: CREATE TABLE x AS src inherits the credentials embedded in the engine of src, which are masked in SHOW CREATE TABLE. It now requires the SELECT privilege on src when the inherited definition can carry credentials, instead of only SHOW COLUMNS. (Yarik Briukhovetskyi). in 26.8.32.14
  • breaking Backported in: Overriding a key that is stored in a named collection now requires SHOW NAMED COLLECTIONS SECRETS on that collection. This also applies to overrides through an alias (including flat kafka_* settings over nested kafka.* keys), through a SETTINGS clause of a table engine or table… in 26.8.29.10
  • breaking Outbound TLS connections no longer verify that the server certificate names the host by default (reverts https://github.com/ClickHouse/ClickHouse/pull/116724), because it broke clickhouse-client --tls-sni-override. Set openSSL.client.extendedVerification to true to enable the check. (Nikita… in 26.8.26.12
  • breaking Backported in: Remove --icf=safe linker warnings about SHT_LLVM_ADDRSIG in the stripped Rust libraries. (Raúl Marín). in 26.8.16.41
  • breaking Backported in: Update the zxc library to v0.14.0, which changes the compressed block format of the experimental ZXC codec. Data written with CODEC(ZXC) by earlier versions cannot be read by the new version and fails with CANNOT_DECOMPRESS. If you used the experimental ZXC codec, re-encode the… in 26.8.15.10
  • breaking Backported in: A MySQL dictionary source created with a CREATE DICTIONARY query can no longer enable enable_local_infile, at the source or at one of its REPLICA entries; loading such a dictionary fails with BAD_ARGUMENTS, which with the default dictionaries_lazy_load is on first use rather than at… in 26.8.12.53
  • breaking Backported in: Outbound TLS connections now verify that the server certificate names the host that was connected to. This affects clickhouse-client --secure, remoteSecure(), Distributed over the secure native protocol, secure Keeper connections, and HTTPS clients such as s3(), url(), HTTP… in 26.8.10.6
  • breaking Backported in: New setting validate_group_by_all_key_types (default true) gates the key type validation that GROUP BY ALL applies to the grouping keys it expands the SELECT expressions into. Since 26.7 it rejects a Variant or Dynamic grouping key, for example an untyped JSON subpath, that earlier… in 26.8.7.19
  • breaking Backported in: Reading a File source with rename_files_after_processing set now requires the WRITE ON FILE grant on top of READ ON FILE, on the initiator for fileCluster: the setting renames the files a SELECT has read, which is a write to the source, and it used to happen for anyone who could… in 26.8.3.105
  • breaking This patch changes how object storage disk transactions work. Now, native to the metadata storage transactions will be used by default instead of the fake ones used before. (Mikhail Artemenko). in 26.8.1.2041
  • breaking The server now refuses to start (and rejects SYSTEM RELOAD CONFIG) when the server config contains an unknown top-level element, instead of silently ignoring it. Audit your config before upgrading: stale sections left over from older versions, sections consumed by forks/third-party tooling, and… in 26.8.1.2041
  • breaking For views whose body is a plain SELECT over a single Distributed table, the whole outer query is now pushed to the shards (new setting optimize_trivial_view_pushdown_to_distributed, enabled by default). This changes observable behaviour for such views: FINAL and SAMPLE written on the view… in 26.8.1.2041
  • breaking Lightweight UPDATE patch parts now use a new v2 on-disk format sorted by (sorting_key..., _block_number, _block_offset) and applied with a new merging algorithm. Peak memory is bounded by the largest equal-sort-key run instead of the full patch, and updates that cross merge boundaries no longer… in 26.8.1.2041
  • breaking An unquoted JSON number for a DateTime64/DateTime column in JSONEachRow and similar formats is now interpreted as a Unix timestamp (seconds since the epoch) with optional sub-second precision, consistent with the Values format, CAST and toDateTime64. Previously a number with a fractional part… in 26.8.1.2041
  • breaking The default value of the max_insert_threads setting has been changed from 1 (no parallelism) to auto, which resolves to the number of CPU cores available to the server (reduced under memory pressure via max_insert_threads_min_free_memory_per_thread). This parallelizes INSERT SELECT by default and… in 26.8.1.2041
  • breaking Reading a CSV bare Tuple now takes one field per element in every position, so a \N in the field of a top-level element is that element and input_format_null_as_default applies to it. Previously a leading \N was taken for the whole column being null, so the row was replaced by the column default… in 26.8.1.2041
  • breaking Added the VALID FOR clause to CREATE USER and ALTER USER as a shorthand for VALID UNTIL. The expiration deadline is computed as the current time plus the given interval at query execution time and stored in the VALID UNTIL form. The valid_until column of the system.users table now has the type… in 26.8.1.2041
  • breaking Fixed SYSTEM STOP/START CLEANUP and SYSTEM STOP/START VIRTUAL PARTS UPDATE ON CLUSTER requiring SYSTEM PULLING REPLICATION LOG instead of SYSTEM CLEANUP / SYSTEM VIRTUAL PARTS UPDATE. (Groene AI). in 26.8.1.2041
  • breaking EXPLAIN SYNTAX now returns the reformatted query as a single String record (with embedded newlines) instead of one record per line, so its output is a recoverable single row that is directly usable (for example, SELECT count() FROM (EXPLAIN SYNTAX ...) returns 1). This is controlled by the new… in 26.8.1.2041
  • breaking The PostgreSQL and MaterializedPostgreSQL database engines now respect the server's remote_url_allow_hosts configuration, like the PostgreSQL table engine, the postgresql table function, and DDL-created dictionaries already do. The policy is enforced on CREATE DATABASE and on a user-issued ATTACH… in 26.8.1.2041
  • breaking Extended the supported range of Date32 from [1900-01-01, 2299-12-31] to [0000-01-01, 9999-12-31], matching DateTime64. Parsing and conversions now accept the extended range instead of silently clamping to the old boundaries. Backward compatibility notes: in the numeric conversion toDate32(N),… in 26.8.1.2041
  • breaking The experimental ALP codec now performs Float32 scaling arithmetic in Float64, which eliminates exceptions on decimal data and significantly improves compression ratios. (Raufs Dunamalijevs). in 26.8.1.2041
  • breaking Removed the library dictionary source. It was created for a single customer a very long time ago, it required writing a shared library against an undocumented C ABI, and it was already disabled in ClickHouse Cloud. SOURCE(LIBRARY(...)) now fails with UNKNOWN_ELEMENT_IN_CONFIG, like any other… in 26.8.1.2041
  • breaking Removed the Apache Arrow library-based reader and writer for the Arrow and ArrowStream formats. The native ClickHouse implementation, which has been the default since 26.7, is now the only one. The settings input_format_arrow_use_native_reader and output_format_arrow_use_native_writer are… in 26.8.1.2041
  • breaking The TLS credentials of a MySQL source (ssl_ca, ssl_cert, ssl_key) can no longer be specified as file paths from SQL — in a named collection created with CREATE NAMED COLLECTION, as a query argument, or in a CREATE DICTIONARY query — because the server opens those files with its own privileges.… in 26.8.1.2041
  • breaking Reject timespan setting (milliseconds/seconds) values that overflow Int64 microseconds. (Azat Khuzhin). in 26.8.1.2041
  • breaking arrayIntersect and arraySymmetricDifference no longer treat a value repeated inside a single argument as if it appeared in several arguments. Queries relying on the previous behavior can now return different results: arrayIntersect([1], [2], [1, 1]) returns [] instead of [1], arrayIntersect([1,… in 26.8.1.2041
  • breaking disable_insertion_and_mutation now prevents background consumption from Kafka, RabbitMQ, and NATS tables while still allowing direct writes to external storage. Gated Kafka2, NATS, and RabbitMQ tables do not initialize consumers for direct SELECT. The recently introduced… in 26.8.1.2041
  • breaking A window PARTITION BY or ORDER BY over an AggregateFunction column is now rejected with ILLEGAL_COLUMN, as top-level ORDER BY over such a column already was. Previously such a query was accepted by at least one analyzer, and window PARTITION BY partitioned differently depending on max_threads. The… in 26.8.1.2041
  • breaking Fix access checks for the SYSTEM ... CACHE ON CLUSTER commands. They required the SYSTEM DROP CACHE privilege group instead of the privilege of the individual command, which both denied holders of a single granular cache privilege and let a holder of the group run SYSTEM SYNC FILESYSTEM CACHE ON… in 26.8.1.2041
  • breaking The include_from setting no longer defaults to /etc/metrika.xml. Previously that file was used for configuration substitutions whenever it existed, even though nothing in the ClickHouse configuration referred to it. If you relied on that implicit substitutions file, add /etc/metrika.xml explicitly… in 26.8.1.2041
  • breaking The NATS table engine accepts credentials inline in the new nats_credentials setting (the same payload as a .creds file), and no longer accepts nats_credential_file from SQL: the path is a reference to a file on the server filesystem, which the server opens with its own privileges, so it can only… in 26.8.1.2041
  • breaking Asynchronous metrics can now have the Map data type, and the per-CPU-core and per-device metrics were converted to single key-value metrics: OSUserTimeCPU0, OSUserTimeCPU1, ... became a single OSUserTimeCPU metric with a map from the CPU core number to the value (and similarly for the other… in 26.8.1.2041
  • breaking Added a new join_algorithm value parallel_full_sorting_merge: for hash-compatible equality joins, it shards a full sorting merge join by the hash of the join keys into independent per-shard merge joins running on all threads. It keeps the low, streaming memory usage of a merge join while… in 26.8.1.2041
  • breaking Backported in: CREATE TABLE x AS src inherits the credentials embedded in the engine of src, which are masked in SHOW CREATE TABLE. It now requires the SELECT privilege on src when the inherited definition can carry credentials, instead of only SHOW COLUMNS. (Yarik Briukhovetskyi). in 26.7.35.11
  • breaking Backported in: Overriding a key that is stored in a named collection now requires SHOW NAMED COLLECTIONS SECRETS on that collection. This also applies to overrides through an alias (including flat kafka_* settings over nested kafka.* keys), through a SETTINGS clause of a table engine or table… in 26.7.32.7
  • breaking Backported in: Remove --icf=safe linker warnings about SHT_LLVM_ADDRSIG in the stripped Rust libraries. (Raúl Marín). in 26.7.19.5
  • breaking Backported in: A MySQL dictionary source created with a CREATE DICTIONARY query can no longer enable enable_local_infile, at the source or at one of its REPLICA entries; loading such a dictionary fails with BAD_ARGUMENTS, which with the default dictionaries_lazy_load is on first use rather than at… in 26.7.15.52
  • breaking Backported in: Outbound TLS connections now verify that the server certificate names the host that was connected to. This affects clickhouse-client --secure, remoteSecure(), Distributed over the secure native protocol, secure Keeper connections, and HTTPS clients such as s3(), url(), HTTP… in 26.7.14.3
  • breaking Backported in: Reading a File source with rename_files_after_processing set now requires the WRITE ON FILE grant on top of READ ON FILE, on the initiator for fileCluster: the setting renames the files a SELECT has read, which is a write to the source, and it used to happen for anyone who could… in 26.7.7.92
  • breaking Remove bad tests on 26.7. (Alexey Milovidov). in 26.7.4.58
  • breaking The / glob (any amount of directories) now also matches the same directory. Previously, / in glob patterns was not handled as a special case, so data/**/file.txt would not match data/file.txt (zero directory levels). (Alexey Milovidov). in 26.7.1.1315
  • breaking Reject the zip/zipx backup archive format for backups stored on object storage — direct S3(...)/AzureBlobStorage(...) destinations and Disk(...) destinations backed by S3 or Azure — for both BACKUP and RESTORE. Zip requires seeking to read its central directory, which is very slow over object… in 26.7.1.1315
  • breaking S3 access originating from user SQL no longer resolves the server's own cloud credentials (environment, IMDS/IRSA, instance profile, AWS config files, role_arn-based STS, GCP OAuth metadata) by default; such a request must use explicit credentials or NOSIGN. Named collections now default… in 26.7.1.1315
  • breaking Extended the supported range of DateTime64 from [1900-01-01, 2299-12-31] to [0000-01-01, 9999-12-31]. Values outside the former range are now computed correctly (via cctz) instead of being clamped to the boundary. With precision 8 or 9 the range remains narrower because the ticks are stored as… in 26.7.1.1315
  • breaking AggregatingMergeTree now rejects, at table creation time, schemas where a column is neither part of the sorting key nor an aggregate-state measure (AggregateFunction/SimpleAggregateFunction). Such columns are silently collapsed to an arbitrary value during background merges, producing wrong… in 26.7.1.1315
  • breaking Removed the config-based workload scheduling configuration (the resources and workload_classifiers server config sections). Use CREATE RESOURCE and CREATE WORKLOAD queries instead. The obsolete config sections are ignored with a warning. (Sergei Trifonov). in 26.7.1.1315
  • breaking ClickHouse now always uses the unified insert deduplication hash for both synchronous and asynchronous inserts; the legacy per-insert deduplication behaviours are removed. The server setting insert_deduplication_version is kept as a migration guard: the server refuses to start if it is set to a… in 26.7.1.1315
  • breaking Removed the long-deprecated functions snowflakeToDateTime, snowflakeToDateTime64, dateTimeToSnowflake and dateTime64ToSnowflake. They were deprecated back in v24.6 in favor of snowflakeIDToDateTime, snowflakeIDToDateTime64, dateTimeToSnowflakeID and dateTime64ToSnowflakeID, which should be used… in 26.7.1.1315
  • breaking The setting use_legacy_to_time is now 0 by default, so toTime converts values into the Time data type instead of converting a date with time to a fixed date. The legacy behavior is still available via the toTimeWithFixedDate function or by setting use_legacy_to_time = 1. (Alexey Milovidov). in 26.7.1.1315
  • breaking Naive Bayes models (used by naiveBayesClassifier) are now configured as a dictionary with the NAIVE_BAYES layout, built at load time from a table of pre-aggregated per-class n-gram counts, instead of the previous server-side configuration (an XML config file referencing serialized .bin model… in 26.7.1.1315
  • breaking The hasColumnInTable function no longer accepts the optional hostname, username, and password arguments for checking a column on an arbitrary remote server; only the hasColumnInTable(database, table, column) form remains. The removed remote mode was a security concern: it let any user trigger… in 26.7.1.1315
  • breaking Remove a single-threaded bottleneck in ShuffleSendStep of the distributed query plan: each upstream stream now scatters its rows by destination bucket independently instead of funneling the whole fragment through one ScatterByPartitionTransform. (Alexander Gololobov). in 26.7.1.1315
  • breaking Speed up serialization and merges of JSON columns whose shared data contains many sparse paths. When flattening shared data into per-path columns, flattenAndBucketSharedDataPaths no longer scans every accumulated path column on every row and no longer inserts a default one cell at a time; the… in 26.7.1.1315

Security changes

  • security Backported in: Update the vendored expat to 2.9.0, fixing a denial of service through a crafted backup manifest during RESTORE (CVE-2026-66046) and the other 2.8.3–2.9.0 security fixes. (Actuele AI). in 26.9.20.23
  • security Backported in: Update mongo-c-driver to 2.5.5, fixing an out-of-bounds write during MongoDB connection monitoring reconnects (CVE-2026-96746). (Actuele AI). in 26.9.17.8
  • security Backported in: Update the vendored expat to 2.9.0, fixing a denial of service through a crafted backup manifest during RESTORE (CVE-2026-66046) and the other 2.8.3–2.9.0 security fixes. (Actuele AI). in 26.8.28.14
  • security Backported in: Update mongo-c-driver to 2.5.5, fixing an out-of-bounds write during MongoDB connection monitoring reconnects (CVE-2026-96746). (Actuele AI). in 26.8.25.14
  • security Backported in: Update the vendored expat to 2.9.0, fixing a denial of service through a crafted backup manifest during RESTORE (CVE-2026-66046) and the other 2.8.3–2.9.0 security fixes. (Actuele AI). in 26.7.31.12
  • security Backported in: Update mongo-c-driver to 2.5.5, fixing an out-of-bounds write during MongoDB connection monitoring reconnects (CVE-2026-96746). (Actuele AI). in 26.7.29.12
  • security Fix krb5 CVE-2026-40355 & CVE-2026-40356. (Robert Schulze). in 26.7.1.1315

Every release in between

fixBackported in: Fixed a query silently returning fewer rows after an unrelated JOIN had run: a join runtime filter (enable_join_runtime_filters) moved into a read's PREWHERE made the read record a "no matching rows" verdict in the query condition cache for granules, or Parquet row groups, whose…
fixBackported in: Mask credentials embedded in HTTP URIs. (Han Fei).
fixBackported in: Fix a stack overflow on a deeply nested query plan received in the QueryPlan packet of the native protocol. (Alexey Milovidov).
fixBackported in: Fix use-after-free in complex key ssd_cache dictionaries when the cache file wraps around its partitions. Fix CANNOT_READ_ALL_DATA when reading long values of ssd_cache dictionaries from the cache file. (Alexey Milovidov).
fixBackported in: Fixed count() with WHERE d = toDate32('1900-01-01') (or !=) over a MergeTree Date32 column returning the number of 1970-01-01 rows when optimize_trivial_count_with_sparsity_filter is enabled (the default since 26.8). Closes. (Groene AI).
breakingBackported in: Remove object addresses from NATS, io_uring and HDFS messages. (Raúl Marín).
breakingBackported in: Remove object addresses from logical error messages. (Raúl Marín).
otherBackported in: Reduce repeated IN evaluation when many adjacent singleton row-mask updates are applied to one part. (Sergey Kuznetsov).
featureBackported in: Estimating subcolumn sizes for PREWHERE (for example m['key'] of a Map(LowCardinality(String), String) column) no longer reads the LowCardinality dictionary or the Variant discriminators header of every data part, which made planning slow on object storage, especially for each new…
otherBackported in: BACKUP uses less memory per file it backs up: an entry of the backup no longer keeps a copy of the description of the disk the file is on. A backup of a table with millions of files saves a few gigabytes. (Julia Kartseva).
otherBackported in: Fatal error reports no longer contain runtime memory addresses: stack frames and the fault address are printed as offsets inside the executable or a library, which can be passed to addr2line, and other addresses are hidden. system.crash_log.fault_address now contains the offset…
otherBackported in: A JOIN whose ON condition has a constant-false conjunct now works with the experimental parallel_replicas_plan_based setting when the join uses grace_hash, spills to disk, or runs with join_use_nulls = 1, instead of terminating the server or failing with NOT_FOUND_COLUMN_IN_BLOCK.…
fixBackported in: Fixed a read of uninitialized memory when a Variant, Dynamic or JSON column holding only NULL values is compressed, for example on insert into a Memory table created with compress = 1, or when a block is compressed for a JOIN or for the query result cache. The reported size of such…
fixBackported in: BACKUP and RESTORE to S3 retry requests that fail with ExpiredToken after refreshing credentials. The retry time limit is 120 seconds by default and can be changed with backup_s3_expired_token_retry_timeout_ms. (Nikolai Ovchinnikov).
fixBackported in: Fixed a server crash (or missing rows in the view, with a Null source table) on INSERT into the source table of a materialized view when a row policy or additional_table_filters of a table read by the view references the source table, e.g. USING x IN src. (Groene AI).
fixBackported in: Fix a segmentation fault in GROUP BY with the adaptive aggregator and external aggregation when a memory limit was hit while draining staged records. (Alexey Milovidov).
fixBackported in: Fix segfault when reading a MySQLDump file whose CREATE TABLE query has an ENUM column without a list of values or with non-string values. (Alexey Milovidov).
fixBackported in: Fixed a heap-use-after-free in the view dependency graph after renaming a materialized view whose query selects from itself. CREATE MATERIALIZED VIEW and ALTER TABLE ... MODIFY QUERY now reject a query that makes a materialized view select from itself. (Groene AI).
fixBackported in: Fix a stack overflow when a Redis server replies with deeply nested arrays. (Alexey Milovidov).
fixBackported in: Fix a stack overflow on a Protobuf schema with a very long chain of nested messages. (Alexey Milovidov).
otherBackported in: Not required. (Groene AI).
otherBackported in: An equality with a Bool value that no statistics can estimate, such as WHERE j.f = false on a JSON path, a Bool column without statistics, or IN with a Bool set, is now estimated to match half of the rows per value instead of 1%, so a join on such a filtered table builds its hash…
fixBackported in: Fixed crashes of the interactive line editor of clickhouse-client and clickhouse-local, which also crashed the server when used through the web terminal or an SSH session: after a history search that found nothing on an edited recalled query, when the prompt or the line given to an…
breakingBackported in: CREATE TABLE x AS src inherits the credentials embedded in the engine of src, which are masked in SHOW CREATE TABLE. It now requires the SELECT privilege on src when the inherited definition can carry credentials, instead of only SHOW COLUMNS. (Yarik Briukhovetskyi).
otherBackported in: Reduced the memory usage of incremental BACKUP: the base backup keeps only the sizes and checksums of its files instead of the full information about each file. For a base backup of millions of files this saves gigabytes. (Julia Kartseva).
otherBackported in: Compare TOTP codes and plaintext_password passwords in constant time, so that the response time does not depend on how many leading characters are correct or on which time window matched. (Vladimir Cherkasov).
otherBackported in: The nodes in the output of EXPLAIN AST graph = 1 are numbered sequentially instead of being identified by memory addresses, so the output is the same on every run. (Raúl Marín).
fixBackported in: Requesting SSH-key authentication over the native protocol no longer reveals whether the named user exists, or how it authenticates, before its signature is checked. (Shaohua Wang).
fixBackported in: Reject CR and LF characters in values sent as HTTP headers or in the request line of outgoing HTTP requests (BigQuery, YTsaurus, url, DataLake catalogs, GCP OAuth, AI functions, S3 storage class), which could be used to inject headers or additional requests. (Raúl Marín).
fixBackported in: The setting http_zlib_compression_level now applies only to the gzip and deflate HTTP response compression. The level of other methods (zstd, lz4, br, xz, bz2) is controlled by output_format_compression_level. Previously, a level suitable for zlib was passed to every method, which…
otherBackported in: Use node ids instead of addresses in pipeline diagnostics. (Raúl Marín).
breakingBackported in: Overriding a key that is stored in a named collection now requires SHOW NAMED COLLECTIONS SECRETS on that collection. This also applies to overrides through an alias (including flat kafka_* settings over nested kafka.* keys), through a SETTINGS clause of a table engine or table…
otherBackported in: A filter on the PARTITION BY columns of a window function is no longer pushed below the window (this reverts). The push-down made queries up to 8 times slower when the window reads a JOIN and the filter removes every row, for example IN over an empty subquery, because the join built…
otherBackported in: A packet that cannot appear at the current point of the native protocol is now rejected without deserializing its payload. Previously the server deserialized the body of an unexpected Data packet — including arbitrary data types and aggregate function states — only to throw…
featureBackported in: Add S3 bucket to remote_url_allow_hosts. (Konstantin Vedernikov).
otherBackported in: Reduced the peak memory usage of RESTORE and of incremental BACKUP: the metadata file of a backup is now parsed while it is read, instead of being read into memory whole first. For backups of millions of files this saves gigabytes. (Julia Kartseva).
fixBackported in: Fixed a crash caused by a stack overflow when a deeply nested JSON document was parsed into a JSON column or passed to the JSONExtract family of functions. Such documents are now rejected with the TOO_DEEP_RECURSION error. (Pavel Kruglov).
fixBackported in: Fix a server crash when a RIGHT JOIN/FULL JOIN is planned for parallel replicas (parallel_replicas_plan_based=1) and the join output header declares a column by type only — e.g. the residual column of a constant NULL conjunct in the ON clause. Type-only header columns are now…
fixBackported in: Fixed CANNOT_READ_ALL_DATA (while reading prefix of column ...) during query planning when a MergeTree table has an active empty Wide part, left by a TTL drop or by a mutation that deleted all rows of a part, and the query filters on a subcolumn, such as a key of a…
securityBackported in: Update the vendored expat to 2.9.0, fixing a denial of service through a crafted backup manifest during RESTORE (CVE-2026-66046) and the other 2.8.3–2.9.0 security fixes. (Actuele AI).
fixBackported in: Fixed loading, short ATTACH, and UNDROP TABLE for existing SQL-defined S3 disks whose endpoints are absent from remote_url_allow_hosts; new full-definition CREATE and ATTACH still reject disallowed endpoints. (Alexey Bakharew).
fixBackported in: Fixed ORDER BY ... LIMIT over a column of an Interval type (or Nullable, LowCardinality, Tuple or Array of one) failing with TYPE_MISMATCH when use_top_k_dynamic_filtering is enabled, which is the default. Closes. (Groene AI).
fixBackported in: Fixed a stack overflow crash on a deeply nested CapnProto schema that the nesting depth check missed: a comment or a byte order mark between import and its path, an escape sequence in the import path, or a backtick text line. A backtick text line with many brackets is no longer…
fixBackported in: Fixed a possible segmentation fault when reading an Avro map into a Map column (for example Map(DateTime, String)) with the AvroConfluent format, including Kafka tables. Closes. (Groene AI).
fixBackported in: Fixed an issue where pressing Ctrl-R and then Ctrl-Z in the web terminal or the SSH interface suspended the whole server process. (Alexey Milovidov).
fixBackported in: Fix a wrong result, or an exception in debug builds, when optimize_aggregators_of_group_by_keys eliminated any, min or max of a GROUPING SETS key with group_by_use_nulls. (Alexey Milovidov).
fixBackported in: Fixed a server crash when a RabbitMQ table with the headers exchange type had a routing key without =, or when rabbitmq_routing_key_list was empty. Routing keys without = for the headers exchange type are now rejected with an exception. The problem was found and reported by @dstesk…
fixBackported in: Allow to do vertical merge if result part storage type is not Full. (alesapin).
fixBackported in: Fixed a crash (stack overflow) on a CapnProto schema with a long chain of type expression suffixes (Int32.a.a..., Int32()()...) or of declarations that refer to each other (constants, aliases, struct fields, annotations, imports). Such a schema is now rejected with The CapnProto…
fixBackported in: Fixed Reading in parallel from replicas is enabled but cluster to execute query is not provided (CLUSTER_DOESNT_EXIST) when selecting from a Distributed table whose cluster is not declared in remote_servers - the cluster of a Replicated database, or one found by cluster discovery -…
otherBackported in: Update mariadb-connector-c to v3.4.10. (Actuele AI).
otherBackported in: Update vectorscan to 5.4.13. (Actuele AI).
otherBackported in: Observed as a bottleneck in the ci-logs cluster. (Mikhail Artemenko).
otherBackported in: DROP TABLE, DETACH TABLE, server shutdown and ALTER TABLE ... MODIFY SETTING refresh_statistics_interval no longer wait until a running background refresh of the statistics cache of a MergeTree table has read the statistics of every part. On object storage with thousands of parts…
fixBackported in: Fix ALTER TABLE ... MATERIALIZE STATISTICS / DROP STATISTICS failing forever and wedging the table's mutation queue when a server profile sets allow_statistics = 0 and the statement enables it per-session, the same opt-in ADD STATISTICS honours. Also close a hole where MATERIALIZE…
fixBackported in: Fix a credential written in cleartext to system.query_log and the server log when a key = value argument precedes the positional arguments of the mongodb, redis, remote, arrowFlight and ytsaurus table functions or the MongoDB, Redis, Remote, ArrowFlight, ExternalDistributed and…
fixBackported in: Fixed queries that go through another server (remote, Distributed, parallel replicas, GLOBAL IN) failing with SYNTAX_ERROR, UNKNOWN_CODEC or CORRUPTED_DATA when output_format_native_encode_types_in_binary_format or input_format_native_decode_types_in_binary_format is enabled. The…
fixBackported in: Free prefetched messages when StorageKafka2 partitions move between consumers, preventing per-partition memory growth until restart. (Aparajita Pandey).
fixBackported in: The web terminal and the SSH interface no longer reset the settings of the user (from settings profiles, roles, and CREATE USER ... SETTINGS) to default values. Previously, restrictions such as readonly, resource limits, and additional_table_filters were not applied in these…
fixBackported in: Don't fuse a filter into ARRAY JOIN before its row-only part is lifted below it, so the element filter doesn't copy the whole array to every element. (Konstantin Vedernikov).
otherBackported in: Not required. (Groene AI).
featureBackported in: optimize_and_compare_chain again derives transitive conditions through a DateTime or lower-scale DateTime64 constant compared with a DateTime64 expression, as it did before 26.8. For example, t1.ts = t2.ts adds t2.ts < toDateTime('2026-09-16 00:00:00'), so the other side of a join…
featureBackported in: Added a server setting access_control_improvements.readonly_restricts_set_role, false by default. When enabled, SET ROLE is refused with error code READONLY in a session or query whose readonly setting is not zero. Previously SET ROLE was the only identity-changing statement that…
featureBackported in: Added the setting use_aggregation_memory_tracker to choose how GROUP BY measures its memory when deciding on two-level aggregation. compatibility below 26.9 restores the measurement from before 26.7. (Hechem Selmi).
fixBackported in: Fix wrong results for uniq*, GROUP BY, LIMIT n BY, ORDER BY after GROUP BY, and window PARTITION BY over toString of a DateTime/DateTime64 in a time zone with a daylight-saving transition, and over toFixedString of a String. Both functions claimed to be injective while mapping…
fixBackported in: Fixed the LOGICAL_ERROR Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan raised when an IN or other set subquery defines a MATERIALIZED CTE that two other MATERIALIZED CTEs of that subquery read (for…
fixBackported in: Fixed use_skip_indexes = 0 also disabling part pruning by the partition-key min-max index (since 26.5), which made such queries read every part of the table. (Ashish Kumar Choubey).
fixBackported in: Reject malformed serialized groupBitmap states with INCORRECT_DATA instead of failing later during bitmap operations. (Elmi Ahmadov).
fixBackported in: Fixed a WHERE condition or a row policy on a Hive partition column (use_hive_partitioning = 1) returning too few rows when the Parquet data file also has a column with that name and other values: Parquet row-group, page and dictionary pruning used the file's values instead of the…
fixBackported in: Fixed a heap use-after-free in the s3, azureBlobStorage, hdfs and other object storage table functions and engines when an exception (for example MEMORY_LIMIT_EXCEEDED) was thrown while creating the reader of a file in a row input format such as CSV. (Groene AI).
fixBackported in: Fixed a server crash, wrong results or a rejected query in ORDER BY ... WITH FILL ... INTERPOLATE when one INTERPOLATE expression has to be converted to its target's type and another item reads the same column or literal, for example INTERPOLATE (a AS b, b AS a) with targets of…
featureBackported in: Restore min/max pruning of Iceberg data files for a Decimal(38, 38) column. A manifest bound of magnitude above roughly 0.7 cannot be widened inside Int128 and was dropped, which left the column without a min/max condition; it is now saturated at the largest magnitude the precision…
fixBackported in: The collections of the Native protocol — the settings and the query parameters of a query, the client information, the granted roles and the table-status lists — are now bounded, so a small packet can no longer make the server allocate memory for data that has not arrived. (Alexey…
fixBackported in: Fixed a crash on a query with a deeply nested Dynamic or JSON constant. (Pavel Kruglov).
fixBackported in: Fix NOT_IMPLEMENTED for an outer JOIN with join_algorithm = 'full_sorting_merge' when optimize_and_compare_chain derived a condition on the preserved side of the join from the ON clause. (Yarik Briukhovetskyi).
securityBackported in: Update mongo-c-driver to 2.5.5, fixing an out-of-bounds write during MongoDB connection monitoring reconnects (CVE-2026-96746). (Actuele AI).
otherBackported in: Update thrift to v0.25.0. (Actuele AI).
fixBackported in: Fixed a crash on INSERT into a MergeTree table when a materialized view over it reads the same table from a correlated subquery, IN or a non-leftmost table of an IN subquery. (Groene AI).
fixBackported in: Fixed TRUNCATE TABLE of an Alias table whose target is a MergeTree failing with DEADLOCK_AVOIDED when the alias is being read concurrently, while the same statement against the target table succeeds immediately. The lock for TRUNCATE is now chosen and taken on the table that…
fixBackported in: Fix a vector search returning fewer rows than its LIMIT, and missing true nearest neighbours, after a lightweight DELETE (or with a delete mutation applied on the fly): the vector index is no longer used for a part while it still holds deleted rows. (Alexey Milovidov).
fixBackported in: Fixed wrong results, or an ILLEGAL_COLUMN error, of a JOIN whose condition equates both a column and an expression of that column (for example ON t1.k = t2.k AND intDiv(t1.k, 2) = intDiv(t2.k, 2)) when a filter on that expression is pushed down to the other side of the join: the…
fixBackported in: Fixed parallel replicas not being used when reading a Distributed table whose underlying table is another Distributed table and every shard of the outer cluster has a single replica. (Igor Nikonov).
fixBackported in: Fixed duplicated rows returned by ANY RIGHT JOIN with any_join_distinct_right_table_keys = 1 when parallel replicas are enabled. (Groene AI).
fixBackported in: Fixed excessive memory usage when loading a data part with a corrupted columns_substreams.txt; such a part is now detached as broken. (Murphy).
fixBackported in: Fixed CREATE MATERIALIZED VIEW ... POPULATE and CREATE TABLE ... AS SELECT in a Replicated database with parallel replicas enabled: each replica sent its population to other replicas, so its rows landed in other replicas' tables (duplicated there, missing on the replica itself), or…
fixBackported in: Fixed slow planning of queries with skip indexes on tables with many parts and pending patch parts of lightweight updates. (Anton Popov).
fixBackported in: Fixed a crash (stack overflow) when reading an Avro file with an explicit structure that does not read a field nested through a long chain of named types, or a field of a recursive type holding deeply nested data such as a long linked list. Such a file now fails with…
otherBackported in: Do not use parallel replicas for clusterAllReplicas. (Igor Nikonov).
otherBackported in: Faster sorted-stream processing on a multi-column key whose leading column has long runs, in LIMIT BY, negative LIMIT BY, DISTINCT in order, window functions (peer groups and PARTITION BY boundaries), full_sorting_merge and partial_merge JOIN, and ReplacingMergeTree FINAL without…
fixBackported in: Fix corrupted shared data of nested JSON objects after a failed attempt to parse a value during insert. It could lead to errors like Unexpected version of JSON type binary encoding or Unknown type code when reading the data after merges or when serializing it in binary formats.…
fixBackported in: Fixed a query failing with an exception like Cannot parse UInt64 from String on a table with a text index on mapKeys or JSONAllPaths, when the predicate cannot be evaluated on the value of a missing map key or JSON path. (Anton Popov).
otherBackported in: Use castStorage for the Join row policy check in the legacy analyzer. (Vladimir Cherkasov).
otherBackported in: bloom_filter and text indexes are now used when a Nullable indexed column is cast to the non-Nullable type, such as CAST(x, 'String') or json.path::String. A query that would throw on a NULL value may not throw when the index skips the granules with NULL. (Anton Popov).
fixBackported in: Fix reading bucketed runtime Map values from JSON columns using advanced shared-data serialization. (Rory Shanks).
fixBackported in: Fix DeltaLake stats pruning with Date cast. (Arsen Muk).
fixBackported in: Fix EXPLAIN PLAN actions = 1 printing a secret function argument (for example the key of HMAC or encrypt) in cleartext when its value came from a subquery or from the other side of a JOIN. (Vladimir Cherkasov).
fixBackported in: Fix INSERT failing with ILLEGAL_FINAL or SAMPLING_NOT_SUPPORTED when a materialized view applies FINAL or SAMPLE to its own source table inside a subquery. Regression in. (Jimmy Aguilar Mena).
fixBackported in: Fix a rare server crash (SIGSEGV in mongoc_log) when a MongoDB dictionary source or MongoDB table was created while another thread created the first MongoDB connection in the process. Messages logged by the MongoDB driver now go to the server log. (Vladimir Cherkasov).
otherBackported in: CRoaring v5.2.3 exposes internal_validate() on the C++ RoaringBitmap wrappers, so RoaringBitmap data can be validated. (Elmi Ahmadov).
otherBackported in: Update cctz to 2026e. (Actuele AI).
fixBackported in: Fixed a LOGICAL_ERROR in arraySlice on a QBit column replicated by ARRAY JOIN or a JOIN. (Groene AI).
otherBackported in: A WHERE that no row passes is pushed to every JOIN input again, including the non-preserved side of an OUTER JOIN and a side with no column used above the join, so that input is no longer read and hash-built for nothing. For example, a UNION ALL branch whose constant column fails…
otherBackported in: Hash joins with many matches per key are faster when they output a LowCardinality column whose blocks have different dictionaries (several parts, FINAL, or a LowCardinality value computed per block): short ranges from another dictionary are now inserted key by key instead of through…
featureBackported in: Added the setting query_plan_filter_push_down_below_limit_by (default 1), controlling whether filters on LIMIT BY key columns are pushed below the LIMIT BY step. Setting it to 0 restores the plan shape used before 26.7, for queries where the pushed predicate makes index analysis…
fixBackported in: Mask secrets in the queries that a cluster-mode QueryRunner table writes to system.query_log as well as in queries executed as startup scripts. (Miсhael Stetsyuk).
fixBackported in: Tables in a database with lazy_load_tables were missing from system.parts, system.replicas and related system tables, and refused by replica commands, after a restart. (Nikolay Degterinsky).
fixBackported in: Fix a server abort when reading an Iceberg table whose sort order names a transform ClickHouse cannot parse (e.g. bucket[xyz]); ClickHouse now ignores that sort-order hint and keeps the table readable. (Ilias).
fixBackported in: Comparing an Enum column with a string literal that is not one of its elements no longer throws UNKNOWN_ELEMENT_OF_ENUM when validate_enum_literals_in_operators is disabled (the default) and the column is part of the primary key, the partition key, or a bloom_filter index. != with…
fixBackported in: Fix Found patch part ... that intersects mutation with version ... on lightweight updates in a table created with CREATE TABLE ... CLONE AS or ATTACH PARTITION ALL FROM a table with lightweight updates. (Nikolay Degterinsky).
fixBackported in: Fix UNKNOWN_IDENTIFIER in the analyzer when a table is referenced as database.table in FROM or JOIN and another table expression in the same query uses that database name as its alias, for example FROM db.t1 AS db INNER JOIN db.t2 AS t ON .... Closes. (Dmitry Novik).
fixBackported in: Fixed wrong results when a WHERE clause mixing AND and OR was evaluated with skip indexes (use_skip_indexes_for_disjunctions, enabled by default). If a minmax or set index could not evaluate one atom of the predicate for a granule, the per-atom verdicts recorded for that granule…
fixFix iceberg_tolerate_conflicting_manifest_schemas being reverted to false by compatibility settings of 26.8 or 26.9 on 26.9 servers, which made Iceberg reads fail with ICEBERG_SPECIFICATION_VIOLATION on tables whose manifest schemas conflict with metadata.json. (Asya Shneerson).
otherBackported in:. (Alexey Milovidov).
fixBackported in: Fix container existence check during RESTORE of a lightweight snapshot from Azure Blob Storage by parsing the saved namespace into container name and prefix. (Garrett Thomas).
otherBackported in: Reduced the setup of the 04510_distributed_final_many_partitions test from 150 to 65 partitions. (Groene AI).
otherBackported in: Filesystem cache: make reserve granularity dynamic. (Kseniia Sumarokova).
fixBackported in: Fixed a text index dropping matching rows when a FixedString is involved in the comparison: a term-preserving tokenizer over a String column lost the rows whose value carries literal trailing zero bytes when the search constant is a FixedString, and an index over a FixedString…
fixBackported in: Rewriting the body of a view with ALTER TABLE ... MODIFY QUERY now needs the same grants as creating it with its SQL security: SET DEFINER on the definer of a SQL SECURITY DEFINER view, or ALLOW SQL SECURITY NONE for a SQL SECURITY NONE view. An ON CLUSTER MODIFY QUERY fails with…
fixBackported in: Fix basic statistics of parts written by 26.6 or 26.7: after ALTER TABLE ... UPDATE or a lightweight DELETE, non-Nullable columns reported a default-value count of 0, which made selectivity estimates wrong. Query results were not affected. To repair parts that are already affected,…
fixBackported in: Fix a possible hang of a query under workload CPU scheduling with cpu_slot_preemption enabled: when all its threads were preempted, the query could keep CPU slots it had already used and wait forever for one of them. (Sergei Trifonov).
fixBackported in: Fixed a LEFT/RIGHT/FULL JOIN without an equality key that failed with INVALID_JOIN_ON_EXPRESSION (Cannot determine join keys) when its WHERE clause also contained an IN (subquery). The WHERE filter now converts such a join to INNER again, as it did in 26.6, which also restores that…
fixBackported in: Respect iceberg_metadata_staleness_ms in metadata parsing. (Konstantin Vedernikov).
fixBackported in: Fixed a segmentation fault or std::length_error when reading TSV formats with input_format_tsv_crlf_end_of_line = 1 if an escape sequence ended exactly at the end of a read buffer. (Groene AI).
otherBackported in: Enabled the text index posting lists cache by default (use_text_index_postings_cache). Previously each query used a private cache capped at 100 MiB, which on large tables caused posting lists and phrase search results to be recomputed several times within a single query; a 4-token…
otherBackported in: Skip indexes (bloom_filter, tokenbf_v1, ngrambf_v1, minmax) and the primary key are now used when the indexed column is wrapped into a conversion that does not change its value, such as toLowCardinality, toNullable or a CAST to Nullable or LowCardinality. (Anton Popov).
fixBackported in: Fix an out-of-bounds read when deserializing a uniqTheta state shorter than 24 bytes, for instance from CAST( AS AggregateFunction(uniqTheta, ...)). (Alexey Milovidov).
otherBackported in: Faster planning of queries to Iceberg tables with many manifest files: when a manifest file header has the schema-id key and that schema is already known from metadata.json, the schema copy stored in the manifest header is no longer parsed and compared with it. ClickHouse now also…
otherBackported in: Hide the HTTP headers in the definition of HTTP dictionary sources in SHOW CREATE DICTIONARY, system.tables and query logs, the same way as passwords. They can be shown with the existing display_secrets_in_show_and_select mechanism. (Matheus Nerone).
fixBackported in: Fixed SYSTEM SYNC TRANSACTION LOG (local, non-ON CLUSTER form) not checking the SYSTEM_SYNC_TRANSACTION_LOG privilege. The ON CLUSTER form already required it via getRequiredAccessForDDLOnCluster, but the local execution path skipped checkAccess, so a user without the grant could…
fixBackported in: Fixed asynchronous TLS connections occasionally failing with an unrelated OpenSSL error left by another connection on the same OS thread. This could terminate distributed queries with a misleading network exception. (Dmitriy Borisenko).
fixBackported in: Fixed an ssl_certificate authentication bypass where an embedded NUL byte in a certificate's Common Name (for example john\0.evil.com) was truncated server-side to john, letting a holder of such a certificate authenticate as a different user. (Konstantin Bogdanov).
fixBackported in: Prevent asynchronous inserts that only need to buffer data from being blocked by another insert waiting for a flush worker while holding their shared queue lock. Ensure a global forced flush waits for batches removed from the queue that are still waiting for a worker. (RJ).
fixBackported in: Skip indexes (text, tokenbf_v1, ngrambf_v1) are now used when the indexed column or the searched constant is wrapped into LowCardinality, Nullable or an equivalent CAST. For example, m['key'] = 'value' on a Map(String, LowCardinality(String)) column and hasToken(s,…
fixBackported in: EXPLAIN AST printed secret function arguments, such as the key of encrypt, in clear text, and with optimize = 1 it did so for the body of a view the user may only SELECT from. The dump now prints '[HIDDEN]' in their place, under the same gate as SHOW CREATE. (Harikrishnan Prabakaran).
fixBackported in: Column-level SELECT privileges are now enforced for columns used only inside indexHint and for ALIAS columns referenced in PREWHERE. As in WHERE, referencing an ALIAS column in PREWHERE requires the grant on the alias name; a grant on its source columns is no longer sufficient. A…
fixBackported in: Fix a server crash (SIGSEGV) when a CREATE TABLE ... PROJECTION / ALTER TABLE ... ADD PROJECTION statement is restored from a clickhouse_json AST whose projection query subtree contains a function node without an arguments list. The malformed payload is now rejected with…
fixBackported in: Fixed a row policy bypass: a direct JOIN with an EmbeddedRocksDB, KeeperMap or Redis table in the legacy analyzer (enable_analyzer = 0) ignored the row policy of the right table and returned hidden rows, and joinGet on a Join table ignored its row policy in both analyzers. Such a…
fixBackported in: Fix NO_COMMON_TYPE in case of use_variant_as_common_type=0 for jemalloc fragmentation dashboard. (Azat Khuzhin).
fixBackported in: Now statistics parts pruning will not work if table has row level policy. (alesapin).
fixBackported in: Fix filesystem cache accounting when the directory for a new cache key cannot be created, for example because the cache disk is out of space or inodes. The failed reservation stayed counted in the cache until the query released the file segment. (Sema Checherinda).
fixBackported in: CREATE OR REPLACE in a Replicated database or with ON CLUSTER now requires the drop privilege for the kind of the table it replaces, so a user without DROP DICTIONARY can no longer replace a dictionary. (Nikolay Degterinsky).
fixBackported in: Fix LOGICAL_ERROR Cannot capture column N because it has incompatible type when a materialized view with a lambda over an Array(Tuple(...)) column receives a block while the source table's column type is being changed by ALTER TABLE ... MODIFY COLUMN. (Jimmy Aguilar Mena).
fixBackported in: Fix a server crash caused by unbounded recursion when decoding a deeply nested value inside a binary encoded type, for example an AggregateFunction parameter in a Dynamic value read from RowBinary or Native. (Pavel Kruglov).
fixBackported in: Fixes a server crash on CREATE TABLE or ALTER TABLE ... MODIFY TTL with a TTL expression that uses the result of arrayMap with a constant lambda, such as toString(arrayMap(x -> CAST(1, 'Dynamic'), arr)). (Groene AI).
fixBackported in: Fixed secret settings of S3Queue and AzureQueue tables written with the legacy s3queue_ prefix, such as s3queue_after_processing_move_secret_access_key, being shown in cleartext in SHOW CREATE TABLE, system.tables, system.query_log and the server log. They are now hidden as they are…
fixBackported in: Add more path validations. (Konstantin Vedernikov).
fixBackported in: S3 client check initial url in backup client. (Konstantin Vedernikov).
fixBackported in: Fix missing rows in hasAllTokens and hasAnyTokens searches over a text index when an earlier query with the same predicate read a narrower key range of the same part and use_text_index_postings_cache was enabled. (Anton Popov).
fixBackported in: Fix a crash when reading an ORC file whose root type is not a struct (for example, a file written with a bigint or array root type). Such files are now rejected with an INCORRECT_DATA error. Closes. (Groene AI).
fixBackported in: Fixed a crash and wrong results with convert_query_to_cnf = 1 when WHERE or HAVING references the same SELECT alias more than once. (Groene AI).
otherNO CL ENTRY: 'Revert "Backport to 26.9: Skip the direct join when the right table has a row policy"'. (Vladimir Cherkasov).
otherBackported in: Hide a Backup locator named like a COLUMNS matcher in EXPLAIN AST instead of throwing. (Groene AI).
otherBackported in: Do not dereference a null logs_queue in OwnSplitChannel::log. (Groene AI).
fixBackported in: Fix the Kafka and NATS table engines ignoring remote_url_allow_hosts: broker addresses from kafka_broker_list, nats_url, and nats_server_list are now checked against the remote host filter. A forbidden address is rejected at CREATE TABLE with UNACCEPTABLE_URL, as the RabbitMQ engine…
breakingBackported in: Remove --icf=safe linker warnings about SHT_LLVM_ADDRSIG in the stripped Rust libraries. (Raúl Marín).
otherBackported in: Parse some (geo) parquet metadata lazily. (Konstantin Vedernikov).
fixBackported in: Fixed max_memory_usage and max_server_memory_usage not being respected when reading a JSON column with the FLATTENED serialization version from the Native format. (Pavel Kruglov).
fixBackported in: Fixed out-of-bounds reads when reading a JSON or Dynamic column from a malformed Native block or a corrupted data part. A truncated stream, a duplicate type in a flattened Dynamic column, a duplicate or typed-colliding path in a JSON column, and a serialization version that is only…
fixBackported in: Kafka producer and consumer trace logs now show the value of secret librdkafka properties, such as sasl.password, as [HIDDEN] instead of the cleartext value. (János Benjamin Antal).
fixBackported in: Now clickhouse masks credentials in system.query_log even for wrong URLs for external table engines. (alesapin).
fixBackported in: The value of 'role_session_name' as of now is hidden in query_log. (Alexey Bakharew).
fixBackported in: Fix Keeper silently giving a new session to a ZooKeeper client (for example the Java client or kazoo) that reconnects and asks to continue its session. Such a client now gets SessionExpired, ZooKeeper's answer for a session that cannot be continued, instead of losing its ephemeral…
fixBackported in: Fix validation of Iceberg manifest-list entries during writes. (Arsen Muk).
breakingBackported in: Update the zxc library to v0.14.0, which changes the compressed block format of the experimental ZXC codec. Data written with CODEC(ZXC) by earlier versions cannot be read by the new version and fails with CANNOT_DECOMPRESS. If you used the experimental ZXC codec, re-encode the…
otherBackported in: Build Iceberg min/max hyperrectangles only for columns the filter uses. (Konstantin Vedernikov).
featureBackported in: Added the http_x_clickhouse_format_overrides_output_format setting (default true). When disabled, the X-ClickHouse-Format HTTP header only sets default_format, as it did before version 26.8, instead of overriding the FORMAT clause of the query via output_format. (Alexey Milovidov).
fixBackported in: Fixed a crash in plus and minus of an array of dates and an array of tuples holding NULL, for example toString([toDateTime64(1, 3)] + [(2, NULL)]), and the exception ColumnTuple cannot have ColumnConst as its element when adding a constant interval to a non-constant interval of…
fixBackported in: Link with --icf=safe instead of --icf=all, so the linker keeps functions whose address is taken distinct. gRPC queries with transport compression (gzip, deflate) no longer crash the server, as they could in official builds since 26.4. Closes. (Groene AI).
fixBackported in: The command line client no longer shows the as-you-type hints on a query recalled from the history (or otherwise displayed at once, e.g. pasted), so pressing Up/Down continues to navigate the history instead of the hint list. The hints appear again as soon as the line is edited.…
otherBackported in: A single-level GROUP BY result smaller than max_block_size is now split into several blocks when it was aggregated by several threads, so the steps after it, such as the probe of a following join, run in parallel instead of on one thread. Previously such queries could be several…
fixBackported in: Fixed a heap-use-after-free when a correlated subquery reading a Merge table was planned inside EXPLAIN, a subquery in FROM, a view or an IN subquery. (Groene AI).
featureBackported in: You can now disable reading through the executable table function and from Executable/ExecutablePool tables with the new allow_executable_tables setting, for a deployment that must not run arbitrary server-side scripts. It defaults to true, so existing behavior is unchanged. (Hanzi…
otherBackported in: Speed up extracting a value from a Map with LowCardinality keys. The key is now resolved to its dictionary position once instead of being compared against every entry of a row, so the cost of m[key] no longer grows with the position of the key in the row. Also fix extracting a value…
otherBackported in: Chained ARRAY JOINs no longer materialize the whole block of a lazily replicated array column before expanding it, which cuts their peak memory by several times. (Yarik Briukhovetskyi).
featureBackported in: Iceberg tables whose manifest file headers carry a schema that conflicts with the schema registered for the same schema-id in metadata.json are now readable: the metadata.json schema is preferred and the divergent manifest header copy is ignored with a warning, no matter which of…
featureBackported in: Add column size statistics in Avro files. (Konstantin Vedernikov).
otherBackported in: The AI function per-query quotas are now disabled by default: ai_function_max_input_tokens_per_query (previously 1000000), ai_function_max_output_tokens_per_query (previously 500000) and ai_function_max_api_calls_per_query (previously 1000) default to 0, meaning no limit. To keep…
otherBackported in: Do not drop the ClickHouse Keeper session when the client's outgoing request queue stays full for longer than operation_timeout_ms. The enqueue wait is now three times session_timeout_ms, so a short burst of backpressure no longer terminates the session and invalidates all its…
featureBackported in: Added the setting analyzer_compatibility_allow_cte_redefinition. When enabled, a CTE name may be defined more than once in a single WITH clause; a later definition shadows the earlier one as the query analysis before 24.3 did (a redefinition can read the previous definition, the…
fixBackported in: Fixed dropping whole parts with TTL (ttl_only_drop_parts = 1) still reading all data from large, fully-expired parts. (Michael Jarrett).
fixBackported in: Fixes a server crash (double free) when finalizing an aggregate function with the -State combinator nested under a combinator that transfers several sub-states in one call (-Resample, -ForEach, -Map, -Tuple), for example groupArrayStateResample, if an exception such as a memory…
fixBackported in: Fixed Iceberg INSERT writing no lower_bounds/upper_bounds at all into the manifest entry when the table has a column whose type cannot be serialized into a statistics bound (for example Array(Int32)), or a column that is entirely NULL. Such a field is now omitted individually and…
fixBackported in: Fixed SQL injection through identifiers when inserting into a table with the SQLite engine. The remote table name and the column names were escaped with backslashes, which SQLite does not honour inside a quoted identifier, so a name containing a double quote could close its own…
fixBackported in: Fixed a Backup database engine printing the credentials of its destination in plaintext. SHOW CREATE DATABASE, system.databases.engine_full, system.query_log and the messages that reject a malformed locator showed an AzureBlobStorage account_key, a connection string or a presigned…
fixBackported in: KILL TRANSACTION ... ON CLUSTER, KILL PART_MOVE_TO_SHARD ... ON CLUSTER, SYSTEM STOP THREAD FUZZER ON CLUSTER, SYSTEM START THREAD FUZZER ON CLUSTER and SYSTEM RESET COVERAGE ON CLUSTER ran without checking any privilege, so a user holding only CLUSTER could roll back other users'…
fixBackported in: ALTER DATABASE ... MODIFY COMMENT on a database with ENGINE = Backup no longer writes a definition the server cannot read back, which made it refuse to start; metadata already written in that form now loads too. Backward incompatibility: a backup taken by an older server of a…
fixBackported in: Fix a patch part whose source_parts.dat lost its content to a zeroed block loading as an empty index, which silently unapplied an acknowledged lightweight UPDATE and then let background cleanup delete the only copy of it. Such a part is now detached as broken. (Alexey Milovidov).
fixBackported in: Fixed http_max_multipart_form_data_size silently truncating oversized multipart data instead of failing the query, and made it span a form's external-table parts instead of resetting per part. (Sema Checherinda).
fixBackported in: Fixed two ways a table with the Redis engine mishandled an MGET reply. Reading the whole table stopped at the first key without a string value and silently dropped every key scanned after it, so one key of another Redis type was enough to truncate the result. A reply carrying a…
fixBackported in: Bound the header column count in RowBinary formats to avoid excessive memory allocation from a crafted header. (George Larionov).
fixBackported in: Fixed settings constraints from a settings profile not being enforced against the other setting assignments in the same statement. SET profile = 'p', = could override a CONST, MIN/MAX or readonly constraint that profile p installs. The same escape existed through an in-query…
fixBackported in: Fixes a segmentation fault that happens when a refreshable materialized view is started up and shut down at the same time, for example when a failed ATTACH DATABASE rolls the database back, or when the server shuts down while tables are still loading asynchronously. (Groene AI).
fixBackported in: Fixed a performance regression where a query whose WHERE requires the same expression to equal two different constants stopped being recognized as always false when compatibility was set below 26.7, or when optimize_redundant_comparisons was disabled explicitly. Such a query…
fixBackported in: TRUNCATE ALL TABLES FROM and TRUNCATE TABLES FROM ... LIKE ... now skip Alias tables, which hold no data of their own. Previously such a statement could fail with LOGICAL_ERROR: RWLock is already locked in exclusive mode, truncate a target in another database, or fail when the alias…
fixBackported in: The text, tokenbf_v1, ngrambf_v1 and sparse_grams skip indexes are now used for IN when transform_null_in = 1 and the set contains no NULL. Previously such a query read every granule, and one using force_data_skipping_indices failed with INDEX_NOT_USED. (Jimmy Aguilar Mena).
fixBackported in: Fixed an out-of-bounds heap write in stem. The output buffer was sized from the input, but some stemmers lengthen a word (Turkish uag → uagı, Estonian keeb → keesi), so a block overran its allocation and returned uninitialized heap as result values. The buffer now grows when the…
fixBackported in: remote(, 'db', 'table', 'user', 'password'), and the same form of remoteSecure and of the Remote and RemoteSecure table engines, wrote the password into system.query_log, system.text_log and the server log in cleartext, while the remote('addresses_expr', ...) form hid it. The…
fixBackported in: Fix wrong values and a LOGICAL_ERROR when reading a partitioned Delta Lake table with allow_delta_kernel_rs = 0 and column types that differ from the ones in _delta_log. (Raúl Marín).
fixBackported in: Fixed a crash when deserializing an AST from JSON (formatQueryFromJSON, the clickhouse_json dialect): a deeply nested document exhausted the stack and killed the process with no log line. Such payloads now fail with TOO_DEEP_RECURSION. (Groene AI).
fixBackported in: Fixed a crash (stack exhaustion) in parseQueryToJSON when serializing a query nested deeper than the serializer could follow, reachable by raising max_parser_depth above its default. Such a query now fails with TOO_DEEP_RECURSION instead of terminating the server. (Groene AI).
fixBackported in: Fixed a server crash when the flameGraph aggregate function was constructed on a thread without a query context, for example while attaching a stored table whose column type names AggregateFunction(flameGraph, ...). (Groene AI).
fixBackported in: Fix a segmentation fault in Keeper when preallocating space for a changelog file fails because the disk is full. (Alexey Milovidov).
otherBackported in: Update cctz to 2026d. Time zone names with the file: prefix are now rejected. (Actuele AI).
otherBackported in: Reject a compressed block whose codec stores data verbatim (NONE, Quantized) when its declared uncompressed size does not match the body length. Previously the passthrough read path accepted such a block while every other decompression path rejected it. (Groene AI).
fixBackported in: Fix flaky 01780_column_sparse: order the arrayFilter result before limiting it. (Alexey Milovidov).
otherBackported in: Make test_multi_consumer_with_partition_affinity deterministic. (Aparajita Pandey).
fixFix 26.9 upgrade check. (Azat Khuzhin).
otherBackported in: Small performance optimisations of iceberg read path. (Konstantin Vedernikov).
breakingBackported in: A MySQL dictionary source created with a CREATE DICTIONARY query can no longer enable enable_local_infile, at the source or at one of its REPLICA entries; loading such a dictionary fails with BAD_ARGUMENTS, which with the default dictionaries_lazy_load is on first use rather than at…
fixBackported in: Fixes a case where date_time_overflow_behavior was ignored on parsing Date and DateTime. Closes. (Yarik Briukhovetskyi).
fixBackported in: Fix ALTER TABLE ... MODIFY SETTING name = DEFAULT skipping the checks an engine makes on a setting reset: TimeSeries allowed an immutable setting to be dropped, leaving the table unwritable, Memory removed a setting from the table definition while the table kept enforcing the old…
fixBackported in: Fix wrong results when a GROUP BY, DISTINCT, LIMIT BY or window PARTITION BY key was plus or minus of a partition column with a non-integer constant, for example f + 1.0 on Float64 or d + INTERVAL 1 MONTH on Date. Such a key was assumed injective, so each table partition was…
fixBackported in: Fix a server crash (std::terminate with write failed) in the embedded SSH client when the client's terminal was closed before the line reader was destroyed. (Alexey Milovidov).
fixBackported in: Fix spurious NATS connection failures when the vendored nats-io client gets EINTR while waiting for a socket, and include the upstream JetStream pull-subscription deadlock fix in the vendored client. (Alexey Milovidov).
otherBackported in: . (Antonio Andelic).
breakingThe default compression method is changed from LZ4 to ZSTD(3). For client/server and server/server network communication it switches uniformly to ZSTD(3). For on-disk table data, MergeTree column data now uses a size-aware built-in default — LZ4 below 100 MB and ZSTD(3) at or above it, applied to…
breakingRemoved the CatBoost integration. The catboostEvaluate function, the system.models table and the SYSTEM RELOAD MODEL(S) queries are no longer available. Queries, views and grants referring to them have to be migrated before the upgrade: in particular, revoke SYSTEM RELOAD MODEL from all users and…
breakingFix setting temporary_files_buffer_size or format_avro_schema_registry_* to an out-of-range value making every subsequent query in the session fail, with no way to recover; the values are now bounded when they are set. (Pedro Ferreira).
breakingFixed wrong results from runningConcurrency. Its value depends on the rows processed before it, but it declared itself deterministic within a query, so a predicate on it above a LEFT or ANY join let optimizer passes rewrite the join and change the row set it sees, and if, multiIf, and and or…
breakingThe experimental WINDOW VIEW feature is removed, together with the WATCH statement and the windowID function. It has been non-functional since version 24.12 (inserts into the source table were silently not delivered to window views) and was never supported by the analyzer, which is enabled by…
breakingRemoved the deprecated read_resource and write_resource disk options from storage_configuration. Attach a scheduler resource to a disk with CREATE RESOURCE name (READ DISK disk, WRITE DISK disk) instead. (Sergei Trifonov).
breakingRemoved the WasmEdge engine for WebAssembly UDFs. wasmtime, which has always been the default, is now the only supported value of the webassembly_udf_engine server setting. A server configured with wasmedge will not start; remove that setting or set it to wasmtime. On binaries where wasmtime is…
breakingRemoved the sharded GROUP BY aggregation (setting enable_sharding_aggregator, disabled by default) in favor of the adaptive aggregation (enable_adaptive_aggregator, enabled by default), which targets the same high cardinality workloads without the weaknesses on skewed or low-cardinality keys and…
breakingBackported in: Outbound TLS connections now verify that the server certificate names the host that was connected to. This affects clickhouse-client --secure, remoteSecure(), Distributed over the secure native protocol, secure Keeper connections, and HTTPS clients such as s3(), url(), HTTP…
breakingmax_bytes_before_external_join and max_bytes_ratio_before_external_join are now the spill threshold for every hash-based join_algorithm, including grace_hash, which previously ignored them and spilled on max_rows_in_join / max_bytes_in_join instead. Those two are a hard cap again for every…
breakingSetting allow_experimental_codecs is obsolete. Use the per-codec settings enable__codec instead. (Raufs Dunamalijevs).
breakingReading a File source with rename_files_after_processing set now requires the WRITE ON FILE grant on top of READ ON FILE, on the initiator for fileCluster: the setting renames the files a SELECT has read, which is a write to the source, and it used to happen for anyone who could read them. A query…
breakingThe interface and http_method columns of system.query_log, system.query_thread_log and system.processes are now Enum8 instead of UInt8, over the value set system.session_log.interface already uses, plus Unknown for an unrecognized reported interface. Comparing to a number keeps working (WHERE…
breakingThe analyzer can no longer be disabled: the enable_analyzer setting (and its old name allow_experimental_analyzer) is obsolete, an attempt to set it to 0 is rejected, and the compatibility setting no longer reverts it. The analyzer has been the default since 24.3, and the query analysis used…
breakingCREATE TABLE ... AS mergeTreeIndex(...) is no longer accepted, nor the same form over mergeTreeProjection, mergeTreeAnalyzeIndexes, mergeTreeAnalyzeIndexesUUID, mergeTreeTextIndex and mergeTreeCodecBlockCounts. The storage these functions return holds its source table's storage object, so once…
breakingHeaders that Google Cloud Storage spells with an x-goog- prefix are now translated for every request, not only for server-side copies. Custom object metadata written to GCS over the S3 API without HMAC credentials — how ClickHouse Cloud on GCP accesses object storage — previously did not take…
breakingNullable(Tuple(...)) is now generally available and enabled by default. Nullable(Tuple(...)) columns can be created without any setting, schema inference of nullable structs in the Parquet, Arrow, ORC, Avro and JSON formats returns Nullable(Tuple(...)), and a Tuple subcolumn extracted from a…
breakingRemove s3_disable_checksum, since checksum calculation for S3 does not read the source second time anymore (previously the problem was that sources has been read twice, once for sending data, second for checksum calculation). (Azat Khuzhin).
breakingCREATE TABLE ... AS timeSeriesSamples(...) is no longer accepted, nor over its alias timeSeriesData or over timeSeriesTags and timeSeriesMetrics. The persisted proxy renamed that live target table in memory on first read: DROP TABLE then dropped the user's table and destroyed its rows, and reads…
breakingNew setting validate_group_by_all_key_types (default true) gates the key type validation that GROUP BY ALL applies to the grouping keys it expands the SELECT expressions into. Since 26.7 it rejects a Variant or Dynamic grouping key, for example an untyped JSON subpath, that earlier versions…
featureOperations '+' and '-' between DateTime and Time data types. (Yarik Briukhovetskyi).
featureAdded the opt-in MergeTree setting skip_empty_columns_on_insert, which avoids storing columns containing only their type-default value. It requires serialization_info_version = 'with_missing_columns'; keep an older serialization version during rolling upgrades with servers that cannot read the new…
featureNew LIMIT forms that select rows by boundary conditions instead of by position, following the stream order (use ORDER BY to define it): LIMIT n AFTER cond returns up to n rows starting at the first row where cond is true (SELECT number FROM numbers(10) ORDER BY number LIMIT 3 AFTER number >= 5…
featureAdd type_json_skip_null_typed_paths setting for JSON type. When enabled, typed paths in JSON columns that have NULL values are treated as absent, matching the behavior of dynamic paths. Closes:. (Pavel Kruglov).
featureAdd support for accessing JSON subcolumns using bracket syntax, e.g. json['key1']['key2'], which the parser translates to nested arrayElement calls. (Pavel Kruglov).
featureSupport BACKUP/RESTORE for WORKLOAD and RESOURCE entities. SQL-defined CREATE WORKLOAD / CREATE RESOURCE definitions are now included when backing up system.workloads / system.resources and are recreated on restore, including ON CLUSTER. (Sergei Trifonov).
featureAuthentication methods in CREATE USER and ALTER USER ... ADD IDENTIFIED support a GRANTS (SELECT ON db.table, ...) clause which limits the access rights of sessions authenticated with that method to the intersection with the listed grants. This allows using additional credentials as tokens for…
featureAdded the system.session_query_ids system table, which contains the query ids of the queries executed in the current session, in execution order. It makes it easy to find "the queries I just ran" in system.query_log without assigning query_id client-side or tagging queries with log_comment, which…
featureAdds support for mode='exclusive' in S3Queue engine, for high-throughput and self-hosted scenarios. (Ivan Tkatchev).
featureDisks with the plain_rewritable metadata (s3_plain_rewritable, and azure/local object storages with metadata_type = plain_rewritable) support hard links if configured with the new enable_hard_links setting, which enables ALTER operations and mutations on MergeTree tables stored on them. Mutations…
featureNew function arrayFlattenedLength, returning the total number of elements of a multidimensional array, as if it was flattened with arrayFlatten. Unlike cardinality/length, which count only the elements of the outermost array, it counts elements at every nesting level, matching PostgreSQL's…
featureRefreshable materialized views can now refresh incrementally with REFRESH ... APPEND INCREMENTAL, appending only the rows committed to the source table since the previous refresh instead of re-reading the whole source. (Smita Kulkarni).
featureSupport exactly-once incremental refresh of refreshable materialized views into Iceberg targets by committing the refresh cursor atomically inside the Iceberg snapshot summary. (Smita Kulkarni).
featureAdd MergeTree settings max_table_size_rows, max_table_size_bytes_compressed, and max_table_size_bytes_uncompressed that limit the total size of a table. The limits are checked at the beginning of INSERT and when new data parts are committed (including the results of background merges and…
featureclickhouse-client accepts --ssh-key-file without a value: the key is looked up the same way as ssh does it - the identity files configured for the host in ~/.ssh/config, the default identity files, such as ~/.ssh/id_ed25519, and the keys held by the ssh-agent. Authentication with a key held by the…
featureAdd the max_tables database setting to limit the number of tables in Atomic and Ordinary databases. Every table-like object counts toward the limit: tables, views and dictionaries. (Alexey Milovidov).
featureJemalloc Fragmentation Profiler. (Azat Khuzhin).
featureNew text index tokenizer keyValuePairs, which indexes a Map(String, String) column directly and answers map['key'] = 'value' from the index without reading the map column. (Jimmy Aguilar Mena).
featureIceberg v3 has two new fields in manifest file - first_row_id and last_seq_num. This PR allows to read them as virtual columns. (Konstantin Vedernikov).
featureAdded nats_ca_file, nats_client_cert_file and nats_client_key_file settings to the NATS engine, for verifying a broker certificate signed by a private CA and for client-certificate authentication. The feature was first proposed in by sidhmads. (Nikolay Degterinsky).
+1346 more items in the release notes
otherBackported in: An equality with a Bool value that no statistics can estimate, such as WHERE j.f = false on a JSON path, a Bool column without statistics, or IN with a Bool set, is now estimated to match half of the rows per value instead of 1%, so a join on such a filtered table builds its hash…
otherBackported in: A JOIN whose ON condition has a constant-false conjunct now works with the experimental parallel_replicas_plan_based setting when the join uses grace_hash, spills to disk, or runs with join_use_nulls = 1, instead of terminating the server or failing with NOT_FOUND_COLUMN_IN_BLOCK.…
fixBackported in: Mask credentials embedded in HTTP URIs. (Han Fei).
fixBackported in: Creating a FileLog tables now require READ and WRITE privileges, analogous to File tables. (Robert Schulze).
fixBackported in: Fixed a heap-use-after-free in the view dependency graph after renaming a materialized view whose query selects from itself. CREATE MATERIALIZED VIEW and ALTER TABLE ... MODIFY QUERY now reject a query that makes a materialized view select from itself. (Groene AI).
fixBackported in: Fix use-after-free in complex key ssd_cache dictionaries when the cache file wraps around its partitions. Fix CANNOT_READ_ALL_DATA when reading long values of ssd_cache dictionaries from the cache file. (Alexey Milovidov).
fixBackported in: Fixed count() with WHERE d = toDate32('1900-01-01') (or !=) over a MergeTree Date32 column returning the number of 1970-01-01 rows when optimize_trivial_count_with_sparsity_filter is enabled (the default since 26.8). Closes. (Groene AI).
fixBackported in: Fix polygonConvexHullCartesian returning garbage for a polygon with an empty exterior ring and a non-empty interior ring. (Alexey Milovidov).
otherBackported in: Make 03673_columns_description_cache and 04257_102926_columns_descriptions_cache_nested_eviction robust to asynchronous part removal, applying the fix already made to their sibling 04510_shared_part_schema_metadata_eviction. (Groene AI).
breakingBackported in: CREATE TABLE x AS src inherits the credentials embedded in the engine of src, which are masked in SHOW CREATE TABLE. It now requires the SELECT privilege on src when the inherited definition can carry credentials, instead of only SHOW COLUMNS. (Yarik Briukhovetskyi).
otherBackported in: Reduce repeated IN evaluation when many adjacent singleton row-mask updates are applied to one part. (Sergey Kuznetsov).
featureBackported in: Estimating subcolumn sizes for PREWHERE (for example m['key'] of a Map(LowCardinality(String), String) column) no longer reads the LowCardinality dictionary or the Variant discriminators header of every data part, which made planning slow on object storage, especially for each new…
otherBackported in: BACKUP uses less memory per file it backs up: an entry of the backup no longer keeps a copy of the description of the disk the file is on. A backup of a table with millions of files saves a few gigabytes. (Julia Kartseva).
fixBackported in: Fixed a server crash and an out-of-bounds write when inserting into a column with a long chain of compression codecs, for example CODEC(FPC, FPC, ..., FPC). CompressionCodecMultiple compounded each stage's reserved size in a UInt32 without checking for overflow, so a long enough…
fixBackported in: Fixed a read of uninitialized memory when a Variant, Dynamic or JSON column holding only NULL values is compressed, for example on insert into a Memory table created with compress = 1, or when a block is compressed for a JOIN or for the query result cache. The reported size of such…
fixBackported in: BACKUP and RESTORE to S3 retry requests that fail with ExpiredToken after refreshing credentials. The retry time limit is 120 seconds by default and can be changed with backup_s3_expired_token_retry_timeout_ms. (Nikolai Ovchinnikov).
fixBackported in: Fixed a server crash (or missing rows in the view, with a Null source table) on INSERT into the source table of a materialized view when a row policy or additional_table_filters of a table read by the view references the source table, e.g. USING x IN src. (Groene AI).
fixBackported in: Fix a segmentation fault in GROUP BY with the adaptive aggregator and external aggregation when a memory limit was hit while draining staged records. (Alexey Milovidov).
fixBackported in: Fix segfault when reading a MySQLDump file whose CREATE TABLE query has an ENUM column without a list of values or with non-string values. (Alexey Milovidov).
fixBackported in: Fix a stack overflow when a Redis server replies with deeply nested arrays. (Alexey Milovidov).
fixBackported in: Fix a stack overflow on a Protobuf schema with a very long chain of nested messages. (Alexey Milovidov).
otherBackported in: Not required. (Groene AI).
fixBackported in: Fixed crashes of the interactive line editor of clickhouse-client and clickhouse-local, which also crashed the server when used through the web terminal or an SSH session: after a history search that found nothing on an edited recalled query, when the prompt or the line given to an…
otherBackported in: Reduced the memory usage of incremental BACKUP: the base backup keeps only the sizes and checksums of its files instead of the full information about each file. For a base backup of millions of files this saves gigabytes. (Julia Kartseva).
otherBackported in: Compare TOTP codes and plaintext_password passwords in constant time, so that the response time does not depend on how many leading characters are correct or on which time window matched. (Vladimir Cherkasov).
fixBackported in: Fix reading dropped column with existing column in data file. Closes. (Konstantin Vedernikov).
fixBackported in: Requesting SSH-key authentication over the native protocol no longer reveals whether the named user exists, or how it authenticates, before its signature is checked. (Shaohua Wang).
fixBackported in: Reject CR and LF characters in values sent as HTTP headers or in the request line of outgoing HTTP requests (BigQuery, YTsaurus, url, DataLake catalogs, GCP OAuth, AI functions, S3 storage class), which could be used to inject headers or additional requests. (Raúl Marín).
fixBackported in: The setting http_zlib_compression_level now applies only to the gzip and deflate HTTP response compression. The level of other methods (zstd, lz4, br, xz, bz2) is controlled by output_format_compression_level. Previously, a level suitable for zlib was passed to every method, which…
fixFixes distributed queries incorrectly disabling the analyzer on shards when a native application reports its own version. Compatibility decisions use the connecting ClickHouse server's version and preserve explicit analyzer choices, including on the first query of a connection. (Ye Yuan).
breakingBackported in: Overriding a key that is stored in a named collection now requires SHOW NAMED COLLECTIONS SECRETS on that collection. This also applies to overrides through an alias (including flat kafka_* settings over nested kafka.* keys), through a SETTINGS clause of a table engine or table…
otherBackported in: A packet that cannot appear at the current point of the native protocol is now rejected without deserializing its payload. Previously the server deserialized the body of an unexpected Data packet — including arbitrary data types and aggregate function states — only to throw…
fixBackported in: Fixed a crash caused by a stack overflow when a deeply nested JSON document was parsed into a JSON column or passed to the JSONExtract family of functions. Such documents are now rejected with the TOO_DEEP_RECURSION error. (Pavel Kruglov).
fixBackported in: Fix a server crash when a RIGHT JOIN/FULL JOIN is planned for parallel replicas (parallel_replicas_plan_based=1) and the join output header declares a column by type only — e.g. the residual column of a constant NULL conjunct in the ON clause. Type-only header columns are now…
fixBackported in: Fixed CANNOT_READ_ALL_DATA (while reading prefix of column ...) during query planning when a MergeTree table has an active empty Wide part, left by a TTL drop or by a mutation that deleted all rows of a part, and the query filters on a subcolumn, such as a key of a…
fixBackported in: Fixed ORDER BY ... LIMIT over a column of an Interval type (or Nullable, LowCardinality, Tuple or Array of one) failing with TYPE_MISMATCH when use_top_k_dynamic_filtering is enabled, which is the default. Closes. (Groene AI).
fixBackported in: Allow to do vertical merge if result part storage type is not Full. (alesapin).
fixBackported in: Fixed a crash (stack overflow) on a CapnProto schema with a long chain of type expression suffixes (Int32.a.a..., Int32()()...) or of declarations that refer to each other (constants, aliases, struct fields, annotations, imports). Such a schema is now rejected with The CapnProto…
fixBackported in: Fixed Reading in parallel from replicas is enabled but cluster to execute query is not provided (CLUSTER_DOESNT_EXIST) when selecting from a Distributed table whose cluster is not declared in remote_servers - the cluster of a Replicated database, or one found by cluster discovery -…
otherBackported in: A filter on the PARTITION BY columns of a window function is no longer pushed below the window (this reverts). The push-down made queries up to 8 times slower when the window reads a JOIN and the filter removes every row, for example IN over an empty subquery, because the join built…
featureBackported in: Add S3 bucket to remote_url_allow_hosts. (Konstantin Vedernikov).
otherBackported in: Reduced the peak memory usage of RESTORE and of incremental BACKUP: the metadata file of a backup is now parsed while it is read, instead of being read into memory whole first. For backups of millions of files this saves gigabytes. (Julia Kartseva).
securityBackported in: Update the vendored expat to 2.9.0, fixing a denial of service through a crafted backup manifest during RESTORE (CVE-2026-66046) and the other 2.8.3–2.9.0 security fixes. (Actuele AI).
fixBackported in: Fixed loading, short ATTACH, and UNDROP TABLE for existing SQL-defined S3 disks whose endpoints are absent from remote_url_allow_hosts; new full-definition CREATE and ATTACH still reject disallowed endpoints. (Alexey Bakharew).
fixBackported in: Fixed a stack overflow crash on a deeply nested CapnProto schema that the nesting depth check missed: a comment or a byte order mark between import and its path, an escape sequence in the import path, or a backtick text line. A backtick text line with many brackets is no longer…
fixBackported in: Fixed a possible segmentation fault when reading an Avro map into a Map column (for example Map(DateTime, String)) with the AvroConfluent format, including Kafka tables. Closes. (Groene AI).
fixBackported in: Fixed an issue where pressing Ctrl-R and then Ctrl-Z in the web terminal or the SSH interface suspended the whole server process. (Alexey Milovidov).
fixBackported in: Fix a wrong result, or an exception in debug builds, when optimize_aggregators_of_group_by_keys eliminated any, min or max of a GROUPING SETS key with group_by_use_nulls. (Alexey Milovidov).
fixBackported in: Fixed a server crash when a RabbitMQ table with the headers exchange type had a routing key without =, or when rabbitmq_routing_key_list was empty. Routing keys without = for the headers exchange type are now rejected with an exception. The problem was found and reported by @dstesk…
otherBackported in: Update mariadb-connector-c to v3.4.10. (Actuele AI).
otherBackported in: Update vectorscan to 5.4.13. (Actuele AI).
otherBackported in: Observed as a bottleneck in the ci-logs cluster. (Mikhail Artemenko).
featureBackported in: Add ability to select jemalloc 4K/16K page size on aarch64 (default 64K). (Azat Khuzhin).
otherBackported in: DROP TABLE, DETACH TABLE, server shutdown and ALTER TABLE ... MODIFY SETTING refresh_statistics_interval no longer wait until a running background refresh of the statistics cache of a MergeTree table has read the statistics of every part. On object storage with thousands of parts…
fixBackported in: Fix ALTER TABLE ... MATERIALIZE STATISTICS / DROP STATISTICS failing forever and wedging the table's mutation queue when a server profile sets allow_statistics = 0 and the statement enables it per-session, the same opt-in ADD STATISTICS honours. Also close a hole where MATERIALIZE…
fixBackported in: Fixed the LOGICAL_ERROR Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan raised when an IN or other set subquery defines a MATERIALIZED CTE that two other MATERIALIZED CTEs of that subquery read (for…
fixBackported in: Fix a credential written in cleartext to system.query_log and the server log when a key = value argument precedes the positional arguments of the mongodb, redis, remote, arrowFlight and ytsaurus table functions or the MongoDB, Redis, Remote, ArrowFlight, ExternalDistributed and…
fixBackported in: Free prefetched messages when StorageKafka2 partitions move between consumers, preventing per-partition memory growth until restart. (Aparajita Pandey).
fixBackported in: The web terminal and the SSH interface no longer reset the settings of the user (from settings profiles, roles, and CREATE USER ... SETTINGS) to default values. Previously, restrictions such as readonly, resource limits, and additional_table_filters were not applied in these…
otherBackported in: Not required. (Groene AI).
breakingOutbound TLS connections no longer verify that the server certificate names the host by default (reverts https://github.com/ClickHouse/ClickHouse/pull/116724), because it broke clickhouse-client --tls-sni-override. Set openSSL.client.extendedVerification to true to enable the check. (Nikita…
featureBackported in: optimize_and_compare_chain again derives transitive conditions through a DateTime or lower-scale DateTime64 constant compared with a DateTime64 expression, as it did before 26.8. For example, t1.ts = t2.ts adds t2.ts < toDateTime('2026-09-16 00:00:00'), so the other side of a join…
featureBackported in: Added a server setting access_control_improvements.readonly_restricts_set_role, false by default. When enabled, SET ROLE is refused with error code READONLY in a session or query whose readonly setting is not zero. Previously SET ROLE was the only identity-changing statement that…
featureBackported in: Added the setting use_aggregation_memory_tracker to choose how GROUP BY measures its memory when deciding on two-level aggregation. compatibility below 26.9 restores the measurement from before 26.7. (Hechem Selmi).
fixBackported in: Fix wrong results for uniq*, GROUP BY, LIMIT n BY, ORDER BY after GROUP BY, and window PARTITION BY over toString of a DateTime/DateTime64 in a time zone with a daylight-saving transition, and over toFixedString of a String. Both functions claimed to be injective while mapping…
fixBackported in: Fixed use_skip_indexes = 0 also disabling part pruning by the partition-key min-max index (since 26.5), which made such queries read every part of the table. (Ashish Kumar Choubey).
fixBackported in: Fixed queries that go through another server (remote, Distributed, parallel replicas, GLOBAL IN) failing with SYNTAX_ERROR, UNKNOWN_CODEC or CORRUPTED_DATA when output_format_native_encode_types_in_binary_format or input_format_native_decode_types_in_binary_format is enabled. The…
fixBackported in: Reject malformed serialized groupBitmap states with INCORRECT_DATA instead of failing later during bitmap operations. (Elmi Ahmadov).
fixBackported in: Fixed a WHERE condition or a row policy on a Hive partition column (use_hive_partitioning = 1) returning too few rows when the Parquet data file also has a column with that name and other values: Parquet row-group, page and dictionary pruning used the file's values instead of the…
fixBackported in: Fixed a heap use-after-free in the s3, azureBlobStorage, hdfs and other object storage table functions and engines when an exception (for example MEMORY_LIMIT_EXCEEDED) was thrown while creating the reader of a file in a row input format such as CSV. (Groene AI).
fixBackported in: Fixed a server crash, wrong results or a rejected query in ORDER BY ... WITH FILL ... INTERPOLATE when one INTERPOLATE expression has to be converted to its target's type and another item reads the same column or literal, for example INTERPOLATE (a AS b, b AS a) with targets of…
featureBackported in: Restore min/max pruning of Iceberg data files for a Decimal(38, 38) column. A manifest bound of magnitude above roughly 0.7 cannot be widened inside Int128 and was dropped, which left the column without a min/max condition; it is now saturated at the largest magnitude the precision…
fixBackported in: Fixed wrong results and a server abort when a JOIN ON condition evaluated during an ie_join join contains arrayJoin. Such a condition is now rejected with INVALID_JOIN_ON_EXPRESSION. Previously SEMI/ANTI/LEFT/RIGHT/FULL joins using the ie_join algorithm could return duplicated or…
fixBackported in: The collections of the Native protocol — the settings and the query parameters of a query, the client information, the granted roles and the table-status lists — are now bounded, so a small packet can no longer make the server allocate memory for data that has not arrived. (Alexey…
fixBackported in: Fix the default-enabled query_plan_merge_expression_into_join returning rows that violate the query's own JOIN ON condition when a subquery computes a non-deterministic expression that is then used as a join key. The merged expression was computed twice from the raw inputs, drawing…
fixBackported in: Fix a vector search returning fewer rows than its LIMIT, and missing true nearest neighbours, after a lightweight DELETE (or with a delete mutation applied on the fly): the vector index is no longer used for a part while it still holds deleted rows. (Alexey Milovidov).
fixBackported in: Fixed a crash on a query with a deeply nested Dynamic or JSON constant. (Pavel Kruglov).
fixBackported in: Fixed excessive memory usage when loading a data part with a corrupted columns_substreams.txt; such a part is now detached as broken. (Murphy).
fixBackported in: Fix NOT_IMPLEMENTED for an outer JOIN with join_algorithm = 'full_sorting_merge' when optimize_and_compare_chain derived a condition on the preserved side of the join from the ON clause. (Yarik Briukhovetskyi).
securityBackported in: Update mongo-c-driver to 2.5.5, fixing an out-of-bounds write during MongoDB connection monitoring reconnects (CVE-2026-96746). (Actuele AI).
fixBackported in: Fixed wrong results when a WHERE clause mixing AND and OR was evaluated with skip indexes (use_skip_indexes_for_disjunctions, enabled by default). If a minmax or set index could not evaluate one atom of the predicate for a granule, the per-atom verdicts recorded for that granule…
otherBackported in: Update thrift to v0.25.0. (Actuele AI).
otherBackported in: Integration-test harness: tolerate non-UTF-8 bytes when decoding captured container output, so a single bad byte no longer aborts cluster teardown and the sanitizer scan, and honor shutdown(ignore_sanitizer=True) in the docker.log fallback scan. (Groene AI).
fixBackported in: Fixed a crash on INSERT into a MergeTree table when a materialized view over it reads the same table from a correlated subquery, IN or a non-leftmost table of an IN subquery. (Groene AI).
fixBackported in: Fixed wrong results for a comma or CROSS join whose WHERE compares columns of two tables through a non-deterministic expression such as rand. Such a query could return rows that contradict its own WHERE clause, because rewriting the join into an INNER join moved the expression into…
fixBackported in: Fixed TRUNCATE TABLE of an Alias table whose target is a MergeTree failing with DEADLOCK_AVOIDED when the alias is being read concurrently, while the same statement against the target table succeeds immediately. The lock for TRUNCATE is now chosen and taken on the table that…
fixBackported in: Fixed wrong results, or an ILLEGAL_COLUMN error, of a JOIN whose condition equates both a column and an expression of that column (for example ON t1.k = t2.k AND intDiv(t1.k, 2) = intDiv(t2.k, 2)) when a filter on that expression is pushed down to the other side of the join: the…
fixBackported in: Fixed parallel replicas not being used when reading a Distributed table whose underlying table is another Distributed table and every shard of the outer cluster has a single replica. (Igor Nikonov).
fixBackported in: Fixed duplicated rows returned by ANY RIGHT JOIN with any_join_distinct_right_table_keys = 1 when parallel replicas are enabled. (Groene AI).
fixBackported in: Fixed slow planning of queries with skip indexes on tables with many parts and pending patch parts of lightweight updates. (Anton Popov).
fixBackported in: Fixed a crash (stack overflow) when reading an Avro file with an explicit structure that does not read a field nested through a long chain of named types, or a field of a recursive type holding deeply nested data such as a long linked list. Such a file now fails with…
otherBackported in: Do not use parallel replicas for clusterAllReplicas. (Igor Nikonov).
otherBackported in: Faster sorted-stream processing on a multi-column key whose leading column has long runs, in LIMIT BY, negative LIMIT BY, DISTINCT in order, window functions (peer groups and PARTITION BY boundaries), full_sorting_merge and partial_merge JOIN, and ReplacingMergeTree FINAL without…
fixBackported in: Comparing an Enum column with a string literal that is not one of its elements no longer throws UNKNOWN_ELEMENT_OF_ENUM when validate_enum_literals_in_operators is disabled (the default) and the column is part of the primary key, the partition key, or a bloom_filter index. != with…
fixBackported in: Fix corrupted shared data of nested JSON objects after a failed attempt to parse a value during insert. It could lead to errors like Unexpected version of JSON type binary encoding or Unknown type code when reading the data after merges or when serializing it in binary formats.…
fixBackported in: Fixed a query failing with an exception like Cannot parse UInt64 from String on a table with a text index on mapKeys or JSONAllPaths, when the predicate cannot be evaluated on the value of a missing map key or JSON path. (Anton Popov).
otherBackported in: Use castStorage for the Join row policy check in the legacy analyzer. (Vladimir Cherkasov).
otherBackported in: ArrayElement and arraySlice now read lazily replicated arrays (produced by ARRAY JOIN and JOIN when enable_lazy_columns_replication is enabled) directly, without materializing them. This greatly reduces memory usage and improves performance of queries that index or slice a large…
otherBackported in: bloom_filter and text indexes are now used when a Nullable indexed column is cast to the non-Nullable type, such as CAST(x, 'String') or json.path::String. A query that would throw on a NULL value may not throw when the index skips the granules with NULL. (Anton Popov).
fixBackported in: Fix reading bucketed runtime Map values from JSON columns using advanced shared-data serialization. (Rory Shanks).
fixBackported in: Fix a possible heap buffer overflow on malformed responses from blob storage. (Arsen Muk).
fixBackported in: Fix DeltaLake stats pruning with Date cast. (Arsen Muk).
fixBackported in: Fix EXPLAIN PLAN actions = 1 printing a secret function argument (for example the key of HMAC or encrypt) in cleartext when its value came from a subquery or from the other side of a JOIN. (Vladimir Cherkasov).
fixBackported in: Fix INSERT failing with ILLEGAL_FINAL or SAMPLING_NOT_SUPPORTED when a materialized view applies FINAL or SAMPLE to its own source table inside a subquery. Regression in. (Jimmy Aguilar Mena).
fixBackported in: Fix a rare server crash (SIGSEGV in mongoc_log) when a MongoDB dictionary source or MongoDB table was created while another thread created the first MongoDB connection in the process. Messages logged by the MongoDB driver now go to the server log. (Vladimir Cherkasov).
otherBackported in: CRoaring v5.2.3 exposes internal_validate() on the C++ RoaringBitmap wrappers, so RoaringBitmap data can be validated. (Elmi Ahmadov).
otherBackported in: Update cctz to 2026e. (Actuele AI).
featureBackported in: Add test coverage for arrayElement compute-on-nested branches and simplify its type dispatch. (Diego Gomes Tomé).
fixBackported in: Fixed a LOGICAL_ERROR in arraySlice on a QBit column replicated by ARRAY JOIN or a JOIN. (Groene AI).
otherBackported in: A WHERE that no row passes is pushed to every JOIN input again, including the non-preserved side of an OUTER JOIN and a side with no column used above the join, so that input is no longer read and hash-built for nothing. For example, a UNION ALL branch whose constant column fails…
otherBackported in: Hash joins with many matches per key are faster when they output a LowCardinality column whose blocks have different dictionaries (several parts, FINAL, or a LowCardinality value computed per block): short ranges from another dictionary are now inserted key by key instead of through…
featureBackported in: Added the setting query_plan_filter_push_down_below_limit_by (default 1), controlling whether filters on LIMIT BY key columns are pushed below the LIMIT BY step. Setting it to 0 restores the plan shape used before 26.7, for queries where the pushed predicate makes index analysis…
fixBackported in: Mask secrets in the queries that a cluster-mode QueryRunner table writes to system.query_log as well as in queries executed as startup scripts. (Miсhael Stetsyuk).
fixBackported in: Fixed a standalone UPDATE ... SET reading the wrong table when a mutation expression names a table that a same-named WITH element hides, but which the subquery does not see because its own SETTINGS clause disables enable_global_with_statement. Such a name is a table name, and it is…
fixBackported in: Tables in a database with lazy_load_tables were missing from system.parts, system.replicas and related system tables, and refused by replica commands, after a restart. (Nikolay Degterinsky).
fixBackported in: Fix a server abort when reading an Iceberg table whose sort order names a transform ClickHouse cannot parse (e.g. bucket[xyz]); ClickHouse now ignores that sort-order hint and keeps the table readable. (Ilias).
fixFix excessive memory usage of SELECT DISTINCT when its result is buffered by the next step, for example on the left side of a JOIN or in INSERT ... SELECT DISTINCT: each output block kept the memory of its whole input block, so memory grew with the input instead of with the number of distinct…
otherBackported in:. (Alexey Milovidov).
fixBackported in: ALTER TABLE ... MODIFY SETTING disk = disk(...) could register a disk defined in SQL whose local path is outside custom_local_disks_base_directory, and create its directory, bypassing the check that CREATE TABLE applies. Now it is rejected the same way, and a statement rejected this…
fixBackported in: Rewriting the body of a view with ALTER TABLE ... MODIFY QUERY now needs the same grants as creating it with its SQL security: SET DEFINER on the definer of a SQL SECURITY DEFINER view, or ALLOW SQL SECURITY NONE for a SQL SECURITY NONE view. An ON CLUSTER MODIFY QUERY fails with…
fixBackported in: Put "WRITE" operation in delta lake catalog. (Konstantin Vedernikov).
fixBackported in: Fix Found patch part ... that intersects mutation with version ... on lightweight updates in a table created with CREATE TABLE ... CLONE AS or ATTACH PARTITION ALL FROM a table with lightweight updates. (Nikolay Degterinsky).
fixBackported in: Fix UNKNOWN_IDENTIFIER in the analyzer when a table is referenced as database.table in FROM or JOIN and another table expression in the same query uses that database name as its alias, for example FROM db.t1 AS db INNER JOIN db.t2 AS t ON .... Closes. (Dmitry Novik).
fixFix iceberg_tolerate_conflicting_manifest_schemas being reverted to false by compatibility settings of 26.8 or 26.9 on 26.8 servers, which made Iceberg reads fail with ICEBERG_SPECIFICATION_VIOLATION on tables whose manifest schemas conflict with metadata.json. (Asya Shneerson).
fixBackported in: Fix container existence check during RESTORE of a lightweight snapshot from Azure Blob Storage by parsing the saved namespace into container name and prefix. (Garrett Thomas).
otherBackported in: Reduced the setup of the 04510_distributed_final_many_partitions test from 150 to 65 partitions. (Groene AI).
otherBackported in: Filesystem cache: make reserve granularity dynamic. (Kseniia Sumarokova).
fixBackported in: Fixed a text index dropping matching rows when a FixedString is involved in the comparison: a term-preserving tokenizer over a String column lost the rows whose value carries literal trailing zero bytes when the search constant is a FixedString, and an index over a FixedString…
fixBackported in: Fix basic statistics of parts written by 26.6 or 26.7: after ALTER TABLE ... UPDATE or a lightweight DELETE, non-Nullable columns reported a default-value count of 0, which made selectivity estimates wrong. Query results were not affected. To repair parts that are already affected,…
fixBackported in: Fix a possible hang of a query under workload CPU scheduling with cpu_slot_preemption enabled: when all its threads were preempted, the query could keep CPU slots it had already used and wait forever for one of them. (Sergei Trifonov).
fixBackported in: Fixed a LEFT/RIGHT/FULL JOIN without an equality key that failed with INVALID_JOIN_ON_EXPRESSION (Cannot determine join keys) when its WHERE clause also contained an IN (subquery). The WHERE filter now converts such a join to INNER again, as it did in 26.6, which also restores that…
fixBackported in: Fixed a segmentation fault or std::length_error when reading TSV formats with input_format_tsv_crlf_end_of_line = 1 if an escape sequence ended exactly at the end of a read buffer. (Groene AI).
fixBackported in: Respect iceberg_metadata_staleness_ms in metadata parsing. (Konstantin Vedernikov).
otherRevert backport of to 26.8: Check for timeouts and KILL QUERY while covering a polygon with H3 cells. (Nikita Fomichev).
otherBackported in: Warn when CLEAR COLUMN leaves an EPHEMERAL-derived MATERIALIZED column stale, and cover it with a test. (Shaohua Wang).
otherBackported in: Skip indexes (bloom_filter, tokenbf_v1, ngrambf_v1, minmax) and the primary key are now used when the indexed column is wrapped into a conversion that does not change its value, such as toLowCardinality, toNullable or a CAST to Nullable or LowCardinality. (Anton Popov).
fixBackported in: Fix an out-of-bounds read when deserializing a uniqTheta state shorter than 24 bytes, for instance from CAST( AS AggregateFunction(uniqTheta, ...)). (Alexey Milovidov).
fixBackported in: Fix a buffer over-read on the sequential read path from Azure Blob Storage: an endpoint that answers a ranged request with more data than was requested could deliver bytes from outside the requested range to the caller. The end of a read is now decided by the locally set right…
otherBackported in: Faster planning of queries to Iceberg tables with many manifest files: when a manifest file header has the schema-id key and that schema is already known from metadata.json, the schema copy stored in the manifest header is no longer parsed and compared with it. ClickHouse now also…
otherBackported in: Build Iceberg min/max hyperrectangles only for columns the filter uses. (Konstantin Vedernikov).
otherBackported in: Hide the HTTP headers in the definition of HTTP dictionary sources in SHOW CREATE DICTIONARY, system.tables and query logs, the same way as passwords. They can be shown with the existing display_secrets_in_show_and_select mechanism. (Matheus Nerone).
otherBackported in: Parse some (geo) parquet metadata lazily. (Konstantin Vedernikov).
fixBackported in: Preserve execution limits and resource lifetimes when deriving QueryPlan instances for internal query execution. (Groene AI).
fixBackported in: Fixed SYSTEM SYNC TRANSACTION LOG (local, non-ON CLUSTER form) not checking the SYSTEM_SYNC_TRANSACTION_LOG privilege. The ON CLUSTER form already required it via getRequiredAccessForDDLOnCluster, but the local execution path skipped checkAccess, so a user without the grant could…
fixBackported in: Fix a text or ngrambf_v1 index silently dropping matching rows when the indexed column is compared for equality against a FixedString value, or searched with hasAny or hasAll over FixedString needles. Happens at default settings, since use_skip_indexes and enable_full_text_index are…
fixBackported in: Fixed an ssl_certificate authentication bypass where an embedded NUL byte in a certificate's Common Name (for example john\0.evil.com) was truncated server-side to john, letting a holder of such a certificate authenticate as a different user. (Konstantin Bogdanov).
fixBackported in: Fixed max_memory_usage and max_server_memory_usage not being respected when reading a JSON column with the FLATTENED serialization version from the Native format. (Pavel Kruglov).
fixBackported in: Fixed out-of-bounds reads when reading a JSON or Dynamic column from a malformed Native block or a corrupted data part. A truncated stream, a duplicate type in a flattened Dynamic column, a duplicate or typed-colliding path in a JSON column, and a serialization version that is only…
fixBackported in: Prevent asynchronous inserts that only need to buffer data from being blocked by another insert waiting for a flush worker while holding their shared queue lock. Ensure a global forced flush waits for batches removed from the queue that are still waiting for a worker. (RJ).
fixBackported in: Kafka producer and consumer trace logs now show the value of secret librdkafka properties, such as sasl.password, as [HIDDEN] instead of the cleartext value. (János Benjamin Antal).
fixBackported in: Skip indexes (text, tokenbf_v1, ngrambf_v1) are now used when the indexed column or the searched constant is wrapped into LowCardinality, Nullable or an equivalent CAST. For example, m['key'] = 'value' on a Map(String, LowCardinality(String)) column and hasToken(s,…
fixBackported in: EXPLAIN AST printed secret function arguments, such as the key of encrypt, in clear text, and with optimize = 1 it did so for the body of a view the user may only SELECT from. The dump now prints '[HIDDEN]' in their place, under the same gate as SHOW CREATE. (Harikrishnan Prabakaran).
fixBackported in: Column-level SELECT privileges are now enforced for columns used only inside indexHint and for ALIAS columns referenced in PREWHERE. As in WHERE, referencing an ALIAS column in PREWHERE requires the grant on the alias name; a grant on its source columns is no longer sufficient. A…
fixBackported in: Fix a server crash (SIGSEGV) when a CREATE TABLE ... PROJECTION / ALTER TABLE ... ADD PROJECTION statement is restored from a clickhouse_json AST whose projection query subtree contains a function node without an arguments list. The malformed payload is now rejected with…
fixBackported in: Fixed a row policy bypass: a direct JOIN with an EmbeddedRocksDB, KeeperMap or Redis table in the legacy analyzer (enable_analyzer = 0) ignored the row policy of the right table and returned hidden rows, and joinGet on a Join table ignored its row policy in both analyzers. Such a…
fixBackported in: Fix NO_COMMON_TYPE in case of use_variant_as_common_type=0 for jemalloc fragmentation dashboard. (Azat Khuzhin).
fixBackported in: Fix the Kafka and NATS table engines ignoring remote_url_allow_hosts: broker addresses from kafka_broker_list, nats_url, and nats_server_list are now checked against the remote host filter. A forbidden address is rejected at CREATE TABLE with UNACCEPTABLE_URL, as the RabbitMQ engine…
fixBackported in: Now statistics parts pruning will not work if table has row level policy. (alesapin).
fixBackported in: Now clickhouse masks credentials in system.query_log even for wrong URLs for external table engines. (alesapin).
fixBackported in: Fix filesystem cache accounting when the directory for a new cache key cannot be created, for example because the cache disk is out of space or inodes. The failed reservation stayed counted in the cache until the query released the file segment. (Sema Checherinda).
fixBackported in: CREATE OR REPLACE in a Replicated database or with ON CLUSTER now requires the drop privilege for the kind of the table it replaces, so a user without DROP DICTIONARY can no longer replace a dictionary. (Nikolay Degterinsky).
fixBackported in: Fix LOGICAL_ERROR Cannot capture column N because it has incompatible type when a materialized view with a lambda over an Array(Tuple(...)) column receives a block while the source table's column type is being changed by ALTER TABLE ... MODIFY COLUMN. (Jimmy Aguilar Mena).
fixBackported in: The value of 'role_session_name' as of now is hidden in query_log. (Alexey Bakharew).
fixBackported in: Fix a server crash caused by unbounded recursion when decoding a deeply nested value inside a binary encoded type, for example an AggregateFunction parameter in a Dynamic value read from RowBinary or Native. (Pavel Kruglov).
fixBackported in: Fix Keeper silently giving a new session to a ZooKeeper client (for example the Java client or kazoo) that reconnects and asks to continue its session. Such a client now gets SessionExpired, ZooKeeper's answer for a session that cannot be continued, instead of losing its ephemeral…
fixBackported in: Fix validation of Iceberg manifest-list entries during writes. (Arsen Muk).
fixBackported in: Fixes a server crash on CREATE TABLE or ALTER TABLE ... MODIFY TTL with a TTL expression that uses the result of arrayMap with a constant lambda, such as toString(arrayMap(x -> CAST(1, 'Dynamic'), arr)). (Groene AI).
fixBackported in: Fixed secret settings of S3Queue and AzureQueue tables written with the legacy s3queue_ prefix, such as s3queue_after_processing_move_secret_access_key, being shown in cleartext in SHOW CREATE TABLE, system.tables, system.query_log and the server log. They are now hidden as they are…
fixBackported in: Add more path validations. (Konstantin Vedernikov).
fixBackported in: S3 client check initial url in backup client. (Konstantin Vedernikov).
fixBackported in: Fix missing rows in hasAllTokens and hasAnyTokens searches over a text index when an earlier query with the same predicate read a narrower key range of the same part and use_text_index_postings_cache was enabled. (Anton Popov).
fixBackported in: Fix a crash when reading an ORC file whose root type is not a struct (for example, a file written with a bigint or array root type). Such files are now rejected with an INCORRECT_DATA error. Closes. (Groene AI).
fixBackported in: Fixed a crash and wrong results with convert_query_to_cnf = 1 when WHERE or HAVING references the same SELECT alias more than once. (Groene AI).
fixFix a possible crash when querying the view over Distributed with enable_analyzer=0. (Mikhail Koviazin).
fixFix a bug where using aliases and row policies with enable_analyzer=0 could error out. (Mikhail Koviazin).
breakingBackported in: Remove --icf=safe linker warnings about SHT_LLVM_ADDRSIG in the stripped Rust libraries. (Raúl Marín).
otherBackported in: Hide a Backup locator named like a COLUMNS matcher in EXPLAIN AST instead of throwing. (Groene AI).
otherBackported in: Do not dereference a null logs_queue in OwnSplitChannel::log. (Groene AI).
breakingBackported in: Update the zxc library to v0.14.0, which changes the compressed block format of the experimental ZXC codec. Data written with CODEC(ZXC) by earlier versions cannot be read by the new version and fails with CANNOT_DECOMPRESS. If you used the experimental ZXC codec, re-encode the…
otherBackported in: Chained ARRAY JOINs no longer materialize the whole block of a lazily replicated array column before expanding it, which cuts their peak memory by several times. (Yarik Briukhovetskyi).
fixBackported in: The command line client no longer shows the as-you-type hints on a query recalled from the history (or otherwise displayed at once, e.g. pasted), so pressing Up/Down continues to navigate the history instead of the hint list. The hints appear again as soon as the line is edited.…
featureBackported in: Added the http_x_clickhouse_format_overrides_output_format setting (default true). When disabled, the X-ClickHouse-Format HTTP header only sets default_format, as it did before version 26.8, instead of overriding the FORMAT clause of the query via output_format. (Alexey Milovidov).
fixBackported in: Fix LOGICAL_ERROR when filtering an Iceberg column that ALTER TABLE ... MODIFY COLUMN made Nullable. Closes. (Groene AI).
fixBackported in: Fixed dpsub join-order optimization (query_plan_optimize_join_order_algorithm = 'dpsub') silently dropping single-table filter conditions from a JOIN ... ON clause, which could return extra rows. (Fisnik Kastrati).
fixBackported in: Fixed wrong results from JIT-compiled conversions of a floating point value to an integer or Decimal type when the value does not fit the destination: a comparison against the converted value could be evaluated against the pre-conversion value, so the same query could flip between…
fixBackported in: Fixed a crash in plus and minus of an array of dates and an array of tuples holding NULL, for example toString([toDateTime64(1, 3)] + [(2, NULL)]), and the exception ColumnTuple cannot have ColumnConst as its element when adding a constant interval to a non-constant interval of…
fixBackported in: Link with --icf=safe instead of --icf=all, so the linker keeps functions whose address is taken distinct. gRPC queries with transport compression (gzip, deflate) no longer crash the server, as they could in official builds since 26.4. Closes. (Groene AI).
otherBackported in: TLS CA certificates configured with openSSL.server.caConfig / openSSL.client.caConfig (and caConfig of composable protocols) are now reloaded without a restart when the file changes or on SYSTEM RELOAD CONFIG, in the same way as certificateFile and privateKeyFile. This makes it…
fixBackported in: Fix a segmentation fault in Keeper when preallocating space for a changelog file fails because the disk is full. (Alexey Milovidov).
otherBackported in: A single-level GROUP BY result smaller than max_block_size is now split into several blocks when it was aggregated by several threads, so the steps after it, such as the probe of a following join, run in parallel instead of on one thread. Previously such queries could be several…
breakingBackported in: A MySQL dictionary source created with a CREATE DICTIONARY query can no longer enable enable_local_infile, at the source or at one of its REPLICA entries; loading such a dictionary fails with BAD_ARGUMENTS, which with the default dictionaries_lazy_load is on first use rather than at…
featureBackported in: You can now disable reading through the executable table function and from Executable/ExecutablePool tables with the new allow_executable_tables setting, for a deployment that must not run arbitrary server-side scripts. It defaults to true, so existing behavior is unchanged. (Hanzi…
featureBackported in: Iceberg tables whose manifest file headers carry a schema that conflicts with the schema registered for the same schema-id in metadata.json are now readable: the metadata.json schema is preferred and the divergent manifest header copy is ignored with a warning, no matter which of…
featureBackported in: Add column size statistics in Avro files. (Konstantin Vedernikov).
featureBackported in: Added the setting analyzer_compatibility_allow_cte_redefinition. When enabled, a CTE name may be defined more than once in a single WITH clause; a later definition shadows the earlier one as the query analysis before 24.3 did (a redefinition can read the previous definition, the…
fixBackported in: Fixed dropping whole parts with TTL (ttl_only_drop_parts = 1) still reading all data from large, fully-expired parts. (Michael Jarrett).
fixBackported in: Fixes a server crash (double free) when finalizing an aggregate function with the -State combinator nested under a combinator that transfers several sub-states in one call (-Resample, -ForEach, -Map, -Tuple), for example groupArrayStateResample, if an exception such as a memory…
fixBackported in: Fixed Iceberg INSERT writing no lower_bounds/upper_bounds at all into the manifest entry when the table has a column whose type cannot be serialized into a statistics bound (for example Array(Int32)), or a column that is entirely NULL. Such a field is now omitted individually and…
fixBackported in: Fixes a case where date_time_overflow_behavior was ignored on parsing Date and DateTime. Closes. (Yarik Briukhovetskyi).
fixBackported in: Functions h3PolygonToCells and h3PolygonToCellsWithContainment now check for query timeouts and KILL QUERY while covering a polygon, and reject vertices whose longitude is outside -180..180 or latitude outside -90..90 degrees. Previously a polygon with such a vertex could keep a…
fixBackported in: Fixed a logical error (... to have 0 rows, but it has 1: while executing function materialize) when a dictionary with LAYOUT(DIRECT()) was read through the merge table function. Closes. (Groene AI).
fixBackported in: Fixed asynchronous TLS connections occasionally failing with an unrelated OpenSSL error left by another connection on the same OS thread. This could terminate distributed queries with a misleading network exception. (Dmitriy Borisenko).
fixBackported in: Fixed SQL injection through identifiers when inserting into a table with the SQLite engine. The remote table name and the column names were escaped with backslashes, which SQLite does not honour inside a quoted identifier, so a name containing a double quote could close its own…
fixBackported in: Fixed a Backup database engine printing the credentials of its destination in plaintext. SHOW CREATE DATABASE, system.databases.engine_full, system.query_log and the messages that reject a malformed locator showed an AzureBlobStorage account_key, a connection string or a presigned…
fixBackported in: KILL TRANSACTION ... ON CLUSTER, KILL PART_MOVE_TO_SHARD ... ON CLUSTER, SYSTEM STOP THREAD FUZZER ON CLUSTER, SYSTEM START THREAD FUZZER ON CLUSTER and SYSTEM RESET COVERAGE ON CLUSTER ran without checking any privilege, so a user holding only CLUSTER could roll back other users'…
fixBackported in: Fixed a SELECT from a table with paimon_incremental_read = 1 failing with REPLICA_IS_ALREADY_ACTIVE ("Failed to activate Paimon replica after Keeper reconnection") on the first read after the server's Keeper session was lost and re-established. Reclaiming the replica's own stale…
fixBackported in: ALTER DATABASE ... MODIFY COMMENT on a database with ENGINE = Backup no longer writes a definition the server cannot read back, which made it refuse to start; metadata already written in that form now loads too. Backward incompatibility: a backup taken by an older server of a…
fixBackported in: Fix a patch part whose source_parts.dat lost its content to a zeroed block loading as an empty index, which silently unapplied an acknowledged lightweight UPDATE and then let background cleanup delete the only copy of it. Such a part is now detached as broken. (Alexey Milovidov).
fixBackported in: Fixed http_max_multipart_form_data_size silently truncating oversized multipart data instead of failing the query, and made it span a form's external-table parts instead of resetting per part. (Sema Checherinda).
fixBackported in: Fix wrong results when a GROUP BY, DISTINCT, LIMIT BY or window PARTITION BY key was plus or minus of a partition column with a non-integer constant, for example f + 1.0 on Float64 or d + INTERVAL 1 MONTH on Date. Such a key was assumed injective, so each table partition was…
fixBackported in: Fixed two ways a table with the Redis engine mishandled an MGET reply. Reading the whole table stopped at the first key without a string value and silently dropped every key scanned after it, so one key of another Redis type was enough to truncate the result. A reply carrying a…
fixBackported in: Bound the header column count in RowBinary formats to avoid excessive memory allocation from a crafted header. (George Larionov).
fixBackported in: Fixed settings constraints from a settings profile not being enforced against the other setting assignments in the same statement. SET profile = 'p', = could override a CONST, MIN/MAX or readonly constraint that profile p installs. The same escape existed through an in-query…
fixBackported in: Fix INSERT INTO SELECT ... FROM url(...) (and s3, azureBlobStorage, ... ) with parallel replicas enabled inserting the data once per replica: the query forwarded to the replicas now names the *Cluster table function, so every replica reads only its share of the files. Closes.…
fixBackported in: Fix a server crash (std::terminate with write failed) in the embedded SSH client when the client's terminal was closed before the line reader was destroyed. (Alexey Milovidov).
fixBackported in: Fixes a segmentation fault that happens when a refreshable materialized view is started up and shut down at the same time, for example when a failed ATTACH DATABASE rolls the database back, or when the server shuts down while tables are still loading asynchronously. (Groene AI).
fixBackported in: Fixed a performance regression where a query whose WHERE requires the same expression to equal two different constants stopped being recognized as always false when compatibility was set below 26.7, or when optimize_redundant_comparisons was disabled explicitly. Such a query…
fixBackported in: TRUNCATE ALL TABLES FROM and TRUNCATE TABLES FROM ... LIKE ... now skip Alias tables, which hold no data of their own. Previously such a statement could fail with LOGICAL_ERROR: RWLock is already locked in exclusive mode, truncate a target in another database, or fail when the alias…
fixBackported in: The text, tokenbf_v1, ngrambf_v1 and sparse_grams skip indexes are now used for IN when transform_null_in = 1 and the set contains no NULL. Previously such a query read every granule, and one using force_data_skipping_indices failed with INDEX_NOT_USED. (Jimmy Aguilar Mena).
fixBackported in: Fixed an out-of-bounds heap write in stem. The output buffer was sized from the input, but some stemmers lengthen a word (Turkish uag → uagı, Estonian keeb → keesi), so a block overran its allocation and returned uninitialized heap as result values. The buffer now grows when the…
fixBackported in: remote(, 'db', 'table', 'user', 'password'), and the same form of remoteSecure and of the Remote and RemoteSecure table engines, wrote the password into system.query_log, system.text_log and the server log in cleartext, while the remote('addresses_expr', ...) form hid it. The…
fixBackported in: Fix wrong values and a LOGICAL_ERROR when reading a partitioned Delta Lake table with allow_delta_kernel_rs = 0 and column types that differ from the ones in _delta_log. (Raúl Marín).
fixFix ACCESS_DENIED on remote nodes of Distributed and parallel-replicas queries over an interserver-secret cluster for users whose grants come from roles, when the remote node recalculates access rights in a copied query context (for example, when reading a view with SETTINGS). The regression…
fixBackported in: Fixed a crash when deserializing an AST from JSON (formatQueryFromJSON, the clickhouse_json dialect): a deeply nested document exhausted the stack and killed the process with no log line. Such payloads now fail with TOO_DEEP_RECURSION. (Groene AI).
fixBackported in: Fixed a crash (stack exhaustion) in parseQueryToJSON when serializing a query nested deeper than the serializer could follow, reachable by raising max_parser_depth above its default. Such a query now fails with TOO_DEEP_RECURSION instead of terminating the server. (Groene AI).
fixBackported in: Fixed a server crash when the flameGraph aggregate function was constructed on a thread without a query context, for example while attaching a stored table whose column type names AggregateFunction(flameGraph, ...). (Groene AI).
fixFixes a problem that MySQL/Postgres queries may run in an expired session. (Robert Schulze).
fixBackported in: Fix spurious NATS connection failures when the vendored nats-io client gets EINTR while waiting for a socket, and include the upstream JetStream pull-subscription deadlock fix in the vendored client. (Alexey Milovidov).
fixBackported in: Fix logical error !raw_type->isNullable() in AND-compare chain optimization. (Groene AI).
fixBackported in: Fix flaky 01780_column_sparse: order the arrayFilter result before limiting it. (Alexey Milovidov).
+12 more items in the release notes
fixBackported in: Fixed an out-of-bounds read when finalizing a crafted analysisOfVariance aggregate state whose internal arrays have mismatched lengths. (uwezkhan).
fixBackported in: Fixed ATTACH TABLE ... AS REPLICATED and the convert_to_replicated flag file accepting a conversion whose ZooKeeper path is not a safe path. On a server whose default_replica_path substitutes {database} or {table}, a name containing / used to resolve to a path inside another table's…
fixBackported in: Fix a crash when a client sends a block over the Native TCP protocol that selects the internal Detached serialization kind for a column. (Pavel Kruglov).
fixBackported in: Fix count() returning the number of default values instead of the number of NULLs when optimize_trivial_count_with_sparsity_filter is used on a column widened to Nullable by a metadata-only ALTER TABLE ... MODIFY COLUMN. (Raúl Marín).
fixBackported in: Fixed repeated reading of text index posting lists in multi-threaded queries when the global text index caches are disabled. (Anton Popov).
otherBackported in: Update mongo-c-driver to 2.5.4 and mongo-cxx-driver to r4.6.0. (Actuele AI).
breakingBackported in: Outbound TLS connections now verify that the server certificate names the host that was connected to. This affects clickhouse-client --secure, remoteSecure(), Distributed over the secure native protocol, secure Keeper connections, and HTTPS clients such as s3(), url(), HTTP…
fixBackported in: Fix a MergeTree table with a rows TTL and a text index never dropping its expired parts: the TTLDrop merge failed with Text index transform for index ... not found and retried forever. (Groene AI).
fixBackported in: Fix wrong aggregate values with optimize_aggregation_in_order_limit when the ORDER BY is a strict prefix of the GROUP BY key and a group's rows span multiple parts. In-order aggregation streams now stop early only at a boundary of the ORDER BY prefix. Closes. (Konstantin Bogdanov).
fixBackported in: Fix a regression in 26.8 where columns of a parameterized view could not be qualified by the view name (SELECT pv.col FROM pv(p = 1) failed with UNKNOWN_IDENTIFIER) and a parameterized view used as a JOIN operand required an explicit alias. Closes. (Dmitry Novik).
fixBackported in: Fix TYPE_MISMATCH ("CAST AS Array can only be performed between same-dimensional array types") when casting an Array(Map(...)) to an array whose element type contains the Map inside a Variant, or to Array(Dynamic), Array(JSON) or Array(String). (Alexey Milovidov).
otherBackported in: Decode Iceberg data manifest files concurrently while the list of data files for a query is produced. The setting iceberg_manifest_decode_concurrency (default 4) bounds how many manifests — delete and data alike — are decoded at a time; it replaces…
fixBackported in: Fixes a performance regression where filter push-down over ANY INNER JOIN was disabled, which prevented primary key pruning and made such queries read far more data than necessary. Note that SELECT ... ANY INNER JOIN ... WHERE may therefore return a different result than applying…
fixBackported in: Fix O(n^2) decompression of gzip/zlib/deflate streams whose single DEFLATE block spans the whole stream, the shape zlib-ng produces at compression level 1 (the default of the official .NET SDK): a 24 MiB gzip HTTP body that took 11 s to ingest in 26.7 now takes 0.12 s, identical to…
fixBackported in: Messages of the PostgreSQL wire protocol are now parsed within their declared size, so a malformed message can no longer make the server allocate memory for a payload that never arrives. (Alexey Milovidov).
fixBackported in: Fix a server abort when an Azure Blob Storage endpoint reports an asynchronous blob copy as completed without the optional x-ms-copy-source or x-ms-copy-status-description header. (Alexey Milovidov).
fixBackported in: Fixed parsing of a column named from inside parentheses, such as WHERE (from IN ('a')), which since 26.8 was read as a subquery starting with the FROM clause and failed with Unknown table function IN, Unknown table expression identifier or a syntax error. (Alexey Milovidov).
fixBackported in: Fixed 01076_parallel_alter_replicated_zookeeper silently testing nothing when its ALTER thread and its DETACH thread picked the same replica. (Groene AI).
otherBackported in: Pin 05182_limit_shrinks_block_size_with_array_join's two per-node oracles to a single local reader, and pin the remote prefetched-pool eligibility its plan-shape oracle needs on object-storage runs. (Groene AI).
otherBackported in: Shrink the t_aj_limit fixture in 05182_limit_shrinks_block_size_with_array_join from 200000 to 20000 rows. (Groene AI).
fixBackported in: A small LIMIT on a query with arrayJoin shrinks the read block size again, so such queries no longer read whole blocks on every thread for a few output rows (a regression from 26.6, Closes). (Yarik Briukhovetskyi).
fixBackported in: Do not terminate the server when a transient error (such as MEMORY_LIMIT_EXCEEDED, a network error, or SYSTEM RESTART REPLICA running at the same time) happens while outdated data parts are being loaded in the background. Such errors are not a sign of an inconsistent set of parts on…
fixBackported in: Fixed a query with a hasToken-family predicate on a text index silently returning no rows when the query also read a column modified by a pending lightweight update. (Shaohua Wang).
fixBackported in: Fixed a HDFS database serving a table from its internal cache without the READ ON HDFS grant. The grant and the remote_url_allow_hosts filter were checked only while a table name was resolved for the first time, so once any user holding the grant had read a name, every user with…
fixBackported in: Fixed filesystem containment checks accepting a path with an embedded NUL byte. A DeltaLakeLocal or IcebergLocal table could be pointed outside of user_files this way. (Alexey Milovidov).
fixBackported in: Fixed ClickHouse Keeper terminating when a client sent a multi request with no subrequests. Such a request was written to the changelog before it failed, so the termination repeated on every restart. (Alexey Milovidov).
otherBackported in: Use cctz tzdata 2026c. (Konstantin Bogdanov).
breakingBackported in: New setting validate_group_by_all_key_types (default true) gates the key type validation that GROUP BY ALL applies to the grouping keys it expands the SELECT expressions into. Since 26.7 it rejects a Variant or Dynamic grouping key, for example an untyped JSON subpath, that earlier…
otherBackported in: LEFT and FULL JOIN with join_use_nulls = 1 use less memory when the right join key is selected in the query: the key is no longer stored twice on the build side. (Vladimir Cherkasov).
otherBackported in: Tightened the access check of the mergeTreeCodecBlockCounts table function: resolving its structure, for example by DESCRIBE, did not require the SELECT privilege on the source table, while reading it did, and a user without any privilege on the source table could tell an existing…
featureBackported in: Added a flat_namespaces setting for the DataLakeCatalog database engine. Set it for Iceberg REST catalogs that have only single-level namespaces and reject the parent query parameter of the list-namespaces endpoint, such as Apache Polaris federated to AWS Glue: only top-level…
featureBackported in: Allow to change fs cache boundary alignment per query via filesystem_cache_boundary_alignment - pre-existing setting which was previously used only for non-disk read. The difference now is that for disk read value 0 means use default cache configuration setting boundary_alignment…
featureBackported in: Added output_format_arrow_record_batch_size and output_format_arrow_record_batch_size_bytes, which make the Arrow and ArrowStream output formats combine consecutive blocks that are individually smaller than the target into a single record batch. A selective SELECT produced one small…
fixBackported in: Fix reading a column that has two streams whose names differ only by escaping, for example a Tuple element named size0 inside an Array, or a JSON typed path named like a substream of a sibling path. Such columns returned wrong values, failed with CANNOT_READ_ALL_DATA or a logical…
fixBackported in: Fix LOGICAL_ERROR: GroupingAggregatedTransform pushed bucket N twice when make_distributed_plan picks the Shuffle aggregation strategy while the aggregation must produce results in bucket order (for example with distributed_aggregation_memory_efficient). It is now planned as a…
fixBackported in: Make mergeTreeTextIndex stricter with row policies: reading the text index is now denied whenever a row policy applies to the table, regardless of which columns the policy uses. (Elmi Ahmadov).
fixBackported in: Fix UNKNOWN_IDENTIFIER errors in INSERT ... SELECT from a parameterized view when parallel_distributed_insert_select is enabled. the view was analyzed with the legacy interpreter even though the analyzer was enabled. (Yarik Briukhovetskyi).
fixBackported in: Fixed PARALLEL WITH, EXECUTE AS and the QueryRunner table engine skipping the access checks of the CREATE statements they execute, which allowed creating tables and databases without the corresponding privileges, and defeated the readonly and allow_ddl settings. (Alexey Milovidov).
fixBackported in: Iceberg tables recovered from stored metadata no longer enable background compaction or old-file cleanup unless those settings are explicitly stored in the table definition. (János Benjamin Antal).
fixBackported in: Fixed a NATS table whose settings all come from a named collection (ENGINE = NATS(collection) with no SETTINGS clause) being written to its metadata file with a dangling SETTINGS keyword. The stored definition could not be parsed again, so the table failed to load and aborted the…
fixBackported in: Fixed a URL database engine printing the password of its base URL in cleartext in SHOW CREATE DATABASE, system.databases.engine_full and the query log, regardless of format_display_secrets_in_show_and_select. The userinfo password is now replaced by [HIDDEN], as it already was for…
fixBackported in: Fixed an out-of-bounds read when reading a Variant column from a truncated Native stream using compact discriminators serialization. (Raufs Dunamalijevs).
fixBackported in: Now ClickHouse reject relative paths in checksums.txt. (alesapin).
fixBackported in: Fix S3 client refresh overwriting static authentication settings and breaking subsequent queries. (alesapin).
otherBackported in: Not required (CI only). (Groene AI).
fixBackported in: Fix a slowdown of query analysis for large parameterized views: the substituted view query was re-hashed on every comparison of the query tree. Closes. (Alexey Milovidov).
fixBackported in: Fixed the logical error Can't determine table for parallel replicas for a RIGHT JOIN whose right side has no table eligible for parallel replicas, and made a RIGHT JOIN materialize a left side that is not a MergeTree instead of letting every replica read it independently. (Groene AI).
fixBackported in: Fix a LOGICAL_ERROR: Next task callback is not set for query with id exception when parallel_replicas_plan_based is enabled and the query reads a system log table. (Groene AI).
otherBackported in: Split the ASan integration test jobs into eight batches. (Alexey Milovidov).
otherBackported in: Bump the internal libssh from 0.12.0 to 0.12.2. (Robert Schulze).
fixBackported in: Fix a logical error Invalid cast from Nothing to native type (an abort in debug/sanitizer builds) when compile_expressions = 1 compiled an expression with a Nullable(Nothing) operand, e.g. and(Nullable(Nothing), ). (Groene AI).
fixBackported in: Fixes a case where date_time_overflow_behavior = 'saturate', an out-of-range value is clamped to the whole second and the sub-second component is discarded. Closes. (Yarik Briukhovetskyi).
fixBackported in: Fix a segmentation fault when reading in order from a Merge table over MergeTree tables whose sorting key is shorter than the key prefix chosen for the query: the prefix was forwarded to the underlying reader unchecked, which grew its cloned sorting-key expression list to that…
fixBackported in: Each code for Time-based one-time password is now accepted at most once, as required by RFC 6238: reusing an already used code, or a code for an earlier time step, is rejected. A user with time_based_one_time_password can successfully authenticate at most once per period. (Vladimir…
fixBackported in: Fixed the byte width of the Iceberg manifest lower_bounds and upper_bounds written for int and date columns: they were 8 bytes wide where the Iceberg specification requires 4. Spec-conformant readers such as pyiceberg failed with unpack requires a buffer of 4 bytes while planning…
fixBackported in: Fix rows silently dropped by an ngrambf_v1 index for a LIKE pattern with a run of escaped backslashes before a wildcard. (Alexey Milovidov).
fixBackported in: Fix TYPE_MISMATCH in selectivity estimator. (Han Fei).
fixBackported in: Fixed an ALTER on a view or materialized view with SQL SECURITY DEFINER deleting the auto-created :definer account when the ALTER did not change the definer. Every later SELECT from the view, and every INSERT into a materialized view's source table, then failed permanently with…
fixBackported in: Fixed cleartext credentials in system.asynchronous_insert_log.query. Secrets of table functions such as s3, url or mysql are now masked as [HIDDEN], the same way system.query_log masks them. (Sema Checherinda).
fixBackported in: Fixed the server not validating the schema of the second and subsequent data blocks that a client sends for an external table over the native protocol. Such a block could make the data be interpreted as a type other than the one it was sent as. (Alexey Milovidov).
fixBackported in: Fixed a crash of the server caused by a table with ENGINE = NATS whose credentials the broker started to reject, for example after a password rotation or on an expired token. Such a table now recreates its connection and resumes consuming once the credentials are accepted again,…
otherBackported in: Write partition field summaries into the Iceberg manifest list. (Konstantin Vedernikov).
fixBackported in: Fixed a crash when reading a subcolumn of a Variant, Dynamic or JSON column whose own type is Nullable or LowCardinality(Nullable) from a MergeTree table, for example SELECT value.Tuple(a Nullable(UInt32), b String).a over a Dynamic column. Previously such a read hit a LOGICAL_ERROR…
fixBackported in: format_display_secrets_in_show_and_select works as expected in EXPLAIN. (Kirill Kopnev).
fixBackported in: Fixed optimize_or_like_chain returning extra rows for OR chains of LIKE/ILIKE patterns that do not end in %: a value followed by a trailing newline wrongly matched the filter. (Jimmy Aguilar Mena).
fixBackported in: Don't use backoffs on concurrent inserts conflicts (when we use Iceberg + catalog, for example). (Konstantin Vedernikov).
fixBackported in: Fixed a crash and a LOGICAL_ERROR for statements that write trim(BOTH '' FROM x) (or the LEADING/TRAILING spelling) where a function is expected: a column's STATISTICS(...) or CODEC(...) list, INDEX ... TYPE, ALTER TABLE ... ADD STATISTICS, auto_statistics_types, a table function, a…
fixBackported in: Fix graceful shutdown of clickhouse-keeper hanging for up to 300 seconds when a client connection on keeper_server.tcp_port_secure is stalled in a TLS read. (Groene AI).
fixBackported in: Fix a crash when reading a table with active lightweight updates whose sorting key contains a column that is missing in the data part and has a DEFAULT expression. (Groene AI).
fixBackported in: Fixed Keeper replaying its local changelog tail one entry at a time after a restart when the changelog is stored on object storage. The commit read-ahead used to discard its own prefetched entries whenever it missed the serve deadline, so on storage slower than that deadline it…
otherBackported in: Do not leave a Filesystem database pointing at a removed directory, which makes the server refuse to start. (Alexey Milovidov).
breakingBackported in: Reading a File source with rename_files_after_processing set now requires the WRITE ON FILE grant on top of READ ON FILE, on the initiator for fileCluster: the setting renames the files a SELECT has read, which is a write to the source, and it used to happen for anyone who could…
featureBackported in: Jemalloc Fragmentation Profiler. (Azat Khuzhin).
fixBackported in: Fix performance regression introduced in 26.4 when writing JSON and Dynamic columns in text formats. (Pavel Kruglov).
featureBackported in: Added the asynchronous_metrics_key_values_mode server setting to control in which form the key-value asynchronous metrics (those broken down per CPU core, block device, network interface, disk, ...) are published to system.asynchronous_metrics, system.asynchronous_metric_log, the…
fixBackported in: Fixes silent data loss for TTL expressions that apply large intervals directly to Date / DateTime source columns by widening the arithmetic away from 16/32-bit overflow. (BoloniniD).
fixBackported in: Fixed SQL injection in the PostgreSQL wire protocol emulation. Prepared-statement parameters — the Parse/Bind/Execute extended-query path used by psycopg2, JDBC, node-postgres, Npgsql and others, and the simple-query EXECUTE path — were substituted into the executed SQL by raw…
fixBackported in: Fixed a privilege-escalation gap where the executable table function did not enforce the TABLE ENGINE ON Executable grant. With table_engines_require_grant enabled, a user denied CREATE TABLE ... ENGINE = Executable could still run the same server-side script via SELECT ... FROM…
fixBackported in: Fixed potential data loss when an INSERT into ReplicatedMergeTree was cancelled or timed out while ClickHouse was recovering an uncertain Keeper commit. (kakao-tars-case).
fixBackported in: Fixed a SQL injection in the PostgreSQL metadata queries. The schema of the PostgreSQL database engine, the requested column names and the publication name were formatted into SQL literals without escaping, so a value containing a quote could execute arbitrary SQL on the connected…
fixBackported in: Fixed Iceberg INSERT writing manifest-wide aggregate column statistics into every data_file entry when a partition produced more than one data file. Each entry's null_value_counts, column_sizes, lower_bounds and upper_bounds now describe only the data file it points at. Previously…
fixBackported in: Fix allow_feature_tier rejecting merge_tree_-prefixed settings in settings profiles as unknown, and rejecting CREATE TABLE because of MergeTree settings set by the server through compatibility or the merge_tree config section. Also fix constraints on a merge_tree_-prefixed setting…
fixBackported in: Fixed a data race and a use-after-free on the metadata of a DeltaLake or Iceberg table. Two concurrent queries that read total_rows or total_bytes from system.tables for the same table could have one query replace the table's metadata while the other was still reading it, which…
fixBackported in: Fixes memory leaks of abandoned nested aggregate states. (Groene AI).
fixBackported in: Apply remote_url_allow_hosts before SQL-supplied S3 and Azure endpoints send schema, metadata, or container requests. (Rory Shanks).
fixBackported in: Fix wrong results when a filter on a combined literal+sub-object JSON subcolumn (json.@a) was analyzed against a JSONAllPaths skip index: the subcolumn was treated as a path literally named @a `, so all granules were skipped and the query returned fewer rows than it should. (Pavel…
fixBackported in: Fixed incremental backups to Azure Blob Storage storing the beginning of each file instead of its tail. Restoring such a backup silently dropped all the data written after the base backup. (Smita Kulkarni).
fixBackported in: Fix a case where expensive ZooKeeper exception logging could delay session finalization and leave pending requests unresolved. (Antonio Andelic).
fixBackported in: Fix an integer overflow in the deserialization of String values in the binary formats, and bound the recursion of the binary deserialization of Dynamic and JSON values. (Alexey Milovidov).
fixBackported in: Fix a use-after-free in the gRPC server when a query with a streaming input finishes while a read of the next message is still in flight. (Alexey Milovidov).
fixBackported in: Fixed ILLEGAL_COLUMN ("Cannot convert column ... because it is non constant in source stream but must be constant in result") for a query combining ARRAY JOIN with a filter on an empty IN set, whether the set is an empty list such as SELECT count() FROM t ARRAY JOIN [b] AS x WHERE a…
fixBackported in: Fixed a server startup failure after creating an Alias table whose target did not exist yet and later became an Alias table itself. Such a table was accepted by CREATE but rejected while loading metadata, which aborted startup with BAD_ARGUMENTS. The Alias target restrictions are…
fixBackported in: Fix RESTORE of an incremental S3 backup chain whose locator authenticates by assuming a role (extra_credentials(role_arn = ...)). The role identifiers are not secrets and are now kept in the locator of the backup metadata, so each backup in the chain can reopen its base; previously…
fixBackported in: A setting that a client does not know about is sent over the native protocol as a custom setting. The server now reads such a setting into the setting it names, instead of keeping it as a custom setting of the same name. Previously, it was reported as unchanged, at its default…
fixBackported in: Fix partition pruning and primary key filtering being silently disabled when parallel_replicas_min_number_of_rows_per_replica is set inside a subquery or CTE instead of at top query level. (Yarik Briukhovetskyi).
fixBackported in: Fixed the Unexpected return type from materialize logical error when reading a column that has a text index through the index after a metadata-only or not-yet-materialized ALTER MODIFY COLUMN (including lazy JSON type hints) that requires a read-time type conversion. (Pavel Kruglov).
fixBackported in: Fixed h3Line returning uninitialized memory in the tail of the result array when a line between two valid H3 indices cannot be drawn because it crosses pentagon distortion. Such a call now throws INCORRECT_DATA. (Groene AI).
fixBackported in: Fixed moduloOrNull, intDivOrNull, divideOrNull and positiveModuloOrNull returning the raw division result instead of NULL when dividing by a constant zero inside a subquery whose result an outer query consumes, such as a passthrough SELECT * FROM (...) or a view. INSERT ... SELECT…
fixBackported in: Fixed a query over an Iceberg table returning fewer rows than the table holds when a manifest declares a lower bound above the upper bound for a filtered column. Such a pair describes an empty range, so min/max pruning dropped the data file holding the matching rows; those bounds…
fixBackported in: Fixed the row numbers shown in the Web UI for a page other than the first one: they restarted at 1 on every page instead of counting from the page's position in the whole result. (Alexey Milovidov).
fixBackported in: Fixed wrong results from sumKahan when the aggregated batch does not start at the first row of the block. sumKahanIf, and sumKahan over a Nullable argument, tested each row against the wrong element of the condition or null map, returning silently incorrect sums inside window frames…
fixBackported in: Fixed reading uninitialized memory as literal data when decompressing a malformed LZ4-compressed block. (Alexey Milovidov).
fixBackported in: Fixed a stack overflow when reading hadoop-snappy data containing many blocks that decode to nothing. (Alexey Milovidov).
fixBackported in: The handshake response of the MySQL wire protocol is now bounded, so a client can no longer make the server grow memory during the handshake. The mysql_require_secure_transport server setting is now enforced from the actual state of the connection instead of a capability bit…
fixBackported in: Fix background Distributed inserts that deleted unsent spool files after a split batch got a transient error. ClickHouse now keeps the files and retries the batch. (Rory Shanks).
fixBackported in: Fixed an external GROUP BY exceeding max_memory_usage when enable_adaptive_aggregator is on. Intermediate data the adaptive aggregator held and could not release kept a thread on the baseline algorithm flushing its own hash table on every block, so each block wrote a temporary file…
fixBackported in: Check the overflow when allocating a block of aggregate function states on deserialization: a malformed Native block could make the server write out of bounds. (Raúl Marín).
fixBackported in: Fix a path traversal on RESTORE. A backup metadata entry whose was not already in normal form, for example one containing // or fewer .. than the depth of its own directory prefix, was validated in normalized form but stored verbatim, so restoring the part wrote the entry outside…
fixBackported in: Fix out of bound in timeSeriesGroupArray(). (Vitaly Baranov).
featureBackported in: Ignore only well known and minor jemalloc errors and add entry about disabled per-cpu arena into system.warnings. (Azat Khuzhin).
featureBackported in: Internal follow-up correcting an implementation detail from an unreleased change; no user-visible behavior change beyond restoring the intended performance characteristics of https://github.com/ClickHouse/ClickHouse/pull/115852 for Dynamic(JSON) text output. (Nikita Fomichev).
+64 more items in the release notes
otherBackported in: Speed up GROUP BY without aggregates by inlining some functions. (Nikita Taranov).
otherBackported in: Sped up SQL function formatDateTime with non-const timezone arguments. (Robert Schulze).
otherBackported in: The adaptive aggregation GROUP BY (enable_adaptive_aggregator) now works together with max_rows_to_group_by in the default throw overflow mode, instead of silently falling back to the regular aggregation. In throw mode the limit is now also enforced against the merged total of the…
fixBackported in: Fixed a settings-constraint bypass: a SETTINGS clause inside a subquery, a CTE or a view's inner query was applied without checking the settings constraints, so it could be used to leave readonly mode or to override a CONST, MIN or MAX constraint (for example…
fixBackported in: Fix a bloom_filter skip index returning fewer rows for IN on an Array column when the set contains an empty array, for example WHERE x IN ([]). (Groene AI).
fixBackported in: Fixed a 404 (S3_ERROR) when reading an Iceberg table through a path that is a parent of the table directory, with the metadata document named by the iceberg_metadata_file_path setting: every data and manifest key was resolved against the queried path, so the directories between it…
breakingThis patch changes how object storage disk transactions work. Now, native to the metadata storage transactions will be used by default instead of the fake ones used before. (Mikhail Artemenko).
breakingThe server now refuses to start (and rejects SYSTEM RELOAD CONFIG) when the server config contains an unknown top-level element, instead of silently ignoring it. Audit your config before upgrading: stale sections left over from older versions, sections consumed by forks/third-party tooling, and…
breakingFor views whose body is a plain SELECT over a single Distributed table, the whole outer query is now pushed to the shards (new setting optimize_trivial_view_pushdown_to_distributed, enabled by default). This changes observable behaviour for such views: FINAL and SAMPLE written on the view…
breakingLightweight UPDATE patch parts now use a new v2 on-disk format sorted by (sorting_key..., _block_number, _block_offset) and applied with a new merging algorithm. Peak memory is bounded by the largest equal-sort-key run instead of the full patch, and updates that cross merge boundaries no longer…
breakingAn unquoted JSON number for a DateTime64/DateTime column in JSONEachRow and similar formats is now interpreted as a Unix timestamp (seconds since the epoch) with optional sub-second precision, consistent with the Values format, CAST and toDateTime64. Previously a number with a fractional part…
breakingThe default value of the max_insert_threads setting has been changed from 1 (no parallelism) to auto, which resolves to the number of CPU cores available to the server (reduced under memory pressure via max_insert_threads_min_free_memory_per_thread). This parallelizes INSERT SELECT by default and…
breakingReading a CSV bare Tuple now takes one field per element in every position, so a \N in the field of a top-level element is that element and input_format_null_as_default applies to it. Previously a leading \N was taken for the whole column being null, so the row was replaced by the column default…
breakingAdded the VALID FOR clause to CREATE USER and ALTER USER as a shorthand for VALID UNTIL. The expiration deadline is computed as the current time plus the given interval at query execution time and stored in the VALID UNTIL form. The valid_until column of the system.users table now has the type…
breakingFixed SYSTEM STOP/START CLEANUP and SYSTEM STOP/START VIRTUAL PARTS UPDATE ON CLUSTER requiring SYSTEM PULLING REPLICATION LOG instead of SYSTEM CLEANUP / SYSTEM VIRTUAL PARTS UPDATE. (Groene AI).
breakingEXPLAIN SYNTAX now returns the reformatted query as a single String record (with embedded newlines) instead of one record per line, so its output is a recoverable single row that is directly usable (for example, SELECT count() FROM (EXPLAIN SYNTAX ...) returns 1). This is controlled by the new…
breakingThe PostgreSQL and MaterializedPostgreSQL database engines now respect the server's remote_url_allow_hosts configuration, like the PostgreSQL table engine, the postgresql table function, and DDL-created dictionaries already do. The policy is enforced on CREATE DATABASE and on a user-issued ATTACH…
breakingExtended the supported range of Date32 from [1900-01-01, 2299-12-31] to [0000-01-01, 9999-12-31], matching DateTime64. Parsing and conversions now accept the extended range instead of silently clamping to the old boundaries. Backward compatibility notes: in the numeric conversion toDate32(N),…
breakingThe experimental ALP codec now performs Float32 scaling arithmetic in Float64, which eliminates exceptions on decimal data and significantly improves compression ratios. (Raufs Dunamalijevs).
breakingRemoved the library dictionary source. It was created for a single customer a very long time ago, it required writing a shared library against an undocumented C ABI, and it was already disabled in ClickHouse Cloud. SOURCE(LIBRARY(...)) now fails with UNKNOWN_ELEMENT_IN_CONFIG, like any other…
breakingRemoved the Apache Arrow library-based reader and writer for the Arrow and ArrowStream formats. The native ClickHouse implementation, which has been the default since 26.7, is now the only one. The settings input_format_arrow_use_native_reader and output_format_arrow_use_native_writer are…
breakingThe TLS credentials of a MySQL source (ssl_ca, ssl_cert, ssl_key) can no longer be specified as file paths from SQL — in a named collection created with CREATE NAMED COLLECTION, as a query argument, or in a CREATE DICTIONARY query — because the server opens those files with its own privileges.…
breakingReject timespan setting (milliseconds/seconds) values that overflow Int64 microseconds. (Azat Khuzhin).
breakingarrayIntersect and arraySymmetricDifference no longer treat a value repeated inside a single argument as if it appeared in several arguments. Queries relying on the previous behavior can now return different results: arrayIntersect([1], [2], [1, 1]) returns [] instead of [1], arrayIntersect([1,…
breakingdisable_insertion_and_mutation now prevents background consumption from Kafka, RabbitMQ, and NATS tables while still allowing direct writes to external storage. Gated Kafka2, NATS, and RabbitMQ tables do not initialize consumers for direct SELECT. The recently introduced…
breakingA window PARTITION BY or ORDER BY over an AggregateFunction column is now rejected with ILLEGAL_COLUMN, as top-level ORDER BY over such a column already was. Previously such a query was accepted by at least one analyzer, and window PARTITION BY partitioned differently depending on max_threads. The…
breakingFix access checks for the SYSTEM ... CACHE ON CLUSTER commands. They required the SYSTEM DROP CACHE privilege group instead of the privilege of the individual command, which both denied holders of a single granular cache privilege and let a holder of the group run SYSTEM SYNC FILESYSTEM CACHE ON…
breakingThe include_from setting no longer defaults to /etc/metrika.xml. Previously that file was used for configuration substitutions whenever it existed, even though nothing in the ClickHouse configuration referred to it. If you relied on that implicit substitutions file, add /etc/metrika.xml explicitly…
breakingThe NATS table engine accepts credentials inline in the new nats_credentials setting (the same payload as a .creds file), and no longer accepts nats_credential_file from SQL: the path is a reference to a file on the server filesystem, which the server opens with its own privileges, so it can only…
breakingAsynchronous metrics can now have the Map data type, and the per-CPU-core and per-device metrics were converted to single key-value metrics: OSUserTimeCPU0, OSUserTimeCPU1, ... became a single OSUserTimeCPU metric with a map from the CPU core number to the value (and similarly for the other…
featureAdded a chinese tokenizer for the tokens function and MergeTree text indexes. It segments Chinese text into words using a dictionary and a Hidden Markov Model (the algorithm follows jieba), with coarse_grained (default) and fine_grained granularities. Continues. (Amos Bird).
featureAdd new functions to serialize and deserialize AST as JSON. (Alexey Milovidov).
featureAdd restore_table_data, restore_access_entities, and restore_functions restore settings for granular control over what gets restored. These can override structure_only for individual categories — e.g. structure_only=true, restore_access_entities=true restores table definitions and access entities…
featureAdded support for Puffin file format (https://iceberg.apache.org/puffin-spec/). Now this format can be used in table functions like file, url, s3 and so on.. (Konstantin Vedernikov).
featureAdded a way to access tables and databases via URL paths in the HTTP interface (e.g. \/database/table.format.gz?filter=a>0), plus new settings (\http_allow_database_as_path\, \http_allow_table_as_file\, \http_allow_filters_as_path\, \http_allow_filters_as_unrecognized_url_parameters\, \select\,…
featureAdded CREATE HANDLER, ALTER HANDLER and DROP HANDLER statements to define custom HTTP handlers from SQL, persisted in a local or Keeper storage. Added the currentHandler and currentRequestURL functions, the system.handlers table, and the http_handler_name / http_request_url columns in…
featureAdded the HiveText output format that writes data in Apache Hive LazySimpleSerDe text form. Fields are separated by \x01, rows by the new format_hive_text_rows_delimiter setting (default \n), and nested Array, Map, and Tuple values use Hive's separator list. The output targets Hive's default…
featureAdded "packed" data part storage for MergeTree tables, which stores all of a part's files in a single archive (data.packed) instead of a file per stream. It is controlled by the min_bytes_for_full_part_storage, min_rows_for_full_part_storage and min_level_for_full_part_storage settings and is…
featureImplement aggregate function mergedJSONPatch for RFC 7396-style merge-patch aggregation over JSON values, including state merge support and AggregatingMergeTree usage. Users can aggregate a JSON column using a timestamp or another ordering column as the sort key to compute the latest state.…
featureThe array subscript operator supports an array of integers as the index: arr[indexes] returns the elements at all of the given positions, equivalently to arrayMap(i -> arr[i], indexes). (folly).
featureSupport the GROUPS frame mode for window functions (SQL:2011), e.g. any(price) OVER (PARTITION BY symbol ORDER BY ts GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING). In a GROUPS frame the boundaries count whole peer groups — sets of rows that are equal on the ORDER BY key — so N PRECEDING/N FOLLOWING…
featurePlain CREATE MATERIALIZED VIEW ... POPULATE is now locally atomic: the view is subscribed to new inserts of the source table and the existing data is snapshotted together under a brief exclusive lock on the source, so rows inserted through the same server concurrently with the population are no…
featureAdded the mergeTreeCodecBlockCounts(database, table) table function that reports, per (part, column, substream) of a MergeTree table, how many compressed blocks use each codec. (Raufs Dunamalijevs).
featureAdded the sort-based IEJoin algorithm for joins whose ON section has two inequality comparisons (, >=) between the joined tables, enabled by adding ie_join to the join_algorithm setting. Supported kinds are ALL INNER/LEFT/RIGHT/FULL JOIN and SEMI/ANTI LEFT/RIGHT JOIN. Previously such queries were…
featureAdd function notHas, the negation of has for arrays, maps, and JSON. When the haystack is a constant array, notHas(constant_array, x) is rewritten to x NOT IN constant_array by optimize_rewrite_has_to_in (enabled by default), so it executes via a set lookup and can prune by the primary key index…
breakingAdded a new join_algorithm value parallel_full_sorting_merge: for hash-compatible equality joins, it shards a full sorting merge join by the hash of the join keys into independent per-shard merge joins running on all threads. It keeps the low, streaming memory usage of a merge join while…
+1678 more items in the release notes
fixBackported in: Combine I/O cost with selectivity in PREWHERE condition ordering. It fixes performance regression in PREWHERE execution in some cases introduced after https://github.com/ClickHouse/ClickHouse/pull/101275. Part of. (Pavel Kruglov).
fixBackported in: Mask credentials embedded in HTTP URIs. (Han Fei).
fixBackported in: Reject CR and LF characters in values sent as HTTP headers or in the request line of outgoing HTTP requests (BigQuery, YTsaurus, url, DataLake catalogs, GCP OAuth, AI functions, S3 storage class), which could be used to inject headers or additional requests. (Raúl Marín).
fixBackported in: Fixed a heap-use-after-free in the view dependency graph after renaming a materialized view whose query selects from itself. CREATE MATERIALIZED VIEW and ALTER TABLE ... MODIFY QUERY now reject a query that makes a materialized view select from itself. (Groene AI).
fixBackported in: Fix use-after-free in complex key ssd_cache dictionaries when the cache file wraps around its partitions. Fix CANNOT_READ_ALL_DATA when reading long values of ssd_cache dictionaries from the cache file. (Alexey Milovidov).
fixBackported in: Fixed count() with WHERE d = toDate32('1900-01-01') (or !=) over a MergeTree Date32 column returning the number of 1970-01-01 rows when optimize_trivial_count_with_sparsity_filter is enabled (the default since 26.8). Closes. (Groene AI).
otherBackported in: Not for changelog. (Alexey Milovidov).
otherBackported in: Make 03673_columns_description_cache and 04257_102926_columns_descriptions_cache_nested_eviction robust to asynchronous part removal, applying the fix already made to their sibling 04510_shared_part_schema_metadata_eviction. (Groene AI).
breakingBackported in: CREATE TABLE x AS src inherits the credentials embedded in the engine of src, which are masked in SHOW CREATE TABLE. It now requires the SELECT privilege on src when the inherited definition can carry credentials, instead of only SHOW COLUMNS. (Yarik Briukhovetskyi).
featureBackported in: Estimating subcolumn sizes for PREWHERE (for example m['key'] of a Map(LowCardinality(String), String) column) no longer reads the LowCardinality dictionary or the Variant discriminators header of every data part, which made planning slow on object storage, especially for each new…
otherBackported in: BACKUP uses less memory per file it backs up: an entry of the backup no longer keeps a copy of the description of the disk the file is on. A backup of a table with millions of files saves a few gigabytes. (Julia Kartseva).
otherBackported in: A packet that cannot appear at the current point of the native protocol is now rejected without deserializing its payload. Previously the server deserialized the body of an unexpected Data packet — including arbitrary data types and aggregate function states — only to throw…
otherBackported in: Compare TOTP codes and plaintext_password passwords in constant time, so that the response time does not depend on how many leading characters are correct or on which time window matched. (Vladimir Cherkasov).
fixBackported in: Fixed a server crash and an out-of-bounds write when inserting into a column with a long chain of compression codecs, for example CODEC(FPC, FPC, ..., FPC). CompressionCodecMultiple compounded each stage's reserved size in a UInt32 without checking for overflow, so a long enough…
fixBackported in: Fixed a read of uninitialized memory when a Variant, Dynamic or JSON column holding only NULL values is compressed, for example on insert into a Memory table created with compress = 1, or when a block is compressed for a JOIN or for the query result cache. The reported size of such…
fixBackported in: Fixed crashes of the interactive line editor of clickhouse-client and clickhouse-local, which also crashed the server when used through the web terminal or an SSH session: after a history search that found nothing on an edited recalled query, when the prompt or the line given to an…
fixBackported in: Fix segfault when reading a MySQLDump file whose CREATE TABLE query has an ENUM column without a list of values or with non-string values. (Alexey Milovidov).
fixBackported in: Fix a stack overflow when a Redis server replies with deeply nested arrays. (Alexey Milovidov).
fixBackported in: Fixed ORDER BY ... LIMIT over a column of an Interval type (or Nullable, LowCardinality, Tuple or Array of one) failing with TYPE_MISMATCH when use_top_k_dynamic_filtering is enabled, which is the default. Closes. (Groene AI).
fixBackported in: The setting http_zlib_compression_level now applies only to the gzip and deflate HTTP response compression. The level of other methods (zstd, lz4, br, xz, bz2) is controlled by output_format_compression_level. Previously, a level suitable for zlib was passed to every method, which…
fixBackported in: Requesting SSH-key authentication over the native protocol no longer reveals whether the named user exists, or how it authenticates, before its signature is checked. (Shaohua Wang).
otherBackported in: Update mariadb-connector-c to v3.4.10. (Actuele AI).
breakingBackported in: Overriding a key that is stored in a named collection now requires SHOW NAMED COLLECTIONS SECRETS on that collection. This also applies to overrides through an alias (including flat kafka_* settings over nested kafka.* keys), through a SETTINGS clause of a table engine or table…
fixBackported in: Do not remove columns when it's referenced in both PREWHERE and WHERE filter conditions even if it's rewritten into a text index virtual column. (Elmi Ahmadov).
fixBackported in: Fixed a stack overflow crash on a deeply nested CapnProto schema that the nesting depth check missed: a comment or a byte order mark between import and its path, an escape sequence in the import path, or a backtick text line. A backtick text line with many brackets is no longer…
fixBackported in: Fixed a possible segmentation fault when reading an Avro map into a Map column (for example Map(DateTime, String)) with the AvroConfluent format, including Kafka tables. Closes. (Groene AI).
fixBackported in: Fixed an issue where pressing Ctrl-R and then Ctrl-Z in the web terminal or the SSH interface suspended the whole server process. (Alexey Milovidov).
fixBackported in: Fixed a crash (stack overflow) on a CapnProto schema with a long chain of type expression suffixes (Int32.a.a..., Int32()()...) or of declarations that refer to each other (constants, aliases, struct fields, annotations, imports). Such a schema is now rejected with The CapnProto…
featureBackported in: Add S3 bucket to remote_url_allow_hosts. (Konstantin Vedernikov).
fixBackported in: Fixed a server startup failure after creating an Alias table whose target did not exist yet and later became an Alias table itself. Such a table was accepted by CREATE but rejected while loading metadata, which aborted startup with BAD_ARGUMENTS. The Alias target restrictions are…
fixBackported in: Fix ALTER TABLE ... MATERIALIZE STATISTICS / DROP STATISTICS failing forever and wedging the table's mutation queue when a server profile sets allow_statistics = 0 and the statement enables it per-session, the same opt-in ADD STATISTICS honours. Also close a hole where MATERIALIZE…
securityBackported in: Update the vendored expat to 2.9.0, fixing a denial of service through a crafted backup manifest during RESTORE (CVE-2026-66046) and the other 2.8.3–2.9.0 security fixes. (Actuele AI).
fixBackported in: Fixed loading, short ATTACH, and UNDROP TABLE for existing SQL-defined S3 disks whose endpoints are absent from remote_url_allow_hosts; new full-definition CREATE and ATTACH still reject disallowed endpoints. (Alexey Bakharew).
fixBackported in: Free prefetched messages when StorageKafka2 partitions move between consumers, preventing per-partition memory growth until restart. (Aparajita Pandey).
fixBackported in: The web terminal and the SSH interface no longer reset the settings of the user (from settings profiles, roles, and CREATE USER ... SETTINGS) to default values. Previously, restrictions such as readonly, resource limits, and additional_table_filters were not applied in these…
fixBackported in: Fix a wrong result, or an exception in debug builds, when optimize_aggregators_of_group_by_keys eliminated any, min or max of a GROUPING SETS key with group_by_use_nulls. (Alexey Milovidov).
fixBackported in: Fixed a server crash when a RabbitMQ table with the headers exchange type had a routing key without =, or when rabbitmq_routing_key_list was empty. Routing keys without = for the headers exchange type are now rejected with an exception. The problem was found and reported by @dstesk…
otherBackported in: Update vectorscan to 5.4.13. (Actuele AI).
otherBackported in: Observed as a bottleneck in the ci-logs cluster. (Mikhail Artemenko).
featureBackported in: Add ability to select jemalloc 4K/16K page size on aarch64 (default 64K). (Azat Khuzhin).
featureBackported in: Added a server setting access_control_improvements.readonly_restricts_set_role, false by default. When enabled, SET ROLE is refused with error code READONLY in a session or query whose readonly setting is not zero. Previously SET ROLE was the only identity-changing statement that…
fixBackported in: Fix a credential written in cleartext to system.query_log and the server log when a key = value argument precedes the positional arguments of the mongodb, redis, remote, arrowFlight and ytsaurus table functions or the MongoDB, Redis, Remote, ArrowFlight, ExternalDistributed and…
fixBackported in: Fixed a heap use-after-free in the s3, azureBlobStorage, hdfs and other object storage table functions and engines when an exception (for example MEMORY_LIMIT_EXCEEDED) was thrown while creating the reader of a file in a row input format such as CSV. (Groene AI).
fixBackported in: Fixed a server crash, wrong results or a rejected query in ORDER BY ... WITH FILL ... INTERPOLATE when one INTERPOLATE expression has to be converted to its target's type and another item reads the same column or literal, for example INTERPOLATE (a AS b, b AS a) with targets of…
otherBackported in: Not required. (Groene AI).
fixBackported in: The collections of the Native protocol — the settings and the query parameters of a query, the client information, the granted roles and the table-status lists — are now bounded, so a small packet can no longer make the server allocate memory for data that has not arrived. (Alexey…
fixBackported in: Fix reading bucketed runtime Map values from JSON columns using advanced shared-data serialization. (Rory Shanks).
fixBackported in: Mask secrets in the queries that a cluster-mode QueryRunner table writes to system.query_log as well as in queries executed as startup scripts. (Miсhael Stetsyuk).
fixBackported in: Fixed TRUNCATE TABLE of an Alias table whose target is a MergeTree failing with DEADLOCK_AVOIDED when the alias is being read concurrently, while the same statement against the target table succeeds immediately. The lock for TRUNCATE is now chosen and taken on the table that…
fixBackported in: Fixed a crash on a query with a deeply nested Dynamic or JSON constant. (Pavel Kruglov).
fixBackported in: Fixed use_skip_indexes = 0 also disabling part pruning by the partition-key min-max index (since 26.5), which made such queries read every part of the table. (Ashish Kumar Choubey).
fixBackported in: Reject malformed serialized groupBitmap states with INCORRECT_DATA instead of failing later during bitmap operations. (Elmi Ahmadov).
fixBackported in: Fixed excessive memory usage when loading a data part with a corrupted columns_substreams.txt; such a part is now detached as broken. (Murphy).
securityBackported in: Update mongo-c-driver to 2.5.5, fixing an out-of-bounds write during MongoDB connection monitoring reconnects (CVE-2026-96746). (Actuele AI).
otherBackported in: Update thrift to v0.25.0. (Actuele AI).
otherBackported in: Integration-test harness: tolerate non-UTF-8 bytes when decoding captured container output, so a single bad byte no longer aborts cluster teardown and the sanitizer scan, and honor shutdown(ignore_sanitizer=True) in the docker.log fallback scan. (Groene AI).
fixBackported in: Fix a possible heap buffer overflow on malformed responses from blob storage. (Arsen Muk).
fixBackported in: Fixed a query failing with an exception like Cannot parse UInt64 from String on a table with a text index on mapKeys or JSONAllPaths, when the predicate cannot be evaluated on the value of a missing map key or JSON path. (Anton Popov).
fixBackported in: Fixed slow planning of queries with skip indexes on tables with many parts and pending patch parts of lightweight updates. (Anton Popov).
otherBackported in: CRoaring v5.2.3 exposes internal_validate() on the C++ RoaringBitmap wrappers, so RoaringBitmap data can be validated. (Elmi Ahmadov).
otherBackported in: Update cctz to 2026e. (Actuele AI).
fixBackported in: Fixed a crash (stack overflow) when reading an Avro file with an explicit structure that does not read a field nested through a long chain of named types, or a field of a recursive type holding deeply nested data such as a long linked list. Such a file now fails with…
otherBackported in: Use castStorage for the Join row policy check in the legacy analyzer. (Vladimir Cherkasov).
otherBackported in: bloom_filter and text indexes are now used when a Nullable indexed column is cast to the non-Nullable type, such as CAST(x, 'String') or json.path::String. A query that would throw on a NULL value may not throw when the index skips the granules with NULL. (Anton Popov).
fixBackported in: Fixed Expected UInt64 column for __grouping_set, got BLOB and ColumnBLOB should be converted to a regular column before usage logical errors on a distributed query executed on a shard with enable_parallel_blocks_marshalling (enabled by default), for example with GROUP BY GROUPING…
fixBackported in: Fixes DeltaLake tables returning too few rows when the WHERE predicate contains a sub-expression the delta-kernel predicate translator cannot handle, positioned under a NOT. Such a sub-expression is now reported to delta-kernel as an explicit unknown predicate instead of as the end…
fixBackported in: Fix EXPLAIN PLAN actions = 1 printing a secret function argument (for example the key of HMAC or encrypt) in cleartext when its value came from a subquery or from the other side of a JOIN. (Vladimir Cherkasov).
fixBackported in: Comparing an Enum column with a string literal that is not one of its elements no longer throws UNKNOWN_ELEMENT_OF_ENUM when validate_enum_literals_in_operators is disabled (the default) and the column is part of the primary key, the partition key, or a bloom_filter index. != with…
fixBackported in: Fix a rare server crash (SIGSEGV in mongoc_log) when a MongoDB dictionary source or MongoDB table was created while another thread created the first MongoDB connection in the process. Messages logged by the MongoDB driver now go to the server log. (Vladimir Cherkasov).
fixFix 05243_enum_unknown_literal_key_condition. (Vladimir Cherkasov).
fixBackported in: Tables in a database with lazy_load_tables were missing from system.parts, system.replicas and related system tables, and refused by replica commands, after a restart. (Nikolay Degterinsky).
fixBackported in: Fix a server abort when reading an Iceberg table whose sort order names a transform ClickHouse cannot parse (e.g. bucket[xyz]); ClickHouse now ignores that sort-order hint and keeps the table readable. (Ilias).
fixBackported in: Fix UNKNOWN_IDENTIFIER in the analyzer when a table is referenced as database.table in FROM or JOIN and another table expression in the same query uses that database name as its alias, for example FROM db.t1 AS db INNER JOIN db.t2 AS t ON .... Closes. (Dmitry Novik).
fixBackported in: Fixed wrong results when a WHERE clause mixing AND and OR was evaluated with skip indexes (use_skip_indexes_for_disjunctions, enabled by default). If a minmax or set index could not evaluate one atom of the predicate for a granule, the per-atom verdicts recorded for that granule…
otherBackported in:. (Alexey Milovidov).
fixBackported in: ALTER TABLE ... MODIFY SETTING disk = disk(...) could register a disk defined in SQL whose local path is outside custom_local_disks_base_directory, and create its directory, bypassing the check that CREATE TABLE applies. Now it is rejected the same way, and a statement rejected this…
fixBackported in: Rewriting the body of a view with ALTER TABLE ... MODIFY QUERY now needs the same grants as creating it with its SQL security: SET DEFINER on the definer of a SQL SECURITY DEFINER view, or ALLOW SQL SECURITY NONE for a SQL SECURITY NONE view. An ON CLUSTER MODIFY QUERY fails with…
fixBackported in: Put "WRITE" operation in delta lake catalog. (Konstantin Vedernikov).
fixBackported in: Fix Found patch part ... that intersects mutation with version ... on lightweight updates in a table created with CREATE TABLE ... CLONE AS or ATTACH PARTITION ALL FROM a table with lightweight updates. (Nikolay Degterinsky).
fixBackported in: Fix a possible hang of a query under workload CPU scheduling with cpu_slot_preemption enabled: when all its threads were preempted, the query could keep CPU slots it had already used and wait forever for one of them. (Sergei Trifonov).
fixBackported in: Respect iceberg_metadata_staleness_ms in metadata parsing. (Konstantin Vedernikov).
fixBackported in: Fix container existence check during RESTORE of a lightweight snapshot from Azure Blob Storage by parsing the saved namespace into container name and prefix. (Garrett Thomas).
fixBackported in: Fix SYSTEM REFRESH on a stopped RabbitMQ table sometimes failing to consume the queued backlog. A REFRESH grants exactly one out-of-order streaming cycle, but that cycle could return immediately with zero rows because the AMQP delivery loop had only just been started asynchronously,…
fixBackported in: Fixed a transient Azure Blob Storage error on the read or merge path — an RBAC permission-propagation 403 Forbidden, a credential authentication failure, or a connect timeout surfaced as 408 — being misclassified as non-retryable and reported as POTENTIALLY_BROKEN_DATA_PART (Code…
fixBackported in: Fixed asynchronous TLS connections occasionally failing with an unrelated OpenSSL error left by another connection on the same OS thread. This could terminate distributed queries with a misleading network exception. (Dmitriy Borisenko).
fixBackported in: Add more path validations. (Konstantin Vedernikov).
fixBackported in: Fixed a segmentation fault or std::length_error when reading TSV formats with input_format_tsv_crlf_end_of_line = 1 if an escape sequence ended exactly at the end of a read buffer. (Groene AI).
otherRevert backport of to 26.7: Check for timeouts and KILL QUERY while covering a polygon with H3 cells. (Nikita Fomichev).
fixBackported in: Fix a text or ngrambf_v1 index silently dropping matching rows when the indexed column is compared for equality against a FixedString value, or searched with hasAny or hasAll over FixedString needles. Happens at default settings, since use_skip_indexes and enable_full_text_index are…
fixBackported in: Fix an out-of-bounds read when deserializing a uniqTheta state shorter than 24 bytes, for instance from CAST( AS AggregateFunction(uniqTheta, ...)). (Alexey Milovidov).
fixBackported in: Fix a buffer over-read on the sequential read path from Azure Blob Storage: an endpoint that answers a ranged request with more data than was requested could deliver bytes from outside the requested range to the caller. The end of a read is now decided by the locally set right…
otherBackported in: Skip indexes (bloom_filter, tokenbf_v1, ngrambf_v1, minmax) and the primary key are now used when the indexed column is wrapped into a conversion that does not change its value, such as toLowCardinality, toNullable or a CAST to Nullable or LowCardinality. (Anton Popov).
otherBackported in: Faster planning of queries to Iceberg tables with many manifest files: when a manifest file header has the schema-id key and that schema is already known from metadata.json, the schema copy stored in the manifest header is no longer parsed and compared with it. ClickHouse now also…
otherBackported in: Build Iceberg min/max hyperrectangles only for columns the filter uses. (Konstantin Vedernikov).
otherBackported in: Hide the HTTP headers in the definition of HTTP dictionary sources in SHOW CREATE DICTIONARY, system.tables and query logs, the same way as passwords. They can be shown with the existing display_secrets_in_show_and_select mechanism. (Matheus Nerone).
fixBackported in: Fixed SYSTEM SYNC TRANSACTION LOG (local, non-ON CLUSTER form) not checking the SYSTEM_SYNC_TRANSACTION_LOG privilege. The ON CLUSTER form already required it via getRequiredAccessForDDLOnCluster, but the local execution path skipped checkAccess, so a user without the grant could…
fixBackported in: Fixed an ssl_certificate authentication bypass where an embedded NUL byte in a certificate's Common Name (for example john\0.evil.com) was truncated server-side to john, letting a holder of such a certificate authenticate as a different user. (Konstantin Bogdanov).
fixBackported in: Fixed max_memory_usage and max_server_memory_usage not being respected when reading a JSON column with the FLATTENED serialization version from the Native format. (Pavel Kruglov).
fixBackported in: Fixed out-of-bounds reads when reading a JSON or Dynamic column from a malformed Native block or a corrupted data part. A truncated stream, a duplicate type in a flattened Dynamic column, a duplicate or typed-colliding path in a JSON column, and a serialization version that is only…
fixBackported in: Skip indexes (text, tokenbf_v1, ngrambf_v1) are now used when the indexed column or the searched constant is wrapped into LowCardinality, Nullable or an equivalent CAST. For example, m['key'] = 'value' on a Map(String, LowCardinality(String)) column and hasToken(s,…
fixBackported in: EXPLAIN AST printed secret function arguments, such as the key of encrypt, in clear text, and with optimize = 1 it did so for the body of a view the user may only SELECT from. The dump now prints '[HIDDEN]' in their place, under the same gate as SHOW CREATE. (Harikrishnan Prabakaran).
fixBackported in: Column-level SELECT privileges are now enforced for columns used only inside indexHint and for ALIAS columns referenced in PREWHERE. As in WHERE, referencing an ALIAS column in PREWHERE requires the grant on the alias name; a grant on its source columns is no longer sufficient. A…
fixBackported in: Fixed a row policy bypass: a direct JOIN with an EmbeddedRocksDB, KeeperMap or Redis table in the legacy analyzer (enable_analyzer = 0) ignored the row policy of the right table and returned hidden rows, and joinGet on a Join table ignored its row policy in both analyzers. Such a…
fixBackported in: Fix NO_COMMON_TYPE in case of use_variant_as_common_type=0 for jemalloc fragmentation dashboard. (Azat Khuzhin).
fixBackported in: Fix the Kafka and NATS table engines ignoring remote_url_allow_hosts: broker addresses from kafka_broker_list, nats_url, and nats_server_list are now checked against the remote host filter. A forbidden address is rejected at CREATE TABLE with UNACCEPTABLE_URL, as the RabbitMQ engine…
fixBackported in: Now statistics parts pruning will not work if table has row level policy. (alesapin).
fixBackported in: Now clickhouse masks credentials in system.query_log even for wrong URLs for external table engines. (alesapin).
fixBackported in: Fix filesystem cache accounting when the directory for a new cache key cannot be created, for example because the cache disk is out of space or inodes. The failed reservation stayed counted in the cache until the query released the file segment. (Sema Checherinda).
fixBackported in: CREATE OR REPLACE in a Replicated database or with ON CLUSTER now requires the drop privilege for the kind of the table it replaces, so a user without DROP DICTIONARY can no longer replace a dictionary. (Nikolay Degterinsky).
fixBackported in: Fix LOGICAL_ERROR Cannot capture column N because it has incompatible type when a materialized view with a lambda over an Array(Tuple(...)) column receives a block while the source table's column type is being changed by ALTER TABLE ... MODIFY COLUMN. (Jimmy Aguilar Mena).
fixBackported in: The value of 'role_session_name' as of now is hidden in query_log. (Alexey Bakharew).
fixBackported in: Fix a server crash caused by unbounded recursion when decoding a deeply nested value inside a binary encoded type, for example an AggregateFunction parameter in a Dynamic value read from RowBinary or Native. (Pavel Kruglov).
fixBackported in: Fix validation of Iceberg manifest-list entries during writes. (Arsen Muk).
fixBackported in: Fixed secret settings of S3Queue and AzureQueue tables written with the legacy s3queue_ prefix, such as s3queue_after_processing_move_secret_access_key, being shown in cleartext in SHOW CREATE TABLE, system.tables, system.query_log and the server log. They are now hidden as they are…
fixBackported in: Fix missing rows in hasAllTokens and hasAnyTokens searches over a text index when an earlier query with the same predicate read a narrower key range of the same part and use_text_index_postings_cache was enabled. (Anton Popov).
fixBackported in: Fix a crash when reading an ORC file whose root type is not a struct (for example, a file written with a bigint or array root type). Such files are now rejected with an INCORRECT_DATA error. Closes. (Groene AI).
fixBackported in: Fixed a crash and wrong results with convert_query_to_cnf = 1 when WHERE or HAVING references the same SELECT alias more than once. (Groene AI).
otherBackported in: Hide a Backup locator named like a COLUMNS matcher in EXPLAIN AST instead of throwing. (Groene AI).
otherBackported in: Do not dereference a null logs_queue in OwnSplitChannel::log. (Groene AI).
fixBackported in: Fixed a LOGICAL_ERROR ("Unexpected number of kept output positions after removing unused columns from ReadFromMergeTree") raised by a SELECT ... FINAL whose PREWHERE uses a column that FINAL needs for merging (ver, is_deleted, sign) and which does not select that column. (Groene AI).
fixBackported in: Kafka producer and consumer trace logs now show the value of secret librdkafka properties, such as sasl.password, as [HIDDEN] instead of the cleartext value. (János Benjamin Antal).
fixBackported in: S3 client check initial url in backup client. (Konstantin Vedernikov).
breakingBackported in: Remove --icf=safe linker warnings about SHT_LLVM_ADDRSIG in the stripped Rust libraries. (Raúl Marín).
fixBackported in: Fixed a Backup database engine printing the credentials of its destination in plaintext. SHOW CREATE DATABASE, system.databases.engine_full, system.query_log and the messages that reject a malformed locator showed an AzureBlobStorage account_key, a connection string or a presigned…
otherBackported in: Chained ARRAY JOINs no longer materialize the whole block of a lazily replicated array column before expanding it, which cuts their peak memory by several times. (Yarik Briukhovetskyi).
fixBackported in: Fixed silently empty tables when more than one ENGINE = Backup database is created from the same backup, or when such a database is recreated under a different name. The storage policy that backs a Backup database is now identified by a name that also covers the local database name,…
fixBackported in: ALTER DATABASE ... MODIFY COMMENT on a database with ENGINE = Backup no longer writes a definition the server cannot read back, which made it refuse to start; metadata already written in that form now loads too. Backward incompatibility: a backup taken by an older server of a…
fixBackported in: Fixed settings constraints from a settings profile not being enforced against the other setting assignments in the same statement. SET profile = 'p', = could override a CONST, MIN/MAX or readonly constraint that profile p installs. The same escape existed through an in-query…
fixBackported in: Fix a segmentation fault in Keeper when preallocating space for a changelog file fails because the disk is full. (Alexey Milovidov).
fixBackported in: Link with --icf=safe instead of --icf=all, so the linker keeps functions whose address is taken distinct. gRPC queries with transport compression (gzip, deflate) no longer crash the server, as they could in official builds since 26.4. Closes. (Groene AI).
otherBackported in: TLS CA certificates configured with openSSL.server.caConfig / openSSL.client.caConfig (and caConfig of composable protocols) are now reloaded without a restart when the file changes or on SYSTEM RELOAD CONFIG, in the same way as certificateFile and privateKeyFile. This makes it…
breakingBackported in: A MySQL dictionary source created with a CREATE DICTIONARY query can no longer enable enable_local_infile, at the source or at one of its REPLICA entries; loading such a dictionary fails with BAD_ARGUMENTS, which with the default dictionaries_lazy_load is on first use rather than at…
featureBackported in: You can now disable reading through the executable table function and from Executable/ExecutablePool tables with the new allow_executable_tables setting, for a deployment that must not run arbitrary server-side scripts. It defaults to true, so existing behavior is unchanged. (Hanzi…
featureBackported in: Added a flat_namespaces setting for the DataLakeCatalog database engine. Set it for Iceberg REST catalogs that have only single-level namespaces and reject the parent query parameter of the list-namespaces endpoint, such as Apache Polaris federated to AWS Glue: only top-level…
otherBackported in: Iceberg partition pruning now uses the partition value of a day, month, year or hour transform for a filter that wraps the partition source column in a monotonic function, such as WHERE toDate(ts) = '2024-01-20', including for partition values from before 1970. (Alexey Milovidov).
featureBackported in: Add column size statistics in Avro files. (Konstantin Vedernikov).
fixBackported in: Fixed an out-of-bounds read when finalizing a crafted analysisOfVariance aggregate state whose internal arrays have mismatched lengths. (uwezkhan).
fixBackported in: Fixed dropping whole parts with TTL (ttl_only_drop_parts = 1) still reading all data from large, fully-expired parts. (Michael Jarrett).
fixBackported in: Fix an accounting leak in memory tracking: when an allocation was rejected by a parent memory tracker (for example, the server-wide memory limit), the thread, query, and user level trackers kept the rejected amount. The error accumulated over time, inflating MemoryTracking and…
fixBackported in: Fixes a server crash (double free) when finalizing an aggregate function with the -State combinator nested under a combinator that transfers several sub-states in one call (-Resample, -ForEach, -Map, -Tuple), for example groupArrayStateResample, if an exception such as a memory…
fixBackported in: Fix Bad cast from type DB::ColumnNullable to DB::ColumnString when a mutation that rewrites the whole part runs on a part whose column type is older than the one in the table metadata, for example after ALTER TABLE ... MODIFY COLUMN followed by ALTER TABLE ... MATERIALIZE…
fixBackported in: Fixed Iceberg INSERT writing no lower_bounds/upper_bounds at all into the manifest entry when the table has a column whose type cannot be serialized into a statistics bound (for example Array(Int32)), or a column that is entirely NULL. Such a field is now omitted individually and…
fixBackported in: A table or database whose name is substituted into a ReplicatedMergeTree ZooKeeper path through the {database} or {table} macro is now rejected if the name would not be a single safe path component. Previously a name containing / was spliced in unescaped, so the table registered its…
fixBackported in: Fixed ATTACH TABLE ... AS REPLICATED and the convert_to_replicated flag file accepting a conversion whose ZooKeeper path is not a safe path. On a server whose default_replica_path substitutes {database} or {table}, a name containing / used to resolve to a path inside another table's…
fixBackported in: Fixes a case where date_time_overflow_behavior was ignored on parsing Date and DateTime. Closes. (Yarik Briukhovetskyi).
fixBackported in: Functions h3PolygonToCells and h3PolygonToCellsWithContainment now check for query timeouts and KILL QUERY while covering a polygon, and reject vertices whose longitude is outside -180..180 or latitude outside -90..90 degrees. Previously a polygon with such a vertex could keep a…
fixBackported in: Fix out of bound in timeSeriesGroupArray(). (Vitaly Baranov).
fixBackported in: Fixed SQL injection through identifiers when inserting into a table with the SQLite engine. The remote table name and the column names were escaped with backslashes, which SQLite does not honour inside a quoted identifier, so a name containing a double quote could close its own…
fixBackported in: Fix a crash when a client sends a block over the Native TCP protocol that selects the internal Detached serialization kind for a column. (Pavel Kruglov).
fixBackported in: KILL TRANSACTION ... ON CLUSTER, KILL PART_MOVE_TO_SHARD ... ON CLUSTER, SYSTEM STOP THREAD FUZZER ON CLUSTER, SYSTEM START THREAD FUZZER ON CLUSTER and SYSTEM RESET COVERAGE ON CLUSTER ran without checking any privilege, so a user holding only CLUSTER could roll back other users'…
fixBackported in: Fixed a SELECT from a table with paimon_incremental_read = 1 failing with REPLICA_IS_ALREADY_ACTIVE ("Failed to activate Paimon replica after Keeper reconnection") on the first read after the server's Keeper session was lost and re-established. Reclaiming the replica's own stale…
fixBackported in: Fix a patch part whose source_parts.dat lost its content to a zeroed block loading as an empty index, which silently unapplied an acknowledged lightweight UPDATE and then let background cleanup delete the only copy of it. Such a part is now detached as broken. (Alexey Milovidov).
fixBackported in: Fixed http_max_multipart_form_data_size silently truncating oversized multipart data instead of failing the query, and made it span a form's external-table parts instead of resetting per part. (Sema Checherinda).
fixBackported in: Fixed two ways a table with the Redis engine mishandled an MGET reply. Reading the whole table stopped at the first key without a string value and silently dropped every key scanned after it, so one key of another Redis type was enough to truncate the result. A reply carrying a…
fixBackported in: Fix count() returning the number of default values instead of the number of NULLs when optimize_trivial_count_with_sparsity_filter is used on a column widened to Nullable by a metadata-only ALTER TABLE ... MODIFY COLUMN. (Raúl Marín).
fixBackported in: Bound the header column count in RowBinary formats to avoid excessive memory allocation from a crafted header. (George Larionov).
fixBackported in: Fix INSERT INTO SELECT ... FROM url(...) (and s3, azureBlobStorage, ... ) with parallel replicas enabled inserting the data once per replica: the query forwarded to the replicas now names the *Cluster table function, so every replica reads only its share of the files. Closes.…
fixBackported in: Fix a server crash (std::terminate with write failed) in the embedded SSH client when the client's terminal was closed before the line reader was destroyed. (Alexey Milovidov).
fixBackported in: Fixed repeated reading of text index posting lists in multi-threaded queries when the global text index caches are disabled. (Anton Popov).
fixBackported in: Fixes a segmentation fault that happens when a refreshable materialized view is started up and shut down at the same time, for example when a failed ATTACH DATABASE rolls the database back, or when the server shuts down while tables are still loading asynchronously. (Groene AI).
fixBackported in: TRUNCATE ALL TABLES FROM and TRUNCATE TABLES FROM ... LIKE ... now skip Alias tables, which hold no data of their own. Previously such a statement could fail with LOGICAL_ERROR: RWLock is already locked in exclusive mode, truncate a target in another database, or fail when the alias…
fixBackported in: The text, tokenbf_v1, ngrambf_v1 and sparse_grams skip indexes are now used for IN when transform_null_in = 1 and the set contains no NULL. Previously such a query read every granule, and one using force_data_skipping_indices failed with INDEX_NOT_USED. (Jimmy Aguilar Mena).
fixBackported in: Fixed an out-of-bounds heap write in stem. The output buffer was sized from the input, but some stemmers lengthen a word (Turkish uag → uagı, Estonian keeb → keesi), so a block overran its allocation and returned uninitialized heap as result values. The buffer now grows when the…
fixBackported in: remote(, 'db', 'table', 'user', 'password'), and the same form of remoteSecure and of the Remote and RemoteSecure table engines, wrote the password into system.query_log, system.text_log and the server log in cleartext, while the remote('addresses_expr', ...) form hid it. The…
fixBackported in: Fix wrong values and a LOGICAL_ERROR when reading a partitioned Delta Lake table with allow_delta_kernel_rs = 0 and column types that differ from the ones in _delta_log. (Raúl Marín).
fixBackported in: Fixed a server crash when the flameGraph aggregate function was constructed on a thread without a query context, for example while attaching a stored table whose column type names AggregateFunction(flameGraph, ...). (Groene AI).
fixFixes a problem that MySQL/Postgres queries may run in an expired session. (Robert Schulze).
fixBackported in: Fix spurious NATS connection failures when the vendored nats-io client gets EINTR while waiting for a socket, and include the upstream JetStream pull-subscription deadlock fix in the vendored client. (Alexey Milovidov).
fixBackported in: Fix the flaky pre-PAUSE checkpoint in test_pause_stops_after_current_batch. (Groene AI).
fixBackported in: Fix flaky 01780_column_sparse: order the arrayFilter result before limiting it. (Alexey Milovidov).
fixFix 05237_delta_lake_legacy_partition_column_type in 26.7. (Raúl Marín).
+11 more items in the release notes
breakingBackported in: Outbound TLS connections now verify that the server certificate names the host that was connected to. This affects clickhouse-client --secure, remoteSecure(), Distributed over the secure native protocol, secure Keeper connections, and HTTPS clients such as s3(), url(), HTTP…
fixBackported in: Fixed an out-of-bounds read when reading a Variant column from a truncated Native stream using compact discriminators serialization. (Raufs Dunamalijevs).
fixBackported in: Fixed wrong results (the WHERE clause was ignored) and a logical error Cannot serialize FutureSetFromSubquery with no query plan for queries over Merge tables and the merge table function when plan-based parallel replicas were enabled. (Alexey Milovidov).
fixBackported in: Fix Logical error: Duplicate announcement received for replica number N when automatic parallel replicas (automatic_parallel_replicas_mode) adopts a plan whose single-node variant was sharded by query_plan_join_shard_by_pk_ranges. (Alexey Milovidov).
fixBackported in: Fix O(n^2) decompression of gzip/zlib/deflate streams whose single DEFLATE block spans the whole stream, the shape zlib-ng produces at compression level 1 (the default of the official .NET SDK): a 24 MiB gzip HTTP body that took 11 s to ingest in 26.7 now takes 0.12 s, identical to…
fixBackported in: Messages of the PostgreSQL wire protocol are now parsed within their declared size, so a malformed message can no longer make the server allocate memory for a payload that never arrives. (Alexey Milovidov).
fixBackported in: Fixed filesystem containment checks accepting a path with an embedded NUL byte. A DeltaLakeLocal or IcebergLocal table could be pointed outside of user_files this way. (Alexey Milovidov).
fixBackported in: Fix a server abort when an Azure Blob Storage endpoint reports an asynchronous blob copy as completed without the optional x-ms-copy-source or x-ms-copy-status-description header. (Alexey Milovidov).
otherBackported in: Use cctz tzdata 2026c. (Konstantin Bogdanov).
featureBackported in: The comments of 04367_lambda_arg_backquoted_dot_no_logical_error (added contain the literal wording of the assertion-failure log message the test guards against. The test's expected TYPE_MISMATCH errors echo the full query text — comments included — into the server log, and the CI…
fixBackported in: Fixed 01076_parallel_alter_replicated_zookeeper silently testing nothing when its ALTER thread and its DETACH thread picked the same replica. (Groene AI).
otherBackported in: Pin 05182_limit_shrinks_block_size_with_array_join's two per-node oracles to a single local reader, and pin the remote prefetched-pool eligibility its plan-shape oracle needs on object-storage runs. (Groene AI).
otherBackported in: Shrink the t_aj_limit fixture in 05182_limit_shrinks_block_size_with_array_join from 200000 to 20000 rows. (Groene AI).
fixBackported in: A small LIMIT on a query with arrayJoin shrinks the read block size again, so such queries no longer read whole blocks on every thread for a few output rows (a regression from 26.6, Closes). (Yarik Briukhovetskyi).
fixBackported in: Do not terminate the server when a transient error (such as MEMORY_LIMIT_EXCEEDED, a network error, or SYSTEM RESTART REPLICA running at the same time) happens while outdated data parts are being loaded in the background. Such errors are not a sign of an inconsistent set of parts on…
fixBackported in: Fix UNKNOWN_IDENTIFIER errors in INSERT ... SELECT from a parameterized view when parallel_distributed_insert_select is enabled. the view was analyzed with the legacy interpreter even though the analyzer was enabled. (Yarik Briukhovetskyi).
fixBackported in: Fixed a HDFS database serving a table from its internal cache without the READ ON HDFS grant. The grant and the remote_url_allow_hosts filter were checked only while a table name was resolved for the first time, so once any user holding the grant had read a name, every user with…
otherBackported in: Wait for DETACH DATABASE to release tables in three integration tests. (Groene AI).
otherBackported in: Parsing an HTTP request that carries many query parameters or headers with the same name (for example thousands of repeated role= parameters) no longer takes quadratic time. (James).
otherBackported in: LEFT and FULL JOIN with join_use_nulls = 1 use less memory when the right join key is selected in the query: the key is no longer stored twice on the build side. (Vladimir Cherkasov).
featureBackported in: Added output_format_arrow_record_batch_size and output_format_arrow_record_batch_size_bytes, which make the Arrow and ArrowStream output formats combine consecutive blocks that are individually smaller than the target into a single record batch. A selective SELECT produced one small…
fixBackported in: Fix a race between a ReplicatedMergeTree mutation and the removal of old temporary directories that could publish a mutated part with some of its files missing, making reads of that part and all its later mutations fail. (Alexey Milovidov).
fixBackported in: Fix reading a column that has two streams whose names differ only by escaping, for example a Tuple element named size0 inside an Array, or a JSON typed path named like a substream of a sibling path. Such columns returned wrong values, failed with CANNOT_READ_ALL_DATA or a logical…
fixBackported in: Fix LOGICAL_ERROR: GroupingAggregatedTransform pushed bucket N twice when make_distributed_plan picks the Shuffle aggregation strategy while the aggregation must produce results in bucket order (for example with distributed_aggregation_memory_efficient). It is now planned as a…
fixBackported in: Make mergeTreeTextIndex stricter with row policies: reading the text index is now denied whenever a row policy applies to the table, regardless of which columns the policy uses. (Elmi Ahmadov).
fixBackported in: Fixed ClickHouse Keeper terminating when a client sent a multi request with no subrequests. Such a request was written to the changelog before it failed, so the termination repeated on every restart. (Alexey Milovidov).
fixBackported in: Fixed PARALLEL WITH, EXECUTE AS and the QueryRunner table engine skipping the access checks of the CREATE statements they execute, which allowed creating tables and databases without the corresponding privileges, and defeated the readonly and allow_ddl settings. (Alexey Milovidov).
fixBackported in: Iceberg tables recovered from stored metadata no longer enable background compaction or old-file cleanup unless those settings are explicitly stored in the table definition. (János Benjamin Antal).
fixBackported in: Fixed a NATS table whose settings all come from a named collection (ENGINE = NATS(collection) with no SETTINGS clause) being written to its metadata file with a dangling SETTINGS keyword. The stored definition could not be parsed again, so the table failed to load and aborted the…
fixBackported in: Now ClickHouse reject relative paths in checksums.txt. (alesapin).
fixBackported in: Fix S3 client refresh overwriting static authentication settings and breaking subsequent queries. (alesapin).
otherBackported in: Wait for replication before asserting a row count in test_rename_distributed. (Groene AI).
otherBackported in: Not required (CI only). (Groene AI).
fixBackported in: Fix the MULTIPLE_EXPRESSIONS_FOR_ALIAS error in queries where a column alias coincides with the alias of a table expression in the FROM section (an analyzer regression in version 25.2). (Alexey Milovidov).
fixBackported in: Fix partition pruning and primary key filtering being silently disabled when parallel_replicas_min_number_of_rows_per_replica is set inside a subquery or CTE instead of at top query level. (Yarik Briukhovetskyi).
fixBackported in: Each code for Time-based one-time password is now accepted at most once, as required by RFC 6238: reusing an already used code, or a code for an earlier time step, is rejected. A user with time_based_one_time_password can successfully authenticate at most once per period. (Vladimir…
fixBackported in: Fixed the byte width of the Iceberg manifest lower_bounds and upper_bounds written for int and date columns: they were 8 bytes wide where the Iceberg specification requires 4. Spec-conformant readers such as pyiceberg failed with unpack requires a buffer of 4 bytes while planning…
otherBackported in: Split the ASan integration test jobs into eight batches. (Alexey Milovidov).
otherBackported in: Bump the internal libssh from 0.12.0 to 0.12.2. (Robert Schulze).
fixBackported in: Fix a logical error Invalid cast from Nothing to native type (an abort in debug/sanitizer builds) when compile_expressions = 1 compiled an expression with a Nullable(Nothing) operand, e.g. and(Nullable(Nothing), ). (Groene AI).
fixBackported in: Fixes a case where date_time_overflow_behavior = 'saturate', an out-of-range value is clamped to the whole second and the sub-second component is discarded. Closes. (Yarik Briukhovetskyi).
fixBackported in: Fix a segmentation fault when reading in order from a Merge table over MergeTree tables whose sorting key is shorter than the key prefix chosen for the query: the prefix was forwarded to the underlying reader unchecked, which grew its cloned sorting-key expression list to that…
fixBackported in: Fix rows silently dropped by an ngrambf_v1 index for a LIKE pattern with a run of escaped backslashes before a wildcard. (Alexey Milovidov).
fixBackported in: Fixed optimize_or_like_chain returning extra rows for OR chains of LIKE/ILIKE patterns that do not end in %: a value followed by a trailing newline wrongly matched the filter. (Jimmy Aguilar Mena).
fixBackported in: Fixed an ALTER on a view or materialized view with SQL SECURITY DEFINER deleting the auto-created :definer account when the ALTER did not change the definer. Every later SELECT from the view, and every INSERT into a materialized view's source table, then failed permanently with…
fixBackported in: Fixed cleartext credentials in system.asynchronous_insert_log.query. Secrets of table functions such as s3, url or mysql are now masked as [HIDDEN], the same way system.query_log masks them. (Sema Checherinda).
fixBackported in: Fixed the server not validating the schema of the second and subsequent data blocks that a client sends for an external table over the native protocol. Such a block could make the data be interpreted as a type other than the one it was sent as. (Alexey Milovidov).
fixBackported in: Fixed a crash of the server caused by a table with ENGINE = NATS whose credentials the broker started to reject, for example after a password rotation or on an expired token. Such a table now recreates its connection and resumes consuming once the credentials are accepted again,…
fixBackported in: Fix flaky test_filesystem_split_cache::test_split_cache_system_files_no_eviction. The baseline System-segment count was sampled straight after wait_for_cache_initialized, which only reports that the cache became usable while background loading keeps adding segments, so the baseline…
featureBackported in: Fix duplicated GROUP BY keys in the partial aggregation strategy of make_distributed_plan, and allow this strategy for aggregations over a distributed read. (Alexander Gololobov).
otherBackported in: Write partition field summaries into the Iceberg manifest list. (Konstantin Vedernikov).
otherBackported in: Support parallel replicas for object storage writes. (Konstantin Vedernikov).
fixBackported in: Fixed a LOGICAL_ERROR (Type mismatch when building statistics for column) during a MergeTree mutation of a table whose column type was changed by a metadata-only ALTER MODIFY COLUMN (for example Enum8 to Int8 or DateTime to UInt32) while the column carries statistics. The mutation…
fixBackported in: Fixed a crash when reading a subcolumn of a Variant, Dynamic or JSON column whose own type is Nullable or LowCardinality(Nullable) from a MergeTree table, for example SELECT value.Tuple(a Nullable(UInt32), b String).a over a Dynamic column. Previously such a read hit a LOGICAL_ERROR…
fixBackported in: Fixed Iceberg INSERT writing manifest-wide aggregate column statistics into every data_file entry when a partition produced more than one data file. Each entry's null_value_counts, column_sizes, lower_bounds and upper_bounds now describe only the data file it points at. Previously…
fixBackported in: Fixes a server abort in debug and sanitizer builds when inserting into a materialized view whose TO target is another materialized view. Such an insert already failed on released versions, with an uninformative Code: 1001 STD_EXCEPTION; it now reports NOT_IMPLEMENTED naming the…
fixBackported in: Fixed a server that refused to start after the directory backing a Filesystem database had been removed. Such a database is now loaded without tables and can be inspected and dropped, while a CREATE DATABASE or ATTACH DATABASE issued by a user is still rejected when the path does…
fixBackported in: Don't use backoffs on concurrent inserts conflicts (when we use Iceberg + catalog, for example). (Konstantin Vedernikov).
fixBackported in: Fixed a crash and a LOGICAL_ERROR for statements that write trim(BOTH '' FROM x) (or the LEADING/TRAILING spelling) where a function is expected: a column's STATISTICS(...) or CODEC(...) list, INDEX ... TYPE, ALTER TABLE ... ADD STATISTICS, auto_statistics_types, a table function, a…
fixBackported in: Fixed a stack buffer overflow when reading a BIT column from MySQL, reachable through the mysql table function, the MySQL table and database engines, and MySQL dictionaries. The length of the value sent by the server was copied without being validated. (Alexey Milovidov).
fixBackported in: Fix flaky 04408_array_fold_cancellation under sanitizers. (Groene AI).
otherBackported in: Make the 04780 index-analysis allocation oracle the minimum of several runs. (Alexey Milovidov).
otherBackported in: Do not leave a Filesystem database pointing at a removed directory, which makes the server refuse to start. (Alexey Milovidov).
breakingBackported in: Reading a File source with rename_files_after_processing set now requires the WRITE ON FILE grant on top of READ ON FILE, on the initiator for fileCluster: the setting renames the files a SELECT has read, which is a write to the source, and it used to happen for anyone who could…
featureBackported in: Jemalloc Fragmentation Profiler. (Azat Khuzhin).
fixBackported in: Fix performance regression introduced in 26.4 when writing JSON and Dynamic columns in text formats. (Pavel Kruglov).
fixBackported in: Fixed a CPU regression for queries that issue many independent small reads against the same MergeTree part when the table has LowCardinality columns. The check deciding whether a part has a single shared dictionary scanned every mark of the whole part on each read task; it now finds…
fixBackported in: Fixes silent data loss for TTL expressions that apply large intervals directly to Date / DateTime source columns by widening the arithmetic away from 16/32-bit overflow. (BoloniniD).
fixBackported in: Fixed incorrect SQL literal escaping in StorageSQLite and sqlite() table function when pushing WHERE predicates to SQLite: single quotes and control characters (\n, \r, \t, ) were escaped with backslashes, which SQLite does not interpret, causing syntax errors or wrong query…
fixBackported in: Fixed SQL injection in the PostgreSQL wire protocol emulation. Prepared-statement parameters — the Parse/Bind/Execute extended-query path used by psycopg2, JDBC, node-postgres, Npgsql and others, and the simple-query EXECUTE path — were substituted into the executed SQL by raw…
fixBackported in: Rejects non-monotonic Array offsets on every read path that decodes them as absolute values, instead of only in the Native format. A corrupt set skip index granule previously passed unchecked and was then read out of bounds. (Groene AI).
fixBackported in: Fixed a privilege-escalation gap where the executable table function did not enforce the TABLE ENGINE ON Executable grant. With table_engines_require_grant enabled, a user denied CREATE TABLE ... ENGINE = Executable could still run the same server-side script via SELECT ... FROM…
fixBackported in: Fixed potential data loss when an INSERT into ReplicatedMergeTree was cancelled or timed out while ClickHouse was recovering an uncertain Keeper commit. (kakao-tars-case).
fixBackported in: Fixed a SQL injection in the PostgreSQL metadata queries. The schema of the PostgreSQL database engine, the requested column names and the publication name were formatted into SQL literals without escaping, so a value containing a quote could execute arbitrary SQL on the connected…
fixBackported in: Fix count() on Iceberg tables whose snapshot summary is inaccurate or corrupted: the trivial count optimization now derives exact row counts from the manifest files, and falls back to a real scan when row-level deletes make metadata counts inexact. Also fix Iceberg OPTIMIZE TABLE…
fixBackported in: Fix Iceberg tables written by ClickHouse being unreadable by external readers (PyIceberg, Spark). The Avro schemas embedded in the manifest-list and manifest files omitted the Iceberg field-id properties, so scan planning failed with Cannot convert field, missing field-id. (Groene…
fixBackported in: Fix allow_feature_tier rejecting merge_tree_-prefixed settings in settings profiles as unknown, and rejecting CREATE TABLE because of MergeTree settings set by the server through compatibility or the merge_tree config section. Also fix constraints on a merge_tree_-prefixed setting…
fixBackported in: Fixed LOGICAL_ERROR when reading a table with a set skip index defined on an expression and the query repeats that expression with a Nullable operand, for example WHERE intDiv(id, (SELECT 1000)) = 3 over INDEX b_set intDiv(id, 1000) TYPE set(100). A scalar subquery is enough to…
fixBackported in: Fixed a data race and a use-after-free on the metadata of a DeltaLake or Iceberg table. Two concurrent queries that read total_rows or total_bytes from system.tables for the same table could have one query replace the table's metadata while the other was still reading it, which…
fixBackported in: Fix wrong statistics part pruning for negated float predicates with NaN. (Han Fei).
fixBackported in: Fixes memory leaks of abandoned nested aggregate states. (Groene AI).
fixBackported in: Apply remote_url_allow_hosts before SQL-supplied S3 and Azure endpoints send schema, metadata, or container requests. (Rory Shanks).
fixBackported in: Fixed a LOGICAL_ERROR: Context has expired exception when a stored expression containing accurateCastOrDefault or a toOrDefault function is evaluated after the query that created it has finished, for example a MATERIALIZED column default on INSERT or a mutation expression. (Groene…
fixBackported in: Fix wrong results when a filter on a combined literal+sub-object JSON subcolumn (json.@a) was analyzed against a JSONAllPaths skip index: the subcolumn was treated as a path literally named @a `, so all granules were skipped and the query returned fewer rows than it should. (Pavel…
fixBackported in: Fixed incremental backups to Azure Blob Storage storing the beginning of each file instead of its tail. Restoring such a backup silently dropped all the data written after the base backup. (Smita Kulkarni).
fixBackported in: Fixed an exception (Block structure mismatch in Expression for FilterSortedStreamByRange) for some SELECT ... FINAL queries with PREWHERE over a table whose sorting key is an expression. (Shaohua Wang).
fixBackported in: Fixed silently incorrect results and undefined behavior when reading a malformed AggregateFunction(uniq, ...) state. The skip_degree field of the serialized state was used as a shift exponent without validation, so an out-of-range value produced an arbitrary cardinality instead of…
fixBackported in: Fixed wrong results from if, multiIf and CASE when one branch is a Date or Date32 and the result type is DateTime or DateTime64. With compile_expressions = 1 (the default) the compiled expression copied the date's day count into the timestamp column without converting days to…
fixBackported in: Fix a case where expensive ZooKeeper exception logging could delay session finalization and leave pending requests unresolved. (Antonio Andelic).
fixBackported in: Fix GroupingAggregatedTransform producing duplicate chunks for the same bucket. (Nikita Taranov).
fixBackported in: Reject a bare carriage return (\r), in addition to a line feed (\n), in HTTP header names and values that pass through the HTTP header filter. This closes an HTTP header injection (request/response splitting) gap for features that pass user-provided headers, such as the url table…
fixBackported in: Fix an integer overflow in the deserialization of String values in the binary formats, and bound the recursion of the binary deserialization of Dynamic and JSON values. (Alexey Milovidov).
fixBackported in: Fix a use-after-free in the gRPC server when a query with a streaming input finishes while a read of the next message is still in flight. (Alexey Milovidov).
fixBackported in: Fix LOGICAL_ERROR: No available columns when a query reads no columns from a table expression that has no columns at all, for example SELECT count() FROM loop(db, tbl) where tbl is an Alias table whose target was dropped, or a parameterized view. Such a query now fails with…
fixBackported in: Fixed ILLEGAL_COLUMN ("Cannot convert column ... because it is non constant in source stream but must be constant in result") for a query combining ARRAY JOIN with a filter on an empty IN set, whether the set is an empty list such as SELECT count() FROM t ARRAY JOIN [b] AS x WHERE a…
fixBackported in: Fixed the Unexpected return type from materialize logical error when reading a column that has a text index through the index after a metadata-only or not-yet-materialized ALTER MODIFY COLUMN (including lazy JSON type hints) that requires a read-time type conversion. (Pavel Kruglov).
fixBackported in: Fixed h3Line returning uninitialized memory in the tail of the result array when a line between two valid H3 indices cannot be drawn because it crosses pentagon distortion. Such a call now throws INCORRECT_DATA. (Groene AI).
fixBackported in: Fixed wrong results from sumKahan when the aggregated batch does not start at the first row of the block. sumKahanIf, and sumKahan over a Nullable argument, tested each row against the wrong element of the condition or null map, returning silently incorrect sums inside window frames…
fixBackported in: Fixed reading uninitialized memory as literal data when decompressing a malformed LZ4-compressed block. (Alexey Milovidov).
fixBackported in: Fixed a stack overflow when reading hadoop-snappy data containing many blocks that decode to nothing. (Alexey Milovidov).
fixBackported in: The handshake response of the MySQL wire protocol is now bounded, so a client can no longer make the server grow memory during the handshake. The mysql_require_secure_transport server setting is now enforced from the actual state of the connection instead of a capability bit…
fixBackported in: Sizes declared by a server in the Native protocol no longer make the client allocate memory for data that has not arrived: exception strings are read as they arrive, the decompressed size of a block is bounded, and the maximum number of rows in a Native block is now a billion.…
featureBackported in: Internal follow-up correcting an implementation detail from an unreleased change; no user-visible behavior change beyond restoring the intended performance characteristics of https://github.com/ClickHouse/ClickHouse/pull/115852 for Dynamic(JSON) text output. (Nikita Fomichev).
+51 more items in the release notes
featureBackported in: Bounded the cost of estimating the selectivity of col IN (...) from column statistics, which could add hundreds of milliseconds to the planning of a single query. The estimator no longer runs the subquery behind col IN (subquery) to fill a set it only needs one selectivity number…
fixBackported in: Fixed a performance regression where a query combining a text index filter with ORDER BY ... LIMIT stopped answering the filter from the index and read the whole text column instead. (Jimmy Aguilar Mena).
fixBackported in: Fixed a performance regression since 26.6: a query filtering a Nullable column with IN (subquery) read the whole table instead of skipping the read when the subquery returned no rows. Closes. (Yarik Briukhovetskyi).
featureBackported in: Added a new MergeTree setting text_index_version that controls the on-disk format version of text indexes: v0_initial, v1_with_codec, or v2_with_positions. During a rolling upgrade or before a downgrade, set it to an older version so that newer servers keep writing text index parts…
featureBackported in: Added fs cache download wait timeout configured by filesystem_cache_wait_for_concurrent_download_timeout_milliseconds. This timeout defined only the wait for a single chunk (buffer bytes of ~1mb) of data, not the whole file segment. (Kseniia Sumarokova).
fixBackported in: Fixed Kafka tables using kafka_sasl_mechanism = 'AWS_MSK_IAM' failing authentication once an hour with SASL authentication error: Access denied. The OAUTHBEARER token lifetime advertised to librdkafka is now capped by the remaining validity of the AWS credentials that signed the…
fixBackported in: Constant folding during query planning no longer executes a function whose argument type differs from the type the function was resolved for during analysis. Such a mismatch used to raise a LOGICAL_ERROR while the output header was being computed, which is an assertion failure in…
fixBackported in: Fix a data race (and rare crash) when a parsing/analysis error is reported while reading a file/object storage table. A parse error raised during lazy KeyCondition initialization was shared as a single exception object across reader threads, and two threads could concurrently append…
fixBackported in: Fix CREATE OR REPLACE leaving the replaced object behind under an internal name when the caller lacks the drop privilege on it. (Nikolay Degterinsky).
fixBackported in: Fixes a bloom_filter skip index dropping granules that contain matching rows when a String or FixedString column is compared for equality against a constant that is wider than the indexed type, so that queries such as SELECT count() FROM t WHERE s = toFixedString('abc', 5) no longer…
fixBackported in: Fixes two cases where an AWS Glue DataLakeCatalog database reported a table as absent instead of reporting an error. SHOW TABLES and system.tables no longer fail with DATALAKE_DATABASE_ERROR ("Exception calling GetTables ... not found") when a Glue database is absent while its…
fixBackported in: Fixed Logical error: 'Files metadata is empty' when reading from, altering, or flushing an S3Queue/AzureQueue table whose metadata handle is gone: concurrently with a DROP/DETACH, after a failed startup, or after a failed DROP. Such a table now reports TABLE_IS_DROPPED instead.…
fixBackported in: Fix a crash for ORDER BY ALL in a WINDOW VIEW, and UNKNOWN_IDENTIFIER errors for INTERPOLATE, WINDOW and LIMIT BY in a query over a Merge or Distributed table with a join, with the old analyzer. (Alexey Milovidov).
fixBackported in: Fixes ORDER BY ... LIMIT queries on Tuple() columns raising a NOT_IMPLEMENTED exception when top-K dynamic filtering is enabled. Direct empty tuples now skip the optimization, while supported nested composite types continue to use top-K filtering. (Langning Zhang).
fixBackported in: Fix std::out_of_range: map::at: key not found when a MergeTree key expression contains a mortonEncode or hilbertEncode call that is not itself a key column, for example ORDER BY mortonEncode(hilbertEncode(x, y), x, y) or PARTITION BY mortonEncode(x, y) % 4. (Groene AI).
fixBackported in: Register Iceberg namespace in the catalog before writing table files (needed for SeaweedFS). (Azat Khuzhin).
fixBackported in: Fixes a server abort (Logical error: Part patch-... doesn't exist) when a DROP TABLE runs concurrently with a lightweight UPDATE on a ReplicatedMergeTree table. The update now holds the table's shared lock until its patch part is committed, so the DROP waits instead of removing it.…
fixBackported in: The AI-function quota settings (ai_function_max_api_calls_per_query, ai_function_max_input_tokens_per_query, ai_function_max_output_tokens_per_query) were enforced per block rather than per query, letting a query exceed the configured limit in proportion to the number of blocks and…
fixBackported in: Fixed a hang when dropping a TimeSeries table whose name sorts lexicographically below its inner tables' names, for example DROP TABLE -ts or dropping a materialized view declared with ENGINE = TimeSeries. The drop self-deadlocked on the DDL guard and could not be cancelled with…
fixBackported in: Fixed an out-of-bounds read while deserializing corrupted posting lists of a text index. (Anton Popov).
fixBackported in: Fixed a row policy bypass where the mergeTreeIndex table function exposed primary key and minmax index values of the rows hidden by a SELECT row policy on the source table; reading mergeTreeIndex for a table with a row policy is now denied. (Yarik Briukhovetskyi).
fixBackported in: Fixes asynchronous inserts into JSON columns ignoring the max_dynamic_subcolumns_in_json_type_parsing setting. Previously, an asynchronous insert (async_insert = 1) could store more dynamic paths than the setting allows, giving a different column layout than a synchronous insert…
fixBackported in: Fixed a bypass of settings constraints: SET = DEFAULT reset a setting without checking the constraints from the user's profile, so a MIN/MAX/CONST constraint could be escaped by resetting the setting instead of assigning to it, and a session could leave readonly mode with SET…
fixBackported in: Fixed a settings-constraint bypass: a SETTINGS clause inside a subquery, a CTE or a view's inner query was applied without checking the settings constraints, so it could be used to leave readonly mode or to override a CONST, MIN or MAX constraint (for example…
fixBackported in: Validate Variant discriminator in ColumnVariant arena deserialization. (Azat Khuzhin).
fixBackported in: Fix read_rows, read_bytes, written_rows and written_bytes in system.query_thread_log reporting a thread lifetime running total instead of the values for the logged query. Rows of long-lived pooled threads, in particular the query's initiating HTTPHandler thread, were affected.…
fixBackported in: Allow KeeperMap readers to accept shared metadata when equivalent primary keys differ only by redundant outer parentheses. (Sergey Kuznetsov).
fixBackported in: Fixed a bug in the function formatRowNoNewline that could produce incorrect results or a logical error when a row is formatted to an empty result. (Alexey Milovidov).
fixBackported in: Fix server crashes on deeply nested input in readWKB, JSONMergePatch, the address parser of the url/remote/cluster/mysql/postgresql table functions, the CURSOR clause parser and the CapnProto schema parser. Fix a crash in the parser of the EXECUTE statement when an argument is not a…
fixBackported in: Validate the states of the stochasticLinearRegression, stochasticLogisticRegression, groupUniqArray, groupArrayIntersect and topK aggregate functions and of the Resample combinator on deserialization: a malformed state could be read out of bounds. (Alexey Milovidov).
fixBackported in: Fix crashes of the Parquet, ORC and Iceberg readers on malformed input: a DELTA_BYTE_ARRAY page with an empty length stream, a DELTA_BYTE_ARRAY page of a Decimal column read under a filter, an out-of-range enum in an Iceberg manifest file and an oversized allocation in the ORC…
fixBackported in: Do not return uninitialized memory in the result of a binary string literal whose length is not a multiple of eight, and from the LZ4 decompressor when a compressed block has no body. (Alexey Milovidov).
fixBackported in: Fix a crash of a window function over a Tuple with a sparse element, for example groupConcat(t) OVER (). (Alexey Milovidov).
fixBackported in: Bound the size of the startup message of the PostgreSQL wire protocol, which is read before authentication. (Alexey Milovidov).
fixBackported in: Reject unsupported and mixed read/write operations in ZooKeeper multi requests. (Antonio Andelic).
fixBackported in: Mask the aws_external_id setting of the DataLakeCatalog database engine in SHOW CREATE DATABASE and system.databases.engine_full. It was previously printed in plaintext, unlike the other AWS credential settings. Closes:. (Groene AI).
fixBackported in: Reject invalid names of projections and indexes. (Alexander Tokmakov).
fixBackported in: Add Objects' paths to deduplication hashing, preventing incorrect deduplication. (Mikhail f. Shiryaev).
fixFixed a TABLE ENGINE privilege bypass in the URL table engine. A user granted only TABLE ENGINE ON URL could ATTACH TABLE ... ENGINE = URL('file://...') (or s3://, az://, hdfs://) and read through it, because the privilege re-check on the backend the scheme dispatches to ran only for CREATE. It…
featureBackported in: This patch: 1. Removes the global error screen (blue screen) and replaces it with a note above the dashboards. In this approach, on any error, already fetched graphs will not be hidden. 2. Dashboard now opens the graphs view immediately. 3. Reload button and any other button can be…
+16 more items in the release notes
fixBackported in: Serialize a Nullable(Tuple(...)) column as a single CSV field instead of flattening it into separate columns. Previously a non-null value was written as several CSV fields while a NULL was a single \N, giving a row-dependent column count that broke CSVWithNames/CSVWithNamesAndTypes…
fixBackported in: Fix a theoretical data race in profile events when using the trace_profile_events_list setting to write stack traces of certain profile events to system.trace_log. (Miсhael Stetsyuk).
fixBackported in: Fix Logical error: No set is registered for key ... when reading through a Merge table whose child declares an ALIAS column containing IN, and the children disagree about that column's default. (Groene AI).
fixBackported in: Reject corrupted/malicious dictionary where lcp exceeds the previous token or lcp + data_size overflows, before the buffer write. (Elmi Ahmadov).
fixBackported in: Fixes a bug where an access entity carrying a Map-valued setting, such as a settings profile with http_response_headers or additional_table_filters, is stored in a form that ClickHouse cannot read back, leaving the entity permanently unloadable after a restart. (Groene AI).
fixBackported in: Fixes has, indexOf, countEqual, mapContainsKey, mapContainsValue and Map subscript returning "not found" for a constant LowCardinality needle equal to the element type's default value, such as an empty String or a zero number. (Groene AI).
fixBackported in: Fix propagation of query settings and NULL handling in accurateCastOrDefault. (Alexey Milovidov).
fixBackported in: Fixed wrong results for SELECT count(arrayJoin(arr)) with the default optimize_trivial_count_query = 1. The stored row count was returned instead of the number of array elements, and on file() and url() the query returned 0. Closes. (Groene AI).
fixBackported in: Fixed uniq, uniqExact, uniqHLL12 and uniqTheta returning a wrong result for an argument wrapped in an injective function that hides nullability, such as uniqExact(tuple(x)) over a Nullable column. The optimize_injective_functions_inside_uniq optimization removed the wrapping…
fixBackported in: Fix a ~1.5x performance regression introduced in 26.5 in GROUP BY over Dynamic keys and over JSON path subcolumns. (Utkal Singh).
fixBackported in: Added the setting analyzer_compatibility_multiple_joins_qualify_column_names (default false). When enabled and the FROM clause of a query contains two or more JOINs, result column names produced by the analyzer mimic the old analyzer's multiple-joins rewrite: columns expanded from…
fixBackported in: Reject unsupported uses of AggregateFunction columns in TTL expressions at CREATE TABLE time (e.g. TTL toDateTime(state)) instead of failing later during TTL execution with ILLEGAL_TYPE_OF_ARGUMENT. This also covers states carried inside Variant alternatives and Dynamic values.…
fixBackported in: Fix possible logical error "Unexpected substream ... for column ..." during bump of compatibility setting. (Pavel Kruglov).
fixBackported in: Fix propagation of settings in accurateCastOrDefault. Closes. (Pavel Kruglov).
fixBackported in: Fixed a LOGICAL_ERROR ("Bad cast from ColumnString to ColumnLowCardinality") during primary-key index analysis when a LowCardinality key column is wrapped in a nested CAST chain that re-introduces LowCardinality, e.g. WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. In…
fixBackported in: RESTORE now fsyncs the restored part files when the destination table has fsync_after_insert enabled, so a restored part is as durable against power loss as an inserted one. Previously restored files were only written and closed (never fsynced), so a power loss right after RESTORE…
fixBackported in: Fixed made_current_at in system.iceberg_history becoming 1970-01-01 for a retained snapshot after ALTER TABLE ... EXECUTE expire_snapshots on an Iceberg table. Also fixed system.iceberg_history returning no rows for a table whose metadata has no snapshot-log. (Groene AI).
fixBackported in: Fix a logical error Block structure mismatch in IntersectOrExceptStep stream: different number of columns that could happen when the filter split optimization (query_plan_split_filter) ran on a WHERE whose filter column name is also an input column name. The optimization left an…
fixBackported in: Fixed a stack frame being displayed as ? instead of its function name in fatal log messages and in the trace_full column of system.crash_log. It affected frames of ordinary functions that have code attributed to a libc++ __functional header, which is common in release builds.…
fixBackported in: Fixed a server abort (SIGABRT) when a BUFFERED_V1 WebAssembly UDF returns an empty result buffer; the query now fails with a catchable WASM_ERROR and the server stays up. (Nikolai Ovchinnikov).
fixBackported in: Fixed a use-after-free when a JOIN with join_algorithm = 'direct' onto a dictionary was given a join key that is stored with sparse serialization. getColumnVectorData returned a reference to a temporary column, so the dictionary lookup read freed memory: release builds could return…
fixBackported in: Fixes cases where row policy was not used for MergeTree Projections during query execution. (Yarik Briukhovetskyi).
fixBackported in: Fix out-of-bounds read in SerializationReplicated on the native protocol on corrupted indexes data. (Pavel Kruglov).
fixBackported in: Fix data races in profile events and memory tracker. (Miсhael Stetsyuk).
fixBackported in: Security related bugfix. (Kseniia Sumarokova).
fixBackported in: Fixed a crash when reading a Parquet file with inconsistent bloom filter metadata. Such files could also silently return fewer rows than they should. (Shaohua Wang).
fixBackported in: Fix AsynchronousBoundedReadBuffer's readBigAt data race. Closes. (Kseniia Sumarokova).
fixBackported in: Fixed the logical error SortingAggregatedTransform already got bucket with number N that could occur in multi-layer distributed GROUP BY queries using two-level aggregation. (Nikita Taranov).
fixBackported in: Fixes wrong results for a JOIN whose ON clause carries a mixed condition, that is a cross-side non-equi residual such as ON (t1.key = t2.key) AND (t1.a * 10 < t2.a). Only the hash family evaluates such a condition, but full_sorting_merge, partial_merge and the direct key-value join…
fixBackported in: Fix DROP TABLE and SYSTEM STOP VIEW hanging when a Refreshable Materialized View is blocked while planning its refresh query. (Nikolay Degterinsky).
fixBackported in: Fixed a case where CREATE TABLE ... ENGINE = Distributed(...) without a column list could reveal the structure of a local table the creating user is not allowed to see. For a CREATE the local server executes itself, the structure is now inferred under the user's own context, so SHOW…
fixBackported in: Fixed reading the internal _temporary_and_external_tables database through the merge table function and the Merge table engine, which allowed one session to read the temporary tables of other sessions and other users, and caused an exception on the old analyzer path. A database…
fixBackported in: Fixed wrong results when a hash join has a single LowCardinality key of a type wider than 8 bytes (UInt128, Int128, UInt256, Int256, and their Nullable variants). Such a join silently returned rows whose key values are not equal. (Groene AI).
fixBackported in: Fixed a query plan optimization stall when a WHERE clause contains a large string constant with many dots and the table carries a bloom_filter, tokenbf_v1, ngrambf_v1 or text skip index. Matching a filter column name against JSONAllPaths(...) index columns enumerated every dot split…
fixBackported in:. (Vladimir Cherkasov).
fixBackported in: Fixed a case where CREATE TABLE ... ENGINE = Buffer(...) without a column list could reveal the structure of a destination table the creating user is not allowed to see. For a CREATE the local server executes itself, the structure is now inferred under the user's own context, so…
fixBackported in: Fixed ATTACH of a Kafka table when kafka_num_consumers exceeds the limit derived from the number of CPU cores. (Nikolay Degterinsky).
fixBackported in: Fixed reading Paimon tables that contain a nullable ARRAY or MAP column. Such a table could not be read at all, because the schema mapper wrapped the composite type in Nullable, which ClickHouse forbids, so both DESC and SELECT failed with Nested type Array(Nullable(Int32)) cannot…
fixBackported in: Fix part and granule pruning for a JOIN ON condition involving constant columns of the other side. (Vladimir Cherkasov).
fixBackported in: Fix wrong results and, in a build with assertions enabled, an aborted assertion for a JOIN onto a dictionary whose ON clause has a non-equi condition over both tables, such as ON (t.key = d.key) AND (t.a * 10 < d.a), when join_use_nulls is enabled. The condition was evaluated over a…
fixBackported in: Fixed a row policy containing a scalar subquery being evaluated only once and then reused forever after the table had been read through a Merge table. The parsed policy condition is cached and shared by all queries, and reading it through Merge rewrote the cached expression in…
fixBackported in: Fixed made_current_at in system.iceberg_history reporting the earliest time a snapshot became current instead of the latest one, when the same snapshot-id appears more than once in the Iceberg snapshot-log (as a rollback leaves it). (Groene AI).
fixBackported in: Fix a wrong value returned for a virtual column such as _table or _database selected from the right side of a JOIN served by DirectKeyValueJoin (a key-value storage such as EmbeddedRocksDB, KeeperMap, Redis, or a dictionary). The query returned the contents of a data column instead,…
fixBackported in: Fix CANNOT_CONVERT_TYPE and an exception in GroupingAggregatedTransform when reading a Merge table with one child being a Distributed table under custom-key parallel replicas (parallel_replicas_mode = 'custom_key_sampling' or 'custom_key_range'). Closes. (Alexey Milovidov).
fixBackported in: Fixed OPTIMIZE TABLE on an Iceberg table failing with Unsupported snapshot's operation type OVERWRITE when the table's history contained a row delete that removed more than one row per position delete file. Closes. (Groene AI).
fixBackported in: Fixed ORDER BY ... LIMIT returning fewer rows than requested, possibly none, when a row policy was the only filter of the query and the sort column had a minmax skip index. The top-K optimization narrowed the read before the row policy was applied. (Alexey Milovidov).
featureBackported in: Add a dedicated thread pool for lightweight snapshot creation. (Han Fei).
featureBackported in: Add clickhouse/utils container image with macOS binary signing tools. (Konstantin Bogdanov).
breakingRemove bad tests on 26.7. (Alexey Milovidov).
+18 more items in the release notes
fixBackported in: Fixed a performance regression where a single lightweight DELETE disabled the query condition cache for the whole table. Repeated selective queries over a table that had ever been touched by a lightweight delete stopped pruning granules and fell back to reading every mark. (Nikita…
fixBackported in: Fix server crashes and wrong NOT_FOUND_COLUMN_IN_BLOCK / LOGICAL_ERROR failures in a direct JOIN over a MergeTree right table. The plan is cloned and re-optimized per lookup across threads, but the clone shared two mutable objects with the original: the PrewhereInfo/row_level_filter…
fixBackported in: With analyzer_compatibility_join_using_top_level_identifier = 1, an identifier in JOIN ... USING can now be resolved from an alias defined on a subexpression inside the SELECT list (for example, SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)), matching the old analyzer…
fixBackported in: Fixed a logical error Block structure mismatch (in debug and sanitizer builds) and an Illegal types of arguments error for set operations over compatible aggregate-state columns (e.g. quantileState and quantilesState(0.9)) nested inside container columns such as Tuple, Array, Map,…
fixBackported in: Now RestCatalog throw proper exception instead of silence or "UNKNOWN_TABLE" in case of stale credentials. (alesapin).
fixBackported in: Fix an out-of-bounds read (a crash in release builds) in insert deduplication when an INSERT flows through a materialized view whose inner query changes the number of rows and the deduplicating target table is partitioned. DeduplicationInfo::filterToPartition attributed each…
fixBackported in: Fixed server startup and ATTACH failing with WITH RECURSIVE is not supported with the old analyzer for a view with a recursive CTE when enable_analyzer = 0 is the server default. (Nikolay Degterinsky).
fixBackported in: Fixed an out-of-bounds write when reading a Parquet DECIMAL column whose physical type is wider than the type its declared precision maps to, for example DECIMAL(9, 2) stored as physical INT64. Such files are valid Parquet and other writers produce them, but the reader sized the…
fixBackported in: Fix a rare use-after-free bug that is triggered in a rare event of the async insert queue having different entries with identical deadlines. Now it's handled gracefully. (Miсhael Stetsyuk).
otherBackported in: This PR bumps aws-c-http v0.11.0. (Govind R Nair).
otherBackported in: Update the vendored libexpat to 2.8.2. (Konstantin Bogdanov).
otherBackported in: Update simdjson to v4.6.5. (Konstantin Bogdanov).
otherBackported in: Update jwt-cpp to v0.7.2. (Konstantin Bogdanov).
otherBackported in: Update libcotp to v4.2.1. (Konstantin Bogdanov).
otherBackported in: Update Apache Arrow to 25.0.0 and Apache ORC to 2.3.1. (Konstantin Bogdanov).
otherBackported in: Update Protocol Buffers to v35.1 and gRPC to v1.83.0. (Konstantin Bogdanov).
fixBackported in: Fix Field::operator<= comparing a Float64 with itself. (Alexey Milovidov).
otherBackported in: I created several PRs to backport the groene-ai's fix: https://github.com/ClickHouse/ClickHouse/pull/109616 However, I need to create dummy PR to create another version patch. (Konstantin Vedernikov).
featureBackported in: Tag OpenAI-format HTTP requests with the SQL name of the calling AI function for upstream endpoint identification. (George Larionov).
fixBackported in: Fixed O(P×N) deduplication hash recomputation in async insert flushes that split across P partitions. DeduplicationInfo::prewarmDataHashes is now called once before the partition loop in MergeTreeSink and ReplicatedMergeTreeSink, so all per-partition clones inherit pre-computed…
fixBackported in: This patch fixes the remaining problems needed for part-level min-max index for _block_number and _block_offset columns. (Mikhail Artemenko).
featureBackported in: Added the jemalloc_merge_tree_arenas server setting controlling the dedicated jemalloc arena(s) used for MergeTree part and table metadata: 0 disables it, 1 uses a single arena (default), and N creates a per-CPU pool. On many-core servers a pool reduces memory-allocator lock…
fixBackported in: Web UI: fix the "+" (new tab) button rendering taller than the tabs in Firefox. (Alexey Milovidov).
featureBackported in: Added the setting use_query_condition_cache_for_top_k (default disabled) which gates the query condition cache for ORDER BY ... LIMIT n (TopK) queries. This turns the feature off by default as a precaution until the soundness of its cache entries is fully established, while keeping…
featureBackported in: Added setting analyzer_compatibility_apply_final_to_all_joined_tables that restores the old behavior, where the FINAL modifier on the left-most table of a JOIN was also applied to the other joined tables. The setting is registered in the settings changes history, so compatibility…
featureBackported in: Iceberg v2 spec requires sequence_number in manifest files. However, other engines such as BigQuery could write those files without this field. This PR allow to read those non-spec tables. (Konstantin Vedernikov).
fixBackported in: Fix a LOGICAL_ERROR (Invalid number of rows in Chunk) in JoiningTransform for a LEFT JOIN with unique right keys, a mixed ON condition, and a small max_joined_block_size_rows. (Groene AI).
fixBackported in: Fix server crash (SIGSEGV) when reading Protobuf data with input_format_allow_errors_num > 0 and a valid message precedes a bad (skippable) message in the same block. (Andrey Tsarevskiy | Андрей Царевский ).
fixBackported in: Fix NOT_FOUND_COLUMN_IN_BLOCK error for queries that use the _part_starting_offset/_part_offset virtual columns in WHERE together with lazy materialization. (Vladimir Cherkasov).
fixBackported in: Fix a server crash (out-of-bounds access) in S3Queue/AzureQueue with enable_hash_ring_filtering = 1 when a batch contained a non-processable file and the Keeper request to set the batch as processing failed at the same time. (Groene AI).
fixBackported in: Preserve original key order in bucketed Map serialization to fix comparison operations that depend on it. (Pavel Kruglov).
fixBackported in: Fix data loss of a column with no default expression when a merge runs concurrently with ALTER TABLE ... RENAME COLUMN, or when the column's only values come from a lightweight UPDATE. The column could be dropped from the merged part, so all of its values read back as NULL. (Groene…
fixBackported in: Fixed a false ICEBERG_SPECIFICATION_VIOLATION error when reading an Iceberg table whose decimal (or other parameterized primitive) type is serialized with different whitespace across metadata files, e.g. decimal(20,0) in the table metadata and decimal(20, 0) in the manifest. Such…
fixBackported in: Fix credential leaks in SHOW CREATE, system.query_log, server logs and EXPLAIN output. Every S3 locator form now masks session_token and Google ADC secrets, extra_credentials/headers values at any argument position, duplicated or expression secret keys, invalid positional forms…
fixBackported in: Fixed wrong results for functions has, mapContainsKey and mapContainsValue with an empty needle when a text index is present. (Robert Schulze).
fixBackported in: Fix S3Queue/AzureQueue ordered mode with persistent processing nodes: bucket locks are now refreshed during streaming, so that the TTL cleanup (persistent_processing_node_ttl_seconds) does not remove locks of a live processor. If lock ownership is nevertheless lost, it is detected…
fixBackported in: Fix 411 Length Required errors from Azure services: the Poco-based Azure HTTP transport now sets Content-Length from the request body for SDK clients that do not set the header themselves (e.g. Azure Key Vault). (Konstantin Bogdanov).
fixBackported in: Fixed a read-only object-storage replica (a disk configured with read_only = true) not discovering new parts via refresh_parts_interval, and table_disk = true being rejected on such a disk with "table_disk is not supported for non-ObjectStorage disks". (Julia Kartseva).
fixBackported in: Fix wrong IS NULL / IS NOT NULL / count() results with optimize_functions_to_subcolumns on a column that was made Nullable by a metadata-only ALTER MODIFY COLUMN T to Nullable(T). For parts written before the conversion, the .null subcolumn was filled from the storage-type default…
fixBackported in: Fix incorrect pruning from primary key index analysis on tables with a reverse (descending) sorting key (ORDER BY (g, r DESC)). A granule spanning a change of a leading key column followed by a descending key column could be pruned incorrectly, dropping matching rows. (Nihal Z.…
fixBackported in: Fix a logical error block.rows() == getRows() (an out-of-bounds read and broken insert deduplication in release builds) when an INSERT flows through a dependent materialized view whose target is an Alias and whose inner query changes the number of rows, with a deduplicating table…
fixBackported in: Fix CREATE OR REPLACE of a dictionary with an object of another kind: it failed with CANNOT_DETACH_DICTIONARY_AS_TABLE after the replace was already committed, leaving an orphan tmp_replace* table. (Nikolay Degterinsky).
fixBackported in: A {_partition_id} placeholder in the path of a file-like engine (S3, AzureBlobStorage, URL, etc.) with no explicit partition_strategy implies the wildcard strategy again, regardless of file_like_engine_default_partition_strategy. This restores backward compatibility for pre-26.6 DDL…
fixBackported in: Fixed INCOMPATIBLE_TYPE_OF_JOIN error for an ANY join on a Join engine table when a WHERE filter on a right-side column allowed the query planner to rewrite the join to SEMI or ANTI. A Join engine table has a fixed declared strictness that cannot be changed, so the conversion is now…
fixBackported in: Fix OPTIMIZE TABLE ... MANIFEST for Iceberg tables when manifest partition tuples do not match their partition spec. (Smita Kulkarni).
fixBackported in: Fix UNKNOWN_IDENTIFIER error for columns qualified by CTE name (cte_name.column) in queries stored in views when the analyzer is enabled. (Dmitry Novik).
fixBackported in: Fix a memory leak of the peer certificate on every TLS handshake with certificate verification enabled: SecureSocketImpl::verifyPeerCertificateImpl did not free the certificate returned by SSL_get1_peer_certificate. (Konstantin Bogdanov).
fixBackported in: Fix checking paths against user_files. (Alexander Tokmakov).
fixBackported in: Restrict local object access only for user files path. Continuation of https://github.com/ClickHouse/ClickHouse/pull/99405. (Konstantin Vedernikov).
fixBackported in: Fix typo in complex schema evolution. (Konstantin Vedernikov).
fixBackported in: Fix mutations with a query parameter as the partition (ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}): the substituted partition value was serialized into the mutation entry in a form that could not be parsed back, which broke loading of the table (for replicated…
fixBackported in: Fix a segfault due to out-of-bounds memory access when deserializing a malformed aggregate function state containing a String value. Such states are now validated and rejected instead of leading to segfaults. (Miсhael Stetsyuk).
fixBackported in: Fix overflow while parsing in system.zookeeper_info. (Kseniia Sumarokova).
fixBackported in: Fixed a server crash on macOS (aarch64) when a stack trace was captured (for example by the memory profiler) while running on a coroutine/fiber stack. (Raúl Marín).
fixBackported in: Fixes NOT_FOUND_COLUMN_IN_BLOCK when a FINAL query filters on a sorting-key column that is not in the SELECT list and the filter is moved to PREWHERE (for example SELECT s FROM t FINAL WHERE k GROUP BY s with optimize_move_to_prewhere_if_final = 1). (Groene AI).
fixBackported in: ... (Han Fei).
fixBackported in: Fix TYPE_MISMATCH ("Key type for complex key ... does not match") when a JOIN onto a dictionary uses a Nullable, LowCardinality, or LowCardinality(Nullable) join key while the dictionary key is not wrapped. The direct-join dictionary lookup now normalizes the key to the dictionary's…
fixBackported in: Fixes AMBIGUOUS_COLUMN_NAME (Block structure mismatch in (columns with identical name must have identical structure)) for a query that repeats a JOIN ON condition in WHERE with join_use_nulls = 1. Such a query now returns its result instead of failing. (Groene AI).
+19 more items in the release notes
breakingThe / glob (any amount of directories) now also matches the same directory. Previously, / in glob patterns was not handled as a special case, so data/**/file.txt would not match data/file.txt (zero directory levels). (Alexey Milovidov).
breakingReject the zip/zipx backup archive format for backups stored on object storage — direct S3(...)/AzureBlobStorage(...) destinations and Disk(...) destinations backed by S3 or Azure — for both BACKUP and RESTORE. Zip requires seeking to read its central directory, which is very slow over object…
breakingS3 access originating from user SQL no longer resolves the server's own cloud credentials (environment, IMDS/IRSA, instance profile, AWS config files, role_arn-based STS, GCP OAuth metadata) by default; such a request must use explicit credentials or NOSIGN. Named collections now default…
breakingExtended the supported range of DateTime64 from [1900-01-01, 2299-12-31] to [0000-01-01, 9999-12-31]. Values outside the former range are now computed correctly (via cctz) instead of being clamped to the boundary. With precision 8 or 9 the range remains narrower because the ticks are stored as…
breakingAggregatingMergeTree now rejects, at table creation time, schemas where a column is neither part of the sorting key nor an aggregate-state measure (AggregateFunction/SimpleAggregateFunction). Such columns are silently collapsed to an arbitrary value during background merges, producing wrong…
breakingRemoved the config-based workload scheduling configuration (the resources and workload_classifiers server config sections). Use CREATE RESOURCE and CREATE WORKLOAD queries instead. The obsolete config sections are ignored with a warning. (Sergei Trifonov).
breakingClickHouse now always uses the unified insert deduplication hash for both synchronous and asynchronous inserts; the legacy per-insert deduplication behaviours are removed. The server setting insert_deduplication_version is kept as a migration guard: the server refuses to start if it is set to a…
breakingRemoved the long-deprecated functions snowflakeToDateTime, snowflakeToDateTime64, dateTimeToSnowflake and dateTime64ToSnowflake. They were deprecated back in v24.6 in favor of snowflakeIDToDateTime, snowflakeIDToDateTime64, dateTimeToSnowflakeID and dateTime64ToSnowflakeID, which should be used…
breakingThe setting use_legacy_to_time is now 0 by default, so toTime converts values into the Time data type instead of converting a date with time to a fixed date. The legacy behavior is still available via the toTimeWithFixedDate function or by setting use_legacy_to_time = 1. (Alexey Milovidov).
breakingNaive Bayes models (used by naiveBayesClassifier) are now configured as a dictionary with the NAIVE_BAYES layout, built at load time from a table of pre-aggregated per-class n-gram counts, instead of the previous server-side configuration (an XML config file referencing serialized .bin model…
breakingThe hasColumnInTable function no longer accepts the optional hostname, username, and password arguments for checking a column on an arbitrary remote server; only the hasColumnInTable(database, table, column) form remains. The removed remote mode was a security concern: it let any user trigger…
featureAdded the skip_unavailable_shards_mode setting (also available as a Distributed engine setting) to control which exceptions from a remote shard are silently ignored when skip_unavailable_shards is enabled. This provides finer control over query behavior in distributed environments. (cjw).
featureIntroduce a memory reservation feature for workloads. More details https://clickhouse.com/docs/operations/workload-scheduling. (Sergei Trifonov).
featureAdd groupFormat aggregate function that formats rows in each group using a specified output format and returns the result as a string. (Yang Hu).
featureEnable wildcard expansion for url() and the URL engine by listing HTTP index pages (HTML or plaintext directory listings) and extracting matching URLs. Wildcards are matched against the URL path component, with limits on the index page size and on the number of directories read. (Yue Ni).
featureAdded AWS_MSK_IAM as a supported value for kafka_sasl_mechanism, enabling ClickHouse to authenticate with Amazon MSK using IAM roles without managing SASL/SCRAM credentials. (kalavt).
featureAdd aggregate function combinator -Tuple, which applies the underlying aggregate function to each element of a Tuple column independently and returns a Tuple of the results, preserving element names: sumTuple(t) for t = (a, b) returns (sum(a), sum(b)). Aggregate functions with several arguments…
featureAdded a postprocessor to the text index which transforms the tokens after tokenization. (Jimmy Aguilar Mena).
featureAdded system table system.stemmers which shows all available stemmers languages that can be specified for the stem function. (Jimmy Aguilar Mena).
featureAdd support for WITH TIES for negative LIMIT. (Nihal Z. Miaji).
featureAdded support for WHERE clauses in projection definitions. Projections with WHERE only materialize rows matching the predicate, and the optimizer can use them (cost-based) when the query's WHERE implies the projection's WHERE. (S Bala Vignesh).
featureAdd new positions argument support to text indexes to store token positions and enable exact direct reads for hasPhrase. The allow_experimental_text_index_positions needs to be enabled to store positional information. (Elmi Ahmadov).
featureAdded support for the standard SQL AT TIME ZONE and AT LOCAL postfix operators as syntactic sugar for toTimeZone. The expression expr AT TIME ZONE zone is now equivalent to toTimeZone(expr, zone), and expr AT LOCAL is equivalent to toTimeZone(expr, timeZone()). (lizepeng).
featureThe URL table engine and url table function now dispatch to the appropriate backend based on the URL scheme: file:// is served by the File engine, s3:///gs:///gcs:///oss:// by S3, az:///azure:///abfss:///abfs:// by AzureBlobStorage, hdfs:// by HDFS, and http(s):// by the URL engine as before. The…
featureAdded the Remote and RemoteSecure table engines, the persistent counterparts of the remote and remoteSecure table functions. CREATE TABLE ... ENGINE = Remote('addresses', db, table, ...) now works in addition to CREATE TABLE ... AS remote(...). (Alexey Milovidov).
featureAdding EXPLAIN ANALYZE v1 for examination of query performance using metrics rendered in the familiar query plan format. ... (Kirill Kopnev).
featureAdded engine-agnostic SYSTEM STOP, SYSTEM START, SYSTEM PAUSE, SYSTEM CANCEL, and SYSTEM REFRESH commands, and their ... ALL BACKGROUND server-wide forms, to control the background activity of Kafka, RabbitMQ, NATS, S3Queue/AzureQueue tables and refreshable materialized views through one unified…
featureAdded support for the mysql, postgresql, and sqlite table functions and table engines to accept a user's query (instead of a table name) and pass it to the external database as is, written either as a subquery (SELECT ...) or as query('SELECT ...'). The structure of the resulting table is inferred…
featureAdded tabs to the ClickHouse Web UI (Play) for working with multiple queries at once. Tabs, their titles, parameters, active state, and small result snapshots are persisted across reloads (large and image results are not restored), integrate with browser history and the URL, and can be switched…
featureIntroduce the QueryRunner table engine. Records inserted into a QueryRunner table represent queries that the engine executes. The engine can be used for asynchronous query execution, batch execution of generated queries, directing queries to remote clusters, benchmarks, fuzzing, and testing with…
featureAdded an interactive help command to clickhouse-client and clickhouse-local. Typing help (also /help, man, /man) shows the documentation of a function, table engine, data type, format, setting, and other components, rendered from Markdown in the terminal with syntax-highlighted SQL. When the word…
featureAdd the GeoJSON output format for writing GeoJSON FeatureCollection documents, producing one feature per row. The single geo-typed column (Point, LineString, MultiLineString, Polygon, MultiPolygon, Ring, or Geometry) becomes each feature's geometry; a column named id becomes the feature id; and…
featureAdded the dotProductTransposed function (alias scalarProductTransposed) that computes the approximate inner product between a QBit column and a reference vector, complementing the existing L2DistanceTransposed and cosineDistanceTransposed functions. (Alexey Milovidov).
featureAdded an optional stride parameter to the QBit data type (QBit(T, dimension, stride)) that stores groups of dimensions in separate streams, so a vector search can read only the first dimensions efficiently (e.g. for Matryoshka embeddings). The transposed distance functions accept an optional…
featureAdded support for the Int8 element type in the QBit data type, enabling storage and transposed-distance vector search (L2DistanceTransposed, cosineDistanceTransposed) over quantized 8-bit integer vectors. (Alexey Milovidov).
featureNew function randomHadamardTransform(vector[, seed[, output_dims]]): a deterministic randomized Hadamard transform of a float vector — an orthogonal, norm-preserving rotation useful for preprocessing embeddings before quantization, and (when truncated) as a Johnson–Lindenstrauss /…
featureAdd support for configuring dictionary lazy load on a per-dictionary basis. Required for the cloud as auxiliary dictionaries used for metrics collection should be loaded lazily (to avoid the server getting stuck in startup scripts), while customer dictionaries should continue to be loaded eagerly.…
breakingRemove a single-threaded bottleneck in ShuffleSendStep of the distributed query plan: each upstream stream now scatters its rows by destination bucket independently instead of funneling the whole fragment through one ScatterByPartitionTransform. (Alexander Gololobov).
breakingSpeed up serialization and merges of JSON columns whose shared data contains many sparse paths. When flattening shared data into per-path columns, flattenAndBucketSharedDataPaths no longer scans every accumulated path column on every row and no longer inserts a default one cell at a time; the…
securityFix krb5 CVE-2026-40355 & CVE-2026-40356. (Robert Schulze).
+1109 more items in the release notes
See how far your stack has drifted from upstream. Release data from vendors’ own sources · feed under CC BY 4.0 · Code under AGPL-3.0 Settings Feed status