Altinity Stable® Build for ClickHouse® 25.8

Here are the detailed release notes for version 25.8.

Release history

Version 25.8.16.10001 is the latest release. We recommend that you use this version. But read the detailed release notes and upgrade instructions for version 25.8 first. Once you’ve done that, review the details for each release for known issues and changes between the Altinity Stable Build and the upstream release.

Version Release date Details Docker images
25.8.16.10001 2026-02-18 CI report
Release page
Install guide
AMD64 and Aarch64

Builds are available for both AMD64 and Aarch64 from builds.altinity.cloud as either .deb, .rpm, or .tgz.

Finally, check the Altinity ClickHouse® Upgrade E-book, which provides guidelines for upgrading ClickHouse databases.

Major new features in 25.8 since the previous Altinity Stable release 25.3

Require attention

  • Enable the MergeTree setting write_marks_for_substreams_in_compact_parts by default. This significantly improves performance of reading subcolumns from newly created Compact parts. Servers with versions earlier than 25.5 will not be able to read these new Compact parts. #84171. Disable this setting if you need to preserve downgrade compatibility.

    • NOTE: This change has been reverted in Altinity Stable 25.8.16 via #1407. Altinity Stable 25.8.16 disables this setting by default.
  • metric_log now has more than 1.5K columns, which often causes high memory usage during merges (also check old tables such as metric_log_X).

  • Enable sending crash reports by default. This can be turned off in the server configuration file. #79838

  • Enable compile_expressions (JIT compiler for fragments of ordinary expressions) by default. This closes #51264, #56386, and #66486. #79907

  • Enable the query condition cache by default. #79080.

  • All allocations made by external libraries are now visible to ClickHouse’s memory tracker and properly accounted for. This may result in “increased” reported memory usage for certain queries or failures with MEMORY_LIMIT_EXCEEDED. #84082.

  • Reduce logging verbosity: some log levels were downgraded. #79322

  • Distributed INSERT SELECT is now enabled by default.

  • Add the condition field to the system table system.query_condition_cache. It stores the plaintext condition whose hash is used as the key in the query condition cache. #78671.

  • The toTime function now returns the new Time data type. The setting use_legacy_to_time can be enabled to preserve the old behavior for now.

  • ClickHouse, Inc. is gradually phasing out zero_copy due to architectural limitations in its implementation. They have a better-designed internal alternative (SharedMergeTree), but it is not available in the open-source version.

    At the moment, this mostly translates into removing unstable tests related to the feature from the codebase, as well as deprecating some less commonly used parts:

    • Remove tests for zero-copy replication. #82250.
    • Remove experimental send_metadata logic related to experimental zero-copy replication. It was never actually used and nobody maintains this code. Since there were no tests for it, there is a high chance it has been broken for a long time. #82508.

Click any tab in the tab bar above for more information.

Backward Incompatible Changes

  • Function geoToH3() now accepts arguments in the order (lat, lon, res). To keep the legacy order (lon, lat, res), enable geotoh3_lon_lat_input_order = true. #78852.

  • Removed server setting format_alter_commands_with_parentheses. Note: ALTER commands may not work correctly in mixed-version replication setups (25.4+ with replicas older than 24.2) until all replicas are upgraded. #79970.

  • Default expressions now require backticks around identifiers containing dots. #83162.

  • Heredoc (dollar-quoted) tags are now restricted to word characters only to avoid parsing ambiguity. #84846.

  • Table engine setting allow_dynamic_metadata_for_data_lakes is now enabled by default. #85044.

  • Parquet output now writes Enum values as BYTE_ARRAY with ENUM logical type by default. #84169.

  • JSON formats no longer quote 64-bit integers by default. #74079.

  • DeltaLake storage now uses the delta-kernel-rs implementation by default. #79541.

  • Removed legacy index types annoy and usearch. If present, they must be dropped. #79802.

  • Experimental index full_text was renamed to gin, then to text. #79024 #80855.

  • Materialized views are now validated against the target table when allow_materialized_view_with_bad_select is disabled. #74481.

  • SummingMergeTree validation now skips aggregation for columns used in partition or sort keys. #78022.

  • Fixed dateTrunc behavior with negative date/datetime values. #77622.

  • Removed legacy MongoDB integration. Setting use_legacy_mongodb_integration is now obsolete. #77895.

  • Added filesystem cache setting allow_dynamic_cache_resize (default false). Older versions allowed dynamic resizing without an explicit setting. #79148.

  • URL reads now apply enable_url_encoding consistently across redirect chains. Default value of enable_url_encoding is now false. #79563 #80088.

  • Server settings backup_threads and restore_threads are now enforced to be non-zero. #80224.

  • bitNot() for String now returns a zero-terminated string. #80791.

  • extractKeyValuePairs now supports a 5th argument: unexpected_quoting_character_strategy.

  • countMatches now continues counting after empty matches. To keep legacy behavior, enable count_matches_stop_at_empty_match. #81676.

  • BACKUP queries, merges, and mutations now use both server-wide throttlers and dedicated throttlers simultaneously. #81753.

  • Creating tables without insertable columns is now forbidden. #81835.

  • Cluster functions with archives can now process archives on multiple nodes using cluster_function_process_archive_on_multiple_nodes (default true). Set it to false for compatibility when upgrading to 25.7+ from earlier versions. #82355.

  • SYSTEM RESTART REPLICAS now only affects databases where the user has SHOW TABLES permission. #83321.

  • JSON input now infers Array(Dynamic) instead of unnamed Tuple for mixed-type arrays. To keep legacy behavior, disable input_format_json_infer_array_of_dynamic_from_array_of_different_types. #80859.

  • S3 latency metrics were moved to histograms. #82305.

  • Lazy materialization is now enabled only when the analyzer is enabled. #83791.

  • Default concurrent_threads_scheduler changed from round_robin to fair_round_robin. #84747.

Click any tab in the tab bar above for more information.

SQL / Main features

  • (Beta) Lightweight updates for MergeTree-family tables via patch parts, using UPDATE ... SET ... WHERE .... Lightweight deletes are implemented via lightweight updates and can be enabled with lightweight_delete_mode = 'lightweight_update' (requires enable_block_number_column, enable_block_offset_column, allow_experimental_lightweight_update). #82004 #85952

    • Added table setting max_uncompressed_bytes_in_patches to limit total uncompressed patch-part size and avoid SELECT slowdowns / misuse. #85641
  • On-the-fly lightweight deletes are supported with lightweight_deletes_sync = 0 and apply_mutations_on_fly = 1. #79281

  • (Beta) Correlated subqueries (EXISTS, IN, scalar) are enabled by default. #85107

  • Approximate vector search with vector similarity indexes is now GA (see also vector_search_filter_strategy). #85888

  • CPU & resource management: workload scheduler (CREATE WORKLOAD, CREATE RESOURCE) is available (see https://clickhouse.com/docs/operations/workload-scheduling).

  • Added new data types Time and Time64 ([H]HH:MM:SS[.fractional]) with casts and related functions; compatibility settings for legacy toTime. #81217

  • Added CoalescingMergeTree engine. #79344

  • Data Lakes & catalogs are promoted to Beta (see below).

  • FINAL query improvements:

    • Fixed cases where FINAL could be lost for Distributed tables. #78428
    • Settings use_skip_indexes_if_final and use_skip_indexes_if_final_exact_mode now default to true, enabling skip indexes for FINAL queries (set use_skip_indexes_if_final_exact_mode = false to keep legacy approximate behavior). #81331
  • Added NumericIndexedVector (bit-sliced + Roaring-compressed numeric vectors) and 20+ related functions (groupNumericIndexedVectorState, numericIndexedVector*) for building/analysis/arithmetic. Improves joins, filters, and aggregations on sparse data and can significantly reduce storage. #74193

  • Major areas with active development and notable improvements:

    • JSON data type
    • Database=Replicated
    • Parallel replicas
    • S3Queue
    • Keeper
    • Parquet format

Click any tab in the tab bar above for more information.

Functions

  • SimpleAggregateFunction now supports anyLastRespectNulls and anyRespectNulls. #80219

  • Added functions divideOrNull, moduloOrNull, intDivOrNull, positiveModuloOrNull to return NULL when the right argument is zero. #78276.

  • Users can now do case-insensitive JSON key lookups using JSONExtractCaseInsensitive (and other variants of JSONExtract). #83770.

  • Text index improvements:

    • Explicit parameters are now supported via key-value pairs (tokenizer required; optional max_rows_per_postings_list, ngram_size). #80262
    • Text index supports string tokenizer. #81752
    • tokens() supports string tokenizer. #80195
    • hasAll() can use tokenbf_v1 / ngrambf_v1 full-text skipping indices. #77662
    • Added mapContainsKey, mapContainsValue, mapContainsValueLike, mapExtractValueLike functions and bloomfilter-index support for filtering map values. #78171 (UnamedRus).
  • Added experimental functions searchAny and searchAll which are general purpose tools to search text indexes. #80641.

  • Added setting cast_string_to_date_time_mode to control DateTime parsing mode when casting from String. #80210

  • Added dateTimeToUUIDv7(DateTime) conversion function. #84319

  • Added UInt128 ↔ IPv6 conversion support, enabling arithmetic/bitwise operations (e.g. bitAnd) with conversion back to IPv6. #76928

  • Array functions: arrayLevenshteinDistance, arrayLevenshteinDistanceWeighted, arraySimilarity.

  • String functions: stringBytesUniq, stringBytesEntropy; SparseGrams, SparseGramsUTF8, SparseGramsHashes (n-grams extraction with additional longer/unique chunks).

  • DateTime functions:

    • Added toInterval(value, unit) conversion function. #78723
    • Added nowInBlock64(scale) function. #84178
  • Base32 / Bech32:

    • Added base32Encode, base32Decode.
    • Added bech32Encode, bech32Decode. #80239
  • Geo functions:

    • Added MultiPolygon support for pointInPolygon. #79773
    • Added WKB parsing functions (e.g. readWKBPolygon, etc.). #80139
    • Added WKB encoding via wkb(...).
    • Added polygonsIntersectCartesian and polygonsIntersectSpherical.
  • Color space conversion functions: colorOKLCHToSRGB, colorSRGBToOKLCH. #83679

  • Time series / PromQL helpers:

    • Added timeSeriesDerivToGrid and timeSeriesPredictLinearToGrid aggregate functions. #84328
    • Added timeSeries* helper functions for resampling to a time grid and computing PromQL-like delta, rate, idelta, irate. #80590
    • Added helper functions: timeSeriesInstantDeltaToGrid, timeSeriesInstantRateToGrid, timeSeriesRateToGrid, timeSeriesResampleToGridWithStaleness, timeSeriesDeltaToGrid, timeSeriesLastTwoSamples.
  • Added financial functions: financialInternalRateOfReturnExtended (XIRR), financialInternalRateOfReturn (IRR), financialNetPresentValueExtended (XNPV), financialNetPresentValue (NPV). #81599

  • SQL compatibility: added lag and lead window functions. #82108

  • Introspection:

    • added getServerSetting() and getMergeTreeSetting() functions. #78439
    • functions to unpack and compare MergeTree parts (mergeTreePartInfo, isPartCoveredBy). #80573.

Click any tab in the tab bar above for more information.

MergeTree-related

  • Allow filtering query-selected parts by the disk they reside on. #80650

  • filterPartsByQueryConditionCache now respects merge_tree_min_{rows,bytes}_for_seek to align with other index-based filtering methods. #80312

  • Secondary index performance improvements:

    • Speed up secondary indexes by evaluating expressions on multiple granules at once. #64109
    • Process indexes in increasing order of size (prioritizing minmax and vector indexes, then smaller indexes). #84094
    • Process higher-granularity min-max indexes first. #83798
  • Added MergeTree virtual columns:

    • _part_granule_offset: zero-based granule/mark index of each row within its part. #82341
    • _part_starting_offset: cumulative row count of all preceding parts, computed at query time and preserved through execution (even after pruning). #79417
  • Projections: allow using _part_offset in normal projections (first step towards projection indexes). #78429

  • Added setting max_merge_delayed_streams_for_parallel_write to control how many columns merges can flush in parallel (analogous to max_insert_delayed_streams_for_parallel_write). Helps reduce memory usage for vertical merges (notably for wide tables such as system.metric_log dumped to S3).

Click any tab in the tab bar above for more information.

Performance

  • Added query plan optimization for lazy column materialization (read columns only after ORDER BY/LIMIT), controlled by query_plan_optimize_lazy_materialization. #55518

  • Filtering by multiple projections.

  • JOIN optimizations:

    • Merge equality conditions from filter step into JOIN condition to use them as hash keys. #78877
    • Added parallel_hash_join_threshold to fall back to hash algorithm when the right table is small. #76185
    • Added min_joined_block_size_rows (default 65409) to squash small JOIN blocks (when supported by algorithm). #81886
    • Added query-plan optimizations: merge WHERE into ON when possible (query_plan_merge_filter_into_join_condition), and shard joins by PK ranges for similarly ordered large tables (query_plan_join_shard_by_pk_ranges=1).
    • Low-level hash JOIN optimizations.
  • User-defined functions: UDFs can be marked as deterministic in XML; query cache now checks UDF determinism and caches results when applicable. #77769

  • Bloom filter index optimizations.

  • Distributed query optimizations:

    • Added enable_parallel_blocks_marshalling to offload (de)compression and (de)serialization of network blocks into pipeline threads, improving performance of large distributed queries. #78694
    • Added enable_producing_buckets_out_of_order_in_aggregation (enabled by default) to send aggregation buckets out-of-order during memory-efficient aggregation, improving performance when some buckets merge slower (may slightly increase memory usage). #80179
  • Compressed logs and profile events in the native protocol to reduce bandwidth usage and improve responsiveness on large clusters. #82535

  • Avoid substituting table functions with *-cluster variants when a query contains JOINs or subqueries. #84335

  • Improved cache locality using rendezvous hashing. #82511

  • Fixed incorrect use of distributed_depth for cluster-function detection (could lead to data duplication); use client_info.collaborate_with_initiator instead. #85734

Click any tab in the tab bar above for more information.

Codecs / compression

  • Added default_compression_codec for MergeTree tables, used when column codecs are not explicitly specified in CREATE TABLE. #66394

  • DoubleDelta codec can now be applied only to numeric columns (no longer allowed for FixedString). #84383

  • Changed default index granularity for text indexes to 64. #82162

Click any tab in the tab bar above for more information.

Other small SQL things

  • Added TRUNCATE ALL TABLES FROM db LIKE '%pattern%'.

  • DESCRIBE SELECT ... is now supported in addition to DESCRIBE (SELECT ...). #82947

  • Added support for using external disks for temporary data.

  • Fixed snapshots for all tables via enable_shared_storage_snapshot_in_query.

  • Virtual column _table is now available everywhere.

Click any tab in the tab bar above for more information.

JSON data type

  • JSON data type is production-ready (see https://jsonbench.com/). Dynamic and Variant data types are also production-ready. #77785

  • Improved performance of reading JSON subcolumns from shared MergeTree data by introducing new shared-data serializations. #83777

  • Compact parts: store marks per substream to allow reading individual subcolumns. The new format is controlled by write_marks_for_substreams_in_compact_parts (old format is still supported for reads). #77940

  • write_marks_for_substreams_in_compact_parts is now enabled by default, significantly improving subcolumn reads from newly created Compact parts. Note: servers older than 25.5 cannot read these new Compact parts (disable the setting to preserve downgrade compatibility). #84171

  • Added MergeTree setting merge_max_dynamic_subcolumns_in_wide_part to limit the number of dynamic subcolumns in Wide parts after merges. #87646

  • Marked settings allow_experimental_variant/dynamic/json and enable_variant/dynamic/json as obsolete; Variant, Dynamic, and JSON are now enabled unconditionally. #85934

  • MergeTree shared-data serialization is controlled by object_shared_data_serialization_version and object_shared_data_serialization_version_for_zero_level_parts. Default will remain map for the next few releases, then switch to advanced (zero-level parts: map or map_with_buckets). Note: changing shared-data serialization is supported only for object_serialization_version = v3 (currently default is v2, planned to switch to v3 in future releases).

  • Fixed potential thread pool starvation when reading JSON column samples with many subcolumns by respecting merge_tree_use_prefixes_deserialization_thread_pool. #91208

Click any tab in the tab bar above for more information.

ObjectStore - S3/Azure/GCS

  • Added support for custom IAM roles via S3 extra_credentials(role_arn = ...). #84011

  • Added setting s3_slow_all_threads_after_network_error. #80035

  • Azure config: add missing partition_columns_in_data_file. #85373

  • Azure Blob Storage: replace Curl HTTP client with Poco client (enabled by default). Added multiple Azure client settings mirroring S3, introduced aggressive connect timeouts for both Azure and S3, improved Azure profile events/metrics introspection, and significantly improved cold-query latencies. Revert to Curl via azure_sdk_use_native_client=false. #83294

  • S3Queue/AzureQueue: improved resilience to ZooKeeper connection loss without potential duplicates. Requires enabling use_persistent_processing_nodes (modifiable via ALTER TABLE MODIFY SETTING). #85995

  • azureBlobStorage table engine: cache and reuse managed identity auth tokens to reduce throttling. #79860

  • Permissions: azureBlobStorage, deltaLakeAzure, and icebergAzure now properly validate AZURE permissions; all *-Cluster variants validate permissions via their non-clustered counterparts; icebergLocal and deltaLakeLocal now require FILE permissions. #84938

  • Azure Blob Storage: added extra_credentials authentication with client_id and tenant_id. #84235

  • Object storage auth: added AWS S3 authentication with explicitly provided IAM role; added OAuth for GCS; synchronized object storage connection parameter serialization interfaces (previously Cloud-only, now open-sourced). #84011

  • gcs function now requires GRANT READ ON S3 permission. #83503

  • Object removals: collect all removed objects and execute a single object storage remove operation. #85316

Click any tab in the tab bar above for more information.

Datalakes & catalogs

  • Data Lake Catalogs (Unity, REST, Glue, Hive Metastore) are promoted from Experimental to Beta. #85848
  • Added _data_lake_snapshot_version to Data Lake table engines. #84659
  • Implemented file pruning in Data Lake engines by virtual columns. #84520
  • Added show_data_lake_catalogs_in_system_tables to control exposing Data Lake tables in system.tables. #85411

Iceberg

  • Writes & catalogs: CREATE TABLE can create a new Iceberg table; INSERT into Iceberg is supported (controlled by allow_experimental_insert_into_iceberg), incl. compatibility for PyIceberg; REST and Glue catalogs are supported for writes; DROP TABLE removes from REST/Glue catalogs and deletes metadata. #83983 #82692 #84466 #84684 #84136 #85395

  • Partitioning & pruning: Hive-style partitioned writes; partition columns are no longer virtual; bucket partitioning helpers icebergHash / icebergBucketTransform; partition pruning is enabled by default. #76802 #79262

  • Time travel & metadata resolution: time travel via iceberg_timestamp_ms / iceberg_snapshot_id; snapshot version is not cached between SELECTs anymore (fixes time-travel issues); REST catalog metadata resolution fixes; version-hint.text support (read via iceberg_enable_version_hint, write support added). system.iceberg_history (availability/behavior to verify). #85038 #85531 #78594 #85130

  • Metadata caching/observability & scaling: Iceberg metadata files cache via use_iceberg_metadata_files_cache; async iteration of Iceberg objects without materializing per-file object lists; system.iceberg_metadata_log records metadata files used during SELECT. #85369 #86152

  • Schema evolution & column IDs: schema evolution support incl. complex types (plus add/drop/modify for simple types); read data files by field/column IDs to support renamed columns. #85769 #83653

  • Statistics & optimizations: write more Iceberg stats (column sizes, lower/upper bounds) for pruning; pruning by bounds; faster count() without filters. #85746 #78242 #78090

  • Deletes & maintenance: equality deletes and position deletes; ALTER DELETE for merge-on-read; reduced RAM usage for large position-delete files (keep only last Parquet row group in RAM); OPTIMIZE TABLE merges position-delete files into data files to reduce Parquet count/size; Spark compatibility fix for position-delete files. #85843 #83094 #80237 #85549 #85329 #85250 #85762

  • Iceberg metadata format & write fixes: compressed metadata.json via iceberg_metadata_compression_method (all ClickHouse compression methods); fixes for complex-type writes; update metadata timestamp in writes. #85196 #85330 #85711

  • Catalog-specific: Glue catalog supports reading after schema evolution and TimestampTZ; Hive Metastore catalog supported for Iceberg. #82301 #83132 #77677

  • Object storage Hive integration fixes (LowCardinality, column fill order, empty format LOGICAL_ERROR, partition-column-only edge cases, schema assertions, partial parallel replicas fix, deterministic containers). #85538

  • Since 25.7, ClickHouse works with Databricks-managed Iceberg tables.

Delta Lake

  • Delta-kernel-based implementation enabled by default; local storage support; deltaLakeLocal table function for filesystem-mounted tables; deltaAzure for Azure; time travel via delta_lake_snapshot_version; experimental writes gate allow_experimental_delta_lake_writes + write support for DeltaLake. #79541 #79416 #79781 #85295 #86180 #85564

MergeTree as a Data Lake

  • Readonly MergeTree tables support refresh for the one-writer / many-readers pattern. #76467

  • Custom disks for databases.

Click any tab in the tab bar above for more information.

Integrations

  • Experimental: Ytsaurus table engine and table function. #77606

  • Arrow Flight: ClickHouse can expose an Arrow Flight RPC endpoint via arrowflight_port and can also query Arrow Flight servers using the arrowflight() table function (SELECT * FROM arrowflight('host:port', 'dataset_name')). #74184

  • Kafka:

    • Added inline SASL credentials support (kafka_sasl_username, kafka_sasl_password).
    • Fixed cases where a materialized view could start too late (after the Kafka table that streams into it). #72123
    • Implemented Keeper-based rebalance logic for StorageKafka2 with permanent/temporary partition locks and dynamic redistribution across replicas. #78726
    • Added a system table to store erroneous incoming messages from Kafka-like engines. #68873
  • PostgreSQL protocol:

    • Added COPY command support. #74344
    • Added SCRAM-SHA256 support and updated Postgres wire authentication.
    • Use FixedString for PostgreSQL CHARACTER, CHAR, and BPCHAR. #77304
  • Force secure connections for mysql_port and postgresql_port. #82962

  • MySQL protocol: implemented information schema tables to support C# MySQL clients. #84397

  • PromQL: added basic PromQL dialect support (dialect='promql') for TimeSeries tables (promql_table_name). Supports rate, delta, increase, and prometheusQuery() wrapper; no operators and no HTTP API yet. #75036

Click any tab in the tab bar above for more information.

S3Queue

  • Added per-table overrides for MV insert settings: min_insert_block_size_rows_for_materialized_views and min_insert_block_size_bytes_for_materialized_views (override profile-level settings). #83971

  • Improved S3Queue/AzureQueue performance by enabling parallel INSERT pipeline via parallel_inserts=true (scales close to linearly with processing_threads_num). #77671

  • Added _time virtual column to S3Queue. #78926

  • Macros (e.g. {uuid}) are now supported in keeper_path for S3Queue. #82463

  • Added server setting s3queue_disable_streaming (runtime changeable, no restart required) to disable streaming for S3Queue tables. #82515

Click any tab in the tab bar above for more information.

Formats

  • Added Hash output format, which computes a single hash value over all rows and columns of the result (useful as a lightweight result fingerprint when data transfer is a bottleneck). Example: SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash returns e5f9e676db098fdb9530d2059d8c23ef. #84607

  • Parquet:

    • Added experimental Parquet Reader v3 (new faster implementation with page-level filter pushdown and PREWHERE), enabled via input_format_parquet_use_native_reader_v3. #82789
    • Geo types: WKB-encoded geometry data is remapped to corresponding ClickHouse types.
    • Added JSON support: write ClickHouse JSON columns to Parquet and read Parquet JSON columns as ClickHouse JSON. #79649
    • Enum values are now written as BYTE_ARRAY with ENUM logical type by default. #84169
    • Added ParquetReadRowGroups and ParquetPrunedRowGroups counters.
  • ORC: added settings for compression block size and changed the default from 64KB to 256KB (Spark/Hive compatible). #80602

  • Added format_schema_source setting to define the source of format_schema. #80874

Click any tab in the tab bar above for more information.

Operations

  • Database engines Atomic and Ordinary now support disk setting to store table metadata files on a specified disk. #80546

  • Settings constraints now support explicitly disallowed values. #78499

  • Tweaked jemalloc configuration for improved performance. #81807

  • Memory tracking improvements:

    • External library allocations are now accounted by ClickHouse memory tracker (may increase reported memory usage / trigger MEMORY_LIMIT_EXCEEDED). #84082
    • Added MemoryResidentWithoutPageCache metric for more accurate memory usage reporting when userspace page cache is enabled. #81233
    • Memory tracker can be corrected using cgroup data via memory_worker_correct_memory_tracker (when cgroups are available and memory_worker_use_cgroup is enabled). #83981
    • Improved cgroup v2 detection on systems with both v1 and v2 enabled. #78566
  • Backups: allow backing up PostgreSQL, MySQL, and DataLake databases (definition only, without data). #79982

  • ODBC/JDBC: allow using named collections and unify parameter names. #80334 #83410

  • Views created by ephemeral users now store a copy of the user and are not invalidated after the user is deleted. #84763

  • AWS ECS credentials: added token expiration so it can be reloaded. #82422

  • Added bind_host setting in clusters configuration to force distributed connections through a specific network. #74741

  • Logging: introduced async logging and enabled it by default (<logger><async>false</async></logger> disables it). Added tunable limits and introspection, per-channel JSON logging via logger.formatting.channel, and fixed send_logs_source_regexp after refactoring. #82516 #80125 #85105 #86331 #85797

  • Added schema_type setting for system.metric_log with schema options wide, transposed, and transposed_with_wide_view (note: transposed_with_wide_view does not support subsecond resolution; event_time_microseconds remains as alias for compatibility). #78412

  • Set remote_filesystem_read_method default to threadpool. #77368

  • Allow specifying http_response_headers in any http_handlers. #79975

  • system.zookeeper now exposes auxiliary_zookeepers data. #80146

Click any tab in the tab bar above for more information.

CLI

  • clickhouse-local supports persistent database storage via --path (e.g. ch --path .).

  • clickhouse-local supports implicit tables (queries can omit FROM).

  • Bundled <code>chdig</code> (top-like TUI for ClickHouse) as part of ClickHouse. #79666

  • clickhouse-client: added AI-powered SQL generation via ?? prefix (OpenAI/Anthropic, automatic schema discovery). Supports zero-config API key discovery via OPENAI_API_KEY / ANTHROPIC_API_KEY. #83314 #83787

  • clickhouse-benchmark: added --max-concurrency option with gradual ramp-up of parallel queries. #85623

Click any tab in the tab bar above for more information.

Web UI

  • Added a landing page listing embedded web tools (opened automatically for browser-like user agents). #81129

  • Improved Web UI scrollbars appearance. #82869

  • clickhouse-server with embedded configuration now supports Web UI access by responding to HTTP OPTIONS requests. #82870*

Click any tab in the tab bar above for more information.

Security

  • CI/CD can now use FIPS-permissive mode. #82415 #83418

  • Fixed passing external roles in interserver queries. #79099

  • Parameterized CREATE USER query.

  • External authentication: match forward_headers case-insensitively. #84737

  • Added setting access_control_improvements.enable_user_name_access_type to enable/disable precise user/role grants (introduced in #72246). Should be disabled for compatibility with replicas older than 25.1. #79842

  • Added new source access types READ and WRITE, deprecating previous source-related access types (e.g. GRANT READ, WRITE ON S3 TO user). Controlled by access_control_improvements.enable_read_write_grants (disabled by default). #73659

  • Azure/FILE permissions: azureBlobStorage, deltaLakeAzure, and icebergAzure now properly validate AZURE permissions; *-Cluster variants validate against their non-clustered counterparts; icebergLocal and deltaLakeLocal now require FILE permissions. #84938

  • Added new syntax for scoped S3 grants: GRANT READ ON S3('s3://foo/.*') TO user. #84503

  • Mask credentials in deltaLakeAzure, deltaLakeCluster, icebergS3Cluster, and icebergAzureCluster. #85889

  • Query masking rules can now throw LOGICAL_ERROR on match to detect credential leaks in logs. #78094

Click any tab in the tab bar above for more information.

Network

  • Drop TCP connections after a configured number of queries or after a time threshold. #81472

  • HTTP buffers: embed proxy configuration using builder-based setup. #77693

  • Server bandwidth throttling: allow reloading max_local_read_bandwidth_for_server and max_local_write_bandwidth_for_server without server restart. #82083

Click any tab in the tab bar above for more information.

Analyzer

  • Improved resolution of compound identifiers (notably better ARRAY JOIN compatibility). To keep the old behavior, enable analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested. #85492

  • Distributed queries: experimental query plan distribution via serialize_query_plan / process_query_plan_packet.

Click any tab in the tab bar above for more information.

Database=Replicated

  • Added logs_to_keep setting for Replicated databases to control how many log entries are kept in ZooKeeper (lower values reduce ZNodes; higher values allow replicas to catch up after longer downtime). #84183

  • Added database_replicated settings to define default values for DatabaseReplicatedSettings when they are not explicitly specified in CREATE DATABASE ... ENGINE=Replicated. #85127

  • Enabled backoff logic for replicated tasks to reduce CPU/memory usage and log volume. Added settings max_postpone_time_for_failed_replicated_fetches_ms, max_postpone_time_for_failed_replicated_merges_ms, and max_postpone_time_for_failed_replicated_tasks_ms. #74576

Click any tab in the tab bar above for more information.

Parallel replicas

  • Added projection support for parallel replicas (controlled by parallel_replicas_support_projection, requires parallel_replicas_local_plan). #82807

  • Parallel replicas no longer wait for slow unused replicas once all read tasks are already assigned to other replicas. #80199

  • Distributed INSERT SELECT into replicated MergeTree now uses parallel replicas more efficiently by selecting different data on different nodes and inserting independently. #78041

Click any tab in the tab bar above for more information.

Keeper

  • Added support for setting arbitrary watches in Keeper multi queries. #84964

  • Added clickhouse-keeper-utils CLI tool to dump/analyze Keeper snapshots and changelogs (including extracting log ranges). #81677

  • keeper-utils: added configurable limit for dumping top subtrees. #85198

  • Added get_acl command to KeeperClient. #84641

  • Keeper performance improvements:

    • Reduced contention on storage lock. #84732
    • Improved RocksDB initial loading. #83390
    • Move changelog files between disks in a background thread to avoid blocking Keeper (e.g. when moving to S3 disk). #82485
    • Added limits for log entry cache size via latest_logs_cache_entry_count_threshold and commit_logs_cache_entry_count_threshold. #84877
  • ACL improvements:

    • Added keeper_server.cleanup_old_and_ignore_new_acl to clear existing ACLs and ignore new ACL requests (should remain enabled until a new snapshot is created). #82496
    • Added support for specific permissions in world:anyone ACL. #82755

Click any tab in the tab bar above for more information.

Introspection

  • Added pressure metrics to async metrics. #80779

  • Added a dimensional metric for ConcurrentBoundedQueue size, labelled by queue type and queue id. #84675

  • CGroup-level and OS-level metrics are now reported together: cgroup metrics use CGroup<Metric> names, OS/procfs metrics use OS<Metric>. #84317

  • Added query_id to system.errors. #76581

  • Added last_error_message, last_error_trace, and query_id to system.error_log. #79836

  • system.functions now shows the ClickHouse version where each function was introduced. #79839

  • Added system.zookeeper_connection_log with historical ZooKeeper connection information. #79494

  • Added support for partially aggregated metrics. #85328

  • Added system.completions system table. #83833

  • Refreshes of refreshable materialized views are now logged in system.query_log. #71333

  • Added system.codecs system table to introspect available codecs. #81600

  • Added async metrics for server TCP sockets. #80188

  • Added mergeTreeProjection table function to read projection parts directly for introspection. #78429

Click any tab in the tab bar above for more information.

v25.8.16.10001

Released 2026-02-18

Build report - 25.8.16.10001 | Release page

Changes compared to upstream's v25.8.16.34-lts

Backward Incompatible Changes

  • ALTER MODIFY COLUMN now requires explicit DEFAULT when converting nullable columns to non-nullable types. Previously such ALTERs could get stuck with cannot convert null to not null errors, now NULLs are replaced with column’s default expression (ClickHouse#84770 by** @vdimir **via #1344)

New Features

Critical Bug Fixes

Bug Fixes (user-visible misbehavior in an official stable release)

  • Now datalakes catalogs will be shown in system introspection tables only if show_data_lake_catalogs_in_system_tables explicitly enabled (ClickHouse#88341 by @alesapin via #1331)

  • Now ClickHouse will show data lake catalog database in SHOW DATABASES query by default (ClickHouse#89914 by @alesapin via #1331)

  • Possible crash/undefined behavior in IN function where primary key column types are different from IN function right side column types (ClickHouse#89367 by @ilejn via #1339)

  • Fixed move-to-prewhere optimization, which did not work in the presence of row policy (ClickHouse#87303 by @KochetovNicolai via #1345)

  • Fixes a bug where certain distributed queries with ORDER BY could return ALIAS columns with swapped values (i.e., column a showing column b’s data and vice versa) (ClickHouse#94644 by @filimonov via #1346)

  • Split part ranges by volume characteristics to enable TTL drop merges for cold volumes. After this patch, parts with a max TTL < now will be removed from cold storage. The algorithm will schedule only single part drops. (ClickHouse#90059 by @Michicosun via #1363)

  • Check and mark the interserver IO address active in DDL worker (ClickHouse#92339 by @tuanpach via #1403)

  • Disable write_marks_for_substreams_in_compact_parts by default to preserve downgrade compatibility (#1407 by @zvonand)

Improvements

Performance Improvements

  • SELECT query with FINAL clause on a ReplacingMergeTree table with the is_deleted column now executes faster because of improved parallelization from 2 existing optimizations (ClickHouse#88090 by @shankar-iyer via #1332)

  • Reduce INSERT/merges memory usage with wide parts for very wide tables by enabling adaptive write buffers. Add support of adaptive write buffers for encrypted disks (ClickHouse#92250 by @azat via #1341)

Let’s Install!

Linux packages for both AMD64 and Aarch64 can be found at builds.altinity.cloud as either .deb, .rpm, or .tgz. Linux packages for upstream builds are at packages.clickhouse.com.

Altinity Stable Build images are available at DockerHub as altinity/clickhouse-server:25.8.16.10001.altinitystable.

For more information on installing ClickHouse from either the Altinity Builds or the upstream builds, see the ClickHouse Altinity Stable Builds Install Guide.

Please contact us at info@altinity.com if you experience any issues with the upgrade.