What changed in ClickHouse from 25 to 26
33 releases numbered after v25.8.33.6-lts up to and including v26.8.2.7-lts, stable releases only. v25.8.33.6-lts and v26.8.2.7-lts are the newest stable releases of 25 and 26 we track; this page follows them as new ones ship.
- Spans branches 26.8, 26.7, 26.6, 26.5, 26.4, 26.3 — the list is by date, and a branch's own patches sit between the other's.
173 changes across 33 releases · 14 landed on more than one version
- Support for max_rows_to_group_by in throw mode in the Adaptive Aggregator
- Added setting text_index_version for better forward compatibility.
- Compatibility setting to qualify column names as the old analyzer did with multiple joins
- Inference of omitted Distributed and Buffer structure under the user's context
- Added support for additional storage classes in S3.
- Setting `analyzer_compatibility_apply_final_to_all_joined_tables` for compatibility control.
- Added `aiEmbed` function.
- Added support for `S3` `external_id` in backup.
- Added setting to use blob endpoint instead of dfs.
- Added `use_fast_decoder` and `dictionary_as_low_cardinality` to ORC schema cache key.
- Hide legacy storage_* credential settings of DataLakeCatalog.
- Clamp a SETTINGS clause nested in a subquery, a CTE, or a view to the settings constraints.
- formatDateTime now caches resolved time zones locally.
- GROUP BY without aggregate functions to inline per-row emplace for improved performance
- SETTINGS clause nested in a subquery, a CTE, or a view are now clamped to settings constraints
- Improved Dashboard Webpage and enhanced AI functions to use per-query quotas instead of per-block quotas.
- Test adapted to use JOIN ... USING instead of NATURAL JOIN for 26.3.
- Objects' paths are now included in deduplication hashing.
- Dashboard webpage improved.
- Bumped simdjson from v4.2.4 to v4.6.5, google-protobuf to v35.1, grpc to v1.83.0, arrow to 25.0.0, orc to 2.3.1, xsimd to 14.2.0, and vendored libexpat from 2.8.1 to 2.8.2.
- Pre-warm async insert dedup hashes before partition loop to fix O(P×N) recomputation.
- Marked the ZXC codec as experimental.
- Restored prefetch for small files read from object storage.
- Changed to use try-lock in LRUFileCachePriority::tryIncreasePriority.
- Split remote database and data lake visibility settings.
- Enforce access control for MySQL COM_FIELD_LIST and COM_INIT_DB.
- Fixed parallel_view_processing setting being ignored for materialized view fan-out.
- Fixed crash in predicate pushdown with a UNION subquery in a JOIN ON clause.
- Fixed wrong results from sumKahanIf and sumKahan over Nullable types when the aggregated batch does not start at row 0.
- Fixed memory leaks of abandoned nested states in the -ForEach and -Map aggregate combinators.
- Fixed validation of JSON/Object shared-data bucket count read from a stream.
- Fixed validation of skip_degree when reading a uniq aggregate state.
- Fixed overflow check when allocating a block of aggregate function states.
- Crashes of the Parquet, ORC and Iceberg readers on malformed input.
- Wrong window function results for float PARTITION BY keys with several threads.
- Crash of a window function over a Tuple with a sparse element.
- ZooKeeper finalization to complete before logging exceptions.
- allow_feature_tier for MergeTree settings.
- fs cache download wait timeout.
- Fix removePartAndCoveredParts outcome for existing part removal.
- bloom_filter index skipping granules for IN with an empty array in the set
- Iceberg reads when the metadata file is deeper than the queried table path
- formatDateTime time zone resolution performance through local caching
- Fixed std::out_of_range when a space-filling curve is not a key column, out-of-bounds read in formatRowNoNewline with empty rows, and out-of-bounds issues in text index posting list deserialization.
- Fixed read_rows/read_bytes/written_rows/written_bytes statistics in system.query_thread_log.
- Fixed KeeperMap metadata compatibility with redundant parentheses and canonicalize KeeperMap primary key metadata writes.
- Fixed unkillable hang when dropping a low-sorting-name TimeSeries table and segfault in expandOrderByAll for a Merge child query.
- Fixed crashes in Parquet, ORC, and Iceberg readers on malformed input and segfault in showCertificate when TLS certificates are provisioned by ACME.
- Fixed window function issues including wrong results for float PARTITION BY keys with several threads and crashes over Tuple with sparse elements.
- Use-after-free on a sparse join key in a direct dictionary joinalso inv26.3.22.7-lts‡
- Serialization of Map-valued settings in access entitiesalso inv26.7.5.10-stable‡
- Distributed index analysis with projections producing wrong resultsalso inv26.3.20.7-lts‡
- Out-of-bounds write in text index front-coding deserializationalso inv26.3.22.7-lts‡
- CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE losing the source subscription
- Trivial count optimization incorrectly applied when the aggregate argument contains arrayJoinalso inv26.7.5.10-stable‡
- Out-of-bounds read in formatRowNoNewline with empty rowsalso inv26.3.22.7-lts‡
- Out-of-bounds memory exposure in query results
- Various parsing and schema reader recursion depth limits and PostgreSQL startup message size bounds
- Multiple query execution and data handling issues including KeeperMap metadata compatibility, row policies bypassing, LowCardinality search, aggregate function deserialization, Variant discriminator validation, ZooKeeper multi requests, and distributed query planning
- Segfault in expandOrderByAll for a Merge child query.
- Memory allocation from sizes declared by peers in the Native protocol.
- Bounded recursion in several parsers and schema readers to prevent stack overflow.
- Hidden aws_external_id in DataLakeCatalog SHOW CREATE DATABASE output.
- Fixed a segfault in showCertificate when TLS certificates are provisioned by ACME.
- Bounded the size of the PostgreSQL startup message.
- Bounded text index posting list deserialization.
- Fixed propagation of settings in accurateCastOrDefault.
- Fixed finding a LowCardinality needle equal to the type's default value.
- Fixed uninitialized memory exposure in query results.
- Fixed an unkillable hang when dropping a low-sorting-name TimeSeries table.
- Fixed SET <name> = DEFAULT to respect settings constraints.
- Added validation of aggregate function states on deserialization.
- Row policies are now correctly applied in the mergeTreeIndex table function.
- Fixed nullptr dereference in CREATE TABLE TO INNER UUID without ENGINE.
- Fixed serialization of Map-valued settings in access entities.
- Fixed CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE losing the source subscription.
- Fixed trivial count optimization being applied when the aggregate argument contains arrayJoin.
- Fixed stripping of injective functions that hide argument nullability inside uniq.
- Text index out-of-bounds write in front-coding deserialization.
- Data race when tracing profile events.
- Serialization of Nullable(Tuple) as a single CSV field.
- Prepared sets registration before expanding ALIAS columns of Merge child tables.
- Stripping of injective functions that hide argument nullability inside uniq.
- Propagation of settings in accurateCastOrDefault.
- LowCardinality needle lookup equal to the type's default value.
- Hang when dropping a Refreshable Materialized View during refresh planning.
- Hive partitioning sample path resolution to be lazy.
- Parent table row policy enforcement in mergeTreeProjection table function.
- singleValueOrNull null-state merge.
- Fixed `type_json_allow_duplicated_key_with_literal_and_nested_object` not working with typed paths in JSON.
- Fixed data race on `MemoryReservation` release at query finish.
- Fixed JOIN USING identifier resolution from aliases nested in the SELECT list.
- Fixed data race on FileCacheQueryLimit::query_map causing LOGICAL_ERROR.
- Fixed use-after-free in async insert queue due to deadline collision.
- Fixed `Field::operator<=` comparing a `Float64` with itself.
- Fixed block structure check for aggregate-state columns nested in containers and out-of-bounds read in SerializationReplicated on the native protocol.
- Fixed bad cast in KeyCondition for nested CAST that re-introduces LowCardinality.
- Fixed wrong value for a virtual column on the right side of direct JOIN and virtual row not being applied in some cases.
- Fixed multiple issues including out-of-bounds read in Parquet reader, Kafka table attachment, JSON subcolumn skip-index matching, Paimon table reading with nullable ARRAY or MAP columns, and `ORDER BY ... LIMIT` returning too few rows under a row policy.
- Segfault in StreamingStorageRegistry, largestTriangleThreeBuckets aggregate function, and due to bad shutdown ordering on startup exception.
- RESTORE failing with SYNTAX_ERROR on backups that include MASKING POLICY dependents.
- Virtual row with union produces wrong result and virtual row not being applied in some cases.
- IS NULL after metadata-only T to Nullable(T) ALTER with optimize_functions_to_subcolumns.
- type_json_allow_duplicated_key_with_literal_and_nested_object not working with typed paths in JSON.also inv26.3.18.32-lts‡
- JOIN USING identifier resolution from aliases nested in the SELECT list.also inv26.7.3.19-stable‡
- Invalid number of rows in Chunk in JoiningTransform with additional join filter.
- Misreporting of datalake catalog errors as missing tables and out-of-bounds write reading a Parquet DECIMAL wider than declared.
- Deduplication token attribution for materialized-view targets of partitioned tables, use-after-free in async insert queue due to deadline collision, and Field::operator<= comparing a Float64 with itself.
- Out-of-bounds read in SerializationReplicated on the native protocol, wrong value for a virtual column on the right side of direct JOIN, and quadratic JSON subcolumn skip-index matching over a large dotted constant.
- Bad cast in KeyCondition for nested CAST that re-introduces LowCardinality
- Map bucket_indexes stream going out of sync when rows are skipped
- made_current_at showing 1970-01-01 in system.iceberg_history after expire_snapshots
- made_current_at for repeated snapshot-id in system.iceberg_history
- Wrong value for virtual column on the right side of direct JOIN
- Out-of-bounds read in SerializationReplicated on the native protocolalso inv26.3.18.32-lts‡
- Iceberg OPTIMIZE rejecting multi-row position delete snapshots
- Multiple issues including use-after-free in sparse join keys, wrong hash join results on LowCardinality wide-integer keys, quadratic JSON subcolumn skip-index matching, incorrect ORDER BY LIMIT results under row policy, and wrong results of trivial GROUP BY LIMIT optimization
- Fsync restored part files on RESTORE to survive power loss.
- Segfault in StreamingStorageRegistry.
- Segfault due to bad shutdown ordering on startup exception.also inv26.6.2.158-stable‡
- Startup and ATTACH of a view with a recursive CTE with the old analyzer.also inv26.7.3.19-stable‡
- Use-after-free in async insert queue due to deadline collision.also inv26.7.3.19-stable‡
- Dynamic cache resize race condition.
- ATTACH of Kafka tables with a large kafka_num_consumers.
- LOGICAL_ERROR crash in IcebergMetadata::iterate when datalake_table_state is missing.
- ORDER BY ... LIMIT returning too few rows under a row policy.
- Misreporting of datalake catalog errors as missing tables.
- Paimon DLF request signing exposed by error propagation.
- Out-of-bounds write reading a Parquet DECIMAL wider than declared.
- Deduplication token attribution for materialized-view targets of partitioned tables.
- Crash in direct JOIN over MergeTree with PREWHERE caused by shared PrewhereInfo corrupted by column pruning.
- Field::operator<= comparing a Float64 with itself.
- Block structure check for aggregate-state columns nested in containers.
- Fixed dangling pointer in HashJoin::shrinkStoredBlocksToFit, out-of-bounds segfault in groupArrayLastMerge, segfault in largestTriangleThreeBuckets aggregate function, bug in levenshteinDistanceWeighted function, and rollup with materialized and virtual columns.
- Fixed infinite rollup.
- Fixed text-index direct-read double-registration over Merge/Distributed.
- Fixed LOGICAL_ERROR on DROP COLUMN with ALIAS column using IN and UNKNOWN_IDENTIFIER on ALTER TABLE DROP COLUMN with aliased default expression.
- Fixed async-insert deduplication token bleed across partitions.
- Fixed segfault and silent data corruption when appending a non-appendable format to a file, out-of-bounds crash in ObjectStorageQueueSource::FileIterator::next, reading from an encrypted disk with O_DIRECT, data loss when a merge races ALTER RENAME COLUMN, and out-of-bounds write reading a Parquet DECIMAL wider than declared.
- Virtual row with union produces wrong result.
- Rollup with materialized and virtual columns.
- Block structure mismatch in UnionStep/IntersectOrExceptStep when a branch constant-folds.
- Infinite rollup.
- Text-index direct-read double-registration over Merge/Distributed.
- Use-after-free when using Iceberg tables in combination with temporary tables.also inv26.5.6.113-stable‡
- Text index on mapValues/mapKeys not used through a Distributed engine table.
- Hive partition validation when compatibility is 26.6.
- Bad cast for a qualified asterisk over a JOIN USING key nested under a PASTE/CROSS join, LOGICAL_ERROR on DROP COLUMN with ALIAS column using IN, AMBIGUOUS_COLUMN_NAME when a JOIN ON condition is repeated in WHERE, NOT_FOUND_COLUMN_IN_BLOCK on FINAL when the sort key filter is moved to PREWHERE, TYPE_MISMATCH in direct dictionary join with a Nullable or LowCardinality key, and data loss when a merge races ALTER RENAME COLUMN.
- Async-insert deduplication token bleed across partitions, crash in ProtobufRowInputFormat when a valid row precedes a bad row, mutations with query parameters in IN PARTITION, peer certificate leak in Poco SecureSocketImpl::verifyPeerCertificateImpl, CREATE OR REPLACE of a dictionary with an object of another kind, missing variant_discr stream for Dynamic columns after mutation, OOB when deserializing bad aggregate function states, IS NULL after metadata-only T to Nullable(T) ALTER with optimize_functions_to_subcolumns, reading Parquet Tuple column as Nullable(Tuple), Paimon background refresh crash on concurrent LATEST hint rewrite, overflow while parsing in system.zookeeper_info, and Invalid number of rows in Chunk in JoiningTransform with additional join filter.
- Memory usage growth in filesystem cache and per-segment and per-key memory usage.
- Bug with `data_kind = Preprocessed` failing the whole async batch.
- Text index incorrectly used for has/mapContainsKey/mapContainsValue with an empty needle.also inv26.7.2.59-stable‡
- Multiple issues in Iceberg table handling including primitive type string comparison with whitespace and format version upgrade exceptions.
- Column not found errors for lazy materialization, FINAL with filter and LIMIT, and ALTER TABLE DROP COLUMN with aliased default expressions.
- CREATE OR REPLACE of a dictionary with an object of another kind and mutations with query parameters in IN PARTITION.
- Data loss when a merge races ALTER RENAME COLUMN and various other data integrity issues including OOB deserialization and overflow in zookeeper_info parsing.
- Performance regression in async insert deduplication by pre-warming hashes before partition loop.
- CREATE OR REPLACE of a dictionary with an object of another kind.
- StorageJoin handling in ANY-to-SEMI/ANTI join conversion.
- Manifest compaction partition size.
- Missing Content-Length header for Azure requests in the Poco HTTP transport.
- Iceberg primitive type string comparison to ignore whitespace.
- Multiple issues including column not found error with lazy materialization, primary key index analysis for reverse sorting, mutations with query parameters, peer certificate leak, macOS crash on fiber stacks, and direct dictionary join type mismatches.
- Fixed Block structure mismatch in UnionStep on a Sparse-vs-full divergent branch, crash on deeply nested expressions with raised max_parser_depth, logical error casting Dynamic/Variant inside Tuple with accurateCastOrNull, runtime join filter producing wrong results for JSON columns, uniqExact concurrent-merge crash with GROUPING SETS/ROLLUP/CUBE, race between ALTER RENAME COLUMN and merge causing data loss, skip+unused_shards through Merge over Distributed in the analyzer, server crash on deduplicated async insert with optimize_on_insert, out-of-bounds segfault in groupArrayLastMerge, projection incorrectly reading a newly-added column as the type default instead of its DEFAULT value, heap-buffer-overflow when serializing a shared quantileTDigest state, query condition cache poisoning by on-fly mutations, and crash moving an empty part to a plain_rewritable disk.
- Fixed reading Iceberg tables sorted on special-char column names.
- Fixed uninitialized memory exposure in query results, validated aggregate function states on deserialization, and validated Variant discriminator in ColumnVariant arena deserialization.
- Fixed row policy bypass in the mergeTreeIndex table function and enforced grant checks for ATTACH with URL engine definitions.
- Validated Iceberg metadata file path for null bytes.
- Bump libssh to 0.12.0.
- Added path validation in delta lake.
- Masked session_token and Google ADC secrets in the explicit-url S3 form.
- Peer certificate leak in Poco `SecureSocketImpl::verifyPeerCertificateImpl` and masked session_token and Google ADC secrets in explicit-url S3 forms.
- Fixed krb5 CVE-2026-40355 and CVE-2026-40356.
Summarized from commit messages — the vendor published no release notes for that version.
8 releases in the range carry no categorized changes yet: v26.8.1.2041-ltsv26.3.25.2-ltsv26.6.2.160-stablev26.7.1.1315-stablev26.4.5.143-stablev26.6.2.81-stablev26.3.17.56-ltsv26.5.5.8-stable. Their original notes, where the vendor published any, are below.
Original release notes, newest first
The list above is our reading of these notes; the originals from ClickHouse are here, one fold per release.
v26.3.30.9-ltsRelease v26.3.30.9-ltsFrom commit messages
The vendor published no notes for this release.
v26.3.29.7-ltsRelease v26.3.29.7-ltsFrom commit messages
The vendor published no notes for this release.
v26.3.28.5-ltsRelease v26.3.28.5-ltsFrom commit messages
The vendor published no notes for this release.
v26.8.2.7-ltsRelease v26.8.2.7-ltsFrom commit messages
The vendor published no notes for this release.
v26.7.6.57-stableRelease v26.7.6.57-stableFrom commit messages
The vendor published no notes for this release.
v26.6.4.55-stableRelease v26.6.4.55-stableFrom commit messages
The vendor published no notes for this release.
v26.3.27.3-ltsRelease v26.3.27.3-ltsFrom commit messages
The vendor published no notes for this release.
v26.8.1.2041-ltsRelease v26.8.1.2041-lts
The vendor published no notes for this release.
v26.3.26.3-ltsRelease v26.3.26.3-ltsFrom commit messages
The vendor published no notes for this release.
v26.3.25.2-ltsRelease v26.3.25.2-lts
The vendor published no notes for this release.
v26.3.24.4-ltsRelease v26.3.24.4-ltsFrom commit messages
The vendor published no notes for this release.
v26.3.23.7-ltsRelease v26.3.23.7-ltsFrom commit messages
The vendor published no notes for this release.
v26.3.22.7-ltsRelease v26.3.22.7-ltsFrom commit messages
The vendor published no notes for this release.
v26.3.21.7-ltsRelease v26.3.21.7-ltsFrom commit messages
The vendor published no notes for this release.
v26.7.5.10-stableRelease v26.7.5.10-stableFrom commit messages
The vendor published no notes for this release.
v26.3.20.7-ltsRelease v26.3.20.7-ltsFrom commit messages
The vendor published no notes for this release.
v26.6.3.62-stableRelease v26.6.3.62-stableFrom commit messages
The vendor published no notes for this release.
v26.5.7.64-stableRelease v26.5.7.64-stableFrom commit messages
The vendor published no notes for this release.
v26.7.4.58-stableRelease v26.7.4.58-stableFrom commit messages
The vendor published no notes for this release.
v26.3.19.3-ltsRelease v26.3.19.3-ltsFrom commit messages
The vendor published no notes for this release.
v26.3.18.32-ltsRelease v26.3.18.32-ltsFrom commit messages
The vendor published no notes for this release.
v26.7.3.19-stableRelease v26.7.3.19-stableFrom commit messages
The vendor published no notes for this release.
v26.6.2.160-stableRelease v26.6.2.160-stable
The vendor published no notes for this release.
v26.3.17.110-ltsRelease v26.3.17.110-ltsFrom commit messages
The vendor published no notes for this release.
v26.6.2.158-stableRelease v26.6.2.158-stableFrom commit messages
The vendor published no notes for this release.
v26.5.6.113-stableRelease v26.5.6.113-stableFrom commit messages
The vendor published no notes for this release.
v26.7.2.59-stableRelease v26.7.2.59-stableFrom commit messages
The vendor published no notes for this release.
v26.5.6.64-stableRelease v26.5.6.64-stableFrom commit messages
The vendor published no notes for this release.
v26.7.1.1315-stableRelease v26.7.1.1315-stable
The vendor published no notes for this release.
v26.4.5.143-stableRelease v26.4.5.143-stable
The vendor published no notes for this release.
v26.6.2.81-stableRelease v26.6.2.81-stable
The vendor published no notes for this release.
v26.3.17.56-ltsRelease v26.3.17.56-lts
The vendor published no notes for this release.
v26.5.5.8-stableRelease v26.5.5.8-stable
The vendor published no notes for this release.