Watch all release presentations and videos at ClickHouse Theater and YouTube Playlist.
ClickHouse release v26.2, 2026-02-26
ClickHouse release v26.1, 2026-01-29
Changelog for 2025
Changelog for 2024
Changelog for 2023
Changelog for 2022
Changelog for 2021
Changelog for 2020
Changelog for 2019
Changelog for 2018
Changelog for 2017
ClickHouse release 26.2, 2026-02-26. Presentation, Video
- 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 withdeduplicate_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_queuetoazure_queue_metadata_cacheandsystem.s3queuetos3queue_metadata_cache. #95809 (Kseniia Sumarokova). - Previously, applying a function to a
Variantcolumn 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). DATEcolumns from PostgreSQL are now inferred asDate32in ClickHouse (in previous versions they were inferred asDate, which led to overflow of the values outside of a narrow range). Allow insertingDate32values back to PostgreSQL. Closes #73084. #95999 (Alexey Milovidov).- The semantics of the
do_not_merge_across_partitions_select_finalsetting 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=1enables the functionality unconditionally. Ifdo_not_merge_across_partitions_select_final=0, then automatic is used only if the new settingenable_automatic_decision_for_merging_across_partitions_for_final=1and not used otherwise. To preserve the old behaviour as much as possible, the defaults were set todo_not_merge_across_partitions_select_final=0andenable_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_finalby default. Initially, whenoptimize_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 theoptimize_move_to_prewhere_if_finalfor the ROW POLICY filter. To fix this, this PR enables the settingapply_row_policy_after_finalintroduced in #91065. Withapply_row_policy_after_finalenabled, ROW POLICY would continue to respect FINAL by default, as previously. This PR is an incompatible change because it changes the behaviour foroptimize_move_to_prewhere_if_final=1. Now, to get the ROW POLICY applied before FINAL,apply_row_policy_after_finalshould be used instead ofoptimize_move_to_prewhere_if_final. #97279 (Nikolai Kochetov). - The
Datetype is now serialized as Arrow's nativedate32type in Arrow/ArrowStream formats, instead ofuint16. Tools like PyArrow will now correctly see the column as a date type. The old behavior can be restored with theoutput_format_arrow_date_as_uint16setting. Reading old Arrow files that useduint16forDatecolumns is still supported. #96860 (Alexey Milovidov).
- 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_tablesdatabase setting. When enabled, tables are not loaded during database startup — a lightweightStorageTableProxyis created instead and the real table engine is materialized on first access. #96283 (xiaohuanlin). - Added
input_format_max_block_wait_mssetting 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.tokenizerswhich shows all available tokenizers. #96753 (Robert Schulze). - Add new system table
system.user_defined_functionsto monitor UDF loading status and configuration. #90340 (Xu Jia). - Add
system.jemalloc_statstable exposing jemalloc memory allocator statistics (viamalloc_stats_print) for diagnosing memory usage on servers built with jemalloc. Also add a/jemalloc.htmlHTTP endpoint on the ClickHouse HTTP interface for interactive visualization of these statistics. #97077 (Antonio Andelic). - Added
system.jemalloc_profile_texttable for reading and analyzing jemalloc heap profiles. The output format is controlled by thejemalloc_profile_text_output_formatsetting (raw, symbolized, or collapsed; default collapsed). Inline frame resolution is controlled byjemalloc_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_countcontrols 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_databasesetting, 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
primesand new system tablesystem.primesthat 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,colorSRGBToOKLABto convert value from sRGB to OKLAB and vice versa. #93361 (Pranav Tiwari). - A new
deduplicate_insertsetting which overridesinsert_deduplicateandasync_insert_deduplicate. #94413 (Sema Checherinda). - Server setting
insert_deduplication_versionmakes it possible to migrate on unified deduplication hash. #95409 (Sema Checherinda). - Add
xxh3_128hashing 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_dependenciesto avoid dropping named collections used by tables. #96181 (Pablo Marcos). - Added
system.fail_pointsto 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_arnand, optionally,aws_role_session_name. #90825 (Antonio Andelic). - Added a setting
add_minmax_index_for_time_columnsthat, when enabled, automatically creates minmax indexes for allDate,Date32,Time,Time64,DateTime, andDateTime64columns. #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 COLUMNfor Iceberg tables. Previously onlyADD COLUMN, DROP COLUMN, and MODIFY COLUMNwere supported. #97455 (murphy-4o).
- The text index is now GA. #96794 (Robert Schulze).
- The
QBitdata 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_runsandast_fuzzer_any_querysettings. When enabled, the server runs randomized mutations of each query after its normal execution, discarding the results. #97568 (Alexey Milovidov). - Add
iiffunction to the experimental KQL dialect. #94790 (happyso). - Schema inference now respects
allow_experimental_nullable_tuple_type. When enabled, it allows inferred tuple types to beNullable(Tuple(...)), so missing nested objects can becomeNULLinstead of a tuple ofNULLelements. #95525 (Nihal Z. Miaji). - The
use_statistics_cachesetting 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).
- 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, andhas. If the expression is also injective (e.g.ORDER BY hex(p)orORDER BY reverse(tuple(reverse(p), hex(p)))), we can effectively use the index for the negated forms:!=,NOT IN, andNOT 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_scheduleris nowmax_min_fairinstead offair_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
FINALquery used primary key condition for filtering followed by skip indexes for other conditions, thePrimaryKeyExpandprocessing 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_processingsetting. 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
T64codec compression by using dynamic dispatch on x86. #95881 (Raúl Marín). - Speed up
uniqover 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::observeOperationshas been found to account for >20% of the ZooKeeper receive thread CPU consumption. This change addresses that by: 1. ForAggregatedZooKeeperLog::stats, useCityHash64instead ofSipHashwhich is >10x faster. 2. ForCoordination::ErrorCounter, usestd::array<std::atomic<UInt32>, N>instead ofstd::unordered_mapandstd::mutex. #95962 (Miсhael Stetsyuk). - Remove 64-byte alignment for ProfileEvents::Counter to save memory. #96097 (Azat Khuzhin).
- Memory optimization: trim size of
CachedOnDiskReadBufferFromFilestructure 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 OUTERJOINs. #96183 (Hechem Selmi). - The optimization
enable_join_runtime_filtersis 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
minmaxsecondary indexes on time columns andbloom_filterindexes onquery_id/initial_query_idcolumns to system log tables for faster filtering. #96712 (Alexey Milovidov). - Lazy materialization optimization is now applied to all branches of a
UNION ALLquery, not just the first one. Queries that combine multiple sorted and limited reads from differentMergeTreetables viaUNION ALLwill 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
DeltaLakenow takescount()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 TABLESquery by fetching only names of tables and improved getLightweightTablesIterator to return structure containing only table names. resolves #93835. #94467 (Smita Kulkarni). - Improve
assumeNotNull,coalesce,ifNullto 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
statand/ordatain 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_layersenabled. Helps to avoid excessive memory consumption. #96478 (Nikita Taranov). - Implement equivalent sets optimization for multiple joins. Queries with multiple consecutive
INNER JOINoperations 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 delta-io/delta-kernel-rs#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
startsWithUTF8if the prefix contains only ASCII characters. #97055 (vkcku).
- Add OpenTelemetry tracing for Keeper requests. #91332 (Miсhael Stetsyuk).
- New configuration options:
logger.startup_console_level&logger.shutdown_console_levelto 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
mongodbtable function. #89616 (vanchaklar). - The read-in-order optimization for Iceberg tables now works with complex sorting functions like
icebergBucketandicebergTruncate, 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_idsinsystem.part_logfor event type ofMUTATE_PARTandMUTATE_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
QueryNonInternalmetric to track the number of executing non-internal queries. This metric is exposed asClickHouseMetrics_QueryNonInternaland helps operators monitor query concurrency against themax_concurrent_querieslimit, 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 exceededif the total limit is more than allowed. #95003 (Nikolai Kochetov). - Added the
throw_on_unmatched_row_policiesconfiguration 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_msmilliseconds. 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_pathsetting from s3Queue. #95203 (Diego Nieto). - Respect
max_parts_to_merge_at_oncein TTL drop part merges. #95315 (Kseniia Sumarokova). - Add
connection_addressandconnection_portto query_log to reflect physical connection (addressandportare 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
accessdirectory, 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
DeltaLaketables fromsystem.tables. #95899 (Antonio Andelic). - Enable
enable_max_bytes_limit_for_min_age_to_force_mergeby default if thecompatibilitysetting is26.2or 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
distanceCosinealias forcosineDistancebecause all other distance functions already have alias of this form. #96065 (Raufs Dunamalijevs). - Add support for the
with_dataKeeper 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
numbersandprimes. ClickHouse can now derive conservative value bounds fromWHEREconditions when exact bounds cannot be derived, and restrict sequence generation accordingly (for example, forWHERE 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
COMMENTclause was present to disambiguate parsing. Instead, outputCOMMENTbeforeAS SELECT, which eliminates the ambiguity without parentheses. #96293 (Alexey Milovidov). - The
allow_impersonate_userconfig setting is now located inside theaccess_control_improvementssection rather than being a standalone server setting. #96451 (Vitaly Baranov). - Make
core_dump.size_limitconfiguration 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_idtype insystem.instrumentationfrom 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/ipv6settings, are applied even if DNS cache is disabled. #96810 (c-end). - Better jemalloc introspection. #96840 (Azat Khuzhin).
- Fix
/playWeb UI throwingQUERY_CACHE_USED_WITH_SYSTEM_TABLEwhen 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
/playUI clickable to toggle the database list. #96884 (Alexey Milovidov). DROP DATABASEnow drops tables in reverse dependency order, improving crash-safety when the database contains tables with loading dependencies (e.g.Distributedtables usingjoinGet). #97057 (Alexey Milovidov).- Bump yaml-cpp to prevent skipping invalid YAML. #97333 (Azat Khuzhin).
- Show a loading indicator in the
play.htmlsidebar 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).
- 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, andmapContainsValuefunctions. 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
MaterializedPostgreSQLdatabase ifdropReplicationSlotthrows 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
stringJaccardIndexUTF8and 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
-Clustertable function. Resolves #89996. #94748 (Konstantin Bogdanov). - Fix incorrect primary key and skip index pruning for predicates involving
toWeek,toYearWeek,toStartOfWeek,toLastDayOfWeek, andtoDayOfWeek, and fix exceptions in some of these functions for valid queries withLowCardinality(String). #94816 (Nihal Z. Miaji). - Remove unnecessary skip permissions check in
ATTACHqueries 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
ReplicatedMergeTreestartup caused by concurrent removal ofdelete_tmp_*directories. #94892 (myeongjun). - Fix
INSERTinto 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](ClickHouse#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
USINGclause. 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., inSELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a), thet2.acolumn is only used by the first join, so its type should be the supertype oft1.aandt2.a, excludingt3.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_replicasfell back to a local replica during index analysis. #95263 (Azat Khuzhin). - Fix aggregation of sparse columns for
sumand timeseries whengroup_by_overflow_modeis set toany. #95301 (Mikhail Koviazin). - Fix a reliability issue in
plain_rewritabledisk 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
redistable 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/OFFSETis 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_functionsto not rewritesum/count/avgintosumCount()when the aggregate argument isNullable. 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
mergeTreeProjectiontable 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 thatmergeTreeIndexandmergeTreeAnalyzeIndexesalready 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
tupleElementapplied 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 messagelogical error when waiting for a distributed DDL and dropping the Replicated database concurrently. Fixes #95539. #95664 (Alexander Tokmakov). - Fix
INfunction returning incorrect results withNULLvalues whentransform_null_inis enabled. Closes #65776. #95674 (Nihal Z. Miaji). - Correctly handle LowCardinality Nullable types in
CASTwhen the settingcast_keep_nullableis 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.*) andanalyzer_compatibility_join_using_top_level_identifierwhenUSINGcolumn 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_SUPPORTEDerror that could occur when using thedirectjoin 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 prefixpathwere 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
NULLinJointable withNullable(String)key. Closes #71414. #96002 (Alexey Milovidov). - Now the PostgreSQL engine can correctly read
BOOLEAN[]. Closes #72754. #96006 (Alexey Milovidov). - Fix the
ProtobufListformat for the case of reading from an empty file. Closes #70059. #96007 (Alexey Milovidov). - Fix
ProtobufListformat producing ghost record for empty tables. Closes #72596. #96010 (Alexey Milovidov). - Fix
iffunction type mismatch betweenUInt64andInt32in an unusual case of distributed queries and PREWHERE, with type inference. Closes #70017. #96012 (Alexey Milovidov). - Fix
JITcompiled queries involvingBooltypes. #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). FixedStringvalues 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_nsandglobal_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_keyand a very large number of disjunctions of conditions that use the index. #96112 (Alexey Milovidov). - Fix a regression with the
Gorillacodec 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
formatDateTimewith non-fixed-width formatters, such as MySQL and JODA-style. #96133 (Alexey Milovidov). - The combination of settings
use_const_adaptive_granularityandindex_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::containsreturning 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_functionsto not rewritesum/count/avgintosumCount()when the aggregate argument isLowCardinality(Nullable). Closes #95390. #96239 (Nihal Z. Miaji). - Fix incorrect partition pruning for
not INandnot hasfunction in some cases. #96241 (Nihal Z. Miaji). - Fix
stack-use-after-scopein 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
coalescefunction, which has its first argument constant. #96340 (Alexey Milovidov). - The interaction of
GROUPING SETS,group_by_use_nulls, and theTupledata type withLowCardinalityinside it, could produce an unexpected block structure in the query pipeline, which led to a logical error. This appeared after the introduction ofNullableTuples. #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_discriminatorserror 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
mysqltable 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_timevalues. #96450 (Sergei Trifonov). - Fix a logical error in some cases when fractional
LIMIT/OFFSETis 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
LowCardinalitycolumns are converted toNullable. #96483 (Nihal Z. Miaji). - Fix a crash when creating an Iceberg table with an
ORDER BYclause 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_ERRORexception in Parquet V3 native reader whenPREWHEREfilter 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-freeinCREATE TABLEwith constraints. #96669 (Nikita Taranov). - Validate witness version in bech32 to avoid buffer overflow. #96671 (Raúl Marín).
- Fix
system.tablesreturning errors when a Data Lake REST catalog is created with an invalidauth_headersetting. #96680 (Han Fei). - Fix
min(timestamp)returning epoch (1970-01-01) via_minmax_count_projectionafter TTL merge when all rows in a block are filtered out. #96703 (Raquel Barbadillo). - Improve validation of the
iceberg_metadata_file_pathsetting to prevent path traversal and ensure the specified metadata file is within the table directory. #96754 (Daniil Ivanik). - Fix crash in
ifNullwithVariantargument used inGROUP BY. #96790 (Alexey Milovidov). - Fixed cache key collisions between tables with
table_disk=1setting. #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 COLUMNqueries 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 aplain_rewritableobject 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 ALLandINTERSECT ALLignoring row multiplicities and behaving like theirDISTINCTcounterparts. #96876 (Alexey Milovidov). - Fix
std::terminateexception inindexOfAssumeSortedwhen called with incompatible types (e.g.,IPv4array with integer search value). #96877 (Alexey Milovidov). - Fix exception
Bad cast from type DB::ColumnNullable to DB::ColumnStringwhen using window functions withgroup_by_use_nulls = 1and CUBE/ROLLUP/GROUPING SETS. #96878 (Alexey Milovidov). - Fix incorrect results when JIT-compiled expressions convert
DateTimetoDateTime64(e.g., inCASE/if/multiIfwith 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
CoalescingMergeTreewhen a skip index expression produces a constant column (e.g.,bloom_filteronifNotFinite(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
SETTINGSnot being applied to table functions likefilein CTEs and subqueries. #96882 (Alexey Milovidov). - Fix memory leak of BIO objects when reading X509 certificates. #96885 (Alexey Milovidov).
- Fix
LOGICAL_ERRORexception in query analyzer when a lambda expression is passed where a concrete value is expected (e.g., as the accumulator argument ofarrayFold). #96892 (Alexey Milovidov). - Fix
ColumnNullable is not compatible with originalexception when casting complex nested types (Array of Nullable Tuple containing Map with Nullable Enum values). #96924 (Alexey Milovidov). - Fix a race condition in sharded
HASHEDdictionary parallel loading that could occasionally cause some rows to not be loaded. #96953 (Alexey Milovidov). - Fix a race condition between
REPLACE PARTITIONand background mutations that could result in both old and new data being visible after the replace. #96955 (Alexey Milovidov). - Fix
arrayJoinfunction producing duplicate rows when used with INNER JOIN and WHERE clause, caused by the partial predicate push-down optimization incorrectly pushing filters containingarrayJoinbelow a JOIN. #96989 (Alexey Milovidov). - Fix crash (SEGFAULT) in
clearCachescaused byBlockIO::operator=not movingquery_metadata_cache, leading to premature destruction of cached storage snapshots and use-after-free ofMergeTreeDatastorage. #96995 (Alexey Milovidov). - Fix assertion failure in
IfTransformStringsToEnumPasswhen theifortransformfunction returnsNullable(String)(e.g. withGROUP BY ... WITH CUBEandgroup_by_use_nulls = true). #97002 (Alexey Milovidov). - Fix incorrect data written during
INSERT ... SELECTwithUNION ALLandJOIN, where constant string columns could receive wrong values after block squashing. #97019 (Hasyimi Bahrudin). - Fix
assert_castexception (or silent data corruption in release builds) when building column statistics afterALTER TABLE MODIFY COLUMNchanges 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 PARTITIONand background mutations inMergeTreetables 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
FunctionVariantAdaptorwith functions requiring const arguments likearrayROCAUC. #97116 (Bharat Nallan). - Fix stuck mutations when
PartCheckThreadre-enqueues aGET_PARTfor an already-mutated part, leaving phantom entries inparts_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_ERRORexception inFunctionVariantAdaptorwhen a function operating on Variant columns returnsNothingtype, which can happen with empty arrays inUNION ALLqueries. #97213 (Alexey Milovidov). - Fix a data race during S3 multipart copy operations (e.g., during
BACKUP/RESTOREto S3) that could cause exceptions under concurrent access. #97227 (Azat Khuzhin). - Fix
LOGICAL_ERRORexception whenarrayJoininWHEREclause references columns from both sides of aJOIN. #97239 (Alexey Milovidov). - Fix
LOGICAL_ERRORexception when reading.sizesubcolumn of a sparseNullable(String)in a Tuple with PREWHERE. #97264 (Alexey Milovidov). - Fix exception "Number of rows in lazy chunk does not match number of offsets" in
LazyMaterializingTransformwhen reading from tables with non-adaptive index granularity (index_granularity_bytes = 0) usingORDER BY ... LIMIT. #97270 (Alexey Milovidov). - Fix
SYSTEM RESTART REPLICAlosing table from database when table re-creation fails with a non-ZooKeeper exception (e.g. memory limit), causing metadata digest mismatches inDatabaseReplicated. #97276 (Alexey Milovidov). - Field
readonlyinsystem.merge_tree_settingsnow properly reflects that certain merge tree settings (e.g.index_granularity) are unconditionally readonly. #97277 (Robert Schulze). - Fix a crash during
count()optimization onMergeTreetables 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_ERRORexception inapplyOrderwhen using text-indexed columns withQUALIFYclause. #97313 (Alexey Milovidov). - System table
system.functionsnow shows for internal functionscategories = 'Internal'instead ofcategories = ''. #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_MISMATCHerrors that could occur with refreshable materialized views and other scenarios where tables are renamed. #97323 (Azat Khuzhin). - Fix segfault in
StorageKeeperMapbackup due to use-after-free of dangling storage pointer in lazy backup batch. #97336 (Alexey Milovidov). - Fix the
existsfunction with a scalar subquery inside anALTER UPDATE/DELETEwhenmutations_execute_subqueries_on_initiatoris 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 TABLESis executed in parallel with the sharded query cache enabled. #97411 (Konstantin Vedernikov). - Fix
LOGICAL_ERRORexception in Array-to-QBitconversion whennullable_sourcefrom an outerTuplewrapper 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 astuple(('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
LazyMaterializingTransformwhen reading from tables with non-adaptive index granularity (index_granularity_bytes = 0) usingORDER BY ... LIMIT. #97482 (Alexey Milovidov). - Fix insert iceberg settings. Add alias for the
allow_experimental_insert_into_icebergsetting. #97483 (Konstantin Vedernikov). - Fix
ACCESS_DENIEDfor users withoutCREATE TEMPORARY TABLEpermission whenoptimize_inverse_dictionary_lookupoptimization rewritesdictGet(...)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
SetandMergeTreeIndexSetwhen processing columns with inner sparse subcolumns (e.g.,Tuplecolumns from MergeTree parts with different sparse serialization profiles). #97493 (Alexey Milovidov). - Fix a possible use after free in StorageKafka2. #97520 (Bharat Nallan).
- Fix
INTO OUTFILEwithTRUNCATEandinto_outfile_create_parent_directoriessetting when the output path contains directories. #97549 (Alexey Milovidov). - Fix
BAD_ARGUMENTSerror when querying tables with lambda expressions inside ALIAS columns through themerge()table function with the analyzer enabled. #97551 (Alexey Milovidov). - Fix
system.zookeeper_infoexception when Keeper zxid is 0. #97553 (Alexey Milovidov). - Fix a possible logical error in
ip_triedictionary 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 likeOneLakeCatalog). 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 theGeometryvariant type. #97571 (Alexey Milovidov). - Fix
LOGICAL_ERRORexception when usingisNull/isNotNullon subcolumns ofNullable(Tuple(... Nullable(T) ...))types. Closes #97224. #97582 (Alexey Milovidov). - Fix null pointer dereference when applying patch parts during lightweight updates. #97583 (Alexey Milovidov).
BaseSettings::readBinarypasses the index fromaccessor.findtofield_infos[]without checking for the not-found sentinel value (i.e.,-1), which may cause astd::vectorout-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;readBinarywas missing the same check. #97585 (Miсhael Stetsyuk).- Fix incorrect query results for
UNION ALLqueries 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 withUNSUPPORTED_METHODerror. #97646 (Alexey Milovidov). - Fix logical error exception during
GROUP BY ... WITH ROLLUP/CUBEwhen keys includeLowCardinality(Nullable(...))insideNullable(Tuple(...)). #97647 (Alexey Milovidov). - Fix AST formatting inconsistency for
NOT (1, 1, 1)that could causeLOGICAL_ERRORin debug builds. #97653 (Alexey Milovidov). - Fix
keeper-converterexception when encountering empty ZooKeeper transaction log files. #97673 (Alexey Milovidov).
- ClickHouse can be built with clang-23 (master). #95578 (Alexey Milovidov).
- Fix force
is_localto false whenbind_hostis 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
--symbolizeflag forparser_memory_profilertool that produces.heap.symfiles 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
OpenSSLdynamically. 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_enumrange from [-100, 1000] to default [-128, 127] by using a per-type specialization forCoordination::OpNum, improving build time. #96632 (Alexey Milovidov). - Remove unnecessary C++ templates from Function classes to reduce build times. #96646 (Alexey Milovidov).
- Move
StorageSystemLicensesgeneration 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
devectorassertion failure in debug builds. #97037 (Alexey Milovidov). - Update
postgresto REL_18_1. #95189 (Konstantin Bogdanov). - Use
libexpat2.7.3. #95218 (Konstantin Bogdanov). - Use
OpenSSL3.5.5. #95345 (Konstantin Bogdanov). - Use
simdjsonv4.2.4. #97129 (Konstantin Bogdanov). - Use
libarchive3.8.5. #97131 (Konstantin Bogdanov). - Use
fast_floatv8.2.3. #97133 (Konstantin Bogdanov). - Use
abseil-cpp20260107.1,s2geometryto v0.13.1. #97134 (Konstantin Bogdanov). - Bump
libxml2to 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 numericX86_ARCH_LEVELoption (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=truetemplate variants for non-division operations inFunctionBinaryArithmetic, reducing compilation time and binary size. #97496 (Raúl Marín). - Reduce the include footprint of
Exception.hby removing it from high-fan-out headers liketypeid_cast.h,assert_cast.h,Context_fwd.h,IDataType.h, and various Column headers. #97497 (Raúl Marín). - Always use bundled
compiler-rtheaders (sanitizer and XRay interfaces) instead of the host compiler's headers, and buildcompiler-rtlibraries from source by default. #97499 (Raúl Marín). - Avoid including boost/multiprecision headers in
wide_integer_impl.hon platforms with adequatelong 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
- 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_QPLandZSTD_QATwere removed. Users are advised to convert existing data compressed withDEFLATE_QPLorZSTD_QATto another codec before upgrade. Note that in order to use the codecs, settingsenable_deflate_qpl_codecandenable_zstd_qat_codechad 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 insystem.query_log.exceptionfor effective troubleshooting. #92209 (Xu Jia). - Empty column list in
JOIN USING ()clause is now considered a syntax error. Previously it was supposed to beINVALID_JOIN_ON_EXPRESSIONduring query execution. In some cases such as joining withJoinstorage it led toLOGICAL_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
Lazydatabase engine is removed and no longer available. Closes #91231. #93627 (Alexey Milovidov). - Remove the
transposed_with_wide_viewmode of themetric_log- it is unusable due to a bug. It is no longer possible to definesystem.metric_logwith this mode. This partially reverts #78412. #93867 (Alexey Milovidov). - CPU scheduling for workloads is now preemptive by default. See
cpu_slot_preemptionserver 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_dotallanddictionary_use_async_executorwere 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/joinGetOrNullfunctions now enforceSELECTprivileges on the underlying Join table. After this change, executingjoinGet('db.table', 'column', key)requires the user to haveSELECTprivilege on both the key columns defined in the Join table and the attribute column being retrieved. Queries lacking these privileges will fail withACCESS_DENIED. To migrate, grant the necessary permissions usingGRANT SELECT ON db.join_table TO userfor full table access, orGRANT SELECT(key_col, attr_col) ON db.join_table TO userfor column-level access. This change affects all users and applications relying onjoinGet/joinGetOrNullwhere explicitSELECTgrants were not previously configured. #94307 (Vladimir Cherkasov). - Check
SHOW COLUMNSforCREATE TABLE ... AS ...queries. Previously, it checkedSHOW TABLES, which is an incorrect grant for this type of permission check. #94556 (pufit). - Make the
Hashoutput format independent of block sizes. #94503 (Alexey Milovidov). Note that this changes the output hash values compared to previous versions.
- 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 ClickHouse#81021. #91844 (Amos Bird).
- Add text index support for
Arraycolumns. #89895 (Jimmy Aguilar Mena). - Enable
use_variant_as_common_typeby default, which lets you use incompatible types inside anArray, inUNIONqueries, and in branches ofif/multiIf/case. #90677 (Alexey Milovidov). - New system table
zookeeper_info. Implements #88014. #90809 (Smita Kulkarni). - Support the
Varianttype in all functions. #90900 (Bharat Nallan). - Adds a
ClickHouse_Infometric to the Prometheus/metricsendpoint 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
rcfgcommand for keeper which allows to change cluster configuration. This command provides broader possibilities for configuration changes than standardreconfigurerequest. Command takesjsonstring 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
reverseBySeparatorwhich 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_byteswhich control the formation of inserted blocks in finer detail. #92833 (Kirill Kopnev). - It is possible to execute DDL queries with
ON CLUSTERclause for a Replicated database if theignore_on_cluster_for_replicated_databasesetting is enabled. In this case, the cluster name will be ignored. #92872 (Kirill). - Implement
mergeTreeAnalyzeIndexesfunction. #92954 (Azat Khuzhin). - Add new setting
use_primary_key. Set it tofalseto disable granule pruning based on the primary key. #93319 (Nihal Z. Miaji). - Add
icebergLocalClustertable function. #93323 (Anton Ivashkin). - Added
cosineDistanceTransposedfunction that approximates the cosine distance between two points. #93621 (Raufs Dunamalijevs). - Add
filescolumn 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_schedulerserver settingmax_min_fairvalue. #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
joinGetfunction calls. #92973 (Eduard Karacharov). - Support deletion vectors in
DeltaLaketable engine. #93852 (Kseniia Sumarokova). - Support deletion vectors for
deltaLakeCluster. #94365 (Kseniia Sumarokova). - Google cloud storage support for data lakes. #93866 (Konstantin Vedernikov).
- Move
QBitfrom Experimental to Beta. #93816 (Raufs Dunamalijevs). - Add support for
Nullable(Tuple). Setallow_experimental_nullable_tuple_type = 1to enable it. #89643 (Nihal Z. Miaji). - Support Paimon REST catalog, continuing from ClickHouse#84423. #92011 (JIaQi Tang).
- Setting
use_skip_indexes_on_data_readis 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
DISTINCTonLowCardinalitycolumns. Closes #5917. #91639 (Nihal Z. Miaji). - Optimize
distinctJSONPathsaggregate 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,ANTIjoins. #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
FINALquery 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
LIMITandOFFSET. #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
sparseGramstokenizer by reducing the number of searched tokens in the index. #93078 (Anton Popov). - Function
isValidASCIIwas 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 DESCwhich 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_codecin 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
mapContainsKeyLikeandmapContainsValueLikecan now leverage a text index onmapKeys()ormapValues(), 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_usageexceedsmemory_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_STATandTRY_REMOVEKeeper 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 addedmerge_max_dynamic_subcolumns_in_wide_part) that limits number of dynamic subcolumns created during merge into a Compact part. Second is query level settingmax_dynamic_subcolumns_in_json_type_parsingthat 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_ratioto start purging dirty pages based on ratio of total memory usage. #94902 (Antonio Andelic).
system.blob_storage_logis now available for Azure Blob Storage. #93105 (Alexey Milovidov).- Implement
blob_storage_logfor Local and HDFS. Fix an error whenS3Queueused something other than the disk name for logging inblob_storage_log. Adderror_codecolumn toblob_storage_log. Split the test configuration file to simplify local testing. #93106 (Alexey Milovidov). clickhouse-clientandclickhouse-localwill highlight digit groups (thousands, millions, etc.) inside numeric literals while typing. This closes #93100. #93108 (Alexey Milovidov).- Adds support in
clickhouse-clientfor 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 [...] CACHEgave the false impression that the statement disables the cache. ClickHouse now supports statementSYSTEM CLEAR [...] CACHEwhich 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-encryptionheaders from being propagated toHeadObject,UploadPart&CompleteMultipartUploadS3 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::collectCandidatesForEvictionwill 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
avgaggregate function with Date, DateTime and Time values as arguments. Closes #82267. #87845 (Yarik Briukhovetskyi). - The optimization
use_join_disjunctions_push_downis 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_insertsetting to work correctly with JBOD volumes. #90878 (Aleksandr Musorin). - Make it possible to specify
storage_class_namesetting in named collections forS3table engine ands3table function. #91926 (János Benjamin Antal). - Support inserting auxiliary zookeeper by
system.zookeeper. #92092 (RinChanNOW). - Add new metrics for the keeper:
KeeperChangelogWrittenBytes,KeeperChangelogFileSyncMicroseconds,KeeperSnapshotWrittenBytesandKeeperSnapshotFileSyncMicrosecondsprofile events as well asKeeperBatchSizeElementsandKeeperBatchSizeByteshistogram metrics. #92149 (Miсhael Stetsyuk). - Add a new setting,
trace_profile_events_list, which limits tracing withtrace_profile_eventto 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 tosystem.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.serverconfig 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_complexitythat 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 = 1as an alias forEXPLAIN 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 columnxinf.parquetis 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 andHTTP response code: 403errors. Now the credentials provider is cached and shared across all queries. #92891 (Sav). - Rework
insert_select_deduplicatesetting 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_logandsystem.symbols, and thedemanglefunction didn't process them well. Closes #93074. #93075 (Alexey Milovidov). - Introduced the
backup_data_from_refreshable_materialized_view_targetsbackup 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-importtool - 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
Geometrytype forflipCoordinates. #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_mergewhich enables/disables materializing statistics during merge. The default value is1. #93379 (Han Fei). - ClickHouse can now parse
SELECTwithout parentheses aroundDESCRIBE SELECTqueries. 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_objectto 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 returntimeoutthanlogical 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
checkrequest with stats in Keeper. #93907 (Mikhail Artemenko). - Added
use_hash_table_stats_for_join_reorderingsetting to control whether runtime hash table size statistics are used for join reordering. This setting is enabled by default, preserving the existing behavior ofcollect_hash_table_stats_during_joins. #93912 (Vladimir Cherkasov). - Users can now partially view nested global server settings in the
system.server_settingstable (e.g.logger.level). This only covers settings with a fixed structure (no lists, enumerations, repetitions etc.). #94001 (Hechem Selmi). QBitcan 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 TABLEfails. #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_statisticsfor settingallow_statistics_optimize. This is more consistent with existing settingsuse_primary_keyanduse_skip_indexes. #94366 (Robert Schulze). - Enabled setting
input_format_numbers_enum_on_conversion_errorfor 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
defaultuser in clickhouse-local. The default user inclickhouse-localwas missing the access_management privilege, which caused operations likeDROP ROW POLICY IF EXISTSto fail withACCESS_DENIEDerror, 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_msshows 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
hasAnyTokensandhasAllTokensfunctions which was limited to 64. Example:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]);The query would result in aBAD_ARGUMENTSerror 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_errorfor 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).
- 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_sortingenabled. #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
icebergHashfunction 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.warningscorrectly 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 byteserror 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
USINGclause andjoin_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_mergesetting. #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_optimizationpass 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 engineReplicated. 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_MATCHduring 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
getSubcolumnand 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 allocatorwhile executing JOINs. Closes #92043. #92667 (Yarik Briukhovetskyi). - Remove a bug that
ngrambf_v1indexes 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
GRANTstatements failing due to unrelated revokes. #92725 (pufit). - Fix bug in data skipping logic when
not match(...)is used inWHEREcausing 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 retriesin storgaeS3QueueinOrderedmode. 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 inOrderedmode. #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.partstable. #92832 (Anton Popov). - Fixed usage of primary index in lightweight updates that have an
INclause with subqueries in the predicate of theWHEREclause. #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_EXISTafter mutation of a sparse column withratio_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_BLOCKduring insert into a table with subcolumn in partition expression. Closes #93210. Closes #83406. #92905 (Pavel Kruglov). - Fix error
NO_SUCH_COLUMN_IN_TABLEin 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
MergeTreetables. #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
hasfunction. 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_serializationwas changed to1.0via alter. #93016 (Pavel Kruglov). - Fix bug in data skipping logic when
not materialize(...)ornot 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
groupConcataggregate 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 cancellationinestimateCompressionRatio(). 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
__applyFilterused 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_BLOCKerror. #93273 (Dmitry Novik). - Fix possible missing subcolumn in MV during alter of source table. Closes #93231. #93276 (Pavel Kruglov).
- Fix the
Mergetable engine query planning with the analyzer that could throw ILLEGAL_COLUMN forhostName()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 columnforuse_top_k_dynamic_filteringoptimization. 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
hasAllTokensandhasAnyTokensfunctions. #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
tokensis 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
groupConcatstate 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_bfindex 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 COLUMNSpermission using themergetable 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_holdersto make sure that theIStorageobjects are not destroyed whilePipelineExecutoris alive. #93746 (Miсhael Stetsyuk). - Fix attaching Replicated DBs when the interserver host changed after restarting. #93779 (Tuan Pham Anh).
- Fix assert
!read_until_positioninReadBufferFromS3which happened when cache is enabled. #93809 (Kseniia Sumarokova). - Fix logical error in a rare case when empty tuple is used with
Mapcolumn. Closes #93784. #93814 (Nihal Z. Miaji). - Fixed
_part_offsetcorruption when projections are rebuilt during merges, and optimized projection processing by avoiding unnecessary reads of the_part_offsetcolumn 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_lookupnot working with distributed query when key is signed integral type. Closes #93259. #93848 (Nihal Z. Miaji). - Fix
lag/leadnot working with distributedremote()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
TraceSendersends through an internal pipe. However, the buffer size was not updated (here), therefore we are writing more data to buffer thanbuffer_sizewhich results in multiple flushes. And becauseTraceSender::sendis 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
JoinwithUSINGclause. 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
SELECTquery containing a predicate on multiple columns with bloom filter skip indexes and bothORandNOTconditions 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
uniqThetawhen 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 insideSCOPE_EXIT. #94100 (Miсhael Stetsyuk). - Fix data loss when
DROP PARTITIONremoves 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,arrayPartialShuffleandarrayRandomSampleto 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
PostgreSQLdatabase engines (when the query is incorrect). Closes #92887. #94180 (Alexey Milovidov). - Fix memory leak in refreshable materialized views using
SELECTqueries with multiple subqueries. #94200 (Antonio Andelic). - Fix data race in
DataPartStorageOnDiskBase::removevssystem.parts. Closes #49076. #94262 (Alexey Milovidov). - Remove the wrong
noexceptspecifier 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 astd::length_errorifoptimize_row_orderis 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_replicationis 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
FilesystemCacheSizeLimitin caseSLRUcache 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 argumentsinstead ofstd::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'sthrowmode is used. #94425 (Raúl Marín). - Fix crash in
TCPHandlerwhen multiplereceivePacketsExpectQuerycalls readProtocol::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_rowis 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
isNotNullis 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 BYcould returnALIAScolumns with swapped values (i.e., columnashowing columnb’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
getURLHostRFCfunction was missing bounds checks before dereferencing pointers. When an empty string was passed todomainRFC, 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/OFFSETwhen 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 functionurl(). #95006 (Vitaly Baranov). - Function
toStartOfIntervalnow works in the same way astoStartOfX, whereXisDay, Week, Month, Quarter, Yearwhen theenable_extended_results_for_datetime_functionsis on. #95011 (Kirill Kopnev). - Fix constant string comparisons not respecting the settings
cast_string_to_date_time_mode,bool_true_representation,bool_false_representation, andinput_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
LIMITis zero. Closes #93893. #95072 (Alexey Milovidov). - Converting from DateTime/integers to Time64 extracts the time-of-day component using
toTime, which is not monotonic. TheToDateTimeMonotonicitytemplate 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).
- Add a set of tools for profiling memory allocations in the ClickHouse SQL parser using jemalloc's heap profiling capabilities. #94072 (Ilya Yatsishin).
- Added a tool that simplifies debugging of memory allocations in parser. It uses jemalloc
stats.allocatedmetric before and after we parse query to AST representation to show what is allocated. Also it supports memory profiling mode that dumps profile before and after to build reports where allocations occurred. #93523 (Ilya Yatsishin). - Remove transitive libc++ includes. #92523 (Raúl Marín).
- Make some sequential tests parallel: https://github.com/ClickHouse/ClickHouse/pull/93030/changes#diff-c3a73510dae653c9bbfa24300b32f5d6ec663fd4e72cc4a3d5daa6e4342915df. #93030 (Nikita Fomichev).
- Cleanup some build flags. #93679 (Raúl Marín).
- Bump c-ares from v1.34.5 to v1.34.6. This addresses c-ares'
CVE-2025-62408, which is not relevant for ClickHouse. #94129 (Govind R Nair). - Use
curl8.18.0. #94742 (Konstantin Bogdanov).