Skip to main content
Skip to main content

Changelog 2026

ClickHouse release 26.3 LTS, 2026-03-26. Presentation, Video (TODO)

Backward Incompatible Change

  • Remove the hypothesis skip index type. It was an obscure, experimental feature with limited practical use. Creating tables with INDEX ... TYPE hypothesis will now produce an error. #96874 (Alexey Milovidov).
  • Remove the experimental detectProgrammingLanguage function. #99567 (Alexey Milovidov).
  • Fix NOT operator precedence to match the SQL standard: NOT now binds looser than IS NULL, BETWEEN, LIKE, and arithmetic operators. For example, NOT (x) IS NULL is now parsed as NOT (x IS NULL) instead of (NOT x) IS NULL. This may change the result of queries that relied on the previous (non-standard) behavior. #97680 (Alexey Milovidov).
  • Corrects the metadata of normal projections so that projections with multi-column sorting keys are properly recognized. Builds on top of #90429. #91352 (Amos Bird).
  • Propagate data types serialization versions to nested data types. For example, String serialization version with_size_stream previously was applied only on top-level String columns and Tuple elements. Now it's applied to any String type inside any nested type like Array/Map/Variant/JSON/etc. This behaviour is controlled by MergeTree setting propagate_types_serialization_versions_to_nested_types that is now enabled by default. After this change, newly created data parts cannot be read by older versions, but old parts can be read on new version with no problems. It means that upgrade is safe, but downgrade is not. #94859 (Pavel Kruglov).
  • Fixed skip index files not respecting replace_long_file_name_to_hash setting, causing "File name too long" errors and broken index reads for indices with long names. Skip index filenames are now hashed when they exceed max_file_name_length, similar to column files. This is backward compatible (new servers read old parts), but downgrading (or old servers during a rolling upgrade) may cause long-named indices to be ignored. #97128 (Raúl Marín).
  • Turn on async insert by default. ClickHouse will be batching all small inserts by default now. This setting is set under compatibility. If you set compatibility=<version less than 26.2> then default value would be the previous one, false. You can turn off/on async inserts at several levels: in the config in users profiles, for the session, for the query, or for the MergeTree table. #97590 (Sema Checherinda).
  • Change the default value of mysql_datatypes_support_level from empty to decimal,datetime64,date2Date32, enabling proper mapping of MySQL DATE to Date32, DECIMAL/NUMERIC to Decimal, and DATETIME/TIMESTAMP with precision to DateTime64 by default. Previously, MySQL DATE columns were mapped to Date which cannot represent dates before 1970-01-01, causing data corruption. #97716 (Alexey Milovidov).
  • Accept array of part names instead of regexp for mergeTreeAnalyzeIndexes{,UUID} since regexp is slow (Experimental feature). #98474 (Azat Khuzhin).
  • Change default stderr_reaction from throw to log_last for executable UDFs. UDFs that write warnings to stderr no longer fail when exit code is 0. Exit code exceptions now include stderr content. #99232 (Xu Jia).

New Feature

  • Support materialized CTE. Allow evaluating CTEs only once during query execution and store their results in temporary tables. Closes #53449. #94849 (Dmitry Novik).
  • Allow certain SQL-standard functions without parentheses for compatibility, such as NOW. Closes #52102. #95949 (Aly Kafoury).
  • You can now use the natural sort key function as naturalSortKey(s). #90322 (Nazarii Piontko).
  • You can now use native JSON/Object input for JSONExtract functions. Closes #88370. #96711 (Fisnik Kastrati).
  • If a query parameter has Nullable type and is not specified, we will assume that its value is NULL. #93869 (Vikash Kumar).
  • Support auxiliary ZooKeeper for Replicated database. #95590 (RinChanNOW).
  • Support has function for JSON type to check path existence, similar to Map. #96927 (DQ).
  • Added the mergeTreeTextIndex(database, table, index) table function, which allows reading data directly from a text index. This function can be used for introspection or for performing aggregations on top of text index data. #97003 (Anton Popov).
  • Add table_readonly MergeTree setting to mark tables as read-only, preventing inserts and modifications. #97652 (Alexey Milovidov).
  • Add new setting use_partition_pruning and alias use_partition_key. Set it to false to disable partition pruning based on the partition key. #97888 (Nihal Z. Miaji).
  • Implements ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>') for Iceberg tables. #97904 (murphy-4o). #99130
  • Allow each type=http entry in <protocols> to specify a custom <handlers> key pointing to a separate <http_handlers_*> config section, enabling different HTTP routing rules per port. #98414 (Amos Bird).
  • Add pretty=1 option to EXPLAIN for tree-style indented output and compact=1 to collapse Expression steps, making query plans more readable. #98500 (Kirill Kopnev).
  • Add restore_access_entities_with_current_grants server setting. When enabled, restored users/roles from backups have their grants limited to what the restoring user is allowed to grant (same semantics as GRANT CURRENT GRANTS), instead of failing with ACCESS_DENIED. #98795 (pufit).
  • Add caseFoldUTF8 and removeDiacriticsUTF8 functions for Unicode case folding and diacritical mark removal. #98973 (George Larionov).
  • Add normalizeUTF8NFKCCasefold string function for NFKC_Casefold Unicode normalization, which combines NFKC normalization with case folding. #99276 (George Larionov).
  • Add unicodeWord tokenizer for full-text indexes and the tokens function. It splits text using Unicode word boundary rules: ASCII words are formed with connector characters (underscore, colon, dot, single quote), while non-ASCII Unicode characters become single-character tokens. #99357 (Amos Bird).
  • Added max_skip_unavailable_shards_num and max_skip_unavailable_shards_ratio settings to limit how many shards can be silently skipped when skip_unavailable_shards is enabled. If the number or ratio of unavailable shards exceeds the configured threshold, an exception is thrown instead of returning silently incomplete results. #99369 (Alexey Milovidov).
  • Users can now use SOME keyword for subquery expressions. It behaves identically to ANY. #99842 (Artem Kytkin).
  • Add output_format_trim_fixed_string setting to strip trailing null bytes from FixedString values in text output formats. #97558 (NeedmeFordev).
  • Support parenthesized table join expressions in FROM clause, e.g. SELECT * FROM (t1 CROSS JOIN t2). #97650 (Alexey Milovidov).
  • Implement function toDaysInMonth: it returns the number of days in the month of the specified date. #99227 (Vitaly Baranov).

Experimental Feature

  • Add experimental support for WebAssembly-based user-defined functions (UDFs), allowing custom function logic to be implemented in WebAssembly and executed within ClickHouse. Special thanks to Alexey Smirnov for contributing the Wasmtime backend support. #88747 (Vladimir Cherkasov). Incremental improvements for WASM UDF support. #99373 (Vasily Chekalkin).
  • Add support for external SQL dialects using polyglot library. #99496 (Alexey Milovidov).
  • Add ALP floating-point compression codec (without ALP_rd fallback for non-compressible doubles). #91362 (Nazarii Piontko).
  • Add experimental lazy type hints for JSON columns. When enabled via allow_experimental_json_lazy_type_hints, ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName) that only adds or modifies type hints completes instantly as a metadata-only operation, without rewriting historical data. Type hints are applied at query time for old parts and materialized during INSERTs and background merges. #97412 (tanner-bruce).
  • Enable parallel reads from YTsaurus table engine. #97343 (MikhailBurdukov).

Performance Improvement

  • Improve the performance of data lakes. In previous versions, reading from object storage didn't resize the pipeline to the number of processing threads. This gives orders of magnitude improvements (~40x) on multi-core machines. #99548 (Alexey Milovidov).
  • Now, the relationship between enable_parallel_replicas and automatic_parallel_replicas_mode is as follows. A query can use parallel replicas only if enable_parallel_replicas > 0. Additionally, if automatic_parallel_replicas_mode=1, the decision whether to use parallel replicas is made during planning based on the previously collected statistics. If automatic_parallel_replicas_mode=0, parallel replicas will be used for all supported queries regardless of any statistics. One notable exemption is distributed insert-select with parallel replicas: in this case, queries will always be executed as if automatic_parallel_replicas_mode=0. #97517 (Nikita Taranov).
  • Allow partition pruning when the predicate contains any comparison operator (=, <, >, !=) and the partition key is wrapped in a deterministic function chain (e.g. PARTITION BY x and predicates like cityHash64(x) % 5 > 2, toYYYYMM(x) < 2026, toYYYYMM(x) = 2026, or toYYYYMM(x) != 2026 will all use the partition key for pruning). Closes #28800. #98432 (Nihal Z. Miaji).
  • Allow read-in-order optimization and primary-key pruning when the CAST target type is Nullable and the conversion is monotonic; for example, with PRIMARY KEY x, ClickHouse can use read-in-order optimization for ORDER BY x::Nullable(UInt64) and can apply primary-key pruning for predicates such as WHERE x::Nullable(UInt64) > 500000. #98482 (Nihal Z. Miaji).
  • Allow index pruning and filter pushdown when an integral column is compared with a float literal; for example, predicates like WHERE x < 10.5 can now use the primary key for pruning, and filters such as prime < 1e9 or number < 1e5 are now pushed down for the primes() and numbers() table functions instead of causing unbounded execution. Closes #85167. #98516 (Nihal Z. Miaji).
  • Added a new SLRU cache for Parquet metadata to improve read performance by removing the need to re-download files just to read metadata. #98140 (Grant Holly).
  • Support swapping sides of ANTI, SEMI and FULL joins based on optimizer statistics. #97498 (Hechem Selmi).
  • Optimize granules skipping for pointInPolygon for large polygons and fix pointInPolygon index analysis throwing during primary key pruning. #91633 (Nihal Z. Miaji).
  • Improve performance of levenshteinDistance function. #94543 (Joanna Hulboj).
  • Optimize batch decimal type conversions by avoiding per-element function calls. #95923 (Konstantin Bogdanov).
  • Iceberg tables now support asynchronous metadata prefetching via iceberg_metadata_async_prefetch_period_ms table setting, which periodically pre-populates the metadata cache. Additionally, the iceberg_metadata_staleness_ms query setting allows SELECT queries to use cached metadata if it is fresher than the specified staleness, eliminating calls to the Iceberg catalog during request processing. #96191 (Arsen Muk).
  • S3Queue ordered mode uses S3 ListObjectsV2 StartAfter to avoid re-listing full prefix history, reducing ListObjects calls. #96370 (Venkata Vineel ).
  • Lower memory usage for inserts deduplication. In general the original block is needed for deduplication, but for sync insert we could omit it and save the memory for good. #96661 (Sema Checherinda).
  • Use an arch-specific value for cache line size instead of a hardcoded value of 64. #97357 (Nikita Taranov).
  • Slightly optimized reading from the text index dictionary, improving the overall performance of text index analysis. #97519 (Anton Popov).
  • Speed up LZ4 decompression of 16 byte blocks in ARM. #97774 (Raúl Marín).
  • Refactor tokenization to a new high-performance interface, replacing the old iterator-style API to support SIMD and stateful tokenizers. Part of #90268. #97871 (Amos Bird).
  • Improved performance of text index analysis for queries with combined conditions involving both indexed and non-indexed columns. Previously, early exit optimization during index analysis was incorrectly disabled in such cases. #98096 (Anton Popov).
  • Improve the performance of queries with constant expressions that generate very long arrays or maps. #98287 (Alexey Milovidov).
  • Fix key condition analysis for DateTime64 primary keys compared with integer constants, which previously resulted in no granule pruning. #98410 (Amos Bird).
  • The setting optimize_syntax_fuse_functions is enabled by default. #98424 (Alexey Milovidov).
  • Optimize avgWeighted aggregate function by using local accumulators instead of per-row store-forwarding through aggregate state, improving performance by up to 27% for Nullable inputs. #98793 (Antonio Andelic).
  • Improves performance and reduces memory usage for parallel window functions in certain scenarios, and for arrayFold workloads with large arrays. This can also reduce page-fault pressure and improve stability under tight memory limits for affected queries. #98892 (filimonov).
  • Improve performance of sorted merges. #99013 (Artem Zuikov).
  • Optimise INTERSECT ALL and EXCEPT ALL. #99097 (Raufs Dunamalijevs).
  • Support the read_in_order_use_virtual_row optimization for reverse-order reads. #99198 (Vladimir Cherkasov).
  • Reduce cache contention in RIGHT and FULL JOINs by checking if JoinUsedFlags is set before writing. #99274 (Hechem Selmi).
  • Optimize PrefetchingHelper::calcPrefetchLookAhead by replacing floating-point math with pure integer arithmetic, improving instruction cache layout and reducing cycle overhead during aggregation loops. #99327 (Riyane El Qoqui).
  • Reduce memory consumption of Keeper by replacing absl::flat_hash_set with CompactChildrenSet for storing node children. The new container stores 0–1 children inline without heap allocation, which covers the majority of Keeper nodes. This reduces KeeperMemNode size from 144 to 128 bytes. #99860 (Antonio Andelic).
  • Aggregate projections are now correctly supported in views. Fixes #32753. #88798 (Amos Bird).
  • Support OUTER to INNER join conversion optimization with join_use_nulls. Closes #90978. #95968 (Vladimir Cherkasov).
  • Improve subcolumns reading by correct sizes calculation before reading. It reduces memory usage and speeds up the subcolumns reading. #96251 (Pavel Kruglov).
  • Make mark, uncompressed and page caches to use separate jemalloc arena to avoid memory fragmentation when short lived allocations, i.e., for queries and requests are mixed with longer lived allocations for caches. #96812 (Seva Potapov). #98812. #99021
  • Tables with DELETE TTL rules can now use the vertical merge algorithm. #97332 (murphy-4o).
  • Apply data skipping indexes during distributed index analysis. #97767 (Azat Khuzhin).
  • Marks of secondary indexes are now prewarmed when the prewarm_mark_cache setting is enabled (loaded into the index mark cache during data part fetches and table startup). #97772 (Anton Popov).
  • Reduced locking during access control. #97894 (Nikita Taranov).
  • When apply_row_policy_after_final or apply_prewhere_after_final is enabled, compound AND conditions in row policies and PREWHERE are now decomposed to extract sorting-key atoms for primary key index analysis. Previously, if a deferred filter contained a mix of sorting-key and non-sorting-key predicates (e.g. x > 1 AND y != 'foo'), the entire expression was excluded from index analysis. Now sorting-key atoms (like x > 1) are extracted and used for granule pruning, even from nested AND expressions. #98513 (Yarik Briukhovetskyi).
  • Reduce lock contention in MergeTreeBackgroundExecutor by making task resources release without acquiring the lock. Closes #93620. #98604 (Dmitry Novik).

Improvement

  • Makes it possible to parse GeoParquet files that contain different Geo type in the same column. #97851 (Mark Needham).
  • Introduce tokensForLikePattern SQL function that tokenizes LIKE patterns while respecting wildcard semantics: % and _ are treated as wildcards, escaped wildcards (\%, \_) are treated as literals, and tokens adjacent to unescaped wildcards are discarded. #97872 (Amos Bird).
  • Add a {_schema_hash} placeholder for the S3 table engine that inserts a hash of the table's column definitions into the S3 path. #98265 (Miсhael Stetsyuk).
  • SymbolIndex, addressToSymbol, system.symbols, and buildId now work on macOS by parsing Mach-O symbol tables. #99014 (Alexey Milovidov).
  • The system.stack_trace table now works on macOS, allowing introspection of all server thread stack traces. #98982 (Alexey Milovidov).
  • Add per-server LDAP config option <follow_referrals> (default false) to control whether the LDAP client follows referrals. Disabling referral chasing avoids timeouts and hangs when searching from an Active Directory domain-root base DN. Referral-related log messages are moved from warn to trace. #96765 (paf91).
  • We now track any data skipping indices that were used during query execution in the query_log table in a new column named skip_indices. Fixes #78676. Original author @pheepa. #87862 (Grant Holly).
  • ACCESS_DENIED hints no longer reveal column names unless the user can show all required columns; database/table names remain visible in the hint. #91067 (filimonov).
  • Add a dedicated cleanup thread for MergeTree to prevent cleanup delays under heavy merge load. This resolves #86181. #91574 (Amos Bird).
  • Reload cluster config if IPs of local server’s hostname changed, instead of IPs of any host. Fixes #81215, #70156 and #65268. #93726 (Zhigao Hong).
  • Allow optimize_aggregators_of_group_by_keys to correctly optimize aggregate functions in GROUPING SETS queries. #93935 (Xiaozhe Yu).
  • Keeper-bench: report errors in metrics and generate json metrics file for --input-request-log mode. #95748 (Mohammad Lareb Zafar).
  • Add new clause ROLE to CREATE USER. #97074 (Vitaly Baranov).
  • You can now set internal_replication settings for a cluster created by the Replicated database. #97228 (Pervakov Grigorii).
  • New setting allow_nullable_tuple_in_extracted_subcolumns controls whether extracted Tuple(...) subcolumns from Tuple, Variant, Dynamic and JSON are returned as Nullable(Tuple(...)) (NULL for missing rows) or as Tuple(...) (default tuple values for missing rows). Disabled by default, this setting can only be changed by restarting the server. #97299 (Nihal Z. Miaji).
  • Add information about deferred filters as a separate item to EXPLAIN query output (when using Row Policies/PREWHERE with FINAL). Related: #91065. #97374 (Yarik Briukhovetskyi).
  • Enable type_json_allow_duplicated_key_with_literal_and_nested_object by default. It allows to avoid errors about duplicated keys during parsing of JSONs like {"a" : 42, "a" : {"b" : 42}} that can be formatted by ClickHouse from original JSON data {"a" : 42, "a.b" : 42}. #97423 (Pavel Kruglov).
  • Keeper improvement: find_super_nodes is a very useful command for debugging unexpected growth in the node count in Keeper. Unfortunately, if there are multiple super nodes, it's almost impossible to find more than one, because the command gets stuck forever traversing the children of the first encountered super node. This PR forbids traversing the children of super nodes. #97819 (pufit).
  • Initial completion support for clickhouse-keeper-client. #97828 (Konstantin Bogdanov).
  • Flush async logging buffers in case of crash. #97836 (Azat Khuzhin).
  • Enable the impersonate feature by default (see EXECUTE AS target_user). #97870 (Vitaly Baranov).
  • Improve canceling queries with SQLite table engine by KILL QUERY and cancel query (Ctrl+C) in clickhouse-client. #97944 (Roman Vasin).
  • Add server setting jemalloc_profiler_sampling_rate to control jemalloc's lg_prof_sample and expose it as jemalloc.prof.lg_sample asynchronous metric. #97945 (Antonio Andelic).
  • Support weights in concurrent bounded queue implementation. #97962 (Daniil Ivanik).
  • Add sslmode to the allowed keys for PostgreSQL dictionary sources. Previously, sslmode was not in the dictionary_allowed_keys allowlist in PostgreSQLDictionarySource.cpp, making it impossible to configure SSL mode for PostgreSQL dictionary connections. This prevented dictionaries from connecting to PostgreSQL servers that require SSL (e.g., AWS RDS, which enforces SSL by default), as the connection would fail TLS negotiation and the server would reject the unencrypted fallback. #98014 (mcalfin).
  • Show a clear "no such file" error when passing a non-existent file path to clickhouse or clickhouse-local, instead of a confusing generic message. #98048 (Raúl Marín).
  • Text indexes can now be built on top of Nullable([Fixed]String) and Array(Nullable([Fixed]String)) columns. #98118 (Jimmy Aguilar Mena).
  • Avoid dropping named collections that are dependencies of dictionary sources. #98127 (Pablo Marcos).
  • Enable grace_hash join algorithm for queries with totals. #98144 (János Benjamin Antal).
  • Cancel background merges early in DROP DATABASE for ordinary shared merge tree. #98161 (Shaohua Wang).
  • Improve canceling queries with MongoDB and MySQL by KILL QUERY and cancel query (Ctrl+C) in clickhouse-client. #98187 (Roman Vasin).
  • Remove NetlinkMetricsProvider and use procfs exclusively for per-thread taskstats metric collection. Netlink-based collection is problematic in containerized environments and has worse tail latency under contention. #98229 (Amos Bird).
  • Refactor Iceberg manifest file handling to fix issues with manifest file caching. #98231 (Daniil Ivanik).
  • Now we take into account cases where the sorting key of the table can be an expression like toDate(time), and can make the decisions about not-deferring expressions like this if they are part of filters. #98237 (Yarik Briukhovetskyi).
  • Add a new MaxAllocatedEphemeralLockSequentialNumber metric for the maximum sequential number allocated for ephemeral lock znodes in ZooKeeper. #98243 (Miсhael Stetsyuk).
  • Update clickstack to version 2.20.0. #98252 (Aaron Knudtson).
  • Added a new profile event KeeperRequestTotalWithSubrequests that counts each subrequest within a multi-request individually, providing better visibility into the actual Keeper workload. The existing KeeperRequestTotal event continues to count each multi-request as a single request. #98348 (Antonio Andelic).
  • SYSTEM RELOAD DICTIONARIES now reloads dictionaries in topological order so that dictionaries sourcing from other dictionaries see fresh data after reload. #98356 (Alexey Milovidov).
  • Restart the statistics cache after changing the MergeTree setting. #98520 (Han Fei).
  • Only "alive" replicas (that are connectable) participate in distributed index analysis. #98521 (Azat Khuzhin).
  • Add a setting access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users (disabled/allowed by default) that disallows using config-defined settings profiles (except for the default profile) for SQL-defined users. #98662 (Alexander Tokmakov).
  • Cap the number of nodes used in the automatic parallel replicas heuristic to the actual number of nodes in the cluster (instead of only the max_parallel_replicas setting). #98668 (Nikita Taranov).
  • Implement hedged requests and asynchronous reading for distributed index analysis. #98724 (Azat Khuzhin).
  • Deserialization of binary AggregateFunction states now requires consuming the full input. If extra redundant trailing bytes are present, ClickHouse throws an exception instead of accepting malformed state data. #98786 (Nihal Z. Miaji).
  • Make TRUNCATE DATABASE respond to query cancellation. #98828 (Shaohua Wang).
  • Improve keeper-bench with request pipelining, warmup period, per-operation stats, reproducible seeds, and better error handling. #98906 (Antonio Andelic).
  • Support SAMPLE clause in distributed index analysis. #98931 (Azat Khuzhin).
  • Show chart title in dashboard even when query returns empty result or encounters an error. #98975 (Yash ).
  • Analyzer error messages no longer dump all columns of a table (which could produce 150KB+ exceptions). Column lists are now capped at 10 entries. #99002 (Yash ).
  • Properly return column stats from sub-queries with joins so that parent query can use them for join reordering. #99096 (Alexander Gololobov).
  • Mark ZooKeeper session as expired immediately when finalization starts, instead of waiting for the send thread to exit. This allows other threads to establish a new session without delay. #99102 (Raúl Marín).
  • Use more math functions from LLVM-libc: exp, exp2, expm1, fabs, fabsl, floor, fmodl, log, log2, logf, pow, scalbn, scalbnl, copysignl, nan, nanf, nanl, and the explogxf shared constants. #99118 (Konstantin Bogdanov).
  • Reduce memory usage and fix potential duplicate output in system.jemalloc_profile_text collapsed format. #99121 (Antonio Andelic).
  • Add is_subrequest column to system.aggregated_zookeeper_log to separate standalone requests from sub-requests inside Multi/MultiRead requests. Previously, sub-requests were aggregated into the same buckets as standalone requests, and since each sub-operation was logged with the total multi-request duration, the average latency became misleading. Sub-requests now have zero latency. #99169 (Miсhael Stetsyuk).
  • Allow ALTER TABLE MODIFY COLUMN x TTL ... command without specifying column type. #99208 (Nikolay Degterinsky).
  • Skip stale Keeper requests for sessions that have already disconnected, avoiding unnecessary Raft round-trips. The number of tracked finished sessions is capped by the max_finished_sessions_cache_size coordination setting. #99246 (Antonio Andelic).
  • Support text index built on mapValues(map) with IN operator. #99286 (Anton Popov).
  • Shell-like completion support in clickhouse keeper-client (handle completions of arguments in quotes, i.e. 'foo ba', handle escaped arguments, i.e. foo\ ba, make ls print quoted nodes, if they have whitespaces). #99312 (Azat Khuzhin).
  • Prevent Keeper mntr command from getting stuck because of lock contention. #99472 (Antonio Andelic).
  • Reduce lock contention in Keeper dispatcher by invoking callbacks and dispatching read requests outside mutex scope, and add profiled lock guards for observability. #99751 (Antonio Andelic).
  • Tolerate missing padding at the end of the last block of parquet files. #99857 (Seva Potapov).

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

  • Fixes how an Alias table target is saved as a DDL dependency when not fully qualified: it's now saved with the Alias table database instead of the session database. #95175 (Enric Calabuig).
  • Fix wrong result or exception during reading subcolumns of ALIAS columns. #95408 (Pavel Kruglov).
  • Fix missing column when non-standard identifier alias in JOIN with old analyzer. Fixes #25594, #47288 and #53263. #95679 (Zhigao Hong).
  • Fixes a crash in Kusto dialect functions bin(), bin_at(), extract(), and indexof() when empty arguments are provided. #95736 (NeedmeFordev).
  • Forbids mounting local_object_storage (which is used by datalakes above local filesystem and maybe by LocalDisk) anywhere apart from user_files_path in clickhouse-client. #96201 (Daniil Ivanik).
  • In DeltaLake table engine fix logical race on snapshot version change, remove redundant heavy snapshot reloads. #96226 (Kseniia Sumarokova).
  • Fix logical error on attaching a part in MergeTree if there were several chained renames between detaching and attaching. #96351 (Alexey Milovidov).
  • Fix a bug where explicit settings sent alongside compatibility in the same request could be silently ignored when their value matched the server default. #97078 (Raufs Dunamalijevs).
  • Fix the client reporting NETWORK_ERROR instead of the actual parsing error (with the correct row number) when an INSERT with parallel parsing encounters invalid data. #97339 (Alexey Milovidov).
  • Fix sumCount aggregate function not being able to read older serialized states after introduction of Nullable(Tuple). Closes #97370. #97502 (Nihal Z. Miaji).
  • Fix exception in tuple comparison involving Nothing type elements (e.g., comparing with NULL tuple elements) when used with GROUPING SETS and ORDER BY. #97509 (Alexey Milovidov).
  • Fix non-deterministic uncompressed_hash computation for Compact MergeTree parts when multiple compression codecs are used, which could cause incorrect deduplication behavior. #97522 (Alexey Milovidov).
  • Fix logical error about missing stream during INSERT SELECT with JSON and buckets in shared data. Closes #97331. #97523 (Pavel Kruglov).
  • Fix MEMORY_LIMIT_EXCEEDED exceptions being incorrectly reported as CORRUPTED_DATA during SummingMergeTree and CoalescingMergeTree merges. #97537 (János Benjamin Antal).
  • Fix "Context has expired" exception for correlated subqueries containing table functions like url(). #97544 (Alexey Milovidov).
  • Fix exceptions and incorrect behavior in optimize_syntax_fuse_functions with aggregate projections, Date types, and column name preservation. #97545 (Alexey Milovidov).
  • Remove incorrect replaceRegexpOne to extract query rewrite that produced wrong results when the regexp didn't match; also fix exception when replaceRegexpOne is used with GROUP BY ... WITH CUBE and group_by_use_nulls=1. #97546 (Alexey Milovidov).
  • Fix DROP DATABASE with database_atomic_wait_for_drop_and_detach_synchronously hanging indefinitely when the query is killed. #97586 (Alexey Milovidov).
  • Fix KILL QUERY not being able to terminate queries stuck in WITH FILL generation, dictionary loading via dictGet, or ALTER DELETE with mutations_sync=1 on ReplicatedMergeTree. #97589 (Alexey Milovidov).
  • The loop table function was calling inner_storage->read() directly, bypassing the interpreter layer where row policies, column-level grants, and other security checks are applied. This allowed a user restricted by row policies to read all rows via loop(table) even when a direct SELECT returned zero rows. #97682 (pufit).
  • Fixes incorrect partition pruning in cases of using pre-epoch DateTime64 with toDate() function. #97746 (Yarik Briukhovetskyi).
  • After this patch, hasPartitionId will return false if another partition with a higher partition ID exists in the data part set. #97748 (Mikhail Artemenko).
  • Fix possible crashes during reading of empty granules in advanced shared data in JSON. Closes #97563. #97778 (Pavel Kruglov).
  • Fix Cannot schedule a file LOGICAL_ERROR on INSERT into Distributed due to race between DROP and INSERT. #97822 (Azat Khuzhin).
  • Fixed ClickHouse server crash/assert in call to mapContainsKey/mapContainsKeyLike with tokenbf_v1 skip index. #97826 (Shankar Iyer).
  • Fix LOGICAL_ERROR exceptions caused by LowCardinality inside compound types (Variant, Dynamic, Tuple) in concatWithSeparator, format, IN subqueries, GLOBAL IN, and joins with runtime filters. #97831 (Raúl Marín).
  • Fix LOGICAL_ERROR exception Chunk info was not set for chunk in MergingAggregatedTransform when using ARRAY JOIN with merge() table function over multiple Distributed tables combined with GROUP BY. #97838 (Raúl Marín).
  • Fix server crash (std::terminate) caused by an uncaught exception in the HTTP connection pool destructor when the connection group hard limit is reached under high concurrency. The exception HTTP_CONNECTION_LIMIT_REACHED could escape ~PooledConnection when recycling a connection back to the pool, leading to SIGABRT. #97850 (Antonio Andelic).
  • Fix incorrect result when grace_hash algorithm is used with non-equi joins and left block cannot be processed completely because of the size constraints on the join result. #97866 (János Benjamin Antal).
  • Fix performance inefficiency in DeltaLake metadata scanning introduced in #96686. #97880 (Kseniia Sumarokova).
  • Fix data race in ZooKeeper client between sendThread and receiveThread. #97887 (Pablo Marcos).
  • Fixes a bug where it was not possible to use CTE with distributed insert selects. Continuation of https://github.com/ClickHouse/ClickHouse/pull/87789. Closes #95837. #97889 (Yarik Briukhovetskyi).
  • Fix exception from CachedOnDiskReadBufferFromFile::readBigAt. Closes #97325. #97890 (Kseniia Sumarokova).
  • Fix LOGICAL_ERROR exception in Alias engine with materialized columns due to column mismatch. Closes #97907. #97921 (Kai Zhu).
  • Fix Keeper data loss after restart when using Azure Blob Storage with s3_plain metadata for log storage. #97987 (Antonio Andelic).
  • Fix JIT miscompilation of sign function for integer types wider than Int8 — values outside the -128..127 range could produce incorrect sign. #98012 (Alexey Milovidov).
  • Fixed DUPLICATE_COLUMN exception and silent NULLs when reading Delta Lake tables that use column mapping "name" mode with struct fields whose names contain dots (e.g. STRUCT<`a.foo`: STRING, `b.foo`: STRING>). #98013 (Caio Ishizaka Costa).
  • Fix mutation after lightweight update and secondary indices. #98044 (Raúl Marín).
  • Fix incorrect result of FINAL queries when mixing primary key and non primary key skip indexes. #98097 (Raúl Marín).
  • Enforce READ ON FILE checks for scalar file() and DESCRIBE TABLE file(). #98115 (Nikolay Degterinsky).
  • Fixes a crash where querying files with a glob pattern (e.g., file('dir/**', 'LineAsString')) would throw an unhandled filesystem exception (STD_EXCEPTION) if the directory contained a dangling symlink. Dangling symlinks are now silently skipped, and the query returns results from all valid files. #98143 (Mark Andreev).
  • Fix segfault in query plan optimization when converting outer join to inner join with arrayJoin in filter expression. #98147 (Alexey Milovidov).
  • Fix ProtobufList format not working with Kafka engine due to read state not being reset between messages. #98151 (Alexey Milovidov).
  • Fix logical error with analyzer_compatibility_join_using_top_level_identifier and ARRAY JOIN, closes #98164. #98179 (Vladimir Cherkasov).
  • Set Watch component for watch responses in aggregated_zookeeper_log instead of leaving it empty. #98202 (Antonio Andelic).
  • If the partition key columns are not covered by the sorting key, then partition pruning could incorrectly skip partitions containing rows that should "win" during FINAL deduplication. #98242 (Yarik Briukhovetskyi).
  • Fix logical error "Bad cast from type DB::ColumnConst to DB::ColumnArray" in kql_array_sort_asc/kql_array_sort_desc when called with constant array arguments. #98251 (Alexey Milovidov).
  • Fix out-of-bounds access in ColumnConst::getExtremes that could cause a crash when extremes = 1 is enabled. #98263 (Alexey Milovidov).
  • Fix potential deadlock when two concurrent MOVE PARTITION operations work with the same pair of tables in opposite directions. #98264 (Alexey Milovidov).
  • HTTP server now returns an error message in the response body for 400 Bad Request responses caused by malformed headers, instead of an empty body. #98268 (Alexey Milovidov).
  • Fix wrong results with distributed index analysis (experimental feature) and query condition cache. #98269 (Azat Khuzhin).
  • Fixed LOGICAL_ERROR exception "Invalid binary search result in MergeTreeSetIndex" triggered by toDate conversion on key columns with data crossing the 65535 boundary. #98276 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception when a RIGHT JOIN wrapped in a CROSS JOIN is swapped by the query_plan_join_swap_table optimization in the legacy join step code path. #98279 (Alexey Milovidov).
  • Validate corrupted data during DDSketch deserialization to prevent segfaults, exceptions, infinite loops, and OOM when reading corrupted quantilesDD aggregate function states. #98284 (Alexey Milovidov).
  • Fix LOGICAL_ERROR "Trying to execute PLACEHOLDER action" when correlated columns from outer queries are referenced inside lambda functions such as arrayMap. #98285 (Alexey Milovidov).
  • Fix logical error exception in caseWithExpression when CASE expression involves materialize(NULL) or other Nullable(Nothing) arguments. #98290 (Alexey Milovidov).
  • Fix bad cast exception when filtering _table virtual column in merge table function. #98291 (Alexey Milovidov).
  • Fix sporadic deduplication failure where re-inserts were incorrectly deduplicated due to inconsistent cleanup ordering between blocks/ and deduplication_hashes/ ZooKeeper directories. #98293 (Alexey Milovidov).
  • Fix exception when ORDER BY ... WITH FILL is used together with LIMIT BY. #98361 (Alexey Milovidov).
  • Fix silent data corruption when inserting a Parquet/Arrow Date column into an Enum column — now properly rejects the incompatible type conversion instead of storing invalid enum values. #98364 (Alexey Milovidov).
  • Fix exception when reading an Arrow file with Array column into a table with Nested column. #98365 (Alexey Milovidov).
  • Fix MATERIALIZE INDEX and MATERIALIZE PROJECTION mutations getting stuck when the index or projection is dropped before the mutation finishes. #98369 (Alexey Milovidov).
  • Fix exception when reading from Nullable(Tuple(...)) where a Tuple element name collides with the Nullable null subcolumn. #98372 (Alexey Milovidov).
  • Fix exception "Column ... query tree node does not have valid source node" when joining a Merge table (wrapping a Distributed table) with another table. #98376 (Alexey Milovidov).
  • Fix incorrect Parquet Bool to FixedString conversion in native V3 reader that produced raw bytes instead of string representation. #98378 (Alexey Milovidov).
  • Fix tryGetColumnDescription to filter subcolumns by parent column kind, consistent with other column lookup methods. #98391 (Alexey Milovidov).
  • Accept base64 credentials without padding in HTTP Basic Auth. Some HTTP clients omit trailing = padding in the Authorization: Basic header, which previously caused authentication failures. #98392 (Amos Bird).
  • Fix incorrect partition pruning results after merging parts with Nullable partition key columns, caused by wrong min-max index bounds. #98405 (Amos Bird).
  • Fix rare exception in the pipeline executor, that could manifest as a Received signal 6 (only in debug builds), when pipeline expansion races with query cancellation. #98428 (Alexey Milovidov).
  • Fix exception "Column identifier is already registered" when count_distinct_optimization is used with a QUALIFY clause. #98433 (Alexey Milovidov).
  • Fix exception "cannot be inside Nullable type" when using IN/NOT IN with LowCardinality column arguments (e.g. a NOT IN (b) where a is LowCardinality(String)). #98443 (Alexey Milovidov).
  • Fix "Pipeline stuck" exception in full_sorting_merge joins caused by a deadlock in PingPongProcessor when the FilterBySetOnTheFly optimization created a circular dependency with MergeJoinTransform. #98454 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception "Projection cannot increase the number of rows in a block" when merging parts with TTL that deletes all rows and an aggregate projection with a constant GROUP BY key. #98458 (Alexey Milovidov).
  • Fix logical error exception when CROSS JOIN is used together with INNER JOIN USING. #98459 (Alexey Milovidov).
  • Fix null pointer dereference in dictGetOrDefault when the key argument is Nullable. #98460 (Alexey Milovidov).
  • Fix exception in DISTINCT queries when using aggregate projections and materialize causes LowCardinality type differences between the query and the projection. #98462 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception when arrayJoin is used in a filter expression with OUTER JOIN and join_use_nulls enabled. #98464 (Alexey Milovidov).
  • Fix logical error exception "Replica decided to read in WithOrder mode, not in ReverseOrder" when using parallel replicas with optimize_aggregation_in_order. #98467 (Alexey Milovidov).
  • Fixed ClickHouse Keeper disconnecting Java ZooKeeper clients after addWatch request. The Java client expects a 4-byte ErrorResponse body in the addWatch response, but Keeper was sending an empty body, causing EOFException and session disconnect. This broke Apache Curator's CuratorCache and any Java application using persistent watches. Fixes #98079. #98499 (Antonio Andelic).
  • Fix zk_followers and zk_synced_followers Keeper metrics not decreasing when a follower goes down. Add new zk_learners and zk_synced_non_voting_followers metrics to the mntr four-letter-word command. Fixes #54173. #98504 (Antonio Andelic).
  • Fix a LOGICAL_ERROR exception in renameAndCommitEmptyParts that could occur when TRUNCATE TABLE runs concurrently with OPTIMIZE TABLE using MergeTree transactions. #98508 (Alexey Milovidov).
  • Fixed Keeper's secure raft port ignoring cipherList and dhParamsFile from openSSL configuration, always using defaults instead of user-specified values. Close #51188. #98509 (Antonio Andelic).
  • Fixed misleading Keeper log messages like "Receiving request for session X took 9963 ms" where the reported time was actually spent waiting idle in poll() between heartbeats, not performing the operation itself. Fixes #79026. #98510 (Antonio Andelic).
  • Fix unexpected result with read_in_order_use_virtual_row and monotonic functions, close #97837. #98514 (Vladimir Cherkasov).
  • Fix LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in' when using PREWHERE with IN subquery on MergeTree tables. #98522 (Alexey Milovidov).
  • Fix Keeper TCP connections preventing graceful server shutdown by not responding to shutdown signal. #98525 (Alexey Milovidov).
  • Fix exception "Sorting column wasn't found in the ActionsDAG's outputs" when query_plan_convert_join_to_in is enabled with query_plan_merge_expressions = 0. #98526 (Alexey Milovidov).
  • Fix MongoDB dictionary source failing with named collections. Closes #97840. #98528 (Pablo Marcos).
  • Fixed LOGICAL_ERROR when Identifier is empty after parameter substitution. #98530 (Pervakov Grigorii).
  • Fix pipeline deadlock when using sort_overflow_mode = 'break' together with window functions. #98543 (Alexey Milovidov).
  • Fix column rollback in Buffer engine during handling an exception during appending a new block. Old logic could lead to corrupted in-memory state of columns. #98551 (Pavel Kruglov).
  • Fixed exception Bad cast from type ColumnConst to ColumnDynamic in null-safe comparison (<=> / IS NOT DISTINCT FROM) with const Dynamic or Variant columns and NULL. Also fixed IS DISTINCT FROM with Dynamic/Variant vs NULL always incorrectly returning 0. #98553 (Alexey Milovidov).
  • Fixed usage of the text index with other skip indexes. Previously, logical errors such as "Trying to get non-existing mark" could be thrown when a query filter utilized a text index and other regular skip indexes simultaneously. #98555 (Anton Popov).
  • Fix logical error "TABLE_FUNCTION is not allowed in expression context" when a table function with an alias appears multiple times in the same query scope (e.g. in both PREWHERE and QUALIFY clauses). #98557 (Alexey Milovidov).
  • Fix distributed index analysis with expressions (not just columns) in PK (leads to zero filtering of redundant granules on remote replicas). #98561 (Azat Khuzhin).
  • Disallow dropping column when its subcolumns are used in other columns default/alias expressions and use analyzer for default expressions on alter drop column. #98569 (Nikita Mikhaylov).
  • Fix S3 requests being incorrectly retried on non-retryable errors (including HTTP_CONNECTION_LIMIT_REACHED) in the HTTP client. #98598 (Sema Checherinda).
  • Fixes a decimal overflow when partition pruning with DateTime64. #98628 (Yarik Briukhovetskyi).
  • Fix two bugs in JIT expression compilation: a copy-paste error in nativeCast type checking that made integer-to-integer and float-to-float cast branches unreachable, and incorrect nullptr TargetMachine passed to LLVM PassBuilder preventing target-specific optimization passes from being registered. #98660 (Alexey Milovidov).
  • Fix RBAC bypass that allowed users to DESCRIBE any table via remote(), remoteSecure(), cluster(), or clusterAllReplicas() pointed at localhost, without requiring SHOW_COLUMNS privilege. #98669 (pufit).
  • Fix BAD_GET exception and incorrect query results when a non-boolean expression (e.g. sin(col)) is used in both WHERE and SELECT with a JOIN, due to filter push-down optimization corrupting shared DAG nodes. #98681 (Alexey Milovidov).
  • Fix LOGICAL_ERROR "Replica decided to read in Default mode, not in WithOrder" when using read_in_order_through_join with parallel replicas. #98685 (Alexey Milovidov).
  • Fix exception "Bad cast from type DB::TableFunctionNode to DB::QueryNode" when using input table function as an argument of remote. #98694 (Alexey Milovidov).
  • Fix outdated data parts resurrection caused by incorrectly cleaning up empty covering parts. #98698 (Shaohua Wang).
  • Fix exception in LogicalExpressionOptimizerPass when a boolean function in an equals comparison returns a Variant type. #98712 (Alexey Milovidov).
  • Fix parseDateTimeBestEffort incorrectly parsing words starting with month/weekday prefixes. Closes #97965. #98742 (Pavel Kruglov).
  • Fix UNKNOWN_IDENTIFIER exception when querying merge() table function or Merge engine over tables with JSON columns that have different parameters (e.g. different SKIP fields) and ALIAS columns referencing JSON sub-paths, with the new analyzer enabled. Closes #97812. #98753 (Pavel Kruglov).
  • Fix optimize_skip_unused_shards optimization with the analyzer in case Distributed storage is used in a View. #98754 (Nikolai Kochetov).
  • Fix tuple subcolumn access by name (e.g. SELECT x.a for Tuple(a UUID, b Int32)) for external tables passed via --external in clickhouse-client. Closes #96925. #98755 (Pavel Kruglov).
  • Fix reverseUTF8 exception on invalid (truncated) UTF-8 input. #98770 (Alexey Milovidov).
  • Fix detecting set skip index usefulness with OR with false (i.e. or(x, 0)) predicate. #98776 (Azat Khuzhin).
  • Fix a LOGICAL_ERROR exception (Block structure mismatch in removeUnusedColumns) that could occur with FINAL + PREWHERE + constant WHERE expression + column-independent aggregates like count(). #98778 (Alexey Milovidov).
  • Make system.trace_log entries for ClickHouse dictionaries' auto-reloads have non-empty query IDs. #98784 (Miсhael Stetsyuk).
  • Fixes a crash where we could de-reference a null pointer in system tables created between the time when we snapshot the tables in the IDatabaseTablesIterator::table() call and the tables changing in another thread during later iteration. #98792 (Grant Holly).
  • Fix SYSTEM START REPLICATED VIEW not waking up the refresh task. #98797 (Pablo Marcos).
  • Fix exception "Inconsistent table names" when using view() table function containing JOINs inside another JOIN (only with old analyzer). #98809 (Alexey Milovidov).
  • Fix adjusting RLIMIT_SIGPENDING (via pending_signals). #98829 (Azat Khuzhin).
  • Fix exception when composing loop with cluster table functions. #98860 (Konstantin Bogdanov).
  • LEFT ANTI JOIN with multiple join key columns returned wrong results when enable_join_runtime_filters=1 (which is default). #98871 (Alexander Gololobov).
  • Fix excessive memory usage (~514 MiB) during format auto-detection when reading non-Arrow data (e.g. JSON from url() or file() without explicit format), caused by the ArrowStream reader misinterpreting the first bytes as a huge metadata length. #98893 (Konstantin Bogdanov).
  • Fix WITH FILL STALENESS producing extra filled rows when data is read in multiple chunks (e.g., with small index_granularity). #98895 (Alexey Milovidov).
  • Fix "RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B" LOGICAL_ERROR. #98900 (Azat Khuzhin).
  • Fix memory tracking drift caused by failed allocations not being rolled back, nallocx(0) undefined behavior, and off-by-one in global peak tracking. Extend tracking to cover io_uring ring buffers. #98915 (Antonio Andelic).
  • Forbid attaching to local data lake tables outside user paths, not only creating them. #98936 (Daniil Ivanik).
  • Fix a race condition that could cause a "ReadBuffer is canceled" exception in queries using urlCluster or similar cluster table functions. #98955 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception in financial functions (financialNetPresentValue, financialInternalRateOfReturn, etc.) when BFloat16 type arguments are passed. #98958 (Alexey Milovidov).
  • Fix skip indexes (and primary key conditions) not being applied for ALIAS columns when query plan expression merging is disabled (query_plan_merge_expressions = 0 or query_plan_enable_optimizations = 0). #98960 (Peng).
  • Increment InsertQuery ProfileEvent for async inserts. Closes #98626. #98962 (Narasimha Pakeer).
  • Fix exception "Inconsistent KeyCondition behavior" in debug builds when primary key contains NaN float values, by making accurateLess and accurateEquals handle NaN consistently with ClickHouse sort order. Closes #98075. #98964 (Alexey Milovidov).
  • SummingMergeTree no longer sums Bool (and other domain type) columns. Bool values are kept as-is instead of being arithmetically summed. #98976 (Yash ).
  • Fixes an exception Scalar doesn't exist that occurred when querying a remote shard with optimize_const_name_size set and enable_scalar_subquery_optimization = 0. Large constants replaced with __getScalar references in the remote query were not being sent to the shard, causing the query to fail. #98979 (andriibeee).
  • Fix NOT_FOUND_COLUMN_IN_BLOCK for some queries with GROUP BY and expressions that include inverse dictionary lookup, Date/DateTime conversion comparisons, and tuple comparisons. Closes #98888. #98980 (Nihal Z. Miaji).
  • Fixed undefined behavior (null pointer dereference) when altering a version/sign/is_deleted column to EPHEMERAL or ALIAS in MergeTree engines. Such alterations are now properly rejected. #98985 (Alexey Milovidov).
  • Fixed an issue where system.grants omitted the regular expression parameters for URL and S3 grants in the access_object column. #98987 (DQ).
  • Fixed Iceberg BigLake reads: ADC credentials are now forwarded to the GCS S3 client (fixing 403 errors), OAuth2 credentials are URL-encoded before sending (fixing auth failures for tokens with special characters), and namespace traversal no longer aborts on BigLake HTTP 400 responses. #98998 (Nikita Fomichev).
  • Fixed clickhouse-client failing to switch timezone when TZ environment variable uses POSIX file path syntax (e.g. TZ=:/etc/localtime). #99000 (Yash ).
  • Fix incorrect or less pruning when startsWith, LIKE, NOT LIKE used with FixedString column. Additionally, FixedString to String cast function can now prune granules when wrapped around key column. Closes #98940. #99001 (Nihal Z. Miaji).
  • Fixed windowFunnel with strict_deduplication returning incorrect level when a duplicate event was encountered. #99003 (Yash ).
  • Fixes a bug where EXISTS would ignore LIMIT and OFFSET clauses in subqueries, causing incorrect results when the subquery returned no rows due to an offset or a zero limit. Closes #88722. #99005 (andriibeee).
  • Fix "Block structure mismatch" exception when filter push-down optimization encounters an AND expression that short-circuits to a constant with GROUPING SETS. #99010 (Alexey Milovidov).
  • Fix exception when reading patch parts (lightweight updates) without _part_offset column in the query plan. #99023 (Alexey Milovidov).
  • A query like SELECT * FROM table WHERE pk_id = '' where pk_id is the primary key and of String type will now correctly use the primary key index for filtering granules. #99027 (Shankar Iyer).
  • Fix DEPENDENCIES_NOT_FOUND exception in Kafka engine when materialized view is detached while the background thread is streaming data. #99028 (Alexey Milovidov).
  • Fix exception when creating a table with an EPHEMERAL column that has the same name as a virtual column (e.g., _part_offset). #99031 (Alexey Milovidov).
  • Fix misleading "inflate failed: buffer error" when reading non-existent compressed files via url() table function with glob patterns. Now returns empty result as expected when http_skip_not_found_url_for_globs is enabled. #99034 (Alexey Milovidov).
  • Fix server crash (std::terminate) when executing ALTER TABLE ... DROP PART on a patch part after a schema change (e.g. ADD COLUMN). The crash was caused by missing system columns (_part) in the empty coverage part metadata, leading to an uncaught exception inside a NOEXCEPT_SCOPE. #99036 (Peng).
  • ClickHouse server process could crash if there was a memory limit exceeded exception thrown during a cached disk read. That is now fixed. #99042 (Shankar Iyer).
  • Fix LOGICAL_ERROR when querying a table that has both a ROW POLICY and an ALIAS column using dictGet. The issue was caused by premature access to the table expression during ALIAS column resolution in the new analyzer. #99065 (Peng).
  • Fix out of bounds error when user tries to query only virtual columns from Iceberg table with Avro format for data. It's super rare scenario so not marking it as critical. Fixes #88238. #99080 (alesapin).
  • Fix segfault in recursive CTE with remote() + view(). #99081 (Konstantin Bogdanov).
  • Skip unnecessary extra index analysis when read-in-order optimization is applied. #99084 (Vladimir Cherkasov).
  • Fixed a crash triggered by a memory limit exception thrown during patch part application. #99086 (Anton Popov).
  • Fix debug assertion in DDLWorker caused by stale first_failed_task_name after a ZooKeeper entry is deleted during reinitialization recovery. #99099 (Antonio Andelic).
  • Fixed rebuild of text indexes on merges with TTL. #99107 (Anton Popov).
  • Fix crash in ALTER TABLE ... REMOVE SETTINGS query for Iceberg table engine. Fixes #86330. #99108 (alesapin).
  • Fixes a bug in query_plan_convert_any_join_to_semi_or_anti_join optimization, returning an incorrect result for unmatched rows. Related: https://github.com/ClickHouse/ClickHouse/pull/95995. #99112 (Yarik Briukhovetskyi).
  • Fix LOGICAL_ERROR exception in ASTColumnsExceptTransformer::transform. #99119 (Pablo Marcos).
  • Fix RBAC bypass that allowed users to obtain table structure via DESCRIBE TABLE or CREATE TABLE AS on table functions (mysql(), postgresql(), sqlite(), arrowFlight(), jdbc(), odbc(), etc.) without the required source access privileges. For functions that infer schema from remote servers, this also allowed triggering outbound connections (SSRF) without authorization. #99122 (pufit).
  • Fix Keeper crash (segfault in NuRaft) during dynamic reconfiguration and leadership transfer. #99133 (JIaQi Tang).
  • Fix crash on usage of Buffer table with SAMPLE when destination does not support it. #99141 (Kseniia Sumarokova).
  • Fix LOGICAL_ERROR due to patch parts column order mismatch. #99164 (Pablo Marcos).
  • Fix very rare crash when Iceberg table contains files of mixed format (ORC and Parquet). Fixes #88126. #99168 (alesapin).
  • Fix max_execution_time not being applied for backup/restore. #99205 (Kseniia Sumarokova).
  • Fix insert_deduplication_token being silently ignored for INSERT SELECT queries without ORDER BY ALL. Previously, deduplication was disabled entirely for unsorted INSERT SELECT, even when an explicit user token was provided. Now, providing insert_deduplication_token is sufficient to enable deduplication regardless of ORDER BY ALL. #99206 (Desel72).
  • Fix excessive access checks during InverseDictionaryLookupPass optimization by checking CREATE_TEMPORARY_TABLE grant once before the pass instead of for every visited node. #99210 (Mikhail Artemenko).
  • Fix clickhouse format --obfuscate producing invalid SQL by obfuscating skip index types, compression codec names, database engine names, and dictionary layout/source definitions. #99260 (Raúl Marín).
  • Fixed a bug where, in some cases, comparing between Time[64] and DateTime[64] types was confusing; now, in cases like this, Time[64] values are promoted to DateTime[64] by adding the 1970-01-01 as a date part. #99267 (Yarik Briukhovetskyi).
  • Clamp settings constraints in DDL worker for distributed DDL queries. #99317 (Pablo Marcos).
  • Fix minor issues with TOTP authentication: the --one-time-password CLI option with empty password, validation of <digits> and <period> configuration values. #99322 (Vladimir Cherkasov).
  • Fix logical error unordered_map::at: key not found in Avro output format when serializing Enum8/Enum16 columns with values not present in the enum definition. #99332 (Desel72).
  • Fix CHECK TABLE with sparse serialization inside Tuple with Dynamic. Closes #96588. #99351 (Pavel Kruglov).
  • Fixed too strict validation of text index preprocessor. #99359 (Anton Popov).
  • Fix compatibility when upgrading replicated tables with implicit minmax indices from 25.10 to newer versions. #99392 (Raúl Marín).
  • Removed support for negated functions (notEquals, notLike, notIn) in text index analysis. These functions could never skip any granules, so analyzing the index for them only added overhead without any benefit. #99393 (Anton Popov).
  • Fix optimize_skip_unused_shards with a new analyzer for the case when a Distributed table was used inside an IN subquery. #99436 (Nikolai Kochetov).
  • Fix heap-use-after-free in INTERSECT/EXCEPT when the query produces duplicate column names. #99471 (Alexey Milovidov).
  • Fix logical error in ALTER TABLE ... DROP PART when a typed query parameter is used for the part name. #99489 (Alexey Milovidov).
  • Fixed NOT_FOUND_COLUMN_IN_BLOCK exception when a text index predicate (e.g. hasAllTokens) is referenced in both SELECT and WHERE clauses via an alias. #99504 (Anton Popov).
  • Fix incorrect results when using hasAllTokens with OR across columns that have separate text indexes. #99505 (Anton Popov).
  • Initialize page cache in clickhouse-local so that page_cache_max_size setting takes effect. #99510 (Alexey Milovidov).
  • Fixed rare incorrect marking of a data part as broken and detaching it after DETACH/ATTACH TABLE query. #99529 (Anton Popov).
  • Fix std::length_error exception when querying empty system tables with Pretty format via HTTP interface. #99541 (Alexey Milovidov).
  • Fix LOGICAL_ERROR when using ALTER TABLE ADD COLUMN to create an EPHEMERAL column with the same name as a virtual column (e.g. _part_offset). #99549 (Alexey Milovidov).
  • Fix VectorSimilarityIndexCache entries never being evicted after part removal due to mismatched cache keys. #99575 (Seva Potapov).
  • Forbid reading Google credentials from a local file. This setting is insecure because it allows reading other credentials if the file path is known. #99584 (Konstantin Vedernikov).
  • Fix performance degradation in the analyzer. Prune unused columns from ARRAY JOIN. #99587 (Dmitry Novik).
  • Fixed reading of text index in table with existing lightweight deletes and row policies. #99661 (Anton Popov).
  • Fix nullptr dereference in Parquet reader when filter-in-decoder path encounters filtered-out pages. Closes #99676. #99677 (Alexey Milovidov).
  • Fix incorrect seek in AsynchronousReadBufferFromFileDescriptor with O_DIRECT. Closes #99358. #99678 (Pavel Kruglov).
  • Fixed heap-buffer-overflow in CompressionCodecT64 and process abort in CompressionCodecMultiple when decompressing malformed compressed data. Both issues were found by new libFuzzer targets. The codecs now throw an exception instead of crashing. #99680 (Rahul).
  • Delay processing until server has finished loading all the tables. #99700 (Seva Potapov).
  • Fix MySQL dictionary source bypassing RemoteHostFilter for inline DDL params. #99720 (Shaohua Wang).
  • Fix logical error when iterating over data lake tables in system.tables. #99739 (Konstantin Vedernikov).
  • Fixed analysis of predicates with the IN function by text index with the preprocessor. Fixed the collision of searched tokens in the text index, which could lead to incorrect results. #99755 (Anton Popov).
  • Fix infinite loop when reading Npy format files with negative shape dimensions. #99812 (Desel72).
  • Fix global-buffer-overflow in CRC32 function on FixedString arguments when evaluated with zero rows during query plan header computation. #99835 (Alexey Milovidov).
  • Fix crash (null pointer dereference) when executing ALTER TABLE ... MODIFY COLUMN ... COMMENT on Iceberg tables. #99838 (Desel72).
  • Fix aggregate_functions_null_for_empty setting to work with aggregate functions returning non-Nullable types such as Array or Map (e.g., groupArray, sumMap). #99839 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception in midpoint function when called with mixed signed/unsigned integer types. #99867 (Alexey Milovidov).
  • Fix "Block structure mismatch" exception in queries with HAVING clause where the filter expression contains both an aggregate wrapped in a NULL-producing function and materialize(0). #99915 (Alexey Milovidov).
  • Fix assertion failure in sipHash128Keyed (and similar keyed hash functions) when the data argument is a Map with array keys or other nested array types. #99921 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception "Not-ready Set" in IN function during query plan optimization with convertAnyJoinToSemiOrAntiJoin. #99939 (Alexey Milovidov).

Build/Testing/Packaging Improvement

  • Reduce compilation time by removing heavy header includes and moving expensive template instantiations out of headers. #97893 (Raúl Marín).
  • Reduce compile time of arithmetic functions and related headers by shrinking template dispatch matrices and removing heavy includes. #98204 (Raúl Marín).
  • Use mongo-c-driver 2.2.2. #98304 (Konstantin Bogdanov).
  • Use postgres REL_18_3. #98306 (Konstantin Bogdanov).
  • Enable jemalloc allocator for UBSan builds to avoid RSS accumulation from glibc malloc's poor memory reclamation behavior. #98444 (Alexey Milovidov).
  • Use Rust v0 symbol mangling and strip internal symbols from PRQL library to reduce symbol name bloat from parser combinator libraries. #98446 (Alexey Milovidov).
  • Add TPC-H benchmark suite and TPC-DS README to tests/benchmarks. #98495 (Raufs Dunamalijevs).
  • Add correctness tests for all 99 TPC-DS queries. #99204 (Raufs Dunamalijevs).
  • Add integration test reproducing DDL CREATE TABLE + ALTER with offline replica bug (#44070), marked as expected failure. #99259 (Raufs Dunamalijevs).
  • Integrate jemalloc with je_ prefix and remove usage of linker's --wrap. #99342 (Azat Khuzhin).

ClickHouse release 26.2, 2026-02-26. Presentation, Video

Backward Incompatible Change

  • Deduplication is turned ON for all inserts by default. It was OFF before for async inserts and for MV's, but it was ON for sync inserts. The goal is to have the same defaults for both ways of inserts. If you have deduplication explicitly disabled on your cluster, you have to explicitly set deduplicate_insert='backward_compatible_choice' to keep the old behavior. The same with deduplicate_blocks_in_dependent_materialized_views. #95970 (Sema Checherinda).
  • Improved storage format of statistics. All statistics are now stored in a single file. #93414 (Anton Popov). If you didn't explicitly enable table statistics, you can ignore this item.
  • Limit S3(Azure)Queue in-memory metadata. System tables are renamed from azure_queue to azure_queue_metadata_cache and system.s3queue to s3queue_metadata_cache. #95809 (Kseniia Sumarokova).
  • Previously, applying a function to a Variant column silently returned NULLs when a variant sub-type was incompatible with the function; now it throws an exception, which may break queries that relied on the silent NULL behavior. #95811 (Bharat Nallan).
  • DATE columns from PostgreSQL are now inferred as Date32 in ClickHouse (in previous versions they were inferred as Date, which led to overflow of the values outside of a narrow range). Allow inserting Date32 values back to PostgreSQL. Closes #73084. #95999 (Alexey Milovidov).
  • The semantics of the do_not_merge_across_partitions_select_final setting were made more obvious. Previously, the feature could be automatically enabled when the setting was not explicitly set in the configs. It caused confusion repeatedly and, unfortunately, led to some issues in production. Now, the rules are simpler: do_not_merge_across_partitions_select_final=1 enables the functionality unconditionally. If do_not_merge_across_partitions_select_final=0, then automatic is used only if the new setting enable_automatic_decision_for_merging_across_partitions_for_final=1 and not used otherwise. To preserve the old behaviour as much as possible, the defaults were set to do_not_merge_across_partitions_select_final=0 and enable_automatic_decision_for_merging_across_partitions_for_final=1. #96110 (Nikita Taranov).
  • When creating an S3 table with explicitly specified columns, ClickHouse now validates that those column names actually exist in the remote file's schema. Queries that previously worked with mismatched column names will now fail at table creation time. This closes #96089. #96194 (Konstantin Vedernikov).
  • Forbid using subqueries in ORDER BY and other table key expressions. #96847 (Alexey Milovidov).
  • Enable apply_row_policy_after_final by default. Initially, when optimize_move_to_prewhere_if_final=0, both ROW POLICY and PREWHERE respect FINAL and were applied after FINAL. This was broken by #87303, which ignored the optimize_move_to_prewhere_if_final for the ROW POLICY filter. To fix this, this PR enables the setting apply_row_policy_after_final introduced in #91065. With apply_row_policy_after_final enabled, ROW POLICY would continue to respect FINAL by default, as previously. This PR is an incompatible change because it changes the behaviour for optimize_move_to_prewhere_if_final=1. Now, to get the ROW POLICY applied before FINAL, apply_row_policy_after_final should be used instead of optimize_move_to_prewhere_if_final. #97279 (Nikolai Kochetov).
  • The Date type is now serialized as Arrow's native date32 type in Arrow/ArrowStream formats, instead of uint16. Tools like PyArrow will now correctly see the column as a date type. The old behavior can be restored with the output_format_arrow_date_as_uint16 setting. Reading old Arrow files that used uint16 for Date columns is still supported. #96860 (Alexey Milovidov).

New Feature

  • Users can now use ClickStack (an observability UI) directly from ClickHouse, useful for debugging and local development. #96597 (Aaron Knudtson).
  • Support time-based one-time password (TOTP) as an authentication method. #71273 (Vladimir Cherkasov).
  • Add lazy_load_tables database setting. When enabled, tables are not loaded during database startup — a lightweight StorageTableProxy is created instead and the real table engine is materialized on first access. #96283 (xiaohuanlin).
  • Added input_format_max_block_wait_ms setting to emit data blocks by timeout and allowed processing of remaining data when an HTTP connection is closed unexpectedly. #94509 (Mostafa Mohamed Salah).
  • Google BigLake catalog integration. This closes #95339. #97104 (Konstantin Vedernikov).
  • Added system table system.tokenizers which shows all available tokenizers. #96753 (Robert Schulze).
  • Add new system table system.user_defined_functions to monitor UDF loading status and configuration. #90340 (Xu Jia).
  • Add system.jemalloc_stats table exposing jemalloc memory allocator statistics (via malloc_stats_print) for diagnosing memory usage on servers built with jemalloc. Also add a /jemalloc.html HTTP endpoint on the ClickHouse HTTP interface for interactive visualization of these statistics. #97077 (Antonio Andelic).
  • Added system.jemalloc_profile_text table for reading and analyzing jemalloc heap profiles. The output format is controlled by the jemalloc_profile_text_output_format setting (raw, symbolized, or collapsed; default collapsed). Inline frame resolution is controlled by jemalloc_profile_text_symbolize_with_inline (when enabled, inline frames are included at the cost of slower symbolization; when disabled, they are skipped for faster output). For the collapsed format, jemalloc_profile_text_collapsed_use_count controls whether stacks are weighted by live allocation count (true) or live bytes (false, default). This enables easier memory profiling and flame graph visualization of jemalloc heap profiles. Fixes #93248. #97218 (Antonio Andelic).
  • Add the default_dictionary_database setting, which lets ClickHouse resolve external dictionaries referenced without a database qualifier in a specified default database. This simplifies migration from XML-defined global dictionaries to SQL-defined per-database dictionaries—allowing existing dictionary queries (e.g. dictGet('name', …)) to continue working without modification. #91412 (Dmitrii Plotnikov).
  • Support auxiliary zookeeper for DatabaseReplicated. #91683 (RinChanNOW).
  • Implement new table function primes and new system table system.primes that contains prime numbers in ascending order. Closes #90839. #92776 (Nihal Z. Miaji).
  • Async inserts support parallel quorum. The inserted data is replicated to the quorum. If duplicates are found, query waits until previously inserted data is replicated as well. #93356 (Sema Checherinda).
  • Added functions colorOKLABToSRGB, colorSRGBToOKLAB to convert value from sRGB to OKLAB and vice versa. #93361 (Pranav Tiwari).
  • A new deduplicate_insert setting which overrides insert_deduplicate and async_insert_deduplicate. #94413 (Sema Checherinda).
  • Server setting insert_deduplication_version makes it possible to migrate on unified deduplication hash. #95409 (Sema Checherinda).
  • Add xxh3_128 hashing function. #96055 (Raúl Marín).
  • Added OPTIMIZE <table> DRY RUN PARTS <part names> query to simulate merges without committing the result part. It may be useful for testing purposes: verifying merge correctness in the new version, deterministically reproducing merge-related bugs, and reliably benchmarking merge performance. #96122 (Anton Popov).
  • Add a new check enabled by default via setting check_named_collection_dependencies to avoid dropping named collections used by tables. #96181 (Pablo Marcos).
  • Added system.fail_points to inspect existing failpoints in the server and whether they are enabled or not. This is going to help automate testing. #96762 (Pedro Ferreira).
  • Add role-based access to Glue catalog. Use settings aws_role_arn and, optionally, aws_role_session_name. #90825 (Antonio Andelic).
  • Added a setting add_minmax_index_for_temporal_columns that, when enabled, automatically creates minmax indexes for all Date, Date32, Time, Time64, DateTime, and DateTime64 columns. #93355 (Michael Jarrett).
  • Support for extended table aliases for JOINs (queries like SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b). Closes #95131. #95331 (Yarik Briukhovetskyi).
  • Added support for ALTER TABLE RENAME COLUMN for Iceberg tables. Previously only ADD COLUMN, DROP COLUMN, and MODIFY COLUMN were supported. #97455 (murphy-4o).

Experimental Feature

  • The text index is now GA. #96794 (Robert Schulze).
  • The QBit data type for quantized bit-packed vector storage (used for approximate nearest-neighbor search) is now generally available and no longer requires enabling an experimental setting. #95358 (Raufs Dunamalijevs).
  • Vector search in ClickHouse can now use replicas in the cluster to distribute the load and search of vector index parts. This enables ClickHouse to support large vector indexes that exceed the memory capacity of a single VM. #95876 (Shankar Iyer).
  • Add server-side AST fuzzer controlled by ast_fuzzer_runs and ast_fuzzer_any_query settings. When enabled, the server runs randomized mutations of each query after its normal execution, discarding the results. #97568 (Alexey Milovidov).
  • Add iif function to the experimental KQL dialect. #94790 (happyso).
  • Schema inference now respects allow_experimental_nullable_tuple_type. When enabled, it allows inferred tuple types to be Nullable(Tuple(...)), so missing nested objects can become NULL instead of a tuple of NULL elements. #95525 (Nihal Z. Miaji).
  • The use_statistics_cache setting is now enabled by default, so column statistics are cached in memory to speed up query optimization without needing to reload them from each part. #95950 (Han Fei).

Performance Improvement

  • Allow any deterministic expression in Primary Key to be used for data skipping (e.g. ORDER BY cityHash64(user_id)/ ORDER BY length(user_id)). For deterministic expressions, ClickHouse can apply the expression to query constants and use the result in the primary key index for predicates like =, IN, and has. If the expression is also injective (e.g. ORDER BY hex(p) or ORDER BY reverse(tuple(reverse(p), hex(p)))), we can effectively use the index for the negated forms: !=, NOT IN, and NOT has. Closes #10685. Closes #82161. #92952 (Nihal Z. Miaji).
  • Improved storage format of statistics. All statistics are now stored in a single file. #93414 (Anton Popov).
  • Allow parallelized read for remote table engines/functions in the filesystem cache. #71781 (Kseniia Sumarokova).
  • Allow using userspace page cache with local files and object storage table functions. #77874 (Michael Kolupaev).
  • Avoid unnecessary memcpy in userspace page cache. #77884 (Michael Kolupaev).
  • The default for concurrent_threads_scheduler is now max_min_fair instead of fair_round_robin. This improves fairness under high load by prioritizing queries with fewer allocated slots, so short-running queries aren't penalized by long-running ones. #95300 (Sergei Trifonov).
  • If a FINAL query used primary key condition for filtering followed by skip indexes for other conditions, the PrimaryKeyExpand processing step will now only check the initial shortlisted primary key ranges for intersection. #94903 (Shankar Iyer).
  • When using parallel replicas with table functions like s3(...), queries with a single subquery wrapping the table function are now automatically parallelized across replicas, whereas previously only direct table function references were parallelized. Closes #92264. #96332 (phulv94).
  • Enable splitting data and system files in cache into separate segments. #87834 (MikhailBurdukov).
  • Speed up some hash join operations by implementing dynamic dispatch for ColumnVector::replicate. #79573 (Raúl Marín).
  • Performance improvement for parallel hash join in cases of complex predicates. Previously, we were processing non-joined rows in one thread, which is suboptimal the idea of the optimization is to parallelize the processing of the non-joined rows across multiple threads. Can be toggled by the parallel_non_joined_rows_processing setting. Enabled by default. #92068 (Yarik Briukhovetskyi).
  • Slightly optimize parsing of JSON type. #93614 (Pavel Kruglov).
  • Improve memory footprint of AST. Optimization makes sense as fields are not used when highlighting is not used and there is no VALUES parsing. #93974 (Ilya Yatsishin).
  • Optimize memory consumption of named Tuple AST objects. Place column names as strings in tuple object instead of having them in generic AST literal nodes. #94704 (Ilya Yatsishin).
  • Devirtualization is improved with additional linker options. #94737 (Nikita Taranov).
  • Improve clone replica performance for ReplicatedMergeTree tables with many parts by batching ZooKeeper requests. #94847 (c-end).
  • When read step already has PREWHERE filters a new filter couldn't be added. This change postpones PREWHERE optimization until after JOIN runtime filter optimization so that runtime filters can be also pushed to PREWHERE. #95838 (Alexander Gololobov).
  • Speedup T64 codec compression by using dynamic dispatch on x86. #95881 (Raúl Marín).
  • Speed up uniq over numeric types by batching inserts when possible (not null, not -If, no GROUP BY, no IPv6 or String). #95904 (Raúl Marín).
  • Low-level optimizations for Keeper: ZooKeeper::observeOperations has been found to account for >20% of the ZooKeeper receive thread CPU consumption. This change addresses that by: 1. For AggregatedZooKeeperLog::stats, use CityHash64 instead of SipHash which is >10x faster. 2. For Coordination::ErrorCounter, use std::array<std::atomic<UInt32>, N> instead of std::unordered_map and std::mutex. #95962 (Miсhael Stetsyuk).
  • Remove 64-byte alignment for ProfileEvents::Counter to save memory. #96097 (Azat Khuzhin).
  • Memory optimization: trim size of CachedOnDiskReadBufferFromFile structure 50x. #96098 (Azat Khuzhin).
  • Don't copy old data on hash table resizing if it's empty. #96180 (Raúl Marín).
  • Support JOIN runtime filters for RIGHT OUTER JOINs. #96183 (Hechem Selmi).
  • The optimization enable_join_runtime_filters is now the default. #89314 (Alexey Milovidov).
  • Previously, text index direct read optimization was applied only when all parts had a materialized text index. This PR adds partial support: if some parts have a materialized text index, those parts will use it, while parts without a materialized text index will fall back to executing the original filter expression. #96411 (Anton Popov).
  • Added minmax secondary indexes on time columns and bloom_filter indexes on query_id/initial_query_id columns to system log tables for faster filtering. #96712 (Alexey Milovidov).
  • Lazy materialization optimization is now applied to all branches of a UNION ALL query, not just the first one. Queries that combine multiple sorted and limited reads from different MergeTree tables via UNION ALL will now benefit from deferred column reading on every branch, reducing I/O. #96832 (Federico Ginosa).
  • Optimize minmax skip index computation during INSERT by removing an unnecessary data copy and enabling vectorized min/max calculation for numeric columns. #97392 (Raúl Marín).
  • Storage DeltaLake now takes count() result from delta lake metadata and shows correct table stats in system.tables (total bytes/rows). #96190 (Kseniia Sumarokova).
  • The unused columns are removed also from the reading step in case of reading from a MergeTree. It is especially useful when a filter is pushed down into PREWHERE. #89982 (János Benjamin Antal).
  • Improved processing SHOW TABLES query by fetching only names of tables and improved getLightweightTablesIterator to return structure containing only table names. resolves #93835. #94467 (Smita Kulkarni).
  • Improve assumeNotNull, coalesce, ifNull to enable primary key and skip index pruning for range predicates when key columns are wrapped in these functions. Closes #94689. #94754 (Nihal Z. Miaji).
  • Add with_data & with_stat extension to getChildren Keeper request. This allows fetching not only the list of children, but also their stat and/or data in a single operation. #94826 (Nikolay Degterinsky).
  • The index analysis is done only once (in most cases) regardless of whether we end up executing a local plan or a plan with parallel replicas. #94854 (Nikita Taranov).
  • Allow to enable distributed index analysis based on amount of parts (distributed_index_analysis_min_parts_to_activate) and indexes size (distributed_index_analysis_min_indexes_size_to_activate). #95216 (Azat Khuzhin).
  • Enable PREWHERE optimization for Iceberg tables. #95476 (Konstantin Vedernikov).
  • Reduce the memory footprint of some AST classes. #95514 (Raúl Marín).
  • Limit the number of pipeline streams generated with split_intersecting_parts_ranges_into_layers enabled. Helps to avoid excessive memory consumption. #96478 (Nikita Taranov).
  • Implement equivalent sets optimization for multiple joins. Queries with multiple consecutive INNER JOIN operations now benefit from improved filter pushdown optimization. When tables are joined on equivalent columns (e.g., t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10), filters applied to any table in the chain are automatically pushed down to all tables. Close #96550. #96596 (Vladimir Cherkasov).
  • Optimize delta lake metadata scan. Uses changes from delta-kernel PR https://github.com/delta-io/delta-kernel-rs/pull/1827. #96686 (Kseniia Sumarokova).
  • In Replicated database, don't update the cached cluster for every dummy query. #96897 (Tuan Pham Anh).
  • Use the primary key index when filtering with startsWithUTF8 if the prefix contains only ASCII characters. #97055 (vkcku).

Improvement

  • Add OpenTelemetry tracing for Keeper requests. #91332 (Miсhael Stetsyuk).
  • New configuration options: logger.startup_console_level & logger.shutdown_console_level to allow for overriding the console log level during the startup & shutdown of ClickHouse respectively. #95919 (Garrett Thomas).
  • Respect command-line overrides when reloading configuration. Closes #80294. #80295 (Alexey Milovidov).
  • Allow key-value overrides for named collection parameters in mongodb table function. #89616 (vanchaklar).
  • The read-in-order optimization for Iceberg tables now works with complex sorting functions like icebergBucket and icebergTruncate, not just simple column references. #90256 (Konstantin Vedernikov).
  • Add a new column named parts_postpone_reasons in system.mutations to improve diagnostics, which shows the parts postpone reasons. #92206 (Shaohua Wang).
  • Track changes in the number of rows to read (due to inserts/deletes or query condition cache usage) in DataflowStatisticsCache. #93636 (Nikita Taranov).
  • Support SYSTEM RESET DDL WORKER [ON CLUSTER] query. It requests to reset the state of DDLWorker in its main thread. It is helpful to refresh the replica active when host IDs are updated. #93780 (Tuan Pham Anh).
  • Support mutation_ids in system.part_log for event type of MUTATE_PART and MUTATE_PART_START. #93811 (Shaohua Wang).
  • Background operations (Mutate, Merge) can now be configured independently via 'background' profile. Previously such operations shared settings with regular queries via 'default' profile. #93905 (Arsen Muk).
  • Add more information to system.crash_log. #94112 #95857 (Miсhael Stetsyuk).
  • Added new QueryNonInternal metric to track the number of executing non-internal queries. This metric is exposed as ClickHouseMetrics_QueryNonInternal and helps operators monitor query concurrency against the max_concurrent_queries limit, which only applies to non-internal queries. #94284 (Ashwath Singh).
  • Support input bytes statistics collection for columns from compact parts in RuntimeDataflowStatisticsCacheUpdater. #94626 (Nikita Taranov).
  • Add a check for Keeper misconfiguration leading to cluster assembly failures. Closes #60932. #94682 (Konstantin Bogdanov).
  • Improve JSON prefixes deserialization during part loading. #94848 (Pavel Kruglov).
  • Refactor the write using full INSERT pipeline, which triggers materialized views on the target table. #94890 (Kai Zhu).
  • Use vector similarity search plan optimizations only if the index exists for the search column. #94998 (Eduard Karacharov).
  • Check for the total memory limit before the user authentication and throw (total) memory limit exceeded if the total limit is more than allowed. #95003 (Nikolai Kochetov).
  • Added the throw_on_unmatched_row_policies configuration option which, when enabled, throws an exception if a user queries a table that has row policies but none of them apply to that user — preventing the ambiguous behavior of returning all rows due to access control misconfiguration. #95014 (Vitaly Baranov).
  • Dynamic update s3 access tokens in long queries with unity catalog. This closes #93981. #95069 (Konstantin Vedernikov).
  • Disable jemalloc's dirty page decay if ClickHouse is under sustained memory pressure for memory_worker_decay_adjustment_period_ms milliseconds. Enable jemalloc's dirty page decay back if ClickHouse is working under normal conditions for same amount of time. #95145 (Antonio Andelic).
  • S3Queue auxiliary Zookeeper support using keeper_path setting from s3Queue. #95203 (Diego Nieto).
  • Respect max_parts_to_merge_at_once in TTL drop part merges. #95315 (Kseniia Sumarokova).
  • Add connection_address and connection_port to query_log to reflect physical connection (address and port are replaced when connected through proxy and auth_use_forwarded_address=1). #95471 (Yakov Olkhovskiy).
  • Fix incorrect memory accounting for the query conditions cache. The key problem was that it didn't take into account the cache key that composed of several strings (like part_name, the table id and the whole SQL condition). #95478 (Nikita Mikhaylov).
  • Server started with the embedded configuration will allow to manipulate users and grants, saving them to the access directory, as the regular configuration does. This improves testing. Also enabled all access_control_improvements in the embedded config and in clickhouse-local. #95481 (Alexey Milovidov).
  • Improved S3 authentication error messages to include a hint to check credentials when access is denied. #95648 (Gerald Latkovic).
  • Enable statistics cache and set the update period of cache to 300s. #95841 (Han Fei).
  • Add component name to system.aggregated_zookeeper_log. #95882 (Antonio Andelic).
  • Skip object storage reads when querying DeltaLake tables from system.tables. #95899 (Antonio Andelic).
  • Enable enable_max_bytes_limit_for_min_age_to_force_merge by default if the compatibility setting is 26.2 or higher. #95917 (Christoph Wurm).
  • Delta Lake is now available on macOS. Closes #95979. #95985 (Alexey Milovidov).
  • In previous versions, when combining conflicting ALTER expressions with UPDATE and RENAME COLUMN, a logical error was thrown instead of a proper exception. Closes #70678. #96022 (Alexey Milovidov).
  • Improve the help output for all ClickHouse applications and add a --no-sudo option with a few fixes. This is a continuation of #58244 from Ilya Yatsishin. #96025 (Alexey Milovidov).
  • Add distanceCosine alias for cosineDistance because all other distance functions already have alias of this form. #96065 (Raufs Dunamalijevs).
  • Add support for the with_data Keeper extension to improve table fetching in Database Replicated. #96090 (Nikolay Degterinsky).
  • Update chdig to v26.2.1 (new features and MacOS support). #96113 (Azat Khuzhin).
  • Improve filter pushdown for numbers and primes. ClickHouse can now derive conservative value bounds from WHERE conditions when exact bounds cannot be derived, and restrict sequence generation accordingly (for example, for WHERE number % 5 < 2 AND number > 100 AND number < 300, ClickHouse will only generate numbers between 100 and 300, then apply the predicate), avoiding unbounded scans. Closes #84853. Closes #93913. #96115 (Nihal Z. Miaji).
  • The formatter previously wrapped SELECT in parentheses when a COMMENT clause was present to disambiguate parsing. Instead, output COMMENT before AS SELECT, which eliminates the ambiguity without parentheses. #96293 (Alexey Milovidov).
  • The allow_impersonate_user config setting is now located inside the access_control_improvements section rather than being a standalone server setting. #96451 (Vitaly Baranov).
  • Make core_dump.size_limit configuration setting hot-reloadable, to avoid having to restart servers for configuration changes to take place. #96524 (Miсhael Stetsyuk).
  • Improves CPU and real-time profiler interoperability with socket timeouts. #96601 (Sergei Trifonov).
  • Prevent the resurrection of dropped data if ADD COLUMN is run quickly after the DROP COLUMN mutation. #96713 (Alexey Milovidov).
  • Change function_id type in system.instrumentation from LowCardinality(Int32) to Int32. #96726 (Copilot).
  • Synchronous waiting for mutations will respect query cancellation and time limits. #96756 (Alexey Milovidov).
  • Added system command SYSTEM RELOAD DELTA KERNEL TRACING <level> to be able to change delta-kernel logging, which can be useful for debugging. #96763 (Kseniia Sumarokova).
  • Filtering by IP address family, i.e. dns_allow_resolve_names_to_ipv4/ipv6 settings, are applied even if DNS cache is disabled. #96810 (c-end).
  • Better jemalloc introspection. #96840 (Azat Khuzhin).
  • Fix /play Web UI throwing QUERY_CACHE_USED_WITH_SYSTEM_TABLE when querying system tables. #96869 (Alexey Milovidov).
  • Improve Web UI: change favicon to indicate running query state; display errors from auxiliary queries (loading databases and tables) instead of silently ignoring them. Closes #85055. #96883 (Alexey Milovidov).
  • Make the left panel in /play UI clickable to toggle the database list. #96884 (Alexey Milovidov).
  • DROP DATABASE now drops tables in reverse dependency order, improving crash-safety when the database contains tables with loading dependencies (e.g. Distributed tables using joinGet). #97057 (Alexey Milovidov).
  • Bump yaml-cpp to prevent skipping invalid YAML. #97333 (Azat Khuzhin).
  • Show a loading indicator in the play.html sidebar while tables are being fetched. #97531 (Alexey Milovidov).
  • Add a copy-to-clipboard button for raw query results in the built-in web UI (play.html). #97532 (Alexey Milovidov).
  • Fix query obfuscator (clickhouse-format --obfuscate) to produce parseable SQL in more cases. #97584 (Alexey Milovidov).

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

  • After metadata-only ALTERs, such as extending the elements of Enums, the optimization of aggregation with projection may end up producing an exception. #84143 (Alexey Milovidov).
  • Materialized views now use the database where they were created as execution context, meaning that: - it is possible to omit explicit database qualification on names referred in view's select query - if no explicit database qualification is given, the same database where the materialized view was created is assumed. #88193 (Dmitry Kovalev).
  • Fix query parameter substitution in CREATE USER authentication methods when using ON CLUSTER. Query parameters in authentication methods (e.g., password) were not being replaced, causing UNKNOWN_QUERY_PARAMETER errors on remote nodes. #92777 (xiaohuanlin).
  • Fixed inconsistencies in text index analysis for has, mapContainsKey, and mapContainsValue functions. Previously, queries using these functions could return different results depending on whether the expression was evaluated with or without a text index. #93578 (Anton Popov).
  • Fix crash when attaching a table to a MaterializedPostgreSQL database if dropReplicationSlot throws during stack unwinding. #96871 (Alexey Milovidov).
  • Backups could crash the server if you do many concurrent backups clashing over the same files. #93659 (Alexey Milovidov).
  • Fixes queries with parallel replicas and JOIN with non-MT table. Closes #92056. #93902 (Igor Nikonov).
  • Fixes an issue when Iceberg columns with dot in names returned NULL as values. #94335 (Mikhail Koviazin).
  • Fixed handling of UTF8 strings in stringJaccardIndexUTF8 and improve performance. #94613 (Joanna Hulboj).
  • Fix possible overflows in WITH FILL STALENESS (that leads to UB or/and endless loops). Fix possible endless loop due to big jumps. Add old analyzer support (mostly for stress tests). #94663 (Azat Khuzhin).
  • Fix possible hung distributed queries when hostnames resolve to multiple addresses and a remote replica freezes. #94726 (c-end).
  • Fix invalid result on joining multiple table expressions, when leftmost table expression is a -Cluster table function. Resolves #89996. #94748 (Konstantin Bogdanov).
  • Fix incorrect primary key and skip index pruning for predicates involving toWeek, toYearWeek, toStartOfWeek, toLastDayOfWeek, and toDayOfWeek, and fix exceptions in some of these functions for valid queries with LowCardinality(String). #94816 (Nihal Z. Miaji).
  • Remove unnecessary skip permissions check in ATTACH queries for a view with SQL Security. This prevents potential privilege escalation when a user attaches a view with a definer without validating required access. #94865 (pufit).
  • Fixes a crash during ReplicatedMergeTree startup caused by concurrent removal of delete_tmp_* directories. #94892 (myeongjun).
  • Fix INSERT into Iceberg tables with materialized views losing deduplication information, which caused an exception. #94938 (Daniil Ivanik).
  • Fix a bug where SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME> would drop the full cache on the cluster. #94978 (Rory Crispin).
  • Preserve constant index granularity (use_const_adaptive_granularity) after Vertical merges (v2 with a fix for Nested, and in general). #95013 (Azat Khuzhin).
  • Fixes race in filesystem cache in version 26.1 after [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764). #95042 (Kseniia Sumarokova).
  • Fix postgresql() table function canceling by KILL QUERY and cancel query (Ctrl+C) in clickhouse-client. #95136 (Roman Vasin).
  • Fixed type inference for qualified columns from source tables when multiple joins are used with USING clause. Previously, subsequent joins incorrectly updated types of underlying source columns to a common supertype even when the column was not involved in that join (e.g., in SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a), the t2.a column is only used by the first join, so its type should be the supertype of t1.a and t2.a, excluding t3.a). This could lead to logical errors or crashes when functions expected different column types than what actually appeared in the execution plan. #95157 (Vladimir Cherkasov).
  • Make column transform only once during getting content of manifest .avro list and files. #95164 (Daniil Ivanik).
  • Fix incorrect calculation of JSON column sizes that could lead to excessive memory usage or wrong column statistics. #95207 (Azat Khuzhin).
  • Fixed inaccurate memory accounting when applying large patch parts after lightweight updates. Previously, applying large patches could cause excessive memory usage and result in the server process being killed by the OOM killer. #95231 (Anton Popov).
  • Fix undefined behavior that could cause incorrect results or an exception when a distributed query with max_parallel_replicas fell back to a local replica during index analysis. #95263 (Azat Khuzhin).
  • Fix aggregation of sparse columns for sum and timeseries when group_by_overflow_mode is set to any. #95301 (Mikhail Koviazin).
  • Fix a reliability issue in plain_rewritable disk policy where a network error mid-way through unlinking a metadata file could leave the storage in an inconsistent state. #95302 (Mikhail Artemenko).
  • Replace Date with Date32 for iceberg. #95322 (Konstantin Vedernikov).
  • The password argument of the redis table function now will be masked in the logs and system tables (e.g.: query_log). #95325 (János Benjamin Antal).
  • Fix a bug where tables could be dropped or altered while a distributed query was still executing against them, potentially causing exceptions or incorrect results. #95356 (Azat Khuzhin).
  • Fix a logical error in some cases when negative LIMIT/OFFSET is used in distributed queries. #95357 (Nihal Z. Miaji).
  • Fix a bug where clickhouse-client would ask for password twice when connecting using ssh. #95372 (Isak Ellmer).
  • Fix a data race in storage S3(Azure)Queue. #95385 (Kseniia Sumarokova).
  • Fix the prewhere filter error caused by lambda expressions in prewhere. #95395 (Xiaozhe Yu).
  • Fix optimize_syntax_fuse_functions to not rewrite sum/count/avg into sumCount() when the aggregate argument is Nullable. Closes #95390. #95441 (Nihal Z. Miaji).
  • Avoid possible crash for distributed queries in case of cancellation. #95466 (Aleksandr Musorin).
  • Fix deduplication for streaming from S3(Azure)Queue engine. #95467 (Kseniia Sumarokova).
  • Fix updating row policies assigned to the initial user in distributed queries. #95469 (Vitaly Baranov).
  • Fix check for encrypted disks over plain_rewritable (Fixes possible It is not possible to register multiple plain-rewritable disks with the same object storage prefix). #95470 (Azat Khuzhin).
  • The mergeTreeProjection table function was missing an access check, allowing users without SELECT permission on a table (but with permissions for table functions) to read data from its projections. This fix adds the same access check that mergeTreeIndex and mergeTreeAnalyzeIndexes already have. #95480 (Alexey Milovidov).
  • Fix possible logical error during reading of size subcolumn from dynamic subcolumns of Dynamic/JSON types. #95573 (Pavel Kruglov).
  • Fix regression in (experimental) zero‑copy replication introduced by #94262 where shared parts could be deleted before other replicas finished fetching them. #95597 (filimonov).
  • Fix crash during tupleElement applied to arrays of JSON. Closes #95581. #95647 (Pavel Kruglov).
  • Fix logical error exception when using a matcher (*) inside a lambda function within a VALUES clause in a JOIN with USING. Close #93675. #95661 (Vladimir Cherkasov).
  • Fixed There was an error: Cannot obtain error message logical error when waiting for a distributed DDL and dropping the Replicated database concurrently. Fixes #95539. #95664 (Alexander Tokmakov).
  • Fix IN function returning incorrect results with NULL values when transform_null_in is enabled. Closes #65776. #95674 (Nihal Z. Miaji).
  • Correctly handle LowCardinality Nullable types in CAST when the setting cast_keep_nullable is enabled. Closes #95670. #95747 (Alexey Milovidov).
  • Fix squashing partitioned delta lake data. #95773 (Kseniia Sumarokova).
  • Fix race condition for Nullable join column in runtime filters. #95775 (Hechem Selmi).
  • Fix possible logical error in query with matcher (*, table.*) and analyzer_compatibility_join_using_top_level_identifier when USING column has different types in tables and select list. Close #90477. #95808 (Vladimir Cherkasov).
  • Fix memory safety bugs in parallel thread pool operations (backups, aggregation, distributed queries) that could cause exceptions when an error occurred during task scheduling. #95818 (Raúl Marín).
  • Fixes a crash on the DROP WORKLOAD while running concurrently with queries using the workload being dropped. #95856 (Alexey Milovidov).
  • Fix slow performance when querying system tables with a user that has limited grants on many databases. Closes #89371. #95874 (pufit).
  • Fix executing tupleElement on JSON with nested paths, previously it could lead to wrong query result. #95907 (Pavel Kruglov).
  • Fixed a NOT_SUPPORTED error that could occur when using the direct join algorithm with an empty MergeTree table. #95935 (Vladimir Cherkasov).
  • Fix the client not suggesting and auto-completing alias names for settings, closes #92190. #95945 (phulv94).
  • Fix event_date in system.asynchronous_metric_log. #95947 (Raúl Marín).
  • Fix skipping paths in JSON data type. Previously with JSON(SKIP path) all JSON keys with prefix path were skipped, even keys like "pathpath", so it could lead to data loss for these paths during insert. Now it's fixed and only key "path" is skipped. #95948 (Pavel Kruglov).
  • Part with unknown projections should not be marked as lost forever. #95952 (Mikhail Artemenko).
  • Fix empty string becoming NULL in Join table with Nullable(String) key. Closes #71414. #96002 (Alexey Milovidov).
  • Now the PostgreSQL engine can correctly read BOOLEAN[]. Closes #72754. #96006 (Alexey Milovidov).
  • Fix the ProtobufList format for the case of reading from an empty file. Closes #70059. #96007 (Alexey Milovidov).
  • Fix ProtobufList format producing ghost record for empty tables. Closes #72596. #96010 (Alexey Milovidov).
  • Fix if function type mismatch between UInt64 and Int32 in an unusual case of distributed queries and PREWHERE, with type inference. Closes #70017. #96012 (Alexey Milovidov).
  • Fix JIT compiled queries involving Bool types. #96013 (Alexey Milovidov).
  • Fix logical error when reading UUID column from SQLite TEXT column. Closes #71263. #96016 (Alexey Milovidov).
  • Fix SQLite engine type conversion for DateTime, Date, UUID, and other types. Closes #73481. #96017 (Alexey Milovidov).
  • FixedString values were escaped incorrectly in queries to external databases, SQLite and PostgreSQL. Closes #73519. Co-authored with @jh0x. #96019 (Alexey Milovidov).
  • Fix assertion failure in WindowTransform with a large PRECEDING offset. Closes #75852. #96026 (Alexey Milovidov).
  • Fix a bug with possible data corruption when concurrent async inserts are using the same parameter names but contain different values. #96035 (Seva Potapov).
  • Fix period for global profilers (controlled by global_profiler_real_time_period_ns and global_profiler_cpu_time_period_ns). Instead of set value, a truncated value was used, causing profiler to wakeup more than intended. #96048 (Antonio Andelic).
  • Earlier if reference data file inside iceberg manifest file for position delete was present in an entry but was null, we didn't get correct bounds for a corresponding data files. This PR fixes this bug. #96061 (Daniil Ivanik).
  • Fix revoking default roles. #96103 (Vitaly Baranov).
  • Fix use-after-free in the index analysis in a rare combination of disabled use_primary_key and a very large number of disjunctions of conditions that use the index. #96112 (Alexey Milovidov).
  • Fix a regression with the Gorilla codec when an explicitly specified size does not correspond to the data type size, and the buffer size is too small. In previous versions, it threw an exception on decompression. Closes #78253. #96118 (Alexey Milovidov).
  • Avoid a deadlock in dictionaries loaded when one dictionary references a Merge table that references it recursively. Closes #78360. #96120 (Alexey Milovidov).
  • Fix use-of-uninitialized-value in formatDateTime with non-fixed-width formatters, such as MySQL and JODA-style. #96133 (Alexey Milovidov).
  • The combination of settings use_const_adaptive_granularity and index_granularity_bytes (which means "non-adaptive granularity") led to a miscalculation of the number of rows to read and an exception. #96143 (Alexey Milovidov).
  • Running an invalid ALTER UPDATE mutation on object storage file-like tables, such as S3 and Azure, could lead to a nullptr dereference. Closes #92994. #96162 (Alexey Milovidov).
  • Fix AccessRights::contains returning incorrect results with partial revokes. #96170 (pufit).
  • Fix query condition cache hash collision for CTE folded constants, which could lead to a wrong query result. Closes #96060. #96172 (Alexey Milovidov).
  • Fix possible deadlock in ProcessList. It can happen because of possible lock inversion if memory overcommit tracker triggers when we are adding task to cancellation checker. #96182 (Antonio Andelic).
  • Fixed a bug where queries involving outer joins (LEFT, RIGHT, or FULL) combined with multiple INNER JOINs could return incorrect results due to illegal join reordering. When an outer join's ON condition referenced columns from multiple previously joined tables, the optimizer failed to account for all table dependencies and could reorder the joins incorrectly, producing missing rows. Close #95972. #96193 (Vladimir Cherkasov).
  • When a table has no statistics defined, ClickHouse shouldn't try to load them. This avoids some overhead (100+ms) for checking if the statistics files exist. (issue #96068). #96233 (Han Fei).
  • Fix optimize_syntax_fuse_functions to not rewrite sum/count/avg into sumCount() when the aggregate argument is LowCardinality(Nullable). Closes #95390. #96239 (Nihal Z. Miaji).
  • Fix incorrect partition pruning for not IN and not has function in some cases. #96241 (Nihal Z. Miaji).
  • Fix stack-use-after-scope in the vector similarity index. #96259 (Alexey Milovidov).
  • Fix test runner not recognizing error hint comments when a query is preceded by a SQL comment. #96336 (Yakov Olkhovskiy).
  • Fix logical error in KeyCondition when a table has a nullable primary key, and the query uses the coalesce function, which has its first argument constant. #96340 (Alexey Milovidov).
  • The interaction of GROUPING SETS, group_by_use_nulls, and the Tuple data type with LowCardinality inside it, could produce an unexpected block structure in the query pipeline, which led to a logical error. This appeared after the introduction of Nullable Tuples. #96358 (Alexey Milovidov).
  • It was possible to create a table with an empty expression () as an index, which led to an invalid memory access. #96363 (Alexey Milovidov).
  • Fixed crash in old analyzer if JOIN and duplicated aliases. #96405 (Ilya Golshtein).
  • Fix Nested columns sizes are inconsistent with local_discriminators error due to a wrong in-place filtering optimization for Variant columns. #96410 (Alexey Milovidov).
  • Fix CREATE TABLE ... CLONE AS ... ignoring full qualifier of source table. #96415 (Hasyimi Bahrudin).
  • Fix mysql table function canceling by KILL QUERY and cancel query (Ctrl+C) in clickhouse-client. #96437 (Roman Vasin).
  • Fixes livelock in the cancellation checker thread for queries with high max_execution_time values. #96450 (Sergei Trifonov).
  • Fix a logical error in some cases when fractional LIMIT/OFFSET is used in distributed queries. #96475 (Nihal Z. Miaji).
  • Fix null pointer dereference in certain expressions with lambda functions. #96479 (Alexey Milovidov).
  • Fix incorrect results when LowCardinality columns are converted to Nullable. #96483 (Nihal Z. Miaji).
  • Fix a crash when creating an Iceberg table with an ORDER BY clause referencing a non-existent column or using a positional argument. Closes #93280. #96484 (Konstantin Vedernikov).
  • Fix runtime filter exception for Tuple columns with Nullable subfields. #96509 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception in Parquet V3 native reader when PREWHERE filter column contains non-boolean UInt8 values. #96594 (Alexey Milovidov).
  • Fix implicit index regeneration in replicated tables during metadata changes. #96600 (Raúl Marín).
  • Fixes a datarace on DROP WORKLOAD. #96614 (Sergei Trifonov).
  • Fix a bug in Iceberg table writes where partitioned inserts could produce incorrect data distribution across partition files. #96620 (Konstantin Vedernikov).
  • Fixed heap-use-after-free in CREATE TABLE with constraints. #96669 (Nikita Taranov).
  • Validate witness version in bech32 to avoid buffer overflow. #96671 (Raúl Marín).
  • Fix system.tables returning errors when a Data Lake REST catalog is created with an invalid auth_header setting. #96680 (Han Fei).
  • Fix min(timestamp) returning epoch (1970-01-01) via _minmax_count_projection after TTL merge when all rows in a block are filtered out. #96703 (Raquel Barbadillo).
  • Improve validation of the iceberg_metadata_file_path setting to prevent path traversal and ensure the specified metadata file is within the table directory. #96754 (Daniil Ivanik).
  • Fix crash in ifNull with Variant argument used in GROUP BY. #96790 (Alexey Milovidov).
  • Fixed cache key collisions between tables with table_disk=1 setting. #96818 (Raufs Dunamalijevs).
  • Fix MemoryWorker's purging thread being stuck because of a race condition. #96819 (Antonio Andelic).
  • Don't log data with credentials in iceberg catalogs. #96831 (Konstantin Vedernikov).
  • Fix exit status of clickhouse-client after server error. #96841 (Vitaly Baranov).
  • Queries with CROSS JOINs and enabled parallel replicas could return incorrect result. Fixes #74337. #96848 (Igor Nikonov).
  • Fixed ALTER TABLE DROP COLUMN queries failing after a lightweight update was previously performed on the same column. #96861 (Anton Popov).
  • Fix stack overflow (crash) when creating archive-based backups (.zip, .tzst) to a plain_rewritable object storage disk. #96872 (Alexey Milovidov).
  • Fix server crash when backup fails due to full disk or other I/O errors on the destination filesystem. #96873 (Alexey Milovidov).
  • Fix EXCEPT ALL and INTERSECT ALL ignoring row multiplicities and behaving like their DISTINCT counterparts. #96876 (Alexey Milovidov).
  • Fix std::terminate exception in indexOfAssumeSorted when called with incompatible types (e.g., IPv4 array with integer search value). #96877 (Alexey Milovidov).
  • Fix exception Bad cast from type DB::ColumnNullable to DB::ColumnString when using window functions with group_by_use_nulls = 1 and CUBE/ROLLUP/GROUPING SETS. #96878 (Alexey Milovidov).
  • Fix incorrect results when JIT-compiled expressions convert DateTime to DateTime64 (e.g., in CASE/if/multiIf with mixed DateTime types). The value was reinterpreted instead of properly scaled, producing wrong timestamps after expression compilation kicked in. #96879 (Alexey Milovidov).
  • Fix logical error exception in CoalescingMergeTree when a skip index expression produces a constant column (e.g., bloom_filter on ifNotFinite(1, c0) for an integer column). #96880 (Alexey Milovidov).
  • Fix wrong port number in error message when accidentally connecting with HTTP to the TLS-enabled native protocol port. #96881 (Alexey Milovidov).
  • Fix per-subquery SETTINGS not being applied to table functions like file in CTEs and subqueries. #96882 (Alexey Milovidov).
  • Fix memory leak of BIO objects when reading X509 certificates. #96885 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception in query analyzer when a lambda expression is passed where a concrete value is expected (e.g., as the accumulator argument of arrayFold). #96892 (Alexey Milovidov).
  • Fix ColumnNullable is not compatible with original exception when casting complex nested types (Array of Nullable Tuple containing Map with Nullable Enum values). #96924 (Alexey Milovidov).
  • Fix a race condition in sharded HASHED dictionary parallel loading that could occasionally cause some rows to not be loaded. #96953 (Alexey Milovidov).
  • Fix a race condition between REPLACE PARTITION and background mutations that could result in both old and new data being visible after the replace. #96955 (Alexey Milovidov).
  • Fix arrayJoin function producing duplicate rows when used with INNER JOIN and WHERE clause, caused by the partial predicate push-down optimization incorrectly pushing filters containing arrayJoin below a JOIN. #96989 (Alexey Milovidov).
  • Fix crash (SEGFAULT) in clearCaches caused by BlockIO::operator= not moving query_metadata_cache, leading to premature destruction of cached storage snapshots and use-after-free of MergeTreeData storage. #96995 (Alexey Milovidov).
  • Fix assertion failure in IfTransformStringsToEnumPass when the if or transform function returns Nullable(String) (e.g. with GROUP BY ... WITH CUBE and group_by_use_nulls = true). #97002 (Alexey Milovidov).
  • Fix incorrect data written during INSERT ... SELECT with UNION ALL and JOIN, where constant string columns could receive wrong values after block squashing. #97019 (Hasyimi Bahrudin).
  • Fix assert_cast exception (or silent data corruption in release builds) when building column statistics after ALTER TABLE MODIFY COLUMN changes the column type. #97027 (Alexey Milovidov).
  • Fix reads of uninitialized memory in Azure Blob Storage, SSH protocol, and Arrow Flight interfaces. #97053 (Alexey Milovidov).
  • Fix cases where indexes were affecting the result for queries with row policy/PREWHERE and FINAL. #97076 (Yarik Briukhovetskyi).
  • Fix remaining race condition between REPLACE PARTITION and background mutations in MergeTree tables that could cause old data to reappear. #97105 (Alexey Milovidov).
  • Fix implicit indices with alias columns and do full validation before creating them. #97115 (Raúl Marín).
  • Fix logical error in FunctionVariantAdaptor with functions requiring const arguments like arrayROCAUC. #97116 (Bharat Nallan).
  • Fix stuck mutations when PartCheckThread re-enqueues a GET_PART for an already-mutated part, leaving phantom entries in parts_to_do. #97162 (Alexey Milovidov).
  • Fix query plan row count estimation for subqueries with ORDER BY ... LIMIT, which could cause the optimizer to choose a suboptimal join order. #97193 (Alexander Gololobov).
  • Fix LOGICAL_ERROR exception in FunctionVariantAdaptor when a function operating on Variant columns returns Nothing type, which can happen with empty arrays in UNION ALL queries. #97213 (Alexey Milovidov).
  • Fix a data race during S3 multipart copy operations (e.g., during BACKUP/RESTORE to S3) that could cause exceptions under concurrent access. #97227 (Azat Khuzhin).
  • Fix LOGICAL_ERROR exception when arrayJoin in WHERE clause references columns from both sides of a JOIN. #97239 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception when reading .size subcolumn of a sparse Nullable(String) in a Tuple with PREWHERE. #97264 (Alexey Milovidov).
  • Fix exception "Number of rows in lazy chunk does not match number of offsets" in LazyMaterializingTransform when reading from tables with non-adaptive index granularity (index_granularity_bytes = 0) using ORDER BY ... LIMIT. #97270 (Alexey Milovidov).
  • Fix SYSTEM RESTART REPLICA losing table from database when table re-creation fails with a non-ZooKeeper exception (e.g. memory limit), causing metadata digest mismatches in DatabaseReplicated. #97276 (Alexey Milovidov).
  • Field readonly in system.merge_tree_settings now properly reflects that certain merge tree settings (e.g. index_granularity) are unconditionally readonly. #97277 (Robert Schulze).
  • Fix a crash during count() optimization on MergeTree tables when the storage snapshot was created without data. #97281 (Pablo Marcos).
  • Fix a possible crash when resolving function names from debug information for stack traces. #97294 (Azat Khuzhin).
  • Fix logical error with analyzer_compatibility_join_using_top_level_identifier and ALIAS columns. Close #96228. #97297 (Vladimir Cherkasov).
  • Fix LOGICAL_ERROR exception in applyOrder when using text-indexed columns with QUALIFY clause. #97313 (Alexey Milovidov).
  • System table system.functions now shows for internal functions categories = 'Internal' instead of categories = ''. #97315 (Robert Schulze).
  • Query with RIGHT JOIN chain and enabled parallel replicas can produce incorrect result. Fixes #74341. #97316 (Igor Nikonov).
  • Fix spurious TABLE_UUID_MISMATCH errors that could occur with refreshable materialized views and other scenarios where tables are renamed. #97323 (Azat Khuzhin).
  • Fix segfault in StorageKeeperMap backup due to use-after-free of dangling storage pointer in lazy backup batch. #97336 (Alexey Milovidov).
  • Fix the exists function with a scalar subquery inside an ALTER UPDATE/DELETE when mutations_execute_subqueries_on_initiator is enabled. The scalar subquery was incorrectly evaluated, which could lead to an error or a corrupt mutation command that made the table unloadable on the next server restart. #97347 (Kirill Kopnev).
  • Fix logical exception Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8))) when comparing NULL with a Variant column containing LowCardinality types. #97379 (Alexey Milovidov).
  • Fix a possible race condition when EXCHANGE TABLES is executed in parallel with the sharded query cache enabled. #97411 (Konstantin Vedernikov).
  • Fix LOGICAL_ERROR exception in Array-to-QBit conversion when nullable_source from an outer Tuple wrapper replaces the converted array column with a mismatched column type. Closes #97389. #97413 (Alexey Milovidov).
  • Fix AST formatting roundtrip inconsistency for aliased tuple literals inside parentheses, e.g., (('a', 'b') AS x) was incorrectly reformatted as tuple(('a', 'b') AS x). #97418 (Alexey Milovidov).
  • Fix an exception during asynchronous inserts with deduplication when a parsing failure produced an empty block with zero rows. #97460 (Sema Checherinda).
  • Fix exception "Number of rows in lazy chunk does not match number of offsets" in LazyMaterializingTransform when reading from tables with non-adaptive index granularity (index_granularity_bytes = 0) using ORDER BY ... LIMIT. #97482 (Alexey Milovidov).
  • Fix insert iceberg settings. Add alias for the allow_experimental_insert_into_iceberg setting. #97483 (Konstantin Vedernikov).
  • Fix ACCESS_DENIED for users without CREATE TEMPORARY TABLE permission when optimize_inverse_dictionary_lookup optimization rewrites dictGet(...) predicates. ClickHouse now skips the rewrite and executes the original expression. Closes #97269. #97484 (Nihal Z. Miaji).
  • Fix assertion failure (exception in debug/sanitizer builds) in Set and MergeTreeIndexSet when processing columns with inner sparse subcolumns (e.g., Tuple columns from MergeTree parts with different sparse serialization profiles). #97493 (Alexey Milovidov).
  • Fix a possible use after free in StorageKafka2. #97520 (Bharat Nallan).
  • Fix INTO OUTFILE with TRUNCATE and into_outfile_create_parent_directories setting when the output path contains directories. #97549 (Alexey Milovidov).
  • Fix BAD_ARGUMENTS error when querying tables with lambda expressions inside ALIAS columns through the merge() table function with the analyzer enabled. #97551 (Alexey Milovidov).
  • Fix system.zookeeper_info exception when Keeper zxid is 0. #97553 (Alexey Milovidov).
  • Fix a possible logical error in ip_trie dictionary when key type is not String. #97555 (Bharat Nallan).
  • Fix REST catalog OAuth authentication not working for the base RestCatalog (it only worked for derived catalogs like OneLakeCatalog). This broke the default REST catalog after BigLake catalog was introduced. #97561 (Konstantin Vedernikov).
  • Geometry functions (perimeterSpherical, areaSpherical, etc.) now accept individual geometry subtypes (Polygon, Ring, Point, etc.) in addition to the Geometry variant type. #97571 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception when using isNull/isNotNull on subcolumns of Nullable(Tuple(... Nullable(T) ...)) types. Closes #97224. #97582 (Alexey Milovidov).
  • Fix null pointer dereference when applying patch parts during lightweight updates. #97583 (Alexey Milovidov).
  • BaseSettings::readBinary passes the index from accessor.find to field_infos[] without checking for the not-found sentinel value (i.e., -1), which may cause a std::vector out-of-bounds access. The issue was caught thanks to libcxx hardening. This probably happened during query plan deserialization when a newer server sends a setting unknown to an older server. The string-based read method already handles this correctly; readBinary was missing the same check. #97585 (Miсhael Stetsyuk).
  • Fix incorrect query results for UNION ALL queries where one branch had a constant-false predicate — the branch would incorrectly read data instead of returning nothing. #97620 (Bharat Nallan).
  • Fix IN (col) with a single column reference failing with UNSUPPORTED_METHOD error. #97646 (Alexey Milovidov).
  • Fix logical error exception during GROUP BY ... WITH ROLLUP/CUBE when keys include LowCardinality(Nullable(...)) inside Nullable(Tuple(...)). #97647 (Alexey Milovidov).
  • Fix AST formatting inconsistency for NOT (1, 1, 1) that could cause LOGICAL_ERROR in debug builds. #97653 (Alexey Milovidov).
  • Fix keeper-converter exception when encountering empty ZooKeeper transaction log files. #97673 (Alexey Milovidov).

Build/Testing/Packaging Improvement

  • ClickHouse can be built with clang-23 (master). #95578 (Alexey Milovidov).
  • Fix force is_local to false when bind_host is configured and replace with integration test. Follow-up for #74741. #93109 #96018 (Zhigao Hong).
  • Stress tests: fix stress and upgrade tests in CI. ignore no-{build} tags. add compatibility randomization. #94693 (Nikita Fomichev).
  • Publish parser_memory_profiler binary from build. Tool can be used to analyze AST memory consumption. #95826 (Ilya Yatsishin).
  • Add --symbolize flag for parser_memory_profiler tool that produces .heap.sym files with resolved symbols in results. #96477 (Ilya Yatsishin).
  • Pin third-party Docker images in integration tests to specific versions. #96500 (Alexey Milovidov).
  • Restore the possibility to link OpenSSL dynamically. This is not recommended and not used by any production builds, but the option still exists for enthusiasts on the Internet. #96506 (Govind R Nair).
  • Reduce magic_enum range from [-100, 1000] to default [-128, 127] by using a per-type specialization for Coordination::OpNum, improving build time. #96632 (Alexey Milovidov).
  • Remove unnecessary C++ templates from Function classes to reduce build times. #96646 (Alexey Milovidov).
  • Move StorageSystemLicenses generation to configure time to improve build parallelism. #96697 (Alexey Milovidov).
  • Parallelize license scanning. #96727 (Raúl Marín).
  • Add stateless functional test for SSH protocol support. #96996 (Alexey Milovidov).
  • Add Kafka 3.9.0 to the stateless functional test infrastructure, enabling direct testing of Kafka and Kafka2 table engines using ClickHouse Keeper as ZooKeeper. Six new stateless tests cover basic produce/consume, virtual columns, INSERT, multiple formats, broken message handling, and Keeper-based offset storage. #96997 (Alexey Milovidov).
  • Add a CI workflow to build PGO+BOLT optimized clang toolchain. #96991 (Alexey Milovidov).
  • Use the PGO-optimized LLVM/Clang build in CI, which should give 20..30% build speed improvement. #97031 (Alexey Milovidov).
  • Replace math functions from glibc with llvm-libc implementations. #90151 (Konstantin Bogdanov).
  • Update Boost from 1.83 to 1.90, fixing a devector assertion failure in debug builds. #97037 (Alexey Milovidov).
  • Update postgres to REL_18_1. #95189 (Konstantin Bogdanov).
  • Use libexpat 2.7.3. #95218 (Konstantin Bogdanov).
  • Use OpenSSL 3.5.5. #95345 (Konstantin Bogdanov).
  • Use simdjson v4.2.4. #97129 (Konstantin Bogdanov).
  • Use libarchive 3.8.5. #97131 (Konstantin Bogdanov).
  • Use fast_float v8.2.3. #97133 (Konstantin Bogdanov).
  • Use abseil-cpp 20260107.1, s2geometry to v0.13.1. #97134 (Konstantin Bogdanov).
  • Bump libxml2 to 2.15.1. #95574 (Robert Schulze).
  • Upgraded 7 Tier-3 integration test Docker images from EOL or removed base images to current supported versions. #97314 (Rahul).
  • Add TPC-DS benchmark queries. #97349 (Raufs Dunamalijevs).
  • Replace individual x86 instruction-set cmake options (ENABLE_SSSE3, ENABLE_AVX2, NO_SSE3_OR_HIGHER, ARCH_NATIVE, etc.) with a single numeric X86_ARCH_LEVEL option (1/2/3/4), matching the standard x86-64 microarchitecture levels already used by the runtime dispatch system. #97354 (Raúl Marín).
  • Avoid instantiating division_by_nullable=true template variants for non-division operations in FunctionBinaryArithmetic, reducing compilation time and binary size. #97496 (Raúl Marín).
  • Reduce the include footprint of Exception.h by removing it from high-fan-out headers like typeid_cast.h, assert_cast.h, Context_fwd.h, IDataType.h, and various Column headers. #97497 (Raúl Marín).
  • Always use bundled compiler-rt headers (sanitizer and XRay interfaces) instead of the host compiler's headers, and build compiler-rt libraries from source by default. #97499 (Raúl Marín).
  • Avoid including boost/multiprecision headers in wide_integer_impl.h on platforms with adequate long double, improving build time. #96633 (Alexey Milovidov).
  • Implement LLVM Code Coverage job and enable it initially for master branch. #90952 (Alexey Bakharew).
  • Enable fast libcxx hardening for release builds. This is mostly needed for out-of-bounds checks. Given performance tests results, no noticeable performance impact is expected. #94757 (Miсhael Stetsyuk).

ClickHouse release 26.1, 2026-01-29. Presentation, Video

Backward Incompatible Change

  • Fix inconsistent formatting caused by an incorrect substitution of aliases in the formatter. This closes #82833. This closes #82832. This closes #68296. This change is potentially backward incompatible: when the analyzer is disabled, certain CREATE VIEW queries with IN referencing an alias cannot be processed. To prevent the incompatibility, enable the analyzer (it is enabled by default since 24.3). #82838 (Alexey Milovidov).
  • Codecs DEFLATE_QPL and ZSTD_QAT were removed. Users are advised to convert existing data compressed with DEFLATE_QPL or ZSTD_QAT to another codec before upgrade. Note that in order to use the codecs, settings enable_deflate_qpl_codec and enable_zstd_qat_codec had to be enabled. #92150 (Robert Schulze).
  • Improve UDF debugging by enabling stderr capture in system.query_log.exception. Previously, UDF stderr was only logged to files and not exposed in query logs, making debugging impossible. Now stderr triggers exceptions by default and is fully accumulated (up to 1MB) before throwing, so complete Python tracebacks and error messages appear in system.query_log.exception for effective troubleshooting. #92209 (Xu Jia).
  • Empty column list in JOIN USING () clause is now considered a syntax error. Previously it was supposed to be INVALID_JOIN_ON_EXPRESSION during query execution. In some cases such as joining with Join storage it led to LOGICAL_ERROR, close #82502. #92371 (Vladimir Cherkasov).
  • Use partial match for SKIP REGEXP in JSON type by default. Closes #79250. #92847 (Pavel Kruglov).
  • Revert "Allow INSERT into simple ALIAS columns" (Reverts ClickHouse/ClickHouse#84154). It does not work with custom formats, and is not guarded with a setting. #92849 (Azat Khuzhin).
  • Setting to throw an error if a data lake catalog doesn't have access to object storage. #93606 (Konstantin Vedernikov).
  • The Lazy database engine is removed and no longer available. Closes #91231. #93627 (Alexey Milovidov).
  • Remove the transposed_with_wide_view mode of the metric_log - it is unusable due to a bug. It is no longer possible to define system.metric_log with this mode. This partially reverts #78412. #93867 (Alexey Milovidov).
  • CPU scheduling for workloads is now preemptive by default. See cpu_slot_preemption server setting. #94060 (Sergei Trifonov).
  • Escape index filenames to prevent broken parts. With this change ClickHouse will fail to load indices with non-ascii characters in their name created by previous versions. To handle it you can use the merge tree setting escape_index_filenames. #94079 (Raúl Marín).
  • Format settings exact_rows_before_limit, rows_before_aggregation, cross_to_inner_join_rewrite, regexp_dict_allow_hyperscan, regexp_dict_flag_case_insensitive, regexp_dict_flag_dotall and dictionary_use_async_executor were changed to be regular (non-format) settings now. This is a purely internal change without user-visible side effects except in the (unlikely) case that you specified any of these settings in Iceberg or DeltaLake or Kafka or S3 or S3Queue or Azure or Hive or RabbitMQ or Set or FileLog or NATS table engine definitions. In these cases, these settings were previously ignored, now such definitions throw an error. #94106 (Robert Schulze).
  • The joinGet/joinGetOrNull functions now enforce SELECT privileges on the underlying Join table. After this change, executing joinGet('db.table', 'column', key) requires the user to have SELECT privilege on both the key columns defined in the Join table and the attribute column being retrieved. Queries lacking these privileges will fail with ACCESS_DENIED. To migrate, grant the necessary permissions using GRANT SELECT ON db.join_table TO user for full table access, or GRANT SELECT(key_col, attr_col) ON db.join_table TO user for column-level access. This change affects all users and applications relying on joinGet/joinGetOrNull where explicit SELECT grants were not previously configured. #94307 (Vladimir Cherkasov).
  • Check SHOW COLUMNS for CREATE TABLE ... AS ... queries. Previously, it checked SHOW TABLES, which is an incorrect grant for this type of permission check. #94556 (pufit).
  • Make the Hash output format independent of block sizes. #94503 (Alexey Milovidov). Note that this changes the output hash values compared to previous versions.

New Feature

  • HTTP API and embedded Web UI for ClickHouse Keeper. #78181 (pufit and speeedmaster).
  • Async insert deduplication now works with dependent materialized views. When collision by block_id occurs, the original block is filtered to remove rows associated with the block_id, and the remaining rows are transformed with all relevant materialized views select queries, this rebuilds original block without conflicting rows. #89140 (Sema Checherinda). It is allowed to use deduplication with async inserts when materialized views are involved. #93957 (Sema Checherinda).
  • Introduced a new syntax and framework to simplify and extend projection index feature. This follows up https://github.com/ClickHouse/ClickHouse/pull/81021. #91844 (Amos Bird).
  • Add text index support for Array columns. #89895 (Jimmy Aguilar Mena).
  • Enable use_variant_as_common_type by default, which lets you use incompatible types inside an Array, in UNION queries, and in branches of if/multiIf/case. #90677 (Alexey Milovidov).
  • New system table zookeeper_info. Implements #88014. #90809 (Smita Kulkarni).
  • Support the Variant type in all functions. #90900 (Bharat Nallan).
  • Adds a ClickHouse_Info metric to the Prometheus /metrics endpoint containing mainly version information so it's possible to build charts tracking detailed version information over time. #91125 (Christoph Wurm).
  • Introduce a new four letter rcfg command for keeper which allows to change cluster configuration. This command provides broader possibilities for configuration changes than standard reconfigure request. Command takes json string as an argument. The whole set of bytes sent to TCP interface should look like this: rcfg{json_string_length_big_endian}{json_string}. Some examples of command may look like this: {"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin).
  • Add function reverseBySeparator which reverses the order of substrings in a string separated by a specified separator. Close #91463. #91780 (Xuewei Wang).
  • Adds new setting max_insert_block_size_bytes which control the formation of inserted blocks in finer detail. #92833 (Kirill Kopnev).
  • It is possible to execute DDL queries with ON CLUSTER clause for a Replicated database if the ignore_on_cluster_for_replicated_database setting is enabled. In this case, the cluster name will be ignored. #92872 (Kirill).
  • Implement mergeTreeAnalyzeIndexes function. #92954 (Azat Khuzhin).
  • Add new setting use_primary_key. Set it to false to disable granule pruning based on the primary key. #93319 (Nihal Z. Miaji).
  • Add icebergLocalCluster table function. #93323 (Anton Ivashkin).
  • Added cosineDistanceTransposed function that approximates the cosine distance between two points. #93621 (Raufs Dunamalijevs).
  • Add files column to system.parts table that shows the number of files in each data part. #94337 (Match).
  • Adds a max-min fair scheduler for concurrency control. Provides better fairness under high oversubscription, where many queries compete for limited CPU slots. Short-running queries are not penalized by long-running queries that have accumulated more slots over time. Enabled by the concurrent_threads_scheduler server setting max_min_fair value. #94732 (Sergei Trifonov).
  • Added the ability for ClickHouse client to override TLS SNI when connecting to the server. #89761 (Matt Klein).
  • Support temporary tables in joinGet function calls. #92973 (Eduard Karacharov).
  • Support deletion vectors in DeltaLake table engine. #93852 (Kseniia Sumarokova).
  • Support deletion vectors for deltaLakeCluster. #94365 (Kseniia Sumarokova).
  • Google cloud storage support for data lakes. #93866 (Konstantin Vedernikov).

Experimental Feature

Performance Improvement

  • Setting use_skip_indexes_on_data_read is now enabled by default. This setting allows filtering in a streaming fashion, at the same time as reading, improving query performance and startup time. #93407 (Shankar Iyer).
  • Improve performance of DISTINCT on LowCardinality columns. Closes #5917. #91639 (Nihal Z. Miaji).
  • Optimize distinctJSONPaths aggregate function so it reads only JSON paths from data parts and not the whole JSON column. #92196 (Pavel Kruglov).
  • More filters pushed down JOINs. #85556 (Nikita Taranov).
  • Support more cases for push down from join ON condition when the filter uses inputs only from one side. Support ANY, SEMI, ANTI joins. #92584 (Dmitry Novik).
  • Allow using equivalent sets to push down filters for SEMI JOIN. Closes #85239. #92837 (Dmitry Novik).
  • Skip reading left side of hash join when right side is empty. Previously we were reading left side until first non-empty block, which might do a lot of work in case when there is heavy filtering or aggregation. #94062 (Alexander Gololobov).
  • Using the "fastrange" (Daniel Lemire) method for partitioning data inside the query pipeline. This could improve parallel sorting and JOINs. #93080 (Alexey Milovidov).
  • Improve performance of window functions when PARTITION BY matches or is a prefix of the sorting key. #87299 (Nikita Taranov).
  • Outer filter is pushed down into views which allows applying PREWHERE on local and remote nodes. Resolves #88189. #88316 (Igor Nikonov).
  • Implement JIT compilations for more functions. Closes #73509. #88770 (Alexey Milovidov with Taiyang Li).
  • If a skip index used in a FINAL query is on a column that is part of the primary key, the additional step to check for primary key intersection in other parts is unnecessary and now not performed. Resolves #85897. #93899 (Shankar Iyer).
  • Optimize performance and memory usage for fractional LIMIT and OFFSET. #91167 (Ahmed Gouda).
  • Fix using of faster random read logic for Parquet Reader V3 prefetcher. Closes #90890. #91435 (Arsen Muk).
  • Improve performance of icebergCluster. Closes #91462. #91537 (Yang Jiang).
  • Don't filter by virtual columns on constant filters. #91588 (c-end).
  • 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. #92250 (Azat Khuzhin).
  • Improved performance of full text search with text index and sparseGrams tokenizer by reducing the number of searched tokens in the index. #93078 (Anton Popov).
  • Function isValidASCII was optimized for positive outcomes, i.e. all-ASCII input values. #93347 (Robert Schulze).
  • The read-in-order optimization now recognizes when ORDER BY columns are constant due to WHERE conditions, enabling efficient reverse-order reads. This benefits multi-tenant queries like WHERE tenant='42' ORDER BY tenant, event_time DESC which can now use InReverseOrder instead of requiring a full sort.". #94103 (matanper).
  • Introduce Enum AST specialized class to store value parameters in (string, integer) pairs instead of ASTLiteral children to optimize memory consumption. #94178 (Ilya Yatsishin).
  • Distributed index analysis on multiple replicas. Beneficial for shared storage and huge amount of data in cluster. This is applicable for SharedMergeTree (ClickHouse Cloud) and could be applicable for other types of MergeTree tables on a shared storage. #86786 (Azat Khuzhin).
  • Reduce overhead of join runtime filters by disabling them in the following cases: - too many bits are set in the bloom filter - too few rows are filtered out at runtime. #91578 (Alexander Gololobov).
  • Use an in-memory buffer for correlated subqueries input to avoid evaluating it multiple times. Part of #79890. #91205 (Dmitry Novik).
  • Allow all replicas to steal orphaned ranges in parallel replicas reading. This improves load balancing and reduces long-tail latency. #91374 (zoomxi).
  • External aggregation/sorting/join now respects query setting temporary_files_codec in all contexts. Fixed missing profile events for grace hash join. #92388 (Vladimir Cherkasov).
  • Make query memory usage detection for spilling to disk during aggregation/sorting more robust. #92500 (Azat Khuzhin).
  • Estimate total rows count and NDV (number of distinct values) statistics of aggregation key columns. #92812 (Alexander Gololobov).
  • Optimize postings list compression with simdcomp. #92871 (Peng Jian).
  • Refactor S3Queue Ordered mode processing with buckets. This should also improve performance, reducing the number of keeper requests. #92889 (Kseniia Sumarokova).
  • Functions mapContainsKeyLike and mapContainsValueLike can now leverage a text index on mapKeys() or mapValues(), respectively. #93049 (Michael Jarrett).
  • Reduce memory usage on non-Linux systems (enable immediate purging of jemalloc dirty pages). #93360 (Eduard Karacharov).
  • Force purging of jemalloc arenas in case the ratio of dirty pages size to max_server_memory_usage exceeds memory_worker_purge_dirty_pages_threshold_ratio. #93500 (Eduard Karacharov).
  • Reduce memory usage for AST. #93601 (Nikolai Kochetov).
  • In some cases we've seen ClickHouse doesn't respect a memory limit when reading from a table. This behaviour is fixed. #93715 (Nikita Mikhaylov).
  • Enable CHECK_STAT and TRY_REMOVE Keeper extension by default. #93886 (Mikhail Artemenko).
  • Parse lower and upper bounds of file names corresponding to position deletes from Iceberg manifest file entries for better selection of corresponding data files. #93980 (Daniil Ivanik).
  • Add two more settings to control maximum number of dynamic subcolumns in JSON column. First is MergeTree setting merge_max_dynamic_subcolumns_in_compact_part (similar to already added merge_max_dynamic_subcolumns_in_wide_part) that limits number of dynamic subcolumns created during merge into a Compact part. Second is query level setting max_dynamic_subcolumns_in_json_type_parsing that limits number of dynamic subcolumns created during parsing of JSON data, it will allow to specify the limit on insert. #94184 (Pavel Kruglov).
  • Slightly optimize squashing of JSON columns for some cases. #94247 (Pavel Kruglov).
  • Lower the thread pool queue sizes based on the production experience. Add an explicit memory consumption check before reading any data from the MergeTree. #94692 (Nikita Mikhaylov).
  • Make sure the scheduler would prefer MemoryWorker thread under the CPU starvation, because it protects ClickHouse process from an existential threat. #94864 (Nikita Mikhaylov).
  • Run purging of jemalloc dirty pages in a different thread from main thread of MemoryWorker. If purging is slow, it could delay updates of RSS usage which could lead to out of memory kills of the process. Introduce new config memory_worker_purge_total_memory_threshold_ratio to start purging dirty pages based on ratio of total memory usage. #94902 (Antonio Andelic).

Improvement

  • system.blob_storage_log is now available for Azure Blob Storage. #93105 (Alexey Milovidov).
  • Implement blob_storage_log for Local and HDFS. Fix an error when S3Queue used something other than the disk name for logging in blob_storage_log. Add error_code column to blob_storage_log. Split the test configuration file to simplify local testing. #93106 (Alexey Milovidov).
  • clickhouse-client and clickhouse-local will highlight digit groups (thousands, millions, etc.) inside numeric literals while typing. This closes #93100. #93108 (Alexey Milovidov).
  • Adds support in clickhouse-client for command-line arguments with a space surrounding the equals sign. Closes #93077. #93174 (Cole Smith).
  • With <interactive_history_legacy_keymap>true</interactive_history_legacy_keymap>, the CLI client can now fall back to Ctrl-R for regular search like before, while Ctrl-T does fuzzy search. #87785 (Larry Snizek).
  • The statement to clear caches SYSTEM DROP [...] CACHE gave the false impression that the statement disables the cache. ClickHouse now supports statement SYSTEM CLEAR [...] CACHE which is more obvious. The old syntax remains available. #93727 (Pranav Tiwari).
  • Support multiple columns as primary key in EmbeddedRocksDB. Closes #32819. #33917 (usurai).
  • It is now possible to use non-constant IN for scalars (queries like val1 NOT IN if(cond, val2, val3)). #93495 (Yarik Briukhovetskyi).
  • Prevent x-amz-server-side-encryption headers from being propagated to HeadObject, UploadPart & CompleteMultipartUpload S3 requests as they're not supported. #64577 (Francisco J. Jurado Moreno).
  • Tracking hive partitioning for ordered mode in S3Queue. Resolves #71161. #81040 (Anton Ivashkin).
  • Optimize space reservation in filesystem cache. FileCache::collectCandidatesForEviction will be executed without unique lock. #82764 (Kseniia Sumarokova).
  • Support composite rotation strategy (size + time) for server log. #87620 (Jianmei Zhang).
  • CLI client can now specify <warnings>false</warnings> instead of the command line --no-warnings. #87783 (Larry Snizek).
  • Add support for the avg aggregate function with Date, DateTime and Time values as arguments. Closes #82267. #87845 (Yarik Briukhovetskyi).
  • The optimization use_join_disjunctions_push_down is enabled by default. #89313 (Alexey Milovidov).
  • Support more table engines and data source kinds in the correlated subqueries. Closes #80775. #90175 (Dmitry Novik).
  • If the schema of parameterized view is specified explicitly, it is shown. Close #88875, #81385. #90220 (Grigorii Sokolik).
  • Correctly handle the gap in Keeper log entries if logs are before the last committed index. #90403 (Antonio Andelic).
  • Improve min_free_disk_bytes_to_perform_insert setting to work correctly with JBOD volumes. #90878 (Aleksandr Musorin).
  • Make it possible to specify storage_class_name setting in named collections for S3 table engine and s3 table function. #91926 (János Benjamin Antal).
  • Support inserting auxiliary zookeeper by system.zookeeper. #92092 (RinChanNOW).
  • Add new metrics for the keeper: KeeperChangelogWrittenBytes, KeeperChangelogFileSyncMicroseconds, KeeperSnapshotWrittenBytes and KeeperSnapshotFileSyncMicroseconds profile events as well as KeeperBatchSizeElements and KeeperBatchSizeBytes histogram metrics. #92149 (Miсhael Stetsyuk).
  • Add a new setting, trace_profile_events_list, which limits tracing with trace_profile_event to the specified list of event names. This allows more precise data collection on large workloads. #92298 (Alexey Milovidov).
  • Support SYSTEM NOTIFY FAILPOINT for pausable failpoints. - Support SYSTEM WAIT FAILPOINT fp PAUSE/RESUME. #92368 (Shaohua Wang).
  • Add creation (implicit/explicit) column to system.data_skipping_indices. #92378 (Raúl Marín).
  • Allow passing the description of columns for YTsaurus dyn tables to the dictionary source. #92391 (MikhailBurdukov).
  • In #63985, we made it possible to specify all the parameters needed for TLS configuration on a per-port basis (see composable protocols), so we don't have to rely on global TLS config. However, the implementation still implicitly requires a global openSSL.server config section to exist, which conflicts with setups where different TLS configurations are needed for different ports. For example, in keeper-in-server deployments, we need separate TLS configs for inter-keeper communication and clickhouse client connections. #92457 (Miсhael Stetsyuk).
  • Introduce a new setting input_format_binary_max_type_complexity that limits the total number of type nodes that can be decoded in binary format to prevent malicious payloads. #92519 (Raufs Dunamalijevs).
  • Reflect running tasks in system.background_schedule_pool{,_log}. Add documentation. #92587 (Azat Khuzhin).
  • Execute current query in Ctrl+R search in client if no history match found. #92749 (Azat Khuzhin).
  • Support EXPLAIN indices = 1 as an alias for EXPLAIN indexes = 1. Closes #92483. #92774 (Pranav Tiwari).
  • Parquet reader now allows reading Tuple or Map columns as JSON: select x from file(f.parquet, auto, 'x JSON') works even if the type of column x in f.parquet is tuple or map. #92864 (Michael Kolupaev).
  • Support empty tuples in parquet reader. #92868 (Michael Kolupaev).
  • Fallback to read-write copy for Azure Blob Storage when native copy fails with BadRequest (e.g. invalid block list). Previously this was only done for Unauthorized error which was seen while copying blob to different storage accounts. But we also sometimes see "The specified block list is invalid" error. So now updated the condition to fallback to read & write for all native copy fails. #92888 (Smita Kulkarni).
  • Fix EC2 metadata endpoint throttling when running many concurrent S3 queries with EC2 instance profile credentials. Previously, each query created its own AWSInstanceProfileCredentialsProvider, causing concurrent requests to the EC2 metadata service which could result in timeouts and HTTP response code: 403 errors. Now the credentials provider is cached and shared across all queries. #92891 (Sav).
  • Rework insert_select_deduplicate setting to add an ability to keep backward compatibility. #92951 (Sema Checherinda).
  • Log background tasks that are slower than average (background_schedule_pool_log.duration_threshold_milliseconds=30) to avoid excessive tasks logging. #92965 (Azat Khuzhin).
  • In previous versions, some of C++ function names were displayed incorrectly ("mangled") in the system.trace_log and system.symbols, and the demangle function didn't process them well. Closes #93074. #93075 (Alexey Milovidov).
  • Introduced the backup_data_from_refreshable_materialized_view_targets backup setting to skip back up of refreshable materialized views. RMVs with APPEND refresh strategy which are always backed up. #93076 (Julia Kartseva). #93658 (Julia Kartseva)
  • Use minimal debug info instead of no debug info for heavy translation units, such as functions. #93079 (Alexey Milovidov).
  • Added MinIO compatibility support to AWS S3 C++ SDK by implementing error code mapping for MinIO-specific errors. This change allows ClickHouse to properly handle and retry MinIO server errors when using MinIO deployments instead of AWS S3, improving reliability for users running object storage on self-hosted MinIO clusters. #93082 (XiaoBinMu).
  • Write symbolized jemalloc profiles (eliminating the need for a binary during heap profile generation). #93099 (Azat Khuzhin).
  • Resurrect clickhouse git-import tool - it was broken on large and invalid commits. See https://presentations.clickhouse.com/2020-matemarketing/. #93202 (Alexey Milovidov).
  • Don't show passwords from URL storage in query log. #93245 (Konstantin Vedernikov).
  • Support Geometry type for flipCoordinates. #93303 (Bharat Nallan).
  • Improve the UX of SYSTEM INSTRUMENT ADD/REMOVE: use String literals for function names, patch all functions that match and allow using function_name in REMOVE. #93345 (Pablo Marcos).
  • Add a new setting materialize_statistics_on_merge which enables/disables materializing statistics during merge. The default value is 1. #93379 (Han Fei).
  • ClickHouse can now parse SELECT without parentheses around DESCRIBE SELECT queries. Closes #58382. #93429 (Yarik Briukhovetskyi).
  • Add randomization of cache correctness checks under probability. #93439 (Kseniia Sumarokova).
  • Add setting type_json_allow_duplicated_key_with_literal_and_nested_object to allow duplicated paths in JSON where one is a literal and another is a nested object, e.g. {"a" : 42, "a" : {"b" : 42}}. Some data could be created before this restriction on duplicated paths was added in https://github.com/ClickHouse/ClickHouse/pull/79317 and further manipulation with this data can lead to errors now. With this setting, such old data cane still be used with no errors. #93604 (Pavel Kruglov).
  • Don't print values of simple types on separate lines in Pretty JSON. #93836 (Pavel Kruglov).
  • When there are many alter table ... modify setting ... statements, it's possible not to acquire lock for 5 seconds. Better to return timeout than logical error. #93856 (Han Fei).
  • Prevent excessive output on a syntax error. Before this change, it output the whole SQL script, which could contain a lot of queries. #93876 (Alexey Milovidov).
  • Do proper byte size calculation of the check request with stats in Keeper. #93907 (Mikhail Artemenko).
  • Added use_hash_table_stats_for_join_reordering setting to control whether runtime hash table size statistics are used for join reordering. This setting is enabled by default, preserving the existing behavior of collect_hash_table_stats_during_joins. #93912 (Vladimir Cherkasov).
  • Users can now partially view nested global server settings in the system.server_settings table (e.g. logger.level). This only covers settings with a fixed structure (no lists, enumerations, repetitions etc.). #94001 (Hechem Selmi).
  • QBit can now be compared for equality. #94078 (Raufs Dunamalijevs).
  • When Keeper detects broken snapshot or inconsistent changelogs, throw exception instead of manually aborting or cleaning up files automatically. This should lead to a safer behaviour of Keeper relying on manual intervention. #94168 (Antonio Andelic).
  • Fix leaving possible leftovers in case of CREATE TABLE fails. #94174 (Azat Khuzhin).
  • Fix uninitialized memory access (a bug in OpenSSL) when password protected TLS key is used. #94182 (Konstantin Bogdanov).
  • Bump chdig to v26.1.1. #94290 (Azat Khuzhin).
  • Support more generic partitioning for S3Queue ordered mode. #94321 (Bharat Nallan).
  • Added alias use_statistics for setting allow_statistics_optimize. This is more consistent with existing settings use_primary_key and use_skip_indexes. #94366 (Robert Schulze).
  • Enabled setting input_format_numbers_enum_on_conversion_error for conversion from Numbers to Enums to check whether the element exists. #94384 (Elmi Ahmadov).
  • In S3(Azure)Queue ordered mode clean up failed nodes by tracking limits (before that was done only in Unordered mode for both failed and processed, so now this will also be done for Ordered but only for failed nodes). #94412 (Kseniia Sumarokova).
  • Enable access management for default user in clickhouse-local. The default user in clickhouse-local was missing the access_management privilege, which caused operations like DROP ROW POLICY IF EXISTS to fail with ACCESS_DENIED error, even though the user should be unrestricted. #94501 (Alexey Milovidov).
  • Enable named collection for YTsaurus dictionaries and tables. #94582 (MikhailBurdukov).
  • Add support for SQL-defined named collections in BACKUP/RESTORE for S3 and Azure Blob Storage. Closes #94604. #94605 (Pablo Marcos).
  • Support bucketing based on partition key for S3Queue in ordered mode. #94698 (Bharat Nallan).
  • Add an asynchronous metric with the longest running merge elapsed time. #94825 (Raúl Marín).
  • Add belonging file check before apply position delete using IcebergBitmapPositionDeleteTransform. #94897 (Yang Jiang).
  • Now view_duration_ms shows the time when group was active, not the sum of the threads duration in it. #94966 (Sema Checherinda).
  • Remove limit of the max number of search tokens in hasAnyTokens and hasAllTokens functions which was limited to 64. Example: SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]); The query would result in a BAD_ARGUMENTS error because there are 65 search tokens. With this PR, the limit has been removed completely and the same query would run without an error. #95152 (Elmi Ahmadov).
  • Add a setting input_format_numbers_enum_on_conversion_error for conversion from Numbers to Enums to check whether the element exists. Closes: #56144. #56240 (Nikolay Degterinsky).
  • Share format parser resources between data file and position delete file reading in Iceberg tables to reduce memory allocations. #94701 (Yang Jiang).

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

  • Fixes a bug where predefined query handlers would have trailing whitespace interpreted as data during inserts. #83604 (Fabian Ponce).
  • Fix INCOMPATIBLE_TYPE_OF_JOIN error for Join storage and outer to inner join optimization applied. Resolves #80794. #84292 (Vladimir Cherkasov).
  • Fix exception "Invalid number of rows in Chunk" when using hash join with allow_experimental_join_right_table_sorting enabled. #86440 (yanglongwei).
  • Always replace file names to hash in MergeTree if filesystem is case insensitive. Previously on systems with case insensitive filesystem (like MacOS) it could lead to data corruption when several column/subcolumn names differs only in the case. #86559 (Pavel Kruglov).
  • Add a full permissions check on the create stage for the underlying query inside a materialized view. #89180 (pufit).
  • Fixed crash in icebergHash function on constant argument. #90335 (Michael Kolupaev).
  • Fix logical error when mutation without transaction mutates parts in an active transaction, which is rolled back finally. #90469 (Shaohua Wang).
  • Update system.warnings correctly after an ordinary database was converted to an atomic database. #90473 (sdk2).
  • Fixes an assertion when reading from Parquet file, and part of a prewhere expression is used elsewhere in the query. #90635 (Max Kainov).
  • Fix crash in a single-node cluster when reading from Iceberg in split-by-buckets mode. This closes #90913. #91553 (Konstantin Vedernikov).
  • Fix possible logical error in Log engine during subcolumns reading. Closes #91710. #91711 (Pavel Kruglov).
  • Fix Logical error: 'Storage does not support transaction' during ATTACH AS REPLICATED. #91772 (Shaohua Wang).
  • Fix for runtime filters working incorrectly when LEFT ANTI JOIN has extra post-condition. #91824 (Alexander Gololobov).
  • Fixes an error where we have a null-safe comparison involving the Nothing type. Closes #91834. Closes #84870. Closes #91821. #91884 (Yarik Briukhovetskyi).
  • Fix DELTA_BYTE_ARRAY decoding bugs in native Parquet reader affecting highly repetitive string data. #91929 (Daniel Muino).
  • Cache schema only for the file it was inferred from in globs instead of all files during schema inference. Closes #91745. #92006 (Pavel Kruglov).
  • Fix the Couldn't pack tar archive: Failed to write all bytes error caused by an incorrect archive entry size header. Fixes #89075. #92122 (Julia Kartseva).
  • Release request stream in insert select to prevent closing http connection. #92175 (Sema Checherinda).
  • Fix logical error for queries with multiple JOINs with USING clause and join_use_nulls. #92251 (Vladimir Cherkasov).
  • Fix logical error while join reordering with join_use_nulls, close https://github.com/clickhouse/clickhouse/issues/90795. #92289 (Vladimir Cherkasov).
  • Fix inconsistent AST formatting of arrayElement with negate literal. Closes #92288 Closes #92212 Closes #91832 Closes #91789 Closes #91735 Closes #88495 Closes #92386. #92293 (Pavel Kruglov).
  • Fix a possible crash with join_on_disk_max_files_to_merge setting. #92335 (Bharat Nallan).
  • Related issue #https://github.com/ClickHouse/support-escalation/issues/6365. #92339 (Tuan Pham Anh).
  • Fix missing access check in SYSTEM SYNC FILE CACHE. Closes #92101. #92372 (Kseniia Sumarokova).
  • Fix count_distinct_optimization pass over window functions and over multiple arguments. #92376 (Raúl Marín).
  • Fix "Cannot write to finalized buffer" error when using certain aggregate functions with window functions. Closes #91415. #92395 (Jimmy Aguilar Mena).
  • Fix logical error with CREATE TABLE ... AS urlCluster() and database engine Replicated. Closes #92216. #92418 (Kseniia Sumarokova).
  • Inherit source part serialization info settings during mutation in MergeTree. It fixes possible incorrect result of the query over mutated part after changes in data types serialization. #92419 (Pavel Kruglov).
  • Fix possible conflict in column and subcolumn with the same name leading in using wrong serialization and query failures. Closes #90219. Closes #85161. #92453 (Pavel Kruglov).
  • Fix a LOGICAL_ERRORs that caused by not wanted modification of query plan when converting outer join to inner join. Also relax the requirements of optimization to be able to apply it in cases when injective functions are applied to the aggregating keys during joins. #92503 (János Benjamin Antal).
  • Fix possible error SIZES_OF_COLUMNS_DOESNT_MATCH during sorting of emty tuple column. Closes #92422. #92520 (Pavel Kruglov).
  • Check for incompatible typed paths in JSON type. Closes #91577. #92539 (Pavel Kruglov).
  • Fix deadlock for SHOW CREATE DATABASE for Backup database. #92541 (Azat Khuzhin).
  • Use proper error code when validating hypothesis index. #92559 (Raúl Marín).
  • Fix dynamic subcolumns resolution in column aliases in analyzer. Previously dynamic subcolumn in column alias was wrapped in getSubcolumn and in some cases could be not resolved at all. Closes #91434. #92583 (Pavel Kruglov).
  • Prevent crash in tokens() with null second argument. #92586 (Raúl Marín).
  • Fix potential crash caused by in place mutation of underlying const PREWHERE columns. This could've happened at column shrinking (IColumn::shrinkToFit) or filtering (IColumn::filter), which could've triggered concurrently from several threads. #92588 (Arsen Muk).
  • Creating and materializing text indexes on tables containing large parts (over 4,294,967,295 rows) is temporarily disabled. This limitation prevents incorrect query results, as the current index implementation does not yet support such large parts. #92644 (Anton Popov).
  • Fixes a logical error Too large size (A) passed to allocator while executing JOINs. Closes #92043. #92667 (Yarik Briukhovetskyi).
  • Remove a bug that ngrambf_v1 indexes with ngram length (1st parameter) > 8 would throw an exception. #92672 (Robert Schulze).
  • Fix uncaught exception during background named collections reload when zookeeper storage is used. Closes https://github.com/ClickHouse/clickhouse-private/issues/44180. #92717 (Kseniia Sumarokova).
  • Reworks incorrect logic in access grant checks for wildcard grants. The previous attempt https://github.com/ClickHouse/ClickHouse/pull/90928 addressed a critical vulnerability but ended up being too restrictive, resulting in some wildcard GRANT statements failing due to unrelated revokes. #92725 (pufit).
  • Fix bug in data skipping logic when not match(...) is used in WHERE causing incorrect results. Closes #92492. #92726 (Nihal Z. Miaji).
  • Do not attempt to delete temporary directories at startup if a MergeTree table is created over a read-only disk. #92748 (Alexey Milovidov).
  • Fix "Cannot add action to empty ExpressionActionsChain" for ALTER TABLE REWRITE PARTS (v2). #92754 (Azat Khuzhin).
  • Avoid crash due to reading from a disconnected Connection. #92807 (Raufs Dunamalijevs).
  • Fix logical error Failed to set file processing within 100 retries in storgae S3Queue in Ordered mode. It is now replaced with a warning. This error could happen before 25.10 version if keeper session expired, however it will still be a warning in 25.10+ versions, as it is still theoretically possible to get this error in case of high processing concurrency in Ordered mode. #92814 (Kseniia Sumarokova).
  • Previously, some queries that used PK sharding with a false condition were failing. Now they're not. Needed for https://github.com/ClickHouse/ClickHouse/pull/89313. #92815 (Yarik Briukhovetskyi).
  • Fixed calculation of uncompressed sizes of text indexes in the system.parts table. #92832 (Anton Popov).
  • Fixed usage of primary index in lightweight updates that have an IN clause with subqueries in the predicate of the WHERE clause. #92838 (Anton Popov).
  • Fix creating type hint for path 'skip' in JSON. Closes #92731. #92842 (Pavel Kruglov).
  • In the S3 table engine, we should avoid caching the partition key if there are non-deterministic functions. #92844 (Miсhael Stetsyuk).
  • Fix possible error FILE_DOESNT_EXIST after mutation of a sparse column with ratio_of_defaults_for_sparse_serialization=0.0. Closes #92633. #92860 (Pavel Kruglov).
  • Fix parquet schema inference in the old parquet reader (not used by default) when a JSON column comes after a Tupe column. Fix the old parquet reader (not used by default) failing on empty tuples. #92867 (Michael Kolupaev).
  • Fix logical error with multiple joins on constant condition and join_use_nulls, close #92640. #92892 (Vladimir Cherkasov).
  • Fix possible error NOT_FOUND_COLUMN_IN_BLOCK during insert into a table with subcolumn in partition expression. Closes #93210. Closes #83406. #92905 (Pavel Kruglov).
  • Fix error NO_SUCH_COLUMN_IN_TABLE in Merge engine over tables with aliases. Closes #88665. #92910 (Pavel Kruglov).
  • Fix NULL != NULL case for full_sorting_join on LowCardinality(Nullable(T)) column. #92924 (Vladimir Cherkasov).
  • Fixed several crashes during merges of text indexes in MergeTree tables. #92925 (Anton Popov).
  • Restore LowCardinality wrappers on SET expression results if needed during TTL aggregation to prevent exceptions during table optimization. #92971 (Seva Potapov).
  • Fix logical error during index analysis when empty array is used in has function. Closes #92906. #92995 (Nihal Z. Miaji).
  • Fix possible hung on terminating background schedule pool (may lead to server hungs on shutdown). #93008 (Azat Khuzhin).
  • Fix possible error FILE_DOESNT_EXIST after sparse column mutation when setting ratio_of_defaults_for_sparse_serialization was changed to 1.0 via alter. #93016 (Pavel Kruglov).
  • Fix bug in data skipping logic when not materialize(...) or not CAST(...) is used in WHERE causing incorrect results. Closes #88536. #93017 (Nihal Z. Miaji).
  • Fix possible usage of outdated parts due to TOCTOU race for shared parts. #93022 (Azat Khuzhin).
  • Fix crash when deserialising malformed groupConcat aggregate state with out-of-bounds offsets. #93028 (Raufs Dunamalijevs).
  • Fix leaving connection in a broken state after preliminary cancellation distributed queries. #93029 (Azat Khuzhin).
  • Fix join results when the right-side join key is a sparse column. This closes #92920. I can only reproduce the bug with set compatibility='23.3'. Not sure if it should be backported. #93038 (Amos Bird).
  • Fix possible Cannot finalize buffer after cancellation in estimateCompressionRatio(). Fixes: #87380. #93068 (Azat Khuzhin).
  • Fixed merges of text indexes built on top of the complex expressions (such as concat(col1, col2)). #93073 (Anton Popov).
  • Fix applying projection when filter contains subcolumns. Closes #92882. #93141 (Pavel Kruglov).
  • Fix logical error in some cases triggered when join runtime filters are added to query plan. It was caused by incorrectly returning duplicated const columns from one of join sides. #93144 (Alexander Gololobov).
  • Special function __applyFilter used by join runtime filters was returning ILLEGAL_TYPE_OF_ARGUMENT in some valid cases. #93187 (Alexander Gololobov).
  • Prevent different interpolated columns from collapse into the same column in a block when interpolated columns are effectively aliases of the same column. #93197 (Yakov Olkhovskiy).
  • Do not add runtime filter when joining with already filled right table. #93211 (Alexander Gololobov).
  • Fix keeper persistent watches cleanup after dead session. This closes #92480. #93213 (Konstantin Vedernikov).
  • Fix order by tuple in iceberg. This closes #92977. #93225 (Konstantin Vedernikov).
  • Fix bug with S3Queue setting s3queue_migrate_old_metadata_to_buckets. Closes #93392, #93196, #81739. #93232 (Kseniia Sumarokova).
  • Remove unused columns when the projection is rebuilt during the merge. It reduces memory usage and creates fewer temporary parts. #93233 (Nikolai Kochetov).
  • Fix unused columns removal from subqueries in the presence of a scalar correlated subquery. Before the fix column could have been removed if it was used only in the correlated subquery, and the query would fail with NOT_FOUND_COLUMN_IN_BLOCK error. #93273 (Dmitry Novik).
  • Fix possible missing subcolumn in MV during alter of source table. Closes #93231. #93276 (Pavel Kruglov).
  • Fix the Merge table engine query planning with the analyzer that could throw ILLEGAL_COLUMN for hostName() when merging local and remote/Distributed tables. Closes #92059. #93286 (Jinlin).
  • Fixes a case where NOT IN with non-constant array arguments was returning the wrong value + Support for non-constant Array functions. Closes #14980. #93314 (Yarik Briukhovetskyi).
  • Fix Not found column for use_top_k_dynamic_filtering optimization. Fixes #93186. #93316 (Nikolai Kochetov).
  • Fixed rebuilding of text indexes created on top of subcolumns. #93326 (Anton Popov).
  • Fixed handling of empty array as a second argument in hasAllTokens and hasAnyTokens functions. #93328 (Anton Popov).
  • Fix logical error when runtime filters are used in a query with totals for right side table. #93330 (Alexander Gololobov).
  • The server no longer crashes if function tokens is called with non-const tokenizer parameters (the 2th, 3rd, 4th parameter), e.g., SELECT tokens(NULL, 1, materialize(1)). #93383 (Robert Schulze).
  • Fixed integer overflow vulnerability in groupConcat state deserialisation that could cause memory safety issues with crafted aggregate states. #93426 (Raufs Dunamalijevs).
  • Fixed text index analysis on array columns when the index contains no tokens (all arrays are empty or all tokens are skipped by the tokenizer). #93457 (Anton Popov).
  • Avoids oauth login in ClickHouse Client when username/password are within the connection string. #93459 (Krishna Mannem).
  • Fix Azure ADLS Gen2 vended credentials support in DataLakeCatalog - parse adls.sas-token.* keys from Iceberg REST catalogs and fix ABFSS URL parsing. #93477 (Karun Anantharaman).
  • Fix GLOBAL IN support with analyzer (previously set was created on the remote node again). #93507 (Azat Khuzhin).
  • Fix extracting subcolumn during deserialization directly into Sparse columns. #93512 (Pavel Kruglov).
  • Fixed direct reading from text index with duplicate search queries. #93516 (Anton Popov).
  • Fix for NOT_FOUND_COLUMN_IN_BLOCK error when runtime filter is enabled and joined tables have the same column returned multiple times (e.g. SELECT a, a, a FROM t). #93526 (Alexander Gololobov).
  • Fix a bug where clickhouse-client would ask for password twice when connecting using ssh. #93547 (Isak Ellmer).
  • Make sure that zookeeper is finalized on shutdown (fix possible hung on shutdown in very unlikely cases). #93602 (Azat Khuzhin).
  • Fix LOGICAL_ERROR when restoring ReplicatedMergeTree with deduplication race. #93612 (Pablo Marcos).
  • Fix using Sparse column for TTL update during direct deserialization into Sparse columns in some input formats. It fixes possible logical error Unexpected type of result TTL column. #93619 (Pavel Kruglov).
  • Fixed h3 index functions sometimes crashing or getting stuck when called on invalid inputs. #93657 (Michael Kolupaev).
  • The usage of ngram_bf index on a non-UTF-8 data led to an uninitialized memory read, with values that could reside in the resulting index structure. Closes #92576. #93663 (Alexey Milovidov).
  • Validate that the decompressed buffer size is as expected. #93690 (Raúl Marín).
  • Prevent users to get the list of columns from a table without checking SHOW COLUMNS permission using the merge table engine. #93695 (János Benjamin Antal).
  • Fixed materialization of skip indexes created on top of subcolumns. #93708 (Anton Popov).
  • We store storages' shared pointers in QueryPipeline::resources::storage_holders to make sure that the IStorage objects are not destroyed while PipelineExecutor is alive. #93746 (Miсhael Stetsyuk).
  • Fix attaching Replicated DBs when the interserver host changed after restarting. #93779 (Tuan Pham Anh).
  • Fix assert !read_until_position in ReadBufferFromS3 which happened when cache is enabled. #93809 (Kseniia Sumarokova).
  • Fix logical error in a rare case when empty tuple is used with Map column. Closes #93784. #93814 (Nihal Z. Miaji).
  • Fixed _part_offset corruption when projections are rebuilt during merges, and optimized projection processing by avoiding unnecessary reads of the _part_offset column and skipping unneeded columns in projection calculations. This continues the optimizations introduced in #93233. #93827 (Amos Bird).
  • Remove 'Bad version' handling. #93843 (Anton Ivashkin).
  • Fix optimize_inverse_dictionary_lookup not working with distributed query when key is signed integral type. Closes #93259. #93848 (Nihal Z. Miaji).
  • Fix lag/lead not working with distributed remote() query. Closes #90014. #93858 (Nihal Z. Miaji).
  • Fix system instrument dispatch bug. #93937 (Pablo Marcos).
  • In https://github.com/ClickHouse/ClickHouse/pull/89173, we added an extra field to the structure that TraceSender sends through an internal pipe. However, the buffer size was not updated (here), therefore we are writing more data to buffer than buffer_size which results in multiple flushes. And because TraceSender::send is called from different threads, different threads' flushes may interleave which breaks the invariant that the receiving end (TraceCollector) relies on. #93966 (Miсhael Stetsyuk).
  • Fix type conversion to super type during the join operation of the storage Join with USING clause. Fixes #91672. Fixes #78572. #94000 (Dmitry Novik).
  • Fix for FilterStep not properly added when join runtime filter is applied over Merge table. #94021 (Alexander Gololobov).
  • A SELECT query containing a predicate on multiple columns with bloom filter skip indexes and both OR and NOT conditions are present could return inconsistent results. That is fixed now. #94026 (Shankar Iyer).
  • Fix CLEAR column with dependent indices. #94057 (Raúl Marín).
  • Fix use-of-uninitialized-value in ReadWriteBufferFromHTTP. #94058 (Alexey Milovidov).
  • Fix bad check for typed paths in JSON. The check was introduced in https://github.com/ClickHouse/ClickHouse/pull/92842 and can lead to an error during existing tables startup. #94070 (Pavel Kruglov).
  • Fix the crash during filter analysis in the presence of OUTER JOIN. Fixes #90979. #94080 (Dmitry Novik).
  • Fix accuracy of uniqTheta when using UInt8 aggregation keys in parallel (max_threads > 1 - default). #94095 (Azat Khuzhin).
  • Fix crash caused by exception thrown from a socket.setBlocking(true) call inside SCOPE_EXIT. #94100 (Miсhael Stetsyuk).
  • Fix data loss when DROP PARTITION removes parts created by later log entries in ReplicatedMergeTree. #94123 (Tuan Pham Anh).
  • Fixed parquet reader v3 incorrectly handling arrays that cross page boundaries. This happens e.g. for files written by Arrow without enabling page statistics or page index. Affects only columns of Array data type. Likely symptom is that one array every ~1 MB of data gets truncated. Before this fix, use this setting as workaround: input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev).
  • Fix too many watches in ReplicatedMergeTree while waiting for log entry. #94133 (Azat Khuzhin).
  • Functions arrayShuffle, arrayPartialShuffle and arrayRandomSample to materialize const columns - so that different rows get different results. #94134 (Joanna Hulboj).
  • Fix data race in evaluating table functions in materialized views. #94171 (Alexey Milovidov).
  • Fix nullptr dereference in PostgreSQL database engines (when the query is incorrect). Closes #92887. #94180 (Alexey Milovidov).
  • Fix memory leak in refreshable materialized views using SELECT queries with multiple subqueries. #94200 (Antonio Andelic).
  • Fix data race in DataPartStorageOnDiskBase::remove vs system.parts. Closes #49076. #94262 (Alexey Milovidov).
  • Remove the wrong noexcept specifier at HashTable copy assignment that may lead to crash (std::terminate) on memory exceptions. #94275 (Nikita Taranov).
  • Previously, creating a projection with duplicate columns in GROUP BY (e.g., GROUP BY c0, c0) and inserting data caused a std::length_error if optimize_row_order is enabled. Closes #94065. #94277 (Alexey Milovidov).
  • Fix obscure bug in ZooKeeper client on connect which leads to hungs and crashes. #94320 (Azat Khuzhin).
  • Fix function to subcolumns optimization not applied to subcolumns. #94323 (Pavel Kruglov).
  • Fix possibly incorrect result in nested RIGHT JOINs when enable_lazy_columns_replication is enabled. The bug caused all rows in replicated columns to incorrectly return the same value instead of their distinct values. Close #93891. #94339 (Vladimir Cherkasov).
  • Fix filter pushdown for SEMI JOIN using equivalence sets. Do not push the filter down if argument types have changed. Fixes #93264. #94340 (Dmitry Novik).
  • Fix usage of DeltaLake CDF with database DataLake database engine (delta lake catalogs integration). Closes #94122. #94342 (Kseniia Sumarokova).
  • Fix incorrect value of current metric FilesystemCacheSizeLimit in case SLRU cache policy was used. #94363 (Kseniia Sumarokova).
  • Creating a Backup database engine with less than two arguments now returns a more descriptive error message (Wrong number of arguments instead of std::out_of_range: InlinedVector::at(size_type) const failed bounds check.). #94374 (Robert Schulze).
  • Ignores impossible revokes of global grants on the database level for grants with grant option. #94386 (pufit).
  • Fix reading sparse offsets from compact parts. Closes #94385. #94399 (Pavel Kruglov).
  • Don't prevent ALTER of columns using implicit indexes, even if alter_column_secondary_index_mode's throw mode is used. #94425 (Raúl Marín).
  • Fix crash in TCPHandler when multiple receivePacketsExpectQuery calls read Protocol::Client::IgnoredPartUUIDs. #94434 (Miсhael Stetsyuk).
  • Fix masking sensitive data in system.functions. #94436 (Vitaly Baranov).
  • Fix nullptr dereference with disabled send_profile_events. This feature was introduced recently for the ClickHouse Python driver. Closes #92488. #94466 (Alexey Milovidov).
  • Fix text index .mrk incompatibility during merges. #94494 (Peng Jian).
  • When read_in_order_use_virtual_row is enabled, the code was accessing index columns based on the full primary key size without checking if the index was truncated, leading to use-after-free / uninitialized memory. Closes #85596. #94500 (Alexey Milovidov).
  • Fix an error due to a type mismatch when sending external tables for subqueries with GLOBAL IN if the types are Nullable. Closes #94097. #94511 (Alexey Milovidov).
  • In previous versions, queries with multiple index conditions over the same expression may erroneously throw an exception Not found column. Closes #60660. #94515 (Alexey Milovidov).
  • Fix incorrect handling of Nullable join column in runtime filters. #94555 (Alexander Gololobov).
  • Creating a workload in another workload that is currently in use no longer causes a crash. #94599 (Sergei Trifonov).
  • Fix a crash during ANY LEFT JOIN optimization when isNotNull is evaluated on a missing column. #94600 (Molly).
  • Fix default expression evaluation when referencing other columns with computed defaults. #94615 (Alexey Milovidov).
  • Fix permission issues in BACKUP/RESTORE operations. #94617 (Pablo Marcos).
  • Fix crash due to incorrect type cast when the data type is Nullable(DateTime64). #94627 (Miсhael Stetsyuk).
  • 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). #94644 (filimonov).
  • Fix storing results of keeper-bench to file. #94654 (Antonio Andelic).
  • Fix incorrect estimations with MinMax-type statistics when the column contains negative floating-point values. #94665 (zoomxi).
  • Fix reading Parquet files when a map's key is a struct. #94670 (Konstantin Vedernikov).
  • Fix possibly incorrect RIGHT join result when using complex ON conditions. Close #92913. #94680 (Vladimir Cherkasov).
  • Preserve constant index granularity (use_const_adaptive_granularity) after Vertical merges. #94725 (Azat Khuzhin).
  • Fix mutation bug with scalar subqueries and table dependencies. If a table had dependencies (index or projections) over a column, scalar subqueries might be evaluated and cached without data and lead to incorrect changes. #94731 (Raúl Marín).
  • Fix AsynchronousMetrics cpu_pressure fallback on error. #94827 (Raúl Marín).
  • The getURLHostRFC function was missing bounds checks before dereferencing pointers. When an empty string was passed to domainRFC, it would read uninitialized memory, triggering MSan errors. #94851 (Alexey Milovidov).
  • Fix readonlyness of encrypted disks. #94852 (Azat Khuzhin).
  • Fix logical error in fractional LIMIT/OFFSET when using the old analyzer with Distributed tables. Closes #94712. #94999 (Ahmed Gouda).
  • Fix crash under some conditions when join runtime filters are enabled by default. #95000 (Alexander Gololobov).
  • Improve masking passwords in url used in table engine URL() and table function url(). #95006 (Vitaly Baranov).
  • Function toStartOfInterval now works in the same way as toStartOfX, where X is Day, Week, Month, Quarter, Year when the enable_extended_results_for_datetime_functions is on. #95011 (Kirill Kopnev).
  • Fix constant string comparisons not respecting the settings cast_string_to_date_time_mode, bool_true_representation, bool_false_representation, and input_format_null_as_default. Closes #91681. #95040 (Nihal Z. Miaji).
  • Fix data race in the filesystem cache. #95064 (Alexey Milovidov).
  • Fix a rare race condition in the Parquet reader. #95068 (Alexey Milovidov).
  • Fix crash in the top K optimization when LIMIT is zero. Closes #93893. #95072 (Alexey Milovidov).
  • Converting from DateTime/integers to Time64 extracts the time-of-day component using toTime, which is not monotonic. The ToDateTimeMonotonicity template incorrectly claimed this conversion was monotonic, causing "Invalid binary search result in MergeTreeSetIndex" exception in debug builds. #95125 (Alexey Milovidov).
  • Recreated list of manifest file entries only if necessary (previously it was done on each iteration). #95162 (Daniil Ivanik).

Build/Testing/Packaging Improvement