Back to Clickhouse

2026 Changelog

docs/changelogs/v26.2.1.1139-stable.md

26.4.1.1-new226.9 KB
Original Source

2026 Changelog

ClickHouse release v26.2.1.1139-stable (11da5d85cef) FIXME as compared to v26.2.1.1-new (88589db8a2c)

Backward Incompatible Change

  • Improved storage format of statistics. All statistics are now stored in a single file. #93414 (Anton Popov).
  • 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).
  • Fix logical error on Variant type mismatch. #95811 (Bharat Nallan).
  • BREAKING CHANGE: With that 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 way of inserts. If you have deduplication explicitly disable 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).
  • 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).
  • Add s3 schema validation. 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).

New Feature

  • Support time-based one-time password as an authentication method. #71273 (Vladimir Cherkasov).
  • Enable splitting data and system files in cache into separate segments. #87834 (MikhailBurdukov).
  • Added a new SLRU cache for Parquet metadata to improve reading performance by removing the need to re-download files just to read metadata. The cache can be dropped with SYSTEM DROP PARQUET METADATA CACHE. Resolves #89102. #89750 (Grant Holly).
  • Add new system table system.user_defined_functions to monitor UDF loading status and configuration. #90340 (Xu Jia).
  • 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).
  • New deduplicate_insert which overrides insert_deduplicate and async_insert_deduplicate. #94413 (Sema Checherinda).
  • Allow certain functions without parentheses in SQL. Closes #52102. #94678 (Aly Kafoury).
  • Server setting insert_deduplication_version makes it possible to migrate on unified deduplication hash. #95409 (Sema Checherinda).
  • 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).
  • 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 new check enabled by default via setting check_named_collection_dependencies to avoid dropping named collections used by tables. #96181 (Pablo Marcos).
  • 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).
  • Users can now use ClickStack directly from ClickHouse, useful for debugging and local development. #96597 (Aaron Knudtson).
  • 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).
  • Google biglake catalog integration. This closes #95339. #97104 (Konstantin Vedernikov).
  • Start migration of deduplication hashes. #97562 (Sema Checherinda).

Experimental Feature

  • Implement LLVM Code Coverage job and enable it initially for master branch. #90952 (Alexey Bakharew).
  • 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).

Performance Improvement

  • Speed up some hash join operations by implementing dynamic dispatch for ColumnVector::replicate. #79573 (Raúl Marín).
  • Performance improvement for ParallelHashJoin 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 paralellize 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).
  • 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).
  • Slightly optimize parsing of JSON type. #93614 (Pavel Kruglov).
  • Improve memory footprint of ASTLiteral by removing std::optional<TokenIterator> begin/end from object. 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 heaving 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).
  • 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).
  • Create std::vector out of for loop and allocate memory before it. This should avoid allocations on each iterations. #95178 (Alexey Bakharew).
  • When read step already has PREWHERE filters a new filter cannot 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).
  • 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).
  • Revert 64 byte alignment for ProfileEvents::Counter. #96097 (Azat Khuzhin).
  • Trim size of CachedOnDiskReadBufferFromFile structure 50x. #96098 (Azat Khuzhin).
  • Don't copy old data on HashTable::resize if it's empty. #96180 (Raúl Marín).
  • Support JOIN runtime filters for RIGHT OUTER JOINs. #96183 (Hechem Selmi).
  • 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).
  • Avoid memory usage regression on INSERTs when deduplication is not enabled. #96503 (Alexey Milovidov).
  • Avoid including boost/multiprecision headers in wide_integer_impl.h on platforms with adequate long double, improving build time. TODO: CHANGE CATEGORY TO BUILD IF PERFORMANCE DOES NOT CHANGE. #96633 (Alexey Milovidov).
  • Backported in #97942: 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).
  • 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).
  • LZ4: Speed up decompress of 32 byte blocks in x86. #96778 (Raúl Marín).
  • 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).
  • Backported in #98184: 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).

Improvement

  • Implement readBigAt in fs cache read buffer to allow parallelized read (for remote table engines/functions). #71781 (Kseniia Sumarokova).
  • Respect command-line overrides when reloading configuration. Closes #80294. #80295 (Alexey Milovidov).
  • The optimization enable_join_runtime_filters is now the default. #89314 (Alexey Milovidov).
  • Allow key-value overrides for named collection parameters in mongodb table function. #89616 (vanchaklar).
  • 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).
  • Replace math functions from glibc with llvm-libc implementations. #90151 (Konstantin Bogdanov).
  • Support read in order optimization for complex sorting functions (like icebergBucket, icebergTruncate, etc). #90256 (Konstantin Vedernikov).
  • Add role-based access to Glue catalog. Use settings aws_role_arn and, optionally, aws_role_session_name. #90825 (Antonio Andelic).
  • This PR adds OpenTelemetry tracing for Keeper requests. #91332 (Miсhael Stetsyuk).
  • Add a new column named parts_postpone_reasons in system.mutations to improve diagnostics, which shows the parts postpone reasons. #92206 (Shaohua Wang).
  • Added a setting add_minmax_index_for_time_columns that, when enabled, automatically creates minmax indexes for all Date, Date32, Time, Time64, DateTime, and DateTime64 columns. #93355 (Michael Jarrett).
  • 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 (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).
  • 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).
  • 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).
  • 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 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).
  • 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).
  • Add iif function to ClickHouse KQL. #94790 (happyso).
  • 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).
  • Improve JSON prefixes deserialization during part loading. #94848 (Pavel Kruglov).
  • 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).
  • 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).
  • Add setting enabling throwing an exception on reading from a table if the table has some row policies but no row policies are for the current user. That often means misconfiguration of the access control so it's better to throw an exception in such cases. #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).
  • 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).
  • Respect max_parts_to_merge_at_once in TTL drop part merges. #95315 (Kseniia Sumarokova).
  • 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).
  • QBit is now GA. #95358 (Raufs Dunamalijevs).
  • 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).
  • Enable PREWHERE optimization for Iceberg tables. #95476 (Konstantin Vedernikov).
  • 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).
  • Reduce the memory footprint of some AST classes. #95514 (Raúl Marín).
  • 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).
  • Bump internal libxml2 to 2.15.1. #95574 (Robert Schulze).
  • 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 more information to system.crash_log. #95857 (Miсhael Stetsyuk).
  • 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).
  • Use_statistics_cache by default, release it as beta. #95950 (Han Fei).
  • Delta Lake is now available on macOS. Closes https://github.com/ClickHouse/ClickHouse/pull/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 @qoega. #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).
  • 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 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).
  • Under certain circumstances, manual server startup without a configuration file, could place the data directory inside an unusual location, e.g., /tmp/cores/. This is fixed by resolving the path configuration parameter relative to the working directory at the moment of server startup and resolving all other paths relative to the path. #96305 (Alexey Milovidov).
  • Use automatic cluster table functions for single subquery in FROM. Closes #92264. #96332 (phulv94).
  • When enable_positional_arguments_for_projections is enabled, save the table schema with substituted expressions instead of positional arguments. This allows server restart with disabled enable_positional_arguments_for_projections. #96372 (Alexey Milovidov).
  • Move config setting allow_impersonate_user to the section with other access-control improvements. #96451 (Vitaly Baranov).
  • Set this->exceptions(std::ios::badbit); for the std's streams inside poco. #96455 (Sema Checherinda).
  • Limit the number of pipeline streams generated with split_intersecting_parts_ranges_into_layers enabled. Helps to avoid excessive memory consumption. #96478 (Nikita Taranov).
  • 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).
  • 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).
  • Improves CPU and real-time profiler interoperability with socket timeouts. #96601 (Sergei Trifonov).
  • Optimize delta lake metadata scan. Uses changes from delta-kernel PR https://github.com/delta-io/delta-kernel-rs/pull/1827. #96686 (Kseniia Sumarokova).
  • 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).
  • Added system table system.tokenizers which shows all available tokenizers. #96753 (Robert Schulze).
  • 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).
  • The text index is now GA. #96794 (Robert Schulze).
  • 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).
  • 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).
  • Fix /play Web UI throwing QUERY_CACHE_USED_WITH_SYSTEM_TABLE when querying system tables. #96869 (Alexey Milovidov).
  • Fix crash when attaching a table to a MaterializedPostgreSQL database if dropReplicationSlot throws during stack unwinding. #96871 (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).
  • 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).
  • 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).
  • Reapply https://github.com/ClickHouse/ClickHouse/pull/95014 after https://github.com/ClickHouse/ClickHouse/pull/96813. #97064 (Vitaly Baranov).
  • 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).
  • For automatic parallel replicas, fix estimation accuracy for queries with highly selective PREWHERE filters. #97231 (Nikita Taranov).
  • Bump yaml-cpp to prevent skipping invalid YAML. #97333 (Azat Khuzhin).
  • Backported in #98112: Add information about deferred filters as a separate item to EXPLAIN query output (when using Row Policies/PREWHERE with FINAL). Related: https://github.com/ClickHouse/ClickHouse/pull/91065. #97374 (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).
  • Extract web components from `play.html` for better encapsulation and multi-instance support. #97529 (Alexey Milovidov).
  • 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).
  • Backported in #97898: Apply data skipping indexes during distributed index analysis. #97767 (Azat Khuzhin).
  • Backported in #98186: 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).

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).
  • 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).
  • Preserve chunk infos of a chunk after interaction with Iceberg sink. #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 manifesrt .avro list and files. #95164 (Daniil Ivanik).
  • Fix JSON column size lazy calculation. #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).
  • Avoid UB in distributed index analysis on fallback to local replica and there are more then max_parallel_replicas replicas. #95263 (Azat Khuzhin).
  • Fix aggregation of sparse columns for sum and timeseries when group_by_overflow_mode is set to any. #95301 (Mikhail Koviazin).
  • Try to rollback the source blob, even if the removal wasn't completed. #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 storage lifetime with distributed plan. #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 fron 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 several critical bugs around ThreadPoolCallbackRunnerLocal usage. #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).
  • Backported in #98130: In DeltaLake table engine fix logical race on snapshot version change, remove redundant heavy snapshot reloads. #96226 (Kseniia Sumarokova).
  • When a table has no statistics defined, ClickHouse shouldn't try to 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 hint is not respected for syntax error when query is prepended by a 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 crash order by in iceberg. Continue https://github.com/ClickHouse/ClickHouse/pull/93296. 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).
  • Iceberg partitioing fix. #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).
  • When we create a restful datalake catalog with a invalid auth_header, it will break system.tables. we should catch this exception. #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).
  • Add more checks for the validation of a setting which is used as a root metadata file. #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 ColumnConst not materialized before 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).
  • Azure, SSH, and Arrow Flight had reads of uninitialized memory. Delta Lake cannot work under MSan at all due to Rust. #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).
  • Previously row count estimation wasn't done for SortingStep. Implement it as minimum of row count from previous step and limit value. #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 data-race in copyS3File for multipart_tags. #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 SEGFAULT in supportsTrivialCountOptimization due to null dereference. #97281 (Pablo Marcos).
  • Fix possible crash during parsing DWARF due to wrong CU while parsing inlines for DW_FORM_ref_addr. #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).
  • Remove TABLE_UUID_MISMATCH check for non-analyzer. #97323 (Azat Khuzhin).
  • Fix segfault in StorageKeeperMap backup due to use-after-free of dangling storage pointer in lazy backup batch. #97336 (Alexey Milovidov).
  • The problem appears when we set a setting:. #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).
  • Continue of https://github.com/ClickHouse/ClickHouse/pull/61135, but with sharded cache. #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 applying setting type_json_allow_duplicated_key_with_literal_and_nested_object to typed paths in JSON. Closes #97278. #97422 (Pavel Kruglov).
  • Skip empty deduplication tokens. #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 LOGICAL_ERROR exception when reading sparse column and its subcolumn together. #97515 (Pavel Kruglov).
  • Fix a possible use after free in StorageKafka2. #97520 (Bharat Nallan).
  • Backported in #97960: Fix logical error about missing stream during INSERT SELECT with JSON and buckets in shared data. Closes #97331. #97523 (Pavel Kruglov).
  • Allow read-in-order optimization to use row policies. For example, a table with ORDER BY (key1, key2) and a row policy USING key1 = 5 can now serve ORDER BY key2 queries without an explicit sort. #97538 (János Benjamin Antal).
  • Backported in #98037: 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 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 data race on shutdown_called in DatabaseMaterializedPostgreSQL. #97554 (Alexey Milovidov).
  • Fix a possible logical error in ip_trie dictionary when key type is not String. #97555 (Bharat Nallan).
  • ... #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 filterPartsByVirtualColumns for constant-false predicates. #97620 (Bharat Nallan).
  • Fix block structure mismatch exception in removeUnusedColumns optimization when using indexHint with star expansion on tables with FINAL. #97622 (Alexey Milovidov).
  • 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 LOGICAL_ERROR exception in concat when an argument contains a Variant type with LowCardinality inside. #97654 (Alexey Milovidov).
  • Fix keeper-converter exception when encountering empty ZooKeeper transaction log files. #97673 (Alexey Milovidov).
  • Fixed a possible ClickHouse process crash/assert if the WHERE clause had more than 32 expressions with AND/ORs. #97698 (Shankar Iyer).
  • Fix tupleElement throwing an exception with JSON for paths with type hints. #97728 (Pavel Kruglov).
  • Backported in #98225: Fix possible crashes during reading of empty granules in advanced shared data in JSON. Closes #97563. #97778 (Pavel Kruglov).
  • Backported in #98025: Fixed ClickHouse server crash/assert in call to mapContainsKey/mapContainsKeyLike with tokenbf_v1 skip index. #97826 (Shankar Iyer).
  • Backported in #97985: 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).
  • Backported in #97949: 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).
  • Backported in #97919: 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).
  • Backported in #97947: Fix performance inefficiency introduced in https://github.com/ClickHouse/ClickHouse/pull/96686. #97880 (Kseniia Sumarokova).
  • Backported in #98063: Fix data race in ZooKeeper client between sendThread and receiveThread. #97887 (Pablo Marcos).
  • Backported in #98142: Fix exception from CachedOnDiskReadBufferFromFile::readBigAt. Closes #97325. #97890 (Kseniia Sumarokova).
  • Backported in #98176: Fix Keeper data loss after restart when using Azure Blob Storage with s3_plain metadata for log storage. #97987 (Antonio Andelic).
  • Backported in #98200: Fix segfault in query plan optimization when converting outer join to inner join with arrayJoin in filter expression. #98147 (Alexey Milovidov).

Build/Testing/Packaging Improvement

  • Fix force is_local to false when bind_host is configured and replace with integration test. Follow-up for https://github.com/ClickHouse/ClickHouse/pull/74741. #93109 (Zhigao Hong).
  • Stress tests: fix stress and upgrade tests in CI. ignore no-{build} tags. add compatibility randomization. #94693 (Nikita Fomichev).
  • Use postgres to REL_18_1. #95189 (Konstantin Bogdanov).
  • Use libexpat 2.7.3. #95218 (Konstantin Bogdanov).
  • Use OpenSSL 3.5.5. #95345 (Konstantin Bogdanov).
  • Fix math function domain violations in math.xml performance test. #95442 (Konstantin Bogdanov).
  • ClickHouse can be built with clang-23 (master). #95578 (Alexey Milovidov).
  • Publish parser_memory_profiler binary from build. Tool can be used to analyze AST memory consumption. #95826 (Ilya Yatsishin).
  • Fixed compression codec tests where float generators were producing truncated integer values instead of actual floats. #95961 (Raufs Dunamalijevs).
  • Fix force is_local to false when bind_host is configured and replace with integration test. Follow-up for #74741. #96018 (Zhigao Hong).
  • 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 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 nightly CI workflow to build PGO+BOLT optimized clang toolchain. #96991 (Alexey Milovidov).
  • 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).
  • Move keeper_multiread_batch_size test configuration from private to public repository. #97022 (Alexey Milovidov).
  • Use the PGO-optimized LLVM/Clang build in CI, which should give 20..30% build speed improvement. #97031 (Alexey Milovidov).
  • Update Boost from 1.83 to 1.90, fixing a devector assertion failure in debug builds. #97037 (Alexey Milovidov).
  • 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).
  • Compatibility setting randomization doesn't make sense for upgrade checks and could lead to incorrect failures, because tests with older compatibility settings might create objects that can't be loaded in a newer version without that compatibility setting enabled. #97236 (Nikita Fomichev).
  • Use PGO+BOLT optimized clang toolchain for CI builds. #97283 (clickhouse-gh[bot]).
  • 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).
  • Extract conversion functions in FunctionsConversion.h. #97704 (Raúl Marín).

CI Fix or Improvement

  • Fix a race condition in BACKUP ON CLUSTER where the backup could fail prematurely with "Lost connection" when the initiator node itself temporarily lost its ZooKeeper connection. #96961 (Alexey Milovidov).
  • Fix race condition in file cache dynamic resize that could cause a LOGICAL_ERROR exception during config reload. #96980 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception in REPLACE TABLE ... CLONE AS ... when alter_partition_verbose_result is enabled. #96982 (Alexey Milovidov).
  • Fix logical error exception in addTableExpressionOrJoinIntoTablesInSelectQuery when formatting error messages for invalid query trees containing unexpected node types in join tree positions. #96985 (Alexey Milovidov).
  • Fix logical error exception in FunctionVariantAdaptor when applying functions to Variant columns containing LowCardinality alternatives with constant non-Variant arguments. #97021 (Alexey Milovidov).
  • ... #97025 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception in ATTACH PARTITION ALL when the detached directory contains parts with intersecting block ranges. #97040 (Alexey Milovidov).
  • Fix LOGICAL_ERROR exception "Tried to lock part for removal second time" on concurrent TRUNCATE operations. #97211 (Alexey Milovidov).
  • Switch from Apache Kafka to Redpanda in functional (stateless) tests to reduce flakiness from JVM-related delays. #97429 (Alexey Milovidov).
  • Fix flaky test 02932_refreshable_materialized_views_2 timeout on ASan by preventing race between auto-refresh table exchange and concurrent reads. #97667 (Alexey Milovidov).

CI Fix or improvement

  • Do not fail targeted integration checks on session timeout when all completed tests have passed. #96761 (Alexey Milovidov).
  • Fix inconsistent AST formatting for array/tuple functions with .N tuple element access that caused exceptions in debug builds. #96894 (Alexey Milovidov).
  • Fix flaky test_build_sets_from_multiple_threads integration test under ASan. #96954 (Alexey Milovidov).
  • Reduce Spark JVM startups in test_database_delta integration tests to avoid timeout flakiness. #96962 (Alexey Milovidov).
  • Fix flaky test 00563_shard_insert_into_remote by increasing handshake_timeout_ms. #96966 (Alexey Milovidov).
  • Add missing FilteredListWithStatsAndData and other OpNum values to zookeeper_log system table enum, fixing sporadic UNKNOWN_ELEMENT_OF_ENUM exceptions. #97130 (Alexey Milovidov).
  • Fix flaky test 03400_alter_update_with_rename by using proper mutation sync instead of sleep-based wait. #97268 (Raúl Marín).
  • cherry_pick.py now skips creating cherry-pick/backport PRs for release branches marked rolling-out when the source PR uses the generic pr-must-backport or pr-critical-bugfix label; a direct version-specific label (e.g. v25.10-must-backport) overrides this and always proceeds. #97274 (Max Kainov).
  • Fix several bugs in the praktika CI infrastructure deployment tooling: idempotent IAM/Lambda deploys, Slack worker preference persistence, home view block limit, Lambda timeout, and EC2 instance quantity handling. #97310 (Max Kainov).
  • Added Job.Config.needs_jobs_from_requires flag to treat job-name entries in requires as hard dependencies in the CI praktika framework. #97391 (Max Kainov).
  • Fixed flaky test_kafka_sasl_settings_precedence integration test under TSan by explicitly closing the Kafka producer. #97415 (Alexey Milovidov).
  • Fix MSan use-of-uninitialized-value in LibArchiveWriter::WriteBufferFromLibArchive::closeFile by initializing class members at declaration. #97431 (Alexey Milovidov).
  • Use ext.change_url / ext.run_url fields for navigation links in the Praktika HTML report, and show per-job GitHub Actions URLs when viewing individual job results. #97534 (Max Kainov).
  • N/A. #97643 (Alexey Milovidov).
  • Add timeout for minio restart in CI to avoid test jobs hanging forever. #97655 (Alexey Milovidov).

CI Fix or improvement (CI only)

CI Fix or improvement (not a user-visible change)

NO CL CATEGORY

NO CL ENTRY

  • NO CL ENTRY: 'Revert " Implement AVX512BW versions for random data generation"'. #93983 (Raúl Marín).
  • NO CL ENTRY: 'Sccache: third attempt'. #95226 (Max Kainov).
  • NO CL ENTRY: 'Revert "Fix schema mapping for dates"'. #95468 (Alexander Tokmakov).
  • NO CL ENTRY: 'Revert "Revert "Fix schema mapping for dates""'. #95477 (Konstantin Vedernikov).
  • NO CL ENTRY: 'Revert "Support auxiliary zookeeper for DatabaseReplicated."'. #95513 (Alexander Tokmakov).
  • NO CL ENTRY: 'Revert "Fix test_peak_memory_usage flakiness by making logging of peak memory more accurate"'. #95564 (Alexey Bakharew).
  • NO CL ENTRY: 'Revert "Revert "Merge pull request #93542 from scanhex12/multistage_prewhere""'. #95565 (Konstantin Vedernikov).
  • NO CL ENTRY: 'Revert "Do not hold a storage in storage snapshot"'. #95594 (Azat Khuzhin).
  • NO CL ENTRY: 'Revert "add more information to crash log" (signal-unsafe warning in TSan)'. #95733 (Azat Khuzhin).
  • NO CL ENTRY: 'Revert "Integration tests: add tests for encrypted named collections"'. #95908 (Alexander Tokmakov).
  • NO CL ENTRY: 'Revert "Allow certain functions without parentheses in SQL"'. #95943 (Raúl Marín).
  • NO CL ENTRY: 'Revert "Fix force is_local to false when bind_host is configured"'. #95974 (Raúl Marín).
  • NO CL ENTRY: 'Revert "Part with unknown projections should not be marked as lost forever"'. #95991 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Revert "Revert "Merge pull request #93542 from scanhex12/multistage_prewhere"""'. #96028 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Revert "Revert "Revert "Merge pull request #93542 from scanhex12/multistage_prewhere""""'. #96088 (Konstantin Vedernikov).
  • NO CL ENTRY: 'Revert "Fix relative config paths resolving against wrong directory after chdir"'. #96548 (Ilya Yatsishin).
  • NO CL ENTRY: 'Revert "Fix exception in adjustLastGranule with constant PREWHERE and patch parts"'. #96574 (Nikolai Kochetov).
  • NO CL ENTRY: 'Revert "Remove unnecessary parentheses in CREATE TABLE ... AS SELECT ... COMMENT"'. #96595 (Alexander Tokmakov).
  • NO CL ENTRY: 'Revert "Revert "Remove unnecessary parentheses in CREATE TABLE ... AS SELECT ... COMMENT""'. #96598 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Add setting enabling throwing an exception on reading from a table if the table has row policies but no row policies are for the current user"'. #96813 (Alexander Tokmakov).
  • NO CL ENTRY: 'Revert "Set MALLOC_MIN_ALIGNMENT to the value from standard library"'. #96814 (Nikita Taranov).
  • NO CL ENTRY: 'Revert "Improve catalog show tables query"'. #96826 (alesapin).
  • NO CL ENTRY: 'Revert "Add regression tests for adjustLastGranule with constant PREWHERE and patches"'. #96862 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Test bugfix validation against multiple build types"'. #97011 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Add MSan integration tests as non-required CI jobs"'. #97052 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Revert "Add MSan integration tests as non-required CI jobs""'. #97058 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Revert "Improve catalog show tables query""'. #97062 (Smita Kulkarni).
  • NO CL ENTRY: 'Revert "Normalize positional GROUP BY in projections to prevent server restart failure"'. #97221 (Nikita Fomichev).
  • NO CL ENTRY: 'Revert "Show schema for parameterized_view"'. #97289 (Nikita Fomichev).
  • NO CL ENTRY: 'Revert "Fix logical error when fetched part has newer metadata version than table"'. #97301 (alesapin).
  • NO CL ENTRY: 'Revert "Fix incorrect last mark granularity in constant granularity parts"'. #97430 (Alexey Milovidov).
  • NO CL ENTRY: 'Revert "Fix exception when reading .size subcolumn of sparse Nullable(String) with PREWHERE"'. #97512 (Pavel Kruglov).
  • NO CL ENTRY: 'Revert "Missing testing features"'. #97550 (Alexey Milovidov).

NOT FOR CHANGELOG / INSIGNIFICANT

Performance Optimization

  • 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).