2025 Changelog
Table of Contents
ClickHouse release v25.9, 2025-09-25
ClickHouse release v25.8 LTS, 2025-08-28
ClickHouse release v25.7, 2025-07-24
ClickHouse release v25.6, 2025-06-26
ClickHouse release v25.5, 2025-05-22
ClickHouse release v25.4, 2025-04-22
ClickHouse release v25.3 LTS, 2025-03-20
ClickHouse release v25.2, 2025-02-27
ClickHouse release v25.1, 2025-01-28
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 25.9, 2025-09-25
Backward Incompatible Change
- Disable nonsensical binary operations with IPv4/IPv6: Plus / minus of a IPv4/IPv6 with a non-integer type is disabled. Before it would allow operations with floating types and throw logical errors with some other types (such as DateTime). #86336 (Raúl Marín).
- Deprecate setting
allow_dynamic_metadata_for_data_lakes. Now all iceberg tables try to fetch up-to-date table schema from storage before executing of each query. #86366 (Daniil Ivanik). - Changed resolving of the coalesced column from
OUTER JOIN ... USINGclause to be more consistent: previously, when selecting both the USING column and qualified columns (a, t1.a, t2.a) in a OUTER JOIN, the USING column would incorrectly be resolved tot1.a, showing 0/NULL for rows from the right table with no left match. Now identifiers from USING clause are always resolved to the coalesced column, while qualified identifiers resolve to the non-coalesced columns, regardless of which other identifiers are present in the query. For example: ```sql SELECT a, t1.a, t2.a FROM (SELECT 1 as a WHERE 0) t1 FULL JOIN (SELECT 2 as a) t2 USING (a) -- Before: a=0, t1.a=0, t2.a=2 (incorrect - 'a' resolved to t1.a) -- After: a=2, t1.a=0, t2.a=2 (correct - 'a' is coalesced). #80848 (Vladimir Cherkasov). - Increase replicated deduplication window up to 10000. This is fully compatible, but we can imagine scenarios when this change could lead to high resource consumption in the presence of a large number of tables. #86820 (Sema Checherinda).
New Feature
- Users can now use NATS JetStream to consume messages by specifying the new settings of
nats_streamandnats_consumerfor the NATS engine. #84799 (Dmitry Novikov). - Added support for authentication and SSL in the
arrowFlighttable function. #87120 (Vitaly Baranov). - Add new parameter to
S3table engine ands3table function namedstorage_class_namewhich allows to specify intelligent tiring supported by AWS. Supported both in key-value format and in positional (deprecated) format). #87122 (alesapin). ALTER UPDATEfor Iceberg table engine. #86059 (scanhex12).- Add system table
iceberg_metadata_logto retrieve Iceberg metadata files during SELECT statements. #86152 (scanhex12). IcebergandDeltaLaketables support custom disk configuration via storage level settingdisk. #86778 (scanhex12).- Support Azure for data lakes disks. #87173 (scanhex12).
- Support
Unitycatalog on top of Azure blob storage. #80013 (Smita Kulkarni). - Support more formats (
ORC,Avro) inIcebergwrites. This closes #86179. #87277 (scanhex12). - Add a new system table
database_replicaswith information about database replicas. #83408 (Konstantin Morozov). - Added function
arrayExceptthat subtracts one array as a set from another. #82368 (Joanna Hulboj). - Adds a new
system.aggregated_zookeeper_logtable. The table contains statistics (e.g. number of operations, average latency, errors) of ZooKeeper operations grouped by session id, parent path and operation type, and periodically flushed to disk. #85102 #87208 (Miсhael Stetsyuk). - A new function,
isValidASCII. Returns 1 if the input string or FixedString contains only ASCII bytes (0x00–0x7F) else 0. Closes #85377. ... #85786 (rajat mohan). - Boolean settings can be specified without arguments, e.g.,
SET use_query_cache;, which is equivalent to setting it to true. #85800 (thraeka). - New configuration options:
logger.startupLevel&logger.shutdownLevelallow for overriding the log level during the startup & shutdown of Clickhouse respectively. #85967 (Lennard Eijsackers). - Aggregate functions
timeSeriesChangesToGridandtimeSeriesResetsToGrid. Behaves similarly totimeSeriesRateToGrid, accepting parameters for start timestamp, end timestamp, step, and look back window, as well as two arguments for the timestamps and values, but requiring at least 1 sample per window instead of 2. Calculates a PromQLchanges/resets, counting the number of times the sample value changes or decreases in the specified window for each timestamp in the time grid defined by the parameters. The return type isArray(Nullable(Float64)). #86010 (Stephen Chi). - Allows users to create temporary views with a similar syntax to temporary tables (
CREATE TEMPORARY VIEW). #86432 (Aly Kafoury). - Add warnings for CPU and memory usage to the
system.warningstable. #86838 (Bharat Nallan). - Support the
oneofindicator inProtobufinputs. A special column may be used to indicate the presence of part of oneof. If a message contains oneof andinput_format_protobuf_oneof_presenceis set, ClickHouse fills column that indicates which field of oneof was found. #82885 (Ilya Golshtein). - Improve allocation profiling based on jemalloc's internal tooling. Global jemalloc profiler can now be enabled with config
jemalloc_enable_global_profiler. Sampled global allocations and deallocations can be stored insystem.trace_logunderJemallocSampletype by enabling configjemalloc_collect_global_profile_samples_in_trace_log. Jemalloc profiling can now be enabled for each query independently using settingjemalloc_enable_profiler. Storing samples insystem.trace_logcan be controlled per query using settingjemalloc_collect_profile_samples_in_trace_log. Update jemalloc to newer version. #85438 (Antonio Andelic). - A new setting to delete files on dropping Iceberg tables. This closes #86211. #86501 (scanhex12).
Experimental Feature
- The inverted text index was reworked from scratch to be scalable for datasets that don't fit into RAM. #86485 (Anton Popov).
- Join reordering now uses statistics. The feature can be enabled by setting
allow_statistics_optimize = 1andquery_plan_optimize_join_order_limit = 10. #86822 (Han Fei). - Support
alter table ... materialize statistics allwill materialize all the statistics of a table. #87197 (Han Fei).
Performance Improvement
- Support filtering data parts using skip indexes during reading to reduce unnecessary index reads. Controlled by the new setting
use_skip_indexes_on_data_read(disabled by default). This addresses #75774. This includes some common groundwork shared with #81021. #81526 (Amos Bird). - Added JOIN order optimization that can automatically reorder JOINs for better performance (controlled by
query_plan_optimize_join_order_limitsetting). Note that the join order optimization currently has limited statistics support and primarily relies on row count estimates from storage engines - more sophisticated statistics collection and cardinality estimation will be added in future releases. If you encounter issues with JOIN queries after upgrading, you can temporarily disable the new implementation by settingSET query_plan_use_new_logical_join_step = 0and report the issue for investigation. Note about resolution of identifiers from USING clause: Changed resolving of the coalesced column fromOUTER JOIN ... USINGclause to be more consistent: previously, when selecting both the USING column and qualified columns (a, t1.a, t2.a) in a OUTER JOIN, the USING column would incorrectly be resolved tot1.a, showing 0/NULL for rows from the right table with no left match. Now identifiers from USING clause are always resolved to the coalesced column, while qualified identifiers resolve to the non-coalesced columns, regardless of which other identifiers are present in the query. For example: ```sql SELECT a, t1.a, t2.a FROM (SELECT 1 as a WHERE 0) t1 FULL JOIN (SELECT 2 as a) t2 USING (a) -- Before: a=0, t1.a=0, t2.a=2 (incorrect - 'a' resolved to t1.a) -- After: a=2, t1.a=0, t2.a=2 (correct - 'a' is coalesced). #80848 (Vladimir Cherkasov). - Distributed
INSERT SELECTfor data lakes. #86783 (scanhex12). - Improve PREWHERE optimization for conditions like
func(primary_column) = 'xx'andcolumn in (xxx). #85529 (李扬). - Implemented rewriting of JOIN: 1. Convert
LEFT ANY JOINandRIGHT ANY JOINtoSEMI/ANTIJOIN if the filter condition is always false for matched or non-matched rows. This optimization is controlled by a new settingquery_plan_convert_any_join_to_semi_or_anti_join. 2. ConvertFULL ALL JOINtoLEFT ALLorRIGHT ALLJOIN if the filter condition is always false for non-matched rows from one side. #86028 (Dmitry Novik). - Improved performance of vertical merges after executing a lightweight delete. #86169 (Anton Popov).
HashJoinperformance optimised slightly in the case ofLEFT/RIGHTjoin having a lot of unmatched rows. #86312 (Nikita Taranov).- Radix sort: help the compiler use SIMD and do better prefetching. Uses dynamic dispatch to use software prefetching with Intel CPUs only. Continues the work by @taiyang-li in https://github.com/ClickHouse/ClickHouse/pull/77029. #86378 (Raúl Marín).
- Improves performance of short queries with lots of parts in tables (by optimizing
MarkRangesby usingdevectoroverdeque). #86933 (Azat Khuzhin). - Improved performance of applying patch parts in the join mode. #87094 (Anton Popov).
- Added setting
query_condition_cache_selectivity_threshold(default value: 1.0) which excludes scan results of predicates with low selectivity from insertion into the query condition cache. This allows to reduce the memory consumption of the query condition cache at the cost of a worse cache hit rate. #86076 (zhongyuankai). - Reduce memory usage in Iceberg writes. #86544 (scanhex12).
Improvement
- Support writing multiple data files in Iceberg in a single insertion. Add new settings,
iceberg_insert_max_rows_in_data_fileandiceberg_insert_max_bytes_in_data_fileto control the limits. #86275 (scanhex12). - Add rows/bytes limit for inserted data files in delta lake. Controlled by settings
delta_lake_insert_max_rows_in_data_fileanddelta_lake_insert_max_bytes_in_data_file. #86357 (Kseniia Sumarokova). - Support more types for partitions in Iceberg writes. This closes #86206. #86298 (scanhex12).
- Make S3 retry strategy configurable and make settings of S3 disk can be hot reload if change the config XML file. #82642 (RinChanNOW).
- Improved S3(Azure)Queue table engine to allow it to survive zookeeper connection loss without potential duplicates. Requires enabling S3Queue setting
use_persistent_processing_nodes(changeable byALTER TABLE MODIFY SETTING). #85995 (Kseniia Sumarokova). - You can use query parameters after
TOwhen creating a materialized view, for example:CREATE MATERIALIZED VIEW mv TO {to_table:Identifier} AS SELECT * FROM src_table. #84899 (Diskein). - Give more clear instruction for users when incorrect settings are specified for the
Kafka2table engine. #83701 (János Benjamin Antal). - It's no longer possible to specify time zones for the
Timetype (it didn't make sense). #84689 (Yarik Briukhovetskyi). - Simplified (and avoided some bugs) a logic related to parsing Time/Time64 in the
best_effortmode. #84730 (Yarik Briukhovetskyi). - Added
deltaLakeAzureClusterfunction (similar todeltaLakeAzurefor the cluster mode) anddeltaLakeS3Cluster(alias todeltaLakeCluster) function. Resolves #85358. #85547 (Smita Kulkarni). - Apply
azure_max_single_part_copy_sizesetting for normal copy operations in the same way as for backup. #85767 (Ilya Golshtein). - Slow down S3 client threads on retryable errors in S3 Object Storage. This extends the previous setting
backup_slow_all_threads_after_retryable_s3_errorto S3 disks and renames it to the more generals3_slow_all_threads_after_retryable_error. #85918 (Julia Kartseva). - Mark settings allow_experimental_variant/dynamic/json and enable_variant/dynamic/json as obsolete. Now all three types are enabled unconditionally. #85934 (Pavel Kruglov).
- Support filtering by complete URL string (
full_urldirective) inhttp_handlers(including schema and host:port). #86155 (Azat Khuzhin). - Add a new setting,
allow_experimental_delta_lake_writes. #86180 (Kseniia Sumarokova). - Fix detection of systemd in init.d script (fixes "Install packages" check). #86187 (Azat Khuzhin).
- Add a new
startup_scripts_failure_reasondimensional metric. This metric is needed to distinguish between different error types that result in failing startup scripts. In particular, for alerting purposes, we need to distinguish between transient (e.g.,MEMORY_LIMIT_EXCEEDEDorKEEPER_EXCEPTION) and non-transient errors. #86202 (Miсhael Stetsyuk). - Allow to omit
identityfunction for partition for Iceberg table. #86314 (scanhex12). - Add ability to enable JSON logging only for specific channel, for this set
logger.formatting.channelto one ofsyslog/console/errorlog/log. #86331 (Azat Khuzhin). - Allow using native numbers in
WHERE. They are already allowed to be arguments of logical functions. This simplifies filter-push-down and move-to-prewhere optimizations. #86390 (Nikolai Kochetov). - Fixed error in case of executing
SYSTEM DROP REPLICAagainst a Catalog with corrupted metadata. #86391 (Nikita Mikhaylov). - Add extra retries for disk access check (
skip_access_check = 0) in Azure because it may be provisioning access for quite a long time. #86419 (Alexander Tokmakov). - Make the staleness window in
timeSeries*()functions left-open and right-closed. #86588 (Vitaly Baranov). - Add
FailedInternal*Queryprofile events. #86627 (Shane Andrade). - Fixes handling of users with a dot in the name when added via config file. #86633 (Mikhail Koviazin).
- Add asynchronous metric for memory usage in queries (
QueriesMemoryUsageandQueriesPeakMemoryUsage). #86669 (Azat Khuzhin). - You can use
clickhouse-benchmark --preciseflag for more precise reporting of QPS and other per-interval metrics. It helps to get consistent QPS in case if durations of queries are comparable to the reporting interval--delay D. #86684 (Sergei Trifonov). - Make nice values of Linux threads configurable to assign some threads (merge/mutate, query, materialized view, zookeeper client) higher or lower priorities. #86703 (Miсhael Stetsyuk).
- Fix misleading “specified upload does not exist” error, which occurs when the original exception is lost in multipart upload because of a race condition. #86725 (Julia Kartseva).
- Limit query plan description in the
EXPLAINquery. Do not calculate the description for queries other thanEXPLAIN. Added a steeingquery_plan_max_step_description_length. #86741 (Nikolai Kochetov). - Add ability to tune pending signals in attempt to overcome CANNOT_CREATE_TIMER (for query profilers,
query_profiler_real_time_period_ns/query_profiler_cpu_time_period_ns). And also collectSigQfrom the/proc/self/statusfor introspection (ifProcessSignalQueueSizeis near toProcessSignalQueueLimit, then you will likely getCANNOT_CREATE_TIMERerrors). #86760 (Azat Khuzhin). - Improve performance of
RemoveRecursiverequest in Keeper. #86789 (Antonio Andelic). - Remove extra whitespace in
PrettyJSONEachRowduring JSON type output. #86819 (Pavel Kruglov). - Now we write blobs sizes of for
prefix.pathwhen directory is removed for plain rewriteable disk. #86908 (alesapin). - Support performance tests against remote ClickHouse instances, including ClickHouse Cloud. Usage example:
tests/performance/scripts/perf.py tests/performance/math.xml --runs 10 --user <username> --password <password> --host <hostname> --port <port> --secure. #86995 (Raufs Dunamalijevs). - Respect memory limits in some places that are known to allocate significant (>16MiB) amount of memory (sorting, async inserts, file log). #87035 (Azat Khuzhin).
- Throw an exception if setting
network_compression_methodis not a supported generic codec. #87097 (Robert Schulze). - System table
system.query_cachenow returns all query result cache entries, whereas it previously returned only shared entries or non-shared entries of the same user and role. That is okay as non-shared entries are supposed to not reveal query results, whereassystem.query_cachereturns query strings. This makes the behavior of the system table more similar tosystem.query_log. #87104 (Robert Schulze). - Enable short circuit evaluation for
parseDateTimefunction. #87184 (Pavel Kruglov). - Add a new column
statisticsinsystem.parts_columns. #87259 (Han Fei).
Bug Fix (user-visible misbehavior in an official stable release)
- The results of alter queries are only validated on the initiator node for replicated databases and internally replicated tables. This will fix situations where an already committed alter query could get stuck on other nodes. #83849 (János Benjamin Antal).
- Limit the number of tasks of each type in
BackgroundSchedulePool. Avoid situations when all slots are occupied by task of one type, while other tasks are starving. Also avoids deadlocks when tasks wait for each other. This is controlled bybackground_schedule_pool_max_parallel_tasks_per_type_ratioserver setting. #84008 (Alexander Tokmakov). - Shutdown tables properly when recovering database replica. Improper shutdown would lead to LOGICAL_ERROR for some table engines during database replica recovery. #84744 (Antonio Andelic).
- Check access rights during typo correction hints generation for the database name. #85371 (Dmitry Novik).
-
- LowCardinality for hive columns 2. Fill hive columns before virtual columns (required for https://github.com/ClickHouse/ClickHouse/pull/81040) 3. LOGICAL_ERROR on empty format for hive #85528 4. Fix check for hive partition columns being the only columns 5. Assert all hive columns are specified in the schema 6. Partial fix for parallel_replicas_cluster with hive 7. Use ordered container in extractkeyValuePairs for hive utils (required for https://github.com/ClickHouse/ClickHouse/pull/81040). #85538 (Arthur Passos).
- Prevent unnecessary optimization of the first argument of
INfunctions sometimes resulting in error when array mapping is used. #85546 (Yakov Olkhovskiy). - Mapping between iceberg source ids and parquet names was not adjusted to the schema when the parquet file was written. This PR processes schema relevant for each iceberg data file, not a current one. #85829 (Daniil Ivanik).
- Fix reading file size separately from opening it. Relates to https://github.com/ClickHouse/ClickHouse/pull/33372, which was introduced in response to a bug in Linux kernels prior to
5.10release. #85837 (Konstantin Bogdanov). - ClickHouse Keeper no longer fails to start on systems where IPv6 is disabled at the kernel level (e.g., RHEL with ipv6.disable=1). It now attempts to fall back to an IPv4 listener if the initial IPv6 listener fails. #85901 (jskong1124).
- This PR closes #77990. Add TableFunctionRemote support for parallel replicas in globalJoin. #85929 (zoomxi).
- Fix null pointer in orcschemareader::initializeifneeded(). this pr addresses the following issue: #85292 ### documentation entry for user-facing changes. #85951 (yanglongwei).
- Add a check to allow correlated subqueries in the FROM clause only if they use columns from the outer query. Fixes #85469. Fixes #85402. #85966 (Dmitry Novik).
- Fix alter update of a column with a subcolumn used in other column materialized expression. Previously materialized column with subcolumn in its expression was not updated properly. #85985 (Pavel Kruglov).
- Forbid altering columns whose subcolumns are used in PK or partition expression. #86005 (Pavel Kruglov).
- Fix reading subcolumns with non-default column mapping mode in storage DeltaLake. #86064 (Kseniia Sumarokova).
- Fix using wrong default values for path with Enum hint inside JSON. #86065 (Pavel Kruglov).
- DataLake hive catalog url parsing with input sanitisation. Closes #86018. #86092 (rajat mohan).
- Fix logical error during filesystem cache dynamic resize. Closes #86122. Closes https://github.com/ClickHouse/clickhouse-core-incidents/issues/473. #86130 (Kseniia Sumarokova).
- Use
NonZeroUInt64forlogs_to_keepin DatabaseReplicatedSettings. #86142 (Tuan Pham Anh). - Exception was thrown by a
FINALquery with skip index if the table (e.gReplacingMergeTree) was created with settingindex_granularity_bytes = 0. That exception has been fixed now. #86147 (Shankar Iyer). - Removes UB and fixes problems with parsing of Iceberg partition expression. #86166 (Daniil Ivanik).
- Fix crash in case of const and non-const blocks in one INSERT. #86230 (Azat Khuzhin).
- Process includes from
/etc/metrika.xmlas a default when creating disks from SQL. #86232 (alekar). - Fix accurateCastOrNull/accurateCastOrDefault from String to JSON. #86240 (Pavel Kruglov).
- Support directories without '/' in iceberg engine. #86249 (scanhex12).
- Fix crash with replaceRegex, a FixedString haystack and an empty needle. #86270 (Raúl Marín).
- Fix crash during ALTER UPDATE Nullable(JSON). #86281 (Pavel Kruglov).
- Fix missing column definer in system.tables. #86295 (Raúl Marín).
- Fix cast from LowCardinality(Nullable(T)) to Dynamic. #86365 (Pavel Kruglov).
- Fix logical error during writes to DeltaLake. Closes #86175. #86367 (Kseniia Sumarokova).
- Fix
416 The range specified is invalid for the current size of the resource. The range specified is invalid for the current size of the resourcewhen reading empty blobs from Azure blob storage for plain_rewritable disk. #86400 (Julia Kartseva). - Fix GROUP BY Nullable(JSON). #86410 (Pavel Kruglov).
- Fixed a bug in Materialized Views: an MV might not work if it was created, dropped, and then created again with the same name. #86413 (Alexander Tokmakov).
- Fail if all replicas are unavailable when reading from *cluster functions. #86414 (Julian Maicher).
- Fix leaking of
MergesMutationsMemoryTrackingdue toBuffertables and fixquery_views_logfor streaming fromKafka(and others). #86422 (Azat Khuzhin). - Fix show tables after dropping reference table of alias storage. #86433 (RinChanNOW).
- Fix missing chunk header when send_chunk_header is enabled and UDF is invoked via HTTP protocol. #86469 (Vladimir Cherkasov).
- Fix possible deadlock in case of jemalloc profile flushes enabled. #86473 (Azat Khuzhin).
- Fix reading subcolumns in DeltaLake table engine. Closes #86204. #86477 (Kseniia Sumarokova).
- Handling loopback host ID properly to avoid collision when processing DDL tasks:. #86479 (Tuan Pham Anh).
- Fix detach/attach for postgres database engine tables with numeric/decimal columns. #86480 (Julian Maicher).
- Fix use of uninitialized memory in getSubcolumnType. #86498 (Raúl Marín).
- Functions
searchAnyandsearchAllwhen called with empty needles now returntrue(aka. "matches everything"). Previously, they returnedfalse. (issue #86300). #86500 (Elmi Ahmadov). - Fix function
timeSeriesResampleToGridWithStaleness()when the first bucket has no value. #86507 (Vitaly Baranov). - Fix crash caused by
merge_tree_min_read_task_sizebeing set to 0. #86527 (yanglongwei). - While reading takes format for each data file from Iceberg metadata (earlier it was taken from table arguments). #86529 (Daniil Ivanik).
- Ignore exceptions during flushing log on shutdown and make shutdown more safe (to avoid SIGSEGV). #86546 (Azat Khuzhin).
- Fix Backup db engine raising exception on query with zero sized part files. #86563 (Max Justus Spransy).
- Fix missing chunk header when send_chunk_header is enabled and UDF is invoked via HTTP protocol. #86606 (Vladimir Cherkasov).
- Fix S3Queue logical error "Expected current processor to be equal to ", which happened because of keeper session expiration. #86615 (Kseniia Sumarokova).
- Nullablity bugs in insert and pruning. This closes #86407. #86630 (scanhex12).
- Do not disable file system cache if Iceberg metadata cache is disabled. #86635 (Daniil Ivanik).
- Fixed 'Deadlock in Parquet::ReadManager (single-threaded)' error in parquet reader v3. #86644 (Michael Kolupaev).
- Fix support for IPv6 in
listen_hostfor ArrowFlight. #86664 (Vitaly Baranov). - Fix shutdown in
ArrowFlighthandler. This PR fixes #86596. #86665 (Vitaly Baranov). - Fix distributed queries with
describe_compact_output=1. #86676 (Azat Khuzhin). - Fix window definition parsing and applying query parameters. #86720 (Azat Khuzhin).
- Fix exception
Partition strategy wildcard can not be used without a '_partition_id' wildcard.when creating a table withPARTITION BY, but without partition wildcard, which used to work in versions before 25.8. Closes https://github.com/ClickHouse/clickhouse-private/issues/37567. #86748 (Kseniia Sumarokova). - Fix LogicalError if parallel queries are trying to acquire single lock. #86751 (Pervakov Grigorii).
- Fix writing NULL into JSON shared data in RowBinary input format and add some additional validations in ColumnObject. #86812 (Pavel Kruglov).
- Fix empty Tuple permutation with limit. #86828 (Pavel Kruglov).
- Do not use separate keeper node for persistent processing nodes. Fix for https://github.com/ClickHouse/ClickHouse/pull/85995. Closes #86406. #86841 (Kseniia Sumarokova).
- Fix TimeSeries engine table breaking creation of new replica in Replicated Database. #86845 (Nikolay Degterinsky).
- Fix querying
system.distributed_ddl_queuein cases where tasks are missing certain Keeper nodes. #86848 (Antonio Andelic). - Fix seeking at the end of the decompressed block. #86906 (Pavel Kruglov).
- Process exception which is thrown during asyncronous execution of Iceberg Iterator. #86932 (Daniil Ivanik).
- Fix saving of big preprocessed XML configs. #86934 (c-end).
- Fix date field populating in system.iceberg_metadata_log table. #86961 (Daniil Ivanik).
- Fixed infinite recalculation of
TTLwithWHERE. #86965 (Anton Popov). - Fixed possible incorrect result of
uniqExactfunction withROLLUPandCUBEmodifiers. #87014 (Nikita Taranov). - Fix resolving table schema with
url()table function whenparallel_replicas_for_cluster_functionssetting is set to 1. #87029 (Konstantin Bogdanov). - Correctly cast output of PREWHERE after splitting it into multiple steps. #87040 (Antonio Andelic).
- Fixed lightweight updates with
ON CLUSTERclause. #87043 (Anton Popov). - Fix compatibility of some aggregate function states with String argument. #87049 (Pavel Kruglov).
- Fixes an issue where model name from OpenAI wasn't passed through. #87100 (Kaushik Iska).
- EmbeddedRocksDB: Path must be inside user_files. #87109 (Raúl Marín).
- Fix KeeperMap tables created before 25.1, leaving data in ZooKeeper after the DROP query. #87112 (Nikolay Degterinsky).
- Fix maps and arrays field ids reading parquet. #87136 (scanhex12).
- Fix reading array with array sizes subcolumn in lazy materialization. #87139 (Pavel Kruglov).
- Fix CASE function with Dynamic arguments. #87177 (Pavel Kruglov).
- Fix reading empty array from empty string in CSV. #87182 (Pavel Kruglov).
- Fix possible wrong result of non-correlated
EXISTS. It was broken withexecute_exists_as_scalar_subquery=1which was introduced in https://github.com/ClickHouse/ClickHouse/pull/85481 and affects25.8. Fixes #86415. #87207 (Nikolai Kochetov). - Throws an error if iceberg_metadata_log is not configured, but user tries to get debug iceberg metadata info. Fixes nullptr access. #87250 (Daniil Ivanik).
Build/Testing/Packaging Improvement
- Fix compatibility with abseil-cpp 20250814.0, https://github.com/abseil/abseil-cpp/issues/1923. #85970 (Yuriy Chernyshov).
- Put building standalone WASM lexer under a flag. #86505 (Konstantin Bogdanov).
- Fix crc32c build on older ARM CPUs without support for the
vmull_p64instruction. #86521 (Pablo Marcos). - Use
openldap2.6.10. #86623 (Konstantin Bogdanov). - Do not try to intercept
memalignon darwin. #86769 (Konstantin Bogdanov). - Use
krb51.22.1-final. #86836 (Konstantin Bogdanov). - Fix unpacking Rust crate names in
list-licenses.sh. #87305 (Konstantin Bogdanov).
ClickHouse release 25.8 LTS, 2025-08-28
Backward Incompatible Change
- Infer
Array(Dynamic)instead of unnamedTuplefor arrays of values with different types in JSON. To use the previous behaviour, disable settinginput_format_json_infer_array_of_dynamic_from_array_of_different_types. #80859 (Pavel Kruglov). - Move S3 latency metrics to histograms for homogeneity and simplicity. #82305 (Miсhael Stetsyuk).
- Require backticks around identifiers with dots in default expressions to prevent them from being parsed as compound identifiers. #83162 (Pervakov Grigorii).
- Lazy materialization is enabled only with analyzer (which is the default) to avoid maintenance without analyzer, — which, in our experience, have some issues (for example, when using
indexHint()in conditions). #83791 (Igor Nikonov). - Write values of
Enumtype asBYTE_ARRAYwithENUMlogical type in Parquet output format by default. #84169 (Pavel Kruglov). - Enable MergeTree setting
write_marks_for_substreams_in_compact_partsby default. It significantly improves performance of subcolumns reading from newly created Compact parts. Servers with version less then 25.5 won't be able to read new Compact parts. #84171 (Pavel Kruglov). - The previous
concurrent_threads_schedulerdefault value wasround_robin, which proved unfair in the presence of a high number of single-threaded queries (e.g., INSERTs). This change makes a safer alternativefair_round_robinscheduler, the default. #84747 (Sergei Trifonov). - ClickHouse supports PostgreSQL-style heredoc syntax:
$tag$ string contents... $tag$, also known as dollar-quoted string literals. In previous versions, there were fewer restrictions on tags: they could contain arbitrary characters, including punctuation and whitespace. This introduces parsing ambiguity with identifiers that can also start with a dollar character. At the same time, PostgreSQL only allows word characters for tags. To resolve the problem, we now restrict heredoc tags only to contain word characters. Closes #84731. #84846 (Alexey Milovidov). - The functions
azureBlobStorage,deltaLakeAzure, andicebergAzurehave been updated to properly validateAZUREpermissions. All cluster-variant functions (-Clusterfunctions) now verify permissions against their corresponding non-clustered counterparts. Additionally, theicebergLocalanddeltaLakeLocalfunctions now enforceFILEpermission checks. #84938 (Nikita Mikhaylov). - Enables
allow_dynamic_metadata_for_data_lakessetting (Table Engine level setting) by default. #85044 (Daniil Ivanik). - Disable quoting 64 bit integers in JSON formats by default. #74079 (Pavel Kruglov)
New Feature
- Basic support for the PromQL dialect is added. To use it, set
dialect='promql'in clickhouse-client, point it to the TimeSeries table using the settingpromql_table_name='X'and execute queries likerate(ClickHouseProfileEvents_ReadCompressedBytes[1m])[5m:1m]. In addition you can wrap the PromQL query with SQL:SELECT * FROM prometheusQuery('up', ...);. So far only functionsrate,deltaandincreaseare supported. No unary/binary operators. No HTTP API. #75036 (Vitaly Baranov). - AI Powered SQL generation can now infer from env ANTHROPIC_API_KEY and OPENAI_API_KEY if available, this is to make it so that we can have a zero config option to use this feature. #83787 (Kaushik Iska).
- Implement support for ArrowFlight RPC protocol by adding: - new table function
arrowflight. #74184 (zakr600). - Now all tables support the
_tablevirtual column (not only tables with theMergeengine), which is especially useful for queries with UNION ALL. #63665 (Xiaozhe Yu). - Allow to use any storage policy (i.e. object storage, such as S3) for external aggregation/sorting. #84734 (Azat Khuzhin).
- Implement AWS S3 authentication with an explicitly provided IAM role. Implement OAuth for GCS. These features were recently only available in ClickHouse Cloud and are now open-sourced. Synchronize some interfaces such as serialization of the connection parameters for object storages. #84011 (Alexey Milovidov).
- Support position deletes for Iceberg TableEngine. #83094 (Daniil Ivanik).
- Support Iceberg Equality Deletes. #85843 (Han Fei).
- Iceberg writes for create. Closes #83927. #83983 (Konstantin Vedernikov).
- Glue catalogs for writes. #84136 (Konstantin Vedernikov).
- Iceberg Rest catalogs for writes. #84684 (Konstantin Vedernikov).
- Merge all iceberg position delete files into data files. This will reduce amount and sizes of parquet files in iceberg storage. Syntax:
OPTIMIZE TABLE table_name. #85250 (Konstantin Vedernikov). - Support
drop tablefor iceberg (Removing from REST/Glue catalogs + removing metadata about table). #85395 (Konstantin Vedernikov). - Support alter delete mutations for iceberg in merge-on-read format. #85549 (Konstantin Vedernikov).
- Support writes into DeltaLake. Closes #79603. #85564 (Kseniia Sumarokova).
- Added setting
delta_lake_snapshot_versionto allow reading specific snapshot version in table engineDeltaLake. #85295 (Kseniia Sumarokova). - Write more iceberg statistics (column sizes, lower and upper bounds) in metadata (manifest entries) for min-max pruning. #85746 (Konstantin Vedernikov).
- Support add/drop/modify columns in iceberg for simple types. #85769 (Konstantin Vedernikov).
- Iceberg: support writing version-hint file. This closes #85097. #85130 (Konstantin Vedernikov).
- Views, created by ephemeral users, will now store a copy of an actual user and will no longer be invalidated after the ephemeral user is deleted. #84763 (pufit).
- The vector similarity index now supports binary quantization. Binary quantization significantly reduces the memory consumption and speeds up the process of building a vector index (due to faster distance calculation). Also, the existing setting
vector_search_postfilter_multiplierwas made obsolete and replaced by a more general setting :vector_search_index_fetch_multiplier. #85024 (Shankar Iyer). - Allow key value arguments in
s3ors3Clustertable engine/function, e.g. for examples3('url', CSV, structure = 'a Int32', compression_method = 'gzip'). #85134 (Kseniia Sumarokova). - A new system table to keep erroneous incoming messages from engines like kafka ("dead letter queue"). #68873 (Ilya Golshtein).
- The new SYSTEM RESTORE DATABASE REPLICA for Replicated databases, similar to the existing functionality for restore in ReplicatedMergeTree. #73100 (Konstantin Morozov).
- PostgreSQL protocol now supports the
COPYcommand. #74344 (Konstantin Vedernikov). - Support C# client for mysql protocol. This closes #83992. #84397 (Konstantin Vedernikov).
- Add support for hive partition style reads and writes. #76802 (Arthur Passos).
- Add
zookeeper_connection_logsystem table to store historical information about ZooKeeper connections. #79494 (János Benjamin Antal). - Server setting
cpu_slot_preemptionenables preemptive CPU scheduling for workloads and ensures max-min fair allocation of CPU time among workloads. New workload settings for CPU throttling are added:max_cpus,max_cpu_shareandmax_burst_cpu_seconds. More details: https://clickhouse.com/docs/operations/workload-scheduling#cpu_scheduling. #80879 (Sergei Trifonov). - Drop TCP connection after a configured number of queries or time threshold. This makes sense for a more uniform connection distribution between cluster nodes behind a load balancer. Resolves #68000. #81472 (Kenny Sun).
- Parallel replicas now support using projections for queries. #82659. #82807 (zoomxi).
- Support DESCRIBE SELECT in addition to DESCRIBE (SELECT ...). #82947 (Yarik Briukhovetskyi).
- Force secure connection for mysql_port and postgresql_port. #82962 (tiandiwonder).
- Users can now do case-insensitive JSON key lookups using
JSONExtractCaseInsensitive(and other variants ofJSONExtract). #83770 (Alistair Evans). - Introduction of
system.completionstable. Closes #81889. #83833 (|2ustam). - Added a new function
nowInBlock64. Example usage:SELECT nowInBlock64(6)returns2025-07-29 17:09:37.775725. #84178 (Halersson Paris). - Add extra_credentials to AzureBlobStorage to authenticate with client_id and tenant_id. #84235 (Pablo Marcos).
- Added function
dateTimeToUUIDv7to convert a DateTime value to a UUIDv7. Example usage:SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56'))returns0198af18-8320-7a7d-abd3-358db23b9d5c. #84319 (samradovich). timeSeriesDerivToGridandtimeSeriesPredictLinearToGridaggregate functions to re-sample data to a time grid defined by the specified start timestamp, end timestamp, and step; calculates PromQL-likederivandpredict_linear, respectively. #84328 (Stephen Chi).- Add two new TimeSeries functions: -
timeSeriesRange(start_timestamp, end_timestamp, step), -timeSeriesFromGrid(start_timestamp, end_timestamp, step, values),. #85435 (Vitaly Baranov). - New syntax added
GRANT READ ON S3('s3://foo/.*') TO user. #84503 (pufit). - Added
Hashas a new output format. It calculates a single hash value for all columns and rows of the result. This is useful for calculating a "fingerprint" of the result, for example, in use cases where data transfer is a bottleneck. Example:SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hashreturnse5f9e676db098fdb9530d2059d8c23ef. #84607 (Robert Schulze). - Add the ability to set up arbitrary watches in Keeper Multi queries. #84964 (Mikhail Artemenko).
- Adds an option
--max-concurrencyfor theclickhouse-benchmarktool that enables a mode with a gradual increase in the number of parallel queries. #85623 (Sergei Trifonov). - TODO: what's that? Support partially aggregated metrics. #85328 (Mikhail Artemenko).
Experimental Feature
- Enable correlated subqueries support by default, they are no longer experimental. #85107 (Dmitry Novik).
- Unity, Glue, Rest, and Hive Metastore data lake catalogs are promoted from experimental to beta. #85848 (Melvyn Peignon).
- Lightweight updates and deletes are promoted from experimental to beta.
- Approximate vector search with vector similarity indexes is now GA. #85888 (Robert Schulze).
- Ytsaurus table engine and table function. #77606 (MikhailBurdukov).
- Previously, the text index data would be separated into multiple segments (each segment size by default was 256 MiB). This might reduce the memory consumption while building the text index, however this increases the space requirement on the disk and increase the query response time. #84590 (Elmi Ahmadov).
Performance Improvement
- New parquet reader implementation. It's generally faster and supports page-level filter pushdown and PREWHERE. Currently experimental. Use setting
input_format_parquet_use_native_reader_v3to enable. #82789 (Michael Kolupaev). - Replaced the official HTTP transport in Azure library with our own HTTP client implementation for Azure Blob Storage. Introduced multiple settings for this clients which mirror settings from S3. Introduced aggressive connection timeouts for both Azure and S3. Improved introspection into Azure profile events and metrics. New client is enabled by default, provide much better latencies for cold queries on top of Azure Blob Storage. Old
Curlclient can be returned back by settingazure_sdk_use_native_client=false. #83294 (alesapin). The previous, official implementation of Azure client was unsuitable for production due to terrible latency spikes, ranging from five seconds to minutes. We have ditched that terrible implementation and are very proud of that. - Processes indexes in increasing order of file size. The net index ordering prioritizes minmax and vector indexes (due to simplicity and selectivity respectively), and small indexes thereafter. Within the minmax/vector indexes smaller indexes are also preferred. #84094 (Maruth Goyal).
- Enable MergeTree setting
write_marks_for_substreams_in_compact_partsby default. It significantly improves performance of subcolumns reading from newly created Compact parts. Servers with version less then 25.5 won't be able to read new Compact parts. #84171 (Pavel Kruglov). azureBlobStoragetable engine: cache and reuse managed identity authentication tokens when possible to avoid throttling. #79860 (Nick Blakely).ALLLEFT/INNERJOINs will be automatically converted toRightAnyif the right side is functionally determined by the join key columns (all rows have unique join key values). #84010 (Nikita Taranov).- Add
max_joined_block_size_bytesin addition tomax_joined_block_size_rowsto limit the memory usage of JOINs with heavy columns. #83869 (Nikolai Kochetov). - Added new logic (controlled by the setting
enable_producing_buckets_out_of_order_in_aggregation, enabled by default) that allows sending some buckets out of order during memory-efficient aggregation. When some aggregation buckets take significantly longer to merge than others, it improves performance by allowing the initiator to merge buckets with higher bucket id-s in the meantime. The downside is potentially higher memory usage (shouldn't be significant). #80179 (Nikita Taranov). - Introduced the
optimize_rewrite_regexp_functionssetting (enabled by default), which allows the optimizer to rewrite certainreplaceRegexpAll,replaceRegexpOne, andextractcalls into simpler and more efficient forms when specific regular expression patterns are detected. (issue #81981). #81992 (Amos Bird). - Process
max_joined_block_rowsoutside of hash JOIN main loop. Slightly better performance for ALL JOIN. #83216 (Nikolai Kochetov). - Process higher granularity min-max indexes first. Closes #75381. #83798 (Maruth Goyal).
- Make
DISTINCTwindow aggregates run in linear time and fix a bug insumDistinct. Closes #79792. Closes #52253. #79859 (Nihal Z. Miaji). - Vector search queries using a vector similarity index complete with lower latency due to reduced storage reads and reduced CPU usage. #83803 (Shankar Iyer).
- Rendezvous hashing for improve cache locality of workload distribution among parallel replicas. #82511 (Anton Ivashkin).
- Implement addManyDefaults for If combinators, so now aggregate functions with If combinators work faster. #83870 (Raúl Marín).
- Calculate serialized key columnarly when group by multiple string or number columns. #83884 (李扬).
- Eliminated full scans for the cases when index analysis results in empty ranges for parallel replicas reading. #84971 (Eduard Karacharov).
- Try -falign-functions=64 in attempt for more stable perf tests. #83920 (Azat Khuzhin).
- The bloom filter index is now used for conditions like
has([c1, c2, ...], column), wherecolumnis not of anArraytype. This improves performance for such queries, making them as efficient as theINoperator. #83945 (Doron David). - Reduce unnecessary memcpy calls in CompressedReadBufferBase::readCompressedData. #83986 (Raúl Marín).
- Optimize
largestTriangleThreeBucketsby removing temporary data. #84479 (Alexey Milovidov). - Optimize string deserialization by simplifying the code. Closes #38564. #84561 (Alexey Milovidov).
- Fixed the calculation of the minimal task size for parallel replicas. #84752 (Nikita Taranov).
- Improved performance of applying patch parts in
Joinmode. #85040 (Anton Popov). - Remove zero byte. Closes #85062. A few minor bugs were fixed. Functions
structureToProtobufSchema,structureToCapnProtoSchemadidn't correctly put a zero-terminating byte and were using a newline instead of it. That was leading to a missing newline in the output, and could lead to buffer overflows while using other functions that depend on the zero byte (such aslogTrace,demangle,extractURLParameter,toStringCutToZero, andencrypt/decrypt). Theregexp_treedictionary layout didn't support processing strings with zero bytes. TheformatRowNoNewlinefunction, called withValuesformat or with any other format without a newline at the end of rows, erroneously cuts the last character of the output. Functionstemcontained an exception-safety error that could lead to a memory leak in a very rare scenario. Theinitcapfunction worked in the wrong way forFixedStringarguments: it didn't recognize the start of the word at the start of the string if the previous string in a block ended with a word character. Fixed a security vulnerability of the ApacheORCformat, which could lead to the exposure of uninitialized memory. Changed behavior of the functionreplaceRegexpAlland the corresponding alias,REGEXP_REPLACE: now it can do an empty match at the end of the string even if the previous match processed the whole string, such as in the case of^a*|a*$or^|.*- this corresponds to the semantic of JavaScript, Perl, Python, PHP, Ruby, but differs to the semantic of PostgreSQL. Implementation of many functions has been simplified and optimized. Documentation for several functions was wrong and has now been fixed. Keep in mind that the output ofbyteSizefor String columns and complex types, which consisted of String columns, has changed (from 9 bytes per empty string to 8 bytes per empty string), and this is normal. #85063 (Alexey Milovidov). - Optimize the materialization of constants in cases when we do this materialization only to return a single row. #85071 (Alexey Milovidov).
- Improve parallel files processing with delta-kernel-rs backend. #85642 (Azat Khuzhin).
- A new setting, enable_add_distinct_to_in_subqueries, has been introduced. When enabled, ClickHouse will automatically add DISTINCT to subqueries in IN clauses for distributed queries. This can significantly reduce the size of temporary tables transferred between shards and improve network efficiency. Note: This is a trade-off—while network transfer is reduced, additional merging (deduplication) work is required on each node. Enable this setting when network transfer is a bottleneck and the merging cost is acceptable. #81908 (fhw12345).
- Reduce query memory tracking overhead for executable user-defined functions. #83929 (Eduard Karacharov).
- Implement internal
delta-kernel-rsfiltering (statistics and partition pruning) in storageDeltaLake. #84006 (Kseniia Sumarokova). - Disable skipping indexes that depend on columns updated on the fly or by patch parts more granularly. Now, skipping indexes are not used only in parts affected by on-the-fly mutations or patch parts; previously, those indexes were disabled for all parts. #84241 (Anton Popov).
- Allocate the minimum amount of memory needed for encrypted_buffer for encrypted named collections. #84432 (Pablo Marcos).
- Improved support for bloom filter indexes (regular, ngram, and token) to be utilized when the first argument is a constant array (the set) and the second is the indexed column (the subset), enabling more efficient query execution. #84700 (Doron David).
- Reduce contention on storage lock in Keeper. #84732 (Antonio Andelic).
- Add missing support of
read_in_order_use_virtual_rowforWHERE. It allows to skip reading more parts for queries with filters that were not fully pushed toPREWHERE. #84835 (Nikolai Kochetov). - Allows asynchronously iterating objects from Iceberg table without storing objects for each data file explicitly. #85369 (Daniil Ivanik).
- Execute non-correlated
EXISTSas a scalar subquery. This allows using a scalar subquery cache and constant-folding the result, which is helpful for indexes. For compatibility, the new settingexecute_exists_as_scalar_subquery=1is added. #85481 (Nikolai Kochetov).
Improvement
- Add
database_replicatedsettings defining the default values of DatabaseReplicatedSettings. If the setting is not present in the Replicated DB create query, the value from this setting is used. #85127 (Tuan Pham Anh). - Made the table columns in the web UI (play) resizable. #84012 (Doron David).
- Support compressed
.metadata.jsonfile viaiceberg_metadata_compression_methodsetting. It supports all clickhouse compression methods. This closes #84895. #85196 (Konstantin Vedernikov). - Show the number of ranges to be read in the output of
EXPLAIN indexes = 1. #79938 (Christoph Wurm). - Introduce settings to set ORC compression block size, and update its default value from 64KB to 256KB to keep consistent with spark or hive. #80602 (李扬).
- Add
columns_substreams.txtfile to Wide part to track all substreams stored in the part. It helps to track dynamic streams in JSON and Dynamic types and so avoid reading sample of these columns to get the list of dynamic streams (for example for columns sizes calculation). Also now all dynamic streams are reflected insystem.parts_columns. #81091 (Pavel Kruglov). - Add a CLI flag --show_secrets to clickhouse format to hide sensitive data by default. #81524 (Nikolai Ryzhov).
- S3 read and write requests are throttled on the HTTP socket level (instead of whole S3 requests) to avoid issues with
max_remote_read_network_bandwidth_for_serverandmax_remote_write_network_bandwidth_for_serverthrottling. #81837 (Sergei Trifonov). - Allow to mix different collations for the same column in different windows (for window functions). #82877 (Yakov Olkhovskiy).
- Add a tool to simulate, visualize and compare merge selectors. #71496 (Sergei Trifonov).
- Add support of
remote*table functions with parallel replicas if cluster is provided inaddress_expressionargument. Also, fixes #73295. #82904 (Igor Nikonov). - Set all log messages for writing backup files to TRACE. #82907 (Hans Krutzer).
- User-defined functions with unusual names and codecs can be formatted inconsistently by the SQL formatter. This closes #83092. #83644 (Alexey Milovidov).
- Users can now use Time and Time64 types inside the JSON type. #83784 (Yarik Briukhovetskyi).
- Joins with parallel replicas now use the join logical step. In case of any issues with join queries using parallel replicas, try
SET query_plan_use_new_logical_join_step=0and report an issue. #83801 (Vladimir Cherkasov). - Fix compatibility for cluster_function_process_archive_on_multiple_nodes. #83968 (Kseniia Sumarokova).
- Support changing mv insert settings on
S3Queuetable level. Added newS3Queuelevel settings:min_insert_block_size_rows_for_materialized_viewsandmin_insert_block_size_bytes_for_materialized_views. By default profile level settings will be used andS3Queuelevel settings will override those. #83971 (Kseniia Sumarokova). - Added profile event
MutationAffectedRowsUpperBoundthat shows the number of affected rows in a mutation (e.g., the total number of rows that satisfy the condition inALTER UPDATEorALTER DELETEquery. #83978 (Anton Popov). - Use information from cgroup (if applicable, i.e.
memory_worker_use_cgroupand cgroups are available) to adjust memory tracker (memory_worker_correct_memory_tracker). #83981 (Azat Khuzhin). - MongoDB: Implicit parsing of strings to numeric types. Previously, if a string value was received from a MongoDB source for a numeric column in a ClickHouse table, an exception was thrown. Now, the engine attempts to parse the numeric value from the string automatically. Closes #81167. #84069 (Kirill Nikiforov).
- Highlight digit groups in
Prettyformats forNullablenumbers. #84070 (Alexey Milovidov). - Dashboard: the tooltip will not overflow the container at the top. #84072 (Alexey Milovidov).
- Slightly better-looking dots on the dashboard. #84074 (Alexey Milovidov).
- Dashboard now has a slightly better favicon. #84076 (Alexey Milovidov).
- Web UI: Give browsers a chance to save the password. Also, it will remember the URL values. #84087 (Alexey Milovidov).
- Add support for applying extra ACL on specific Keeper nodes using
apply_to_childrenconfig. #84137 (Antonio Andelic). - Fix usage of "compact" Variant discriminators serialization in MergeTree. Perviously it wasn't used in some cases when it could be used. #84141 (Pavel Kruglov).
- Added a server setting,
logs_to_keepto database replicated settings, that allows changing the defaultlogs_to_keepparameter for replicated databases. Lower values reduce the number of ZNodes (especially if there are many databases), while higher values allow a missing replica to catch up after a longer period of time. #84183 (Alexey Khatskevich). - Add a setting
json_type_escape_dots_in_keysto escape dots in JSON keys during JSON type parsing. The setting is disabled by default. #84207 (Pavel Kruglov). - Check if connection is cancelled before checking for EOF to prevent reading from closed connection. Fixes #83893. #84227 (Raufs Dunamalijevs).
- Slightly better colors of text selection in Web UI. The difference is significant only for selected table cells in the dark mode. In previous versions, there was not enough contrast between the text and the selection background. #84258 (Alexey Milovidov).
- Improved server shutdown handling for client connections by simplifying internal checks. #84312 (Raufs Dunamalijevs).
- Added a setting
delta_lake_enable_expression_visitor_loggingto turn off expression visitor logs as they can be too verbose even for test log level when debugging something. #84315 (Kseniia Sumarokova). - Cgroup-level and system-wide metrics are reported now altogether. Cgroup-level metrics have names
CGroup<Metric>and OS-level metrics (collected from procfs) have namesOS<Metric>. #84317 (Nikita Taranov). - Slightly better charts in Web UI. Not much, but better. #84326 (Alexey Milovidov).
- Change the default of the Replicated database setting
max_retries_before_automatic_recoveryto 10, so it will recover faster in some cases. #84369 (Alexander Tokmakov). - Fix formatting of CREATE USER with query parameters (i.e.
CREATE USER {username:Identifier} IDENTIFIED WITH no_password). #84376 (Azat Khuzhin). - Introduce
backup_restore_s3_retry_initial_backoff_ms,backup_restore_s3_retry_max_backoff_ms,backup_restore_s3_retry_jitter_factorto configure the S3 retry backoff strategy used during backup and restore operations. #84421 (Julia Kartseva). - S3Queue ordered mode fix: quit earlier if shutdown was called. #84463 (Kseniia Sumarokova).
- Support iceberg writes to read from pyiceberg. #84466 (Konstantin Vedernikov).
- Allow set values type casting when pushing down
IN/GLOBAL INfilters over KeyValue storage primary keys (e.g., EmbeddedRocksDB, KeeperMap). #84515 (Eduard Karacharov). - Bump chdig to 25.7.1. #84521 (Azat Khuzhin).
- Low-level errors during UDF execution now fail with error code
UDF_EXECUTION_FAILED, whereas previously different error codes could be returned. #84547 (Xu Jia). - Add
get_aclcommand to KeeperClient. #84641 (Antonio Andelic). - Adds snapshot version to data lake table engines. #84659 (Pete Hampton).
- Add a dimensional metric for the size of
ConcurrentBoundedQueue, labelled by the queue type (i.e. what the queue is there for) and queue id (i.e. randomly generated id for the current instance of the queue). #84675 (Miсhael Stetsyuk). - The
system.columnstable now providescolumnas an alias for the existingnamecolumn. #84695 (Yunchi Pang). - New MergeTree setting
search_orphaned_parts_drivesto limit scope to look for parts e.g. by disks with local metadata. #84710 (Ilya Golshtein). - Add 4LW in Keeper,
lgrq, for toggling request logging of received requests. #84719 (Antonio Andelic). - Match external auth forward_headers in case-insensitive way. #84737 (ingodwerust).
- The
encrypt_decrypttool now supports encrypted ZooKeeper connections. #84764 (Roman Vasin). - Add format string column to
system.errors. This column is needed to group by the same error type in alerting rules. #84776 (Miсhael Stetsyuk). - Updated
clickhouse-formatto accept--highlightas an alias for--hilite. - Updatedclickhouse-clientto accept--hiliteas an alias for--highlight. - Updatedclickhouse-formatdocumentation to reflect the change. #84806 (Rishabh Bhardwaj). - Fix iceberg reading by field ids for complex types. #84821 (Konstantin Vedernikov).
- Introduce a new
backup_slow_all_threads_after_retryable_s3_errorsetting to reduce pressure on S3 during retry storms caused by errors such asSlowDown, by slowing down all threads once a single retryable error is observed. #84854 (Julia Kartseva). - Skip creating and renaming the old temp table of non-append RMV DDLs in Replicated DBs. #84858 (Tuan Pham Anh).
- Limit Keeper log entry cache size by number of entries using
keeper_server.coordination_settings.latest_logs_cache_entry_count_thresholdandkeeper_server.coordination_settings.commit_logs_cache_entry_count_threshold. #84877 (Antonio Andelic). - Allow using
simdjsonon unsupported architectures (previously leads toCANNOT_ALLOCATE_MEMORYerrors). #84966 (Azat Khuzhin). - Async logging: Make limits tuneable and add introspection. #85105 (Raúl Marín).
- Collect all removed objects to execute single object storage remove operation. #85316 (Mikhail Artemenko).
- Iceberg's current implementation of positional delete files keeps all data in RAM. This can be quite expensive if the positional delete files are large, which is often the case. My implementation keeps only the last row-group of Parquet delete files in RAM, which is significantly cheaper. #85329 (Konstantin Vedernikov).
- chdig: fix leftovers on the screen, fix crash after edit query in editor, search in
pathforeditor, update to 25.8.1. #85341 (Azat Khuzhin). - Add missing
partition_columns_in_data_fileto azure configuration. #85373 (Arthur Passos). - Allow zero step in functions
timeSeries*ToGridThis is part of #75036. #85390 (Vitaly Baranov). - Added show_data_lake_catalogs_in_system_tables flag to manage adding data lake tables in system.tables. Resolves #85384. #85411 (Smita Kulkarni).
- Added support for macro expansion in
remote_fs_zero_copy_zookeeper_path. #85437 (Mikhail Koviazin). - AI in clickhouse-client will look slightly better. #85447 (Alexey Milovidov).
- Enable trace_log.symbolize for old deployments by default. #85456 (Azat Khuzhin).
- Support resolution of more cases for compound identifiers. Particularly, it improves the compatibility of
ARRAY JOINwith the old analyzer. Introduce a new settinganalyzer_compatibility_allow_compound_identifiers_in_unflatten_nestedto keep the old behaviour. #85492 (Nikolai Kochetov). - Ignore UNKNOWN_DATABASE while obtaining table columns sizes for system.columns. #85632 (Azat Khuzhin).
- Added a limit (table setting
max_uncompressed_bytes_in_patches) for total uncompressed bytes in patch parts. It prevents significant slowdowns of SELECT queries after lightweight updates and prevents possible misuse of lightweight updates. #85641 (Anton Popov). - Add a
parametercolumn tosystem.grantsto determine source type forGRANT READ/WRITEand the table engine forGRANT TABLE ENGINE. #85643 (MikhailBurdukov). - Fix parsing of a trailing comma in columns of the CREATE DICTIONARY query after a column with parameters, for example, Decimal(8). Closes #85586. #85653 (Nikolay Degterinsky).
- Support inner arrays for the function
nested. #85719 (Nikolai Kochetov). - All the allocations done by external libraries are now visible to ClickHouse's memory tracker and accounted properly. This may result in "increased" reported memory usage for certain queries or failures with
MEMORY_LIMIT_EXCEEDED. #84082 (Nikita Mikhaylov).
Bug Fix (user-visible misbehavior in an official stable release)
- This pr fixes the metadata resolution when querying iceberg tables through rest catalog. ... #80562 (Saurabh Kumar Ojha).
- Fix markReplicasActive in DDLWorker and DatabaseReplicatedDDLWorker. #81395 (Tuan Pham Anh).
- Fix rollback of Dynamic column on parsing failure. #82169 (Pavel Kruglov).
- If function
trimcalled with all-constant inputs now produces a constant output string. (Bug #78796). #82900 (Robert Schulze). - Fix logical error with duplicate subqueries when
optimize_syntax_fuse_functionsis enabled, close #75511. #83300 (Vladimir Cherkasov). - Fixed incorrect result of queries with
WHERE ... IN (<subquery>)clause and enabled query condition cache (settinguse_query_condition_cache). #83445 (LB7666). - Historically,
gcsfunction did not require any access to use. Now it will checkGRANT READ ON S3permission for usage. Closes #70567. #83503 (pufit). - Skip unavailable nodes during INSERT SELECT from s3Cluster() into replicated MergeTree. #83676 (Igor Nikonov).
- Fix write with append (in MergeTree used for experimental transactions) with
plain_rewritable/plainmetadata types, previously they were simply ignored. #83695 (Tuan Pham Anh). - Mask Avro schema registry authentication details to be not visible to user or in logs. #83713 (János Benjamin Antal).
- Fix the issue where, if a MergeTree table is created with
add_minmax_index_for_numeric_columns=1oradd_minmax_index_for_string_columns=1, the index is later materialized during an ALTER operation, and it prevents the Replicated database from initializing correctly on a new replica. #83751 (Nikolay Degterinsky). - Fixed parquet writer outputting incorrect statistics (min/max) for Decimal types. #83754 (Michael Kolupaev).
- Fix sort of NaN values in
LowCardinality(Float32|Float64|BFloat16)type. #83786 (Pervakov Grigorii). - When restoring from backup, the definer user may not be backed up, which will cause the whole backup to be broken. To fix this, we postpone the permissions check on the target table's creation during restore and only check it during runtime. #83818 (pufit).
- Fix crash in client due to connection left in disconnected state after bad INSERT. #83842 (Azat Khuzhin).
- Allow referencing any table in
view(...)argument ofremotetable function with enabled analyzer. Fixes #78717. Fixes #79377. #83844 (Dmitry Novik). - Onprogress call in jsoneachrowwithprogress is synchronized with finalization. #83879 (Sema Checherinda).
- This closes #81303. #83892 (Konstantin Vedernikov).
- Fix colorSRGBToOKLCH/colorOKLCHToSRGB for mix of const and non-const args. #83906 (Azat Khuzhin).
- Fix writing JSON paths with NULL values in RowBinary format. #83923 (Pavel Kruglov).
- Overflow large values (>2106-02-07) when casting from Date to DateTime64 is fixed. #83982 (Yarik Briukhovetskyi).
- Always apply
filesystem_prefetches_limit(not only fromMergeTreePrefetchedReadPool). #83999 (Azat Khuzhin). - Fix rare bug when
MATERIALIZE COLUMNquery could lead to unexpected files inchecksums.txtand eventually detached data parts. #84007 (alesapin). - Fix the logical error
Expected single dictionary argument for functionwhile doing JOIN on an inequality condition when one of the columns isLowCardinalityand the other is a constant. Closes #81779. #84019 (Alexey Milovidov). - Fix crash with clickhouse client when used in interactive mode with syntax highlighting. #84025 (Bharat Nallan).
- Fixed wrong results when the query condition cache is used in conjunction with recursive CTEs (issue #81506). #84026 (zhongyuankai).
- Handle exceptions properly in periodic parts refresh. #84083 (Azat Khuzhin).
- Fix filter merging into JOIN condition in cases when equality operands have different types or they reference constants. Fixes #83432. #84145 (Dmitry Novik).
- Fix rare clickhouse crash when table has projection,
lightweight_mutation_projection_mode = 'rebuild'and user execute lighweight delete which deletes ALL rows from any block in table. #84158 (alesapin). - Fix deadlock caused by background cancellation checker thread. #84203 (Antonio Andelic).
- Fix infinite recursive analysis of invalid
WINDOWdefinitions. Fixes #83131. #84242 (Dmitry Novik). - Fixed a bug that was causing incorrect Bech32 Encoding and Decoding. The bug wasn't caught originally due to an online implementation of the algorithm used for testing having the same issue. #84257 (George Larionov).
- Fixed incorrect construction of empty tuples in the
array()function. This fixes #84202. #84297 (Amos Bird). - Fix
LOGICAL_ERRORfor queries with parallel replicas and multiple INNER joins followed by RIGHT join. Do not use parallel replicas for such queries. #84299 (Vladimir Cherkasov). - Previously,
setindexes didn't considerNullablecolumns while checking if granules passed the filter (issue #75485). #84305 (Elmi Ahmadov). - Now ClickHouse read tables from Glue Catalog where table type specified in lower case. #84316 (alesapin).
- Do not try to substitute table functions to its cluster alternative in presence of a JOIN or subquery. #84335 (Konstantin Bogdanov).
- Fix logger usage in
IAccessStorage. #84365 (Konstantin Bogdanov). - Fixed a logical error in lightweight updates that update all columns in the table. #84380 (Anton Popov).
- Codec
DoubleDeltacodec can now only be applied to columns of numeric type. In particularFixedStringcolumns can no longer be compressed usingDoubleDelta. (fixes #80220). #84383 (Jimmy Aguilar Mena). - The comparison against nan value was not using the correct ranges during
MinMaxindex evaluation. #84386 (Elmi Ahmadov). - Fix reading Variant column with lazy materialization. #84400 (Pavel Kruglov).
- Make
zoutofmemoryhardware error, otherwise it will throw logical error. see https://github.com/clickhouse/clickhouse-core-incidents/issues/877. #84420 (Han Fei). - Fixed server crash when a user created with
no_passwordattempts to login after the server settingallow_no_passwordwas changed to 0. #84426 (Shankar Iyer). - Fix out-of-order writes to Keeper changelog. Previously, we could have in-flight writes to changelog, but rollback could cause concurrent change of the destination file. This would lead to inconsistent logs, and possible data loss. #84434 (Antonio Andelic).
- Now if all TTL are removed from table MergeTree will do nothing related to TTL. #84441 (alesapin).
- Parallel distributed INSERT SELECT with LIMIT was allowed which is not correct, it leads to data duplication in target table. #84477 (Igor Nikonov).
- Fix pruning files by virtual column in data lakes. #84520 (Kseniia Sumarokova).
- Fix leaks for keeper with rocksdb storage (iterators was not destroyed). #84523 (Azat Khuzhin).
- Fix ALTER MODIFY ORDER BY not validating TTL columns in sorting keys. TTL columns are now properly rejected when used in ORDER BY clauses during ALTER operations, preventing potential table corruption. #84536 (xiaohuanlin).
- Change pre-25.5 value of
allow_experimental_delta_kernel_rstofalsefor compatibility. #84587 (Kseniia Sumarokova). - Stops taking schema from manifest files but stores relevant schemas for each snapshot independently. Infer relevant schema for each data file from its corresponding snapshot. Previous behaviour violated Iceberg specification for manifest files entries with existing status. #84588 (Daniil Ivanik).
- Fixed issue where Keeper setting
rotate_log_storage_interval = 0would cause ClickHouse to crash. (issue #83975). #84637 (George Larionov). - Fix logical error from S3Queue "Table is already registered". Closes #84433. Broken after https://github.com/ClickHouse/ClickHouse/pull/83530. #84677 (Kseniia Sumarokova).
- Lock 'mutex' when getting zookeeper from 'view' in RefreshTask. #84699 (Tuan Pham Anh).
- Fix
CORRUPTED_DATAerror when lazy columns are used with external sort. #84738 (János Benjamin Antal). - Fix column pruning with delta-kernel in storage
DeltaLake. Closes #84543. #84745 (Kseniia Sumarokova). - Refresh credentials in delta-kernel in storage DeltaLake. #84751 (Kseniia Sumarokova).
- Fix starting superfluous internal backups after connection problems. #84755 (Vitaly Baranov).
- Fixed issue where querying a delayed remote source could result in vector out of bounds. #84820 (George Larionov).
- The
ngramandno_optokenizers no longer crash the (experimental) text index for empty input tokens. #84849 (Robert Schulze). - Fixed lightweight updates for tables with
ReplacingMergeTreeandCollapsingMergeTreeengines. #84851 (Anton Popov). - Correctly store all settings in table metadata for tables using object queue engine. #84860 (Antonio Andelic).
- Fix total watches count returned by Keeper. #84890 (Antonio Andelic).
- Fixed lightweight updates for tables with
ReplicatedMergeTreeengine created on servers with a version lower than 25.7. #84933 (Anton Popov). - Fixed lightweight updates for tables with non-replicated
MergeTreeengine after running aALTER TABLE ... REPLACE PARTITIONquery. #84941 (Anton Popov). - Fixes column name generation for boolean literals to use "true"/"false" instead of "1"/"0", preventing column name conflicts between boolean and integer literals in queries. #84945 (xiaohuanlin).
- Fix memory tracking drift from background schedule pool and executor. #84946 (Azat Khuzhin).
- Fix potential inaccurate sorting issues in the Merge table engine. #85025 (Xiaozhe Yu).
- Implement missing APIs for DiskEncrypted. #85028 (Azat Khuzhin).
- Add a check if a correlated subquery is used in a distributed context to avoid a crash. Fixes #82205. #85030 (Dmitry Novik).
- Now Iceberg doesn't try to cache relevant snapshot version between select queries and always try to resolve snapshot honestly. Earlier attempt to cache iceberg snapshot led to problems with usage of Iceberg table with time travel. #85038 (Daniil Ivanik).
- Fixed double-free in
AzureIteratorAsync. #85064 (Nikita Taranov). - Improve error message on attempt to create user identified with JWT. #85072 (Konstantin Bogdanov).
- Fixed cleanup of patch parts in
ReplicatedMergeTree. Previously, the result of a lightweight update may temporarily not be visible on the replica until the merged or mutated part that materializes the patch parts is downloaded from another replica. #85121 (Anton Popov). - Fixing illegal_type_of_argument in mv when types are different. #85135 (Sema Checherinda).
- Fix segfault in delta-kernel implementation. #85160 (Kseniia Sumarokova).
- Fix recovering replicated databases when moving the metadata file takes a long time. #85177 (Tuan Pham Anh).
- Fix
Not-ready SetforIN (subquery)insideadditional_table_filters expressionsetting. #85210 (Nikolai Kochetov). - Get rid of unnecessary
getStatus()calls during SYSTEM DROP REPLICA queries. Fixes the case when a table is dropped in the background, and theShutdown for storage is calledexception is thrown. #85220 (Nikolay Degterinsky). - Fix race in
DeltaLakeengine delta-kernel implementation. #85221 (Kseniia Sumarokova). - Fix reading partitioned data with disabled delta-kernel in
DeltaLakeengine. It was broken in 25.7 (https://github.com/ClickHouse/ClickHouse/pull/81136). #85223 (Kseniia Sumarokova). - Added missing table name length checks in CREATE OR REPLACE and RENAME queries. #85326 (Michael Kolupaev).
- Fix the creation of RMV on a new replica of the Replicated database if DEFINER is dropped. #85327 (Nikolay Degterinsky).
- Fix iceberg writes for complex types. #85330 (Konstantin Vedernikov).
- Writing lower and upper bounds are not supported for complex types. #85332 (Konstantin Vedernikov).
- Fix logical error while reading from object storage functions through Distributed table or remote table function. Fixes: #84658, Fixes #85173, Fixes #52022. #85359 (alesapin).
- Fix backup of parts with broken projections. #85362 (Antonio Andelic).
- Forbid using
_part_offsetcolumn in projection in releases until it is stabilized. #85372 (Sema Checherinda). - Fix crash and data corruption during ALTER UPDATE for JSON. #85383 (Pavel Kruglov).
- Queries with parallel replicas which uses reading reverse in order optimization can produce incorrect result. #85406 (Igor Nikonov).
- Fix possible UB (crashes) in case of MEMORY_LIMIT_EXCEEDED during String deserialization. #85440 (Azat Khuzhin).
- Fix incorrect metrics KafkaAssignedPartitions and KafkaConsumersWithAssignment. #85494 (Ilya Golshtein).
- Fixed processed bytes stat being underestimated when PREWHERE (explicit or automatic) is used. #85495 (Michael Kolupaev).
- Fix early return condition for S3 request rate slowdown: require either s3_slow_all_threads_after_network_error or backup_slow_all_threads_after_retryable_s3_error to be true to enable slowdown behavior when all threads are paused due to a retryable error, instead of requiring both. #85505 (Julia Kartseva).
- This pr fixes the metadata resolution when querying iceberg tables through rest catalog. ... #85531 (Saurabh Kumar Ojha).
- Fixed rare crash in asynchronous inserts that change settings
log_commentorinsert_deduplication_token. #85540 (Anton Popov). - Parameters like date_time_input_format were ignored when using HTTP with multipart/form-data. #85570 (Sema Checherinda).
- Fix secrets masking in icebergS3Cluster and icebergAzureCluster table functions. #85658 (MikhailBurdukov).
- Fix precision loss in
JSONExtractwhen converting JSON numbers to Decimal types. Now numeric JSON values preserve their exact decimal representation, avoiding floating-point rounding errors. #85665 (ssive7b). - Fixed
LOGICAL_ERRORwhen usingCOMMENT COLUMN IF EXISTSin the sameALTERstatement afterDROP COLUMN. TheIF EXISTSclause now correctly skips the comment operation when the column has been dropped within the same statement. #85688 (xiaohuanlin). - Fix reading count from cache for delta lake. #85704 (Kseniia Sumarokova).
- Fix coalescing merge tree segfault for large strings. This closes #84582. #85709 (Konstantin Vedernikov).
- Update metadata timestamp in iceberg writes. #85711 (Konstantin Vedernikov).
- Using
distributed_depthas an indicator of *Cluster function was incorrect and may lead to data duplication; useclient_info.collaborate_with_initiatorinstead. #85734 (Konstantin Bogdanov). - Spark can't read position delete files. #85762 (Konstantin Vedernikov).
- Fix send_logs_source_regexp (after async logging refactoring in #85105). #85797 (Azat Khuzhin).
- Fix possible inconsistency for dictionaries with update_field on MEMORY_LIMIT_EXCEEDED errors. #85807 (Azat Khuzhin).
- Support global constants from
WITHstatement for the parallel distributedINSERT SELECTwith theDistributeddestination table. Before, the query could throw anUnknown expression identifiererror. #85811 (Nikolai Kochetov). - Mask credentials for
deltaLakeAzure,deltaLakeCluster,icebergS3ClusterandicebergAzureCluster. #85889 (Julian Maicher). - Fix logical error on attempt to
CREATE ... AS (SELECT * FROM s3Cluster(...))withDatabaseReplicated. #85904 (Konstantin Bogdanov). - Fixes HTTP requests made by the
url()table function to properly include port numbers in the Host header when accessing non-standard ports. This resolves authentication failures when using presigned URLs with S3-compatible services like MinIO running on custom ports, which is common in development environments. (Fixes #85898). #85921 (Tom Quist). - Now unity catalog will ignore schemas with weird data types in case of non-delta tables. Fixes #85699. #85950 (alesapin).
- Fix nullability of fields in iceberg. #85977 (Konstantin Vedernikov).
- Fixed a bug in
Replicateddatabase recovery: if a table name contains the%symbol, it could re-create the table with a different name during recovery. #85987 (Alexander Tokmakov). - Fix backup restores failing due to
BACKUP_ENTRY_NOT_FOUNDerror when restoring an emptyMemorytable. #86012 (Julia Kartseva). - Add checks for sharding_key during ALTER of the Distributed table. Previously incorrect ALTER would break the table definition and server restart. #86015 (Nikolay Degterinsky).
- Don't create empty iceberg delete file. #86061 (Konstantin Vedernikov).
- Fix large setting values breaking S3Queue tables and replica restart. #86074 (Nikolay Degterinsky).
Build/Testing/Packaging Improvement
- Use encrypted disks for tests with S3 by default. #59898 (Nikita Mikhaylov).
- Use
clickhousebinary in integrations tests to get unstripped debug symbols. #83779 (Mikhail f. Shiryaev). - Bumped the internal libxml2 from 2.14.4 to 2.14.5. #84230 (Robert Schulze).
- Bumped internal curl from 8.14.0 to 8.15.0. #84231 (Robert Schulze).
- Now we use less memory for caches in CI and have better tests for eviction. #84676 (alesapin).
ClickHouse release 25.7, 2025-07-24
Backward Incompatible Change
- Changes to
extractKeyValuePairsfunction: introduce a new argumentunexpected_quoting_character_strategythat controls what happens when aquoting_characteris unexpectedly found when reading a non quoted key or value. The value can be one of:invalid,acceptorpromote. Invalid will discard the key and go back to waiting key state. Accept will treat it as part of the key. Promote will discard previous character and start parsing as a quoted key. In addition, after parsing a quoted value, only parse the next key if a pair delimiter is found. #80657 (Arthur Passos). - Support zero-byte match in
countMatchesfunction. Users who like to retain the old behavior can enable settingcount_matches_stop_at_empty_match. #81676 (Elmi Ahmadov). - Use server-wide throttlers for local (
max_local_read_bandwidth_for_serverandmax_local_write_bandwidth_for_server) and remote (max_remote_read_network_bandwidth_for_serverandmax_remote_write_network_bandwidth_for_server) when generating BACKUPs in addition to their dedicated server settings (max_backup_bandwidth_for_server,max_mutations_bandwidth_for_serverandmax_merges_bandwidth_for_server). #81753 (Sergei Trifonov). - Forbid the creation of a table without insertable columns. #81835 (Pervakov Grigorii).
- Parallelize cluster functions by files within archives. In previous versions, the whole archive (such as zip, tar, or 7z) was a unit of work. Added a new setting
cluster_function_process_archive_on_multiple_nodes, by default equal totrue. If set totrue, increases performance of processing archives in cluster functions. Should be set tofalsefor compatibility and to avoid errors during upgrade to 25.7+ if using cluster functions with archives on earlier versions. #82355 (Kseniia Sumarokova). SYSTEM RESTART REPLICASquery led to the wakeup of tables in the Lazy database, even without access to that database, and it happened while these tables were being concurrently dropped. Note: NowSYSTEM RESTART REPLICASwill only restart replicas in the databases where you have permission toSHOW TABLES, which is natural. #83321 (Alexey Milovidov).
New Feature
- Added support for lightweight updates for
MergeTree-family tables. Lightweight updates can be used by a new syntax:UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>. Added implementation of lightweight deletes via lightweight updates. It can be enabled by settinglightweight_delete_mode = 'lightweight_update'. #82004 (Anton Popov). - Support complex types in Iceberg schema evolution. #73714 (Konstantin Vedernikov).
- Introduce support for INSERTs into Iceberg tables. #82692 (Konstantin Vedernikov).
- Read Iceberg data files by field ids. This improves compatibility with Iceberg: the fields can be renamed in the metadata while being mapped to the different names in the underlying Parquet files. This closes #83065. #83653 (Konstantin Vedernikov).
- Now clickhouse supports compressed
metadata.jsonfiles for Iceberg. Fixes #70874. #81451 (alesapin). - Support
TimestampTZin Glue catalog. This closes #81654. #83132 (Konstantin Vedernikov). - Add AI-powered SQL generation to ClickHouse client. Users can now generate SQL queries from natural language descriptions by prefixing their query with
??. Supports OpenAI and Anthropic providers with automatic schema discovery. #83314 (Kaushik Iska). - Add a function to write Geo types into WKB format. #82935 (Konstantin Vedernikov).
- Introduced two new access types:
READandWRITEfor sources and deprecates all previous access types related to sources. BeforeGRANT S3 ON *.* TO user, now:GRANT READ, WRITE ON S3 TO user. This also allows to separateREADandWRITEpermissions for sources, e.g.:GRANT READ ON * TO user,GRANT WRITE ON S3 TO user. The feature is controlled by a settingaccess_control_improvements.enable_read_write_grantsand disabled by default. #73659 (pufit). - NumericIndexedVector: new vector data-structure backed by bit-sliced, Roaring-bitmap compression, together with more than 20 functions for building, analysing and point-wise arithmetic. Can cut storage and speed up joins, filters and aggregations on sparse data. Implements #70582 and “Large-Scale Metric Computation in Online Controlled Experiment Platform” paper by T. Xiong and Y. Wang from VLDB 2024. #74193 (FriendLey).
- The workload setting
max_waiting_queriesis now supported. It can be used to limit the size of the query queue. If the limit is reached, all subsequent queries will be terminated with theSERVER_OVERLOADEDerror. #81250 (Oleg Doronin). - Add financial functions:
financialInternalRateOfReturnExtended(XIRR),financialInternalRateOfReturn(IRR),financialNetPresentValueExtended(XNPV),financialNetPresentValue(NPV). #81599 (Joanna Hulboj). - Add the geospatial functions
polygonsIntersectCartesianandpolygonsIntersectSphericalto check if two polygons intersect. #81882 (Paul Lamb). - Support
_part_granule_offsetvirtual column in MergeTree-family tables. This column indicates the zero-based index of the granule/mark each row belongs to within its data part. This addresses #79572. #82341 (Amos Bird). #82341 (Amos Bird) - Added SQL functions
colorSRGBToOkLCHandcolorOkLCHToSRGBfor converting colours between the sRGB and OkLCH colour spaces. #83679 (Fgrtue). - Allow parameters in
CREATE USERqueries for usernames. #81387 (Diskein). - The
system.formatstable now contains extended information about formats, such as HTTP content type, the capabilities of schema inference, etc. #81505 (Alexey Milovidov).
Experimental Feature
- Added functions
searchAnyandsearchAllwhich are general purpose tools to search text indexes. #80641 (Elmi Ahmadov). - The text index now supports the new
splittokenizer. #81752 (Elmi Ahmadov). - Changed the default index granularity value for
textindexes to 64. This improves the expected performance for the average test query in internal benchmarks. #82162 (Jimmy Aguilar Mena). - The 256-bit bitmap stores the outgoing labels of a state ordered, but outgoing states are saved into disk in the order they appear in the hash table. Therefore, a label would point to a wrong next state while reading from disk. #82783 (Elmi Ahmadov).
- Enable zstd compression for FST tree blob in text indices. #83093 (Elmi Ahmadov).
- Promote vector similarity index to beta. Introduced alias setting
enable_vector_similarity_indexwhich must be enabled to use the vector similarity index. #83459 (Robert Schulze). - Removed experimental
send_metadatalogic related to experimental zero-copy replication. It wasn't ever used and nobody supports this code. Since there were even no tests related to it, there is a high chance that it's broken long time ago. #82508 (alesapin). - Integrate
StorageKafka2tosystem.kafka_consumers. #82652 (János Benjamin Antal). - Estimate complex CNF/DNF, for example,
(a < 1 and a > 0) or b = 3, by statistics. #82663 (Han Fei).
Performance Improvement
- Introduce async logging. When logs are output to a slow device, it no longer delays queries. #82516 (Raúl Marín). Limit the max number of entries that are hold in the queue. #83214 (Raúl Marín).
- Parallel distributed INSERT SELECT is enabled by default in mode where INSERT SELECT executed on each shard independently, see
parallel_distributed_insert_selectsetting. #83040 (Igor Nikonov). - When the aggregation query contains only a single
count()function on a not-Nullablecolumn, the aggregation logic is fully inlined during hash table probing. This avoids allocating and maintaining any aggregation state, significantly reducing memory usage and CPU overhead. This partially addresses #81982. #82104 (Amos Bird). - Performance of
HashJoinoptimised by removing the additional loop over hash maps in the typical case of only one key column, alsonull_mapandjoin_maskchecks are eliminated when they're alwaystrue/false. #82308 (Nikita Taranov). - Trivial optimization for
-Ifcombinator. #78454 (李扬). - Vector search queries using a vector similarity index complete with lower latency due to reduced storage reads and reduced CPU usage. #79103 (Shankar Iyer).
- Respect
merge_tree_min_{rows,bytes}_for_seekinfilterPartsByQueryConditionCacheto align it with other methods filtering by indexes. #80312 (李扬). - Make the pipeline after the
TOTALSstep multithreaded. #80331 (UnamedRus). - Fix filter by key for
RedisandKeeperMapstorages. #81833 (Pervakov Grigorii). - Add new setting
min_joined_block_size_rows(analogous tomin_joined_block_size_bytes; defaults to 65409) to control the minimum block size (in rows) for JOIN input and output blocks (if the join algorithm supports it). Small blocks will be squashed. #81886 (Nikita Taranov). ATTACH PARTITIONno longer leads to the dropping of all caches. #82377 (Alexey Milovidov).- Optimize the generated plan for correlated subqueries by removing redundant JOIN operations using equivalence classes. If there are equivalent expressions for all correlated columns,
CROSS JOINis not produced ifquery_plan_correlated_subqueries_use_substitutionsetting is enabled. #82435 (Dmitry Novik). - Read only required columns in correlated subquery when it appears to be an argument of function
EXISTS. #82443 (Dmitry Novik). - Speedup comparisons of query trees during the query analysis a bit. #82617 (Nikolai Kochetov).
- Add alignment in the Counter of ProfileEvents to reduce false sharing. #82697 (Jiebin Sun).
- The optimizations for
null_mapandJoinMaskfrom #82308 were applied to the case of JOIN with multiple disjuncts. Also, theKnownRowsHolderdata structure was optimized. #83041 (Nikita Taranov). - Plain
std::vector<std::atomic_bool>is used for join flags to avoid calculating a hash on each access to flags. #83043 (Nikita Taranov). - Don't pre-allocate memory for result columns beforehand when
HashJoinuseslazyoutput mode. It is suboptimal, especially when the number of matches is low. Moreover, we know the exact amount of matches after joining is done, so we can preallocate more precisely. #83304 (Nikita Taranov). - Minimize memory copy in port headers during pipeline construction. Original PR by heymind. #83381 (Raúl Marín).
- Improve the startup of clickhouse-keeper when it uses rocksdb storage. #83390 (Antonio Andelic).
- Avoid holding the lock while creating storage snapshot data to reduce lock contention with high concurrent load. #83510 (Duc Canh Le).
- Improved performance of the
ProtobufSingleinput format by reusing the serializer when no parsing errors occur. #83613 (Eduard Karacharov). - Improve the performance of pipeline building that speeds up short queries. #83631 (Raúl Marín).
- Optimize
MergeTreeReadersChain::getSampleBlockthat speeds up short queries. #83875 (Raúl Marín). - Speedup tables listing in data catalogs by asynchronous requests. #81084 (alesapin).
- Introduce jitter to the S3 retry mechanism when the
s3_slow_all_threads_after_network_errorconfiguration is enabled. #81849 (zoomxi).
Improvement
- Color parenthesis in multiple colors for better readability. #82538 (Konstantin Bogdanov).
- Highlight metacharacters in LIKE/REGEXP patterns as you type. We already have it in
clickhouse-formatand in the echo inclickhouse-client, but now it is done in the command prompt as well. #82871 (Alexey Milovidov). - Highlighting in
clickhouse-formatand in the client's echo will work in the same way as the highlighting in the command line prompt. #82874 (Alexey Milovidov). - Now
plain_rewritabledisks are allowed as disks for database metadata. Implement methodsmoveFileandreplaceFileinplain_rewritableto support it as a database disk. #79424 (Tuan Pham Anh). - Allow backups for
PostgreSQL,MySQLandDataLakedatabases. A backup of such a database would only save the definition and not the data inside of it. #79982 (Nikolay Degterinsky). - Setting
allow_experimental_join_conditionmarked as obsolete, because it is now always allowed. #80566 (Vladimir Cherkasov). - Add pressure metrics to ClickHouse async metrics. #80779 (Xander Garbett).
- Added metrics
MarkCacheEvictedBytes,MarkCacheEvictedMarks,MarkCacheEvictedFilesfor tracking evictions from the mark cache. (issue #60989). #80799 (Shivji Kumar Jha). - Support writing Parquet enum as byte array as the spec dictates. #81090 (Arthur Passos).
- An improvement for
DeltaLaketable engine: delta-kernel-rs hasExpressionVisitorAPI which is implemented in this PR and is applied to partition column expressions transform (it will replace an old deprecated within the delta-kernel-rs way, which was used before in our code). In the future thisExpressionVisitorwill also allow to implement statistics based pruning and some delta-lake proprietary features. Additionally the purpose of this change is to support partition pruning inDeltaLakeClustertable engine (the result of a parsed expression - ActionsDAG - will be serialized and sent from the initiator along with the data path, because this kind of information, which is needed for pruning, is only available as meta information on data files listing, which is done by initiator only, but it has to be applied to data on each reading server). #81136 (Kseniia Sumarokova). - Preserve element names when deriving supertypes for named tuples. #81345 (lgbo).
- Count consumed messages manually to avoid depending on previous committed offset in StorageKafka2. #81662 (János Benjamin Antal).
- Added
clickhouse-keeper-utils, a new command-line tool for managing and analyzing ClickHouse Keeper data. The tool supports dumping state from snapshots and changelogs, analyzing changelog files, and extracting specific log ranges. #81677 (Antonio Andelic). - The total and per-user network throttlers are never reset, which ensures that
max_network_bandwidth_for_all_usersandmax_network_bandwidth_for_all_userslimits are never exceeded. #81729 (Sergei Trifonov). - Support writing geoparquets as output format. #81784 (Konstantin Vedernikov).
- Forbid to start
RENAME COLUMNalter mutation if it will rename some column that right now affected by incomplete data mutation. #81823 (Mikhail Artemenko). - Header Connection is send at the end of headers. When we know is the connection should be preserved. #81951 (Sema Checherinda).
- Tune TCP servers queue (64 by default) based on listen_backlog (4096 by default). #82045 (Azat Khuzhin).
- Add ability to reload
max_local_read_bandwidth_for_serverandmax_local_write_bandwidth_for_serveron fly without restart server. #82083 (Kai Zhu). - Add support for clearing all warnings from the
system.warningstable usingTRUNCATE TABLE system.warnings. #82087 (Vladimir Cherkasov). - Fix partition pruning with data lake cluster functions. #82131 (Kseniia Sumarokova).
- Fix reading partitioned data in DeltaLakeCluster table function. In this PR cluster functions protocol version is increased, allowing to send extra info from initiator to replicas. This extra info contains delta-kernel transform expression, which is needed to parse partition columns (and some other staff in the future, like generated columns, etc). #82132 (Kseniia Sumarokova).
- Function
reinterpretfunction now supports conversion toArray(T)whereTis a fixed-size data type (issue #82621). #83399 (Shankar Iyer). - Now database Datalake throw more convenient exception. Fixes #81211. #82304 (alesapin).
- Improve CROSS JOIN by returning false from
HashJoin::needUsedFlagsForPerRightTableRow. #82379 (lgbo). - Allow write/read map columns as Array of Tuples. #82408 (MikhailBurdukov).
- List the licenses of Rust crates in
system.licenses. #82440 (Raúl Marín). - Macros like
{uuid}can now be used in thekeeper_pathsetting of the S3Queue table engine. #82463 (Nikolay Degterinsky). - Keeper improvement: move changelog files between disk in a background thread. Previously, moving changelog to a different disk would block Keeper globally until the move is finished. This lead to performance degradation if moving is a long operation (e.g. to S3 disk). #82485 (Antonio Andelic).
- Keeper improvement: add new config
keeper_server.cleanup_old_and_ignore_new_acl. If enabled, all nodes will have their ACLs cleared while ACL for new requests will be ignored. If the goal is to completely remove ACL from nodes, it's important to leave the config enabled until a new snapshot is created. #82496 (Antonio Andelic). - Added a new server setting
s3queue_disable_streamingwhich disables streaming in tables with S3Queue table engine. This setting is changeable without server restart. #82515 (Kseniia Sumarokova). - Refactor dynamic resize feature of filesystem cache. Added more logs for introspection. #82556 (Kseniia Sumarokova).
clickhouse-serverwithout a configuration file will also listen to the PostgreSQL port 9005, like with the default config. #82633 (Alexey Milovidov).- In
ReplicatedMergeTree::executeMetadataAlter, we get the StorageID, and without taking DDLGuard, we try to callIDatabase::alterTable. In between this time we could have technically exchanged the table in question with another table, so when we get the definiton we would get the wrong one. To avoid this we add a separate check for UUIDs to match when we try to callIDatabase::alterTable. #82666 (Nikolay Degterinsky). - When attaching a database with a read-only remote disk, manually add table UUIDs into DatabaseCatalog. #82670 (Tuan Pham Anh).
- Prevent user from using
nanandinfwithNumericIndexedVector. Fixes #82239 and a little more. #82681 (Raufs Dunamalijevs). - Do not omit zero values in the
X-ClickHouse-ProgressandX-ClickHouse-Summaryheader formats. #82727 (Nikita Mikhaylov). - Keeper improvement: support specific permissions for world:anyone ACL. #82755 (Antonio Andelic).
- Do not allow
RENAME COLUMNorDROP COLUMNinvolving explicitly listed columns to sum in SummingMergeTree. Closes #81836. #82821 (Alexey Milovidov). - Improve the precision of conversion from
DecimaltoFloat32. Implement conversion fromDecimaltoBFloat16. Closes #82660. #82823 (Alexey Milovidov). - Scrollbars in the Web UI will look slightly better. #82869 (Alexey Milovidov).
clickhouse-serverwith embedded configuration will allow using the Web UI by providing an HTTP OPTIONS response. #82870 (Alexey Milovidov).- Add support for specifying extra Keeper ACL for paths in config. If you want to add extra ACL for a specific path you define it in the config under
zookeeper.path_acls. #82898 (Antonio Andelic). - Now mutations snapshot will be built from the visible parts snapshot. Also mutation counters used in snapshot will be recalculated from the included mutations. #82945 (Mikhail Artemenko).
- Adds ProfileEvent when Keeper rejects a write due to soft memory limit. #82963 (Xander Garbett).
- Add columns
commit_time,commit_idtosystem.s3queue_log. #83016 (Kseniia Sumarokova). - In some cases, we need to have multiple dimensions to our metrics. For example, counting failed merges or mutations by error codes rather than having a single counter. Introduce
system.dimensional_metrics, which does precisely that and adds the first dimensional metric calledfailed_merges. #83030 (Miсhael Stetsyuk). - Consolidate unknown settings warnings in clickhouse client and log them as a summary. #83042 (Bharat Nallan).
- Clickhouse client now reports the local port when connection error happens. #83050 (Jianfei Hu).
- Slightly better error handling in
AsynchronousMetrics. If the/sys/blockdirectory exists but is not accessible, the server will start without monitoring the block devices. Closes #79229. #83115 (Alexey Milovidov). - Shutdown SystemLogs after ordinary tables (and before system tables, instead of before ordinary). #83134 (Kseniia Sumarokova).
- Add logs for
S3Queueshutdown process. #83163 (Kseniia Sumarokova). - Possibility to parse
TimeandTime64asMM:SS,M:SS,SS, orS. #83299 (Yarik Briukhovetskyi). - When
distributed_ddl_output_mode='*_only_active', don't wait for new or recovered replicas that have replication lag bigger thanmax_replication_lag_to_enqueue. This should help to avoidDDL task is not finished on some hostswhen a new replica becomes active after finishing initialization or recovery, but it accumulated huge replication log while initializing. Also, implementSYSTEM SYNC DATABASE REPLICA STRICTquery that waits for replication log to become belowmax_replication_lag_to_enqueue. #83302 (Alexander Tokmakov). - Do not output too long descriptions of expression actions in exception messages. Closes #83164. #83350 (Alexey Milovidov).
- Add ability to parse part's prefix and suffix and also check coverage for non constant columns. #83377 (Mikhail Artemenko).
- Unify parameter names in ODBC and JDBC when using named collections. #83410 (Andrey Zvonov).
- When the storage is shutting down,
getStatusthrows anErrorCodes::ABORTEDexception. Previously, this would fail the select query. Now we catch theErrorCodes::ABORTEDexceptions and intentionally ignore them instead. #83435 (Miсhael Stetsyuk). - Add process resource metrics (such as
UserTimeMicroseconds,SystemTimeMicroseconds,RealTimeMicroseconds) to part_log profile events forMergePartsentries. #83460 (Vladimir Cherkasov). - Enable
create_if_not_exists,check_not_exists,remove_recursivefeature flags in Keeper by default which enable new types of requests. #83488 (Antonio Andelic). - Shutdown S3(Azure/etc)Queue streaming before shutting down any tables on server shutdown. #83530 (Kseniia Sumarokova).
- Enable
Date/Date32as integers inJSONinput formats. #83597 (MikhailBurdukov). - Made exception messages for certain situations for loading and adding projections easier to read. #83728 (Robert Schulze).
- Introduce a configuration option to skip binary checksum integrity checks for
clickhouse-server. Resolves #83637. #83749 (Rafael Roquetto).
Bug Fix (user-visible misbehavior in an official stable release)
- Fix the wrong default value for the
--reconnectoption inclickhouse-benchmark. It was changed by mistake in #79465. #82677 (Alexey Milovidov). - Fix inconsistent formatting of
CREATE DICTIONARY. Closes #82105. #82829 (Alexey Milovidov). - Fix inconsistent formatting of TTL when it contains a
materializefunction. Closes #82828. #82831 (Alexey Milovidov). - Fix inconsistent formatting of EXPLAIN AST in a subquery when it contains output options such as INTO OUTFILE. Closes #82826. #82840 (Alexey Milovidov).
- Fix inconsistent formatting of parenthesized expressions with aliases in the context when no aliases are allowed. Closes #82836. Closes #82837. #82867 (Alexey Milovidov).
- Use the proper error code when multiplying an aggregate function state with IPv4. Closes #82817. #82818 (Alexey Milovidov).
- Fix logical error in filesystem cache: "Having zero bytes but range is not finished". #81868 (Kseniia Sumarokova).
- Recalculate the min-max index when TTL reduces rows to ensure the correctness of algorithms relying on it, such as
minmax_count_projection. This resolves #77091. #77166 (Amos Bird). - For queries with combination of
ORDER BY ... LIMIT BY ... LIMIT N, when ORDER BY is executed as a PartialSorting, the counterrows_before_limit_at_leastnow reflects the number of rows consumed by LIMIT clause instead of number of rows consumed by sorting transform. #78999 (Eduard Karacharov). - Fix excessive granule skipping for filtering over token/ngram indexes with regexp which contains alternation and non-literal first alternative. #79373 (Eduard Karacharov).
- Fix logical error with
<=>operator and Join storage, now query returns proper error code. #80165 (Vladimir Cherkasov). - Fix a crash in the
loopfunction when used with theremotefunction family. Ensure the LIMIT clause is respected inloop(remote(...)). #80299 (Julia Kartseva). - Fix incorrect behavior of
to_utc_timestampandfrom_utc_timestampfunctions when handling dates before Unix epoch (1970-01-01) and after maximum date (2106-02-07 06:28:15). Now these functions properly clamp values to epoch start and maximum date respectively. #80498 (Surya Kant Ranjan). - For some queries executed with parallel replicas, reading in order optimization(s) could be applied on initiator while can't be applied on remote nodes. It leads to different reading modes used by parallel replicas coordinator (on initiator) and on remoted nodes, which is a logical error. #80652 (Igor Nikonov).
- Fix logical error during materialize projection when column type was changed to Nullable. #80741 (Pavel Kruglov).
- Fix incorrect TTL recalculation in TTL GROUP BY when updating TTL. #81222 (Evgeniy Ulasik).
- Fixed Parquet bloom filter incorrectly applying condition like
WHERE function(key) IN (...)as if it wereWHERE key IN (...). #81255 (Michael Kolupaev). - Fixed possible crash in
Aggregatorin case of exception during merge. #81450 (Nikita Taranov). - Fixed
InterpreterInsertQuery::extendQueryLogElemImplto add backquotes to database and table names when needed (f.g., when names contain special characters like-). #81528 (Ilia Shvyrialkin). - Fix
INexecution withtransform_null_in=1with null in the left argument and non-nullable subquery result. #81584 (Pavel Kruglov). - Don't validate experimental/suspicious types in default/materialize expression execution during reading from existing table. #81618 (Pavel Kruglov).
- Fix "Context has expired" during merges when dict used in TTL expression. #81690 (Azat Khuzhin).
- Fix monotonicity of the cast function. #81722 (zoomxi).
- Fix the issue where required columns are not read during scalar correlated subquery processing. Fixes #81716. #81805 (Dmitry Novik).
- In previous versions, the server returned excessive content for requests to
/js. This closes #61890. #81895 (Alexey Milovidov). - Previously,
MongoDBtable engine definitions could include a path component in thehost:portargument which was silently ignored. The mongodb integration refuses to load such tables. With this fix we allow loading such tables and ignore path component ifMongoDBengine has five arguments, using the database name from arguments. Note: The fix is not applied for newly created tables or queries withmongotable function, as well as for dictionary sources and named collections. #81942 (Vladimir Cherkasov). - Fixed possible crash in
Aggregatorin case of exception during merge. #82022 (Nikita Taranov). - Fix filter analysis when only a constant alias column is used in the query. Fixes #79448. #82037 (Dmitry Novik).
- Fix LOGICAL_ERROR and following crash when using the same column in the TTL for GROUP BY and SET. #82054 (Pablo Marcos).
- Fix S3 table function argument validation in secret masking, preventing possible
LOGICAL_ERROR, close #80620. #82056 (Vladimir Cherkasov). - Fix data races in Iceberg. #82088 (Azat Khuzhin).
- Fix
DatabaseReplicated::getClusterImpl. If the first element (or elements) ofhostshasid == DROPPED_MARKand there are no other elements for the same shard, the first element ofshardswill be an empty vector, leading tostd::out_of_range. #82093 (Miсhael Stetsyuk). - Fixing copy-paste error in arraySimilarity, disallowing the use of UInt32 and Int32 weights. Update tests and docs. #82103 (Mikhail f. Shiryaev).
- Fix the
Not found columnerror for queries witharrayJoinunderWHEREcondition andIndexSet. #82113 (Nikolai Kochetov). - Fix bug in glue catalog integration. Now clickhouse can read tables with nested data types where some of subcolumns contain decimals, for example:
map<string, decimal(9, 2)>. Fixes #81301. #82114 (alesapin). - Fix performance degradation in SummingMergeTree that was intorduced in 25.5 in https://github.com/ClickHouse/ClickHouse/pull/79051. #82130 (Pavel Kruglov).
- When passing settings over uri the last value is considered. #82137 (Sema Checherinda).
- Fix "Context has expired" for Iceberg. #82146 (Azat Khuzhin).
- Fix possible deadlock for remote queries when server is under memory pressure. #82160 (Kirill).
- Fixes overflow in
numericIndexedVectorPointwiseAdd,numericIndexedVectorPointwiseSubtract,numericIndexedVectorPointwiseMultiply,numericIndexedVectorPointwiseDividefunctions that happened when we applied them to large numbers. #82165 (Raufs Dunamalijevs). - Fix a bug in table dependencies causing Materialized Views to miss INSERT queries. #82222 (Nikolay Degterinsky).
- Fix possible data-race between suggestion thread and main client thread. #82233 (Azat Khuzhin).
- Now ClickHouse can read iceberg tables from Glue catalog after schema evolution. Fixes #81272. #82301 (alesapin).
- Fix the validation of async metrics settings
asynchronous_metrics_update_period_sandasynchronous_heavy_metrics_update_period_s. #82310 (Bharat Nallan). - Fix logical error when resolving matcher in query with multiple JOINs, close #81969. #82421 (Vladimir Cherkasov).
- Add expiration to AWS ECS token so it can be reloaded. #82422 (Konstantin Bogdanov).
- Fixes a bug for
NULLarguments inCASEfunction. #82436 (Yarik Briukhovetskyi). - Fix data-races in client (by not using global context) and
session_timezoneoverrides (previously in case ofsession_timezonewas set in i.e.users.xml/client options to non empty and in query context to empty, then, value fromusers.xmlwas used, while this is wrong, now query context will always have a priority over global context). #82444 (Azat Khuzhin). - Fix disabling boundary alignment for cached buffer in external table engines. It was broken in https://github.com/ClickHouse/ClickHouse/pull/81868. #82493 (Kseniia Sumarokova).
- Fix the crash if key-value storage is joined with a type-casted key. #82497 (Pervakov Grigorii).
- Fix hiding named collection values in logs/query_log. Closes #82405. #82510 (Kseniia Sumarokova).
- Fix a possible crash in logging while terminating a session as the user_id might sometimes be empty. #82513 (Bharat Nallan).
- Fixes cases where parsing of Time could cause msan issues. This fixes: #82477. #82514 (Yarik Briukhovetskyi).
- Disallow setting
threadpool_writer_pool_sizeto zero to ensure that server operations don't get stuck. #82532 (Bharat Nallan). - Fix
LOGICAL_ERRORduring row policy expression analysis for correlated columns. #82618 (Dmitry Novik). - Fix incorrect usage of parent metadata in
mergeTreeProjectiontable function whenenable_shared_storage_snapshot_in_query = 1. This is for #82634. #82638 (Amos Bird). - Functions
trim{Left,Right,Both}now support input strings of type "FixedString(N)". For example,SELECT trimBoth(toFixedString('abc', 3), 'ac')now works. #82691 (Robert Schulze). - In AzureBlobStorage, for native copy we compare authentication methods, during which if we get an exception, updated the code to fallback to read and copy (i.e. non native copy). #82693 (Smita Kulkarni).
- Fix deserialization of
groupArraySample/groupArrayLastin case of empty elements (deserialization could skip part of the binary if the input was empty, this can lead to corruption during data read and UNKNOWN_PACKET_FROM_SERVER in TCP protocol). This does not affect numbers and date time types. #82763 (Pedro Ferreira). - Fix backup of an empty
Memorytable, causing the backup restore to fail with withBACKUP_ENTRY_NOT_FOUNDerror. #82791 (Julia Kartseva). - Fix exception safety in union/intersect/except_default_mode rewrite. Closes #82664. #82820 (Alexey Milovidov).
- Keep track of the number of async tables loading jobs. If there are some running jobs, do not update
tail_ptrinTransactionLog::removeOldEntries. #82824 (Tuan Pham Anh). - Fix data races in Iceberg. #82841 (Azat Khuzhin).
- Setting
use_skip_indexes_if_final_exact_modeoptimization (introduced in 25.6) could fail to select a relevant candidate range depending uponMergeTreeengine settings / data distribution. That has been resolved now. #82879 (Shankar Iyer). - Set salt for auth data when parsing from AST with type SCRAM_SHA256_PASSWORD. #82888 (Tuan Pham Anh).
- When using a non-caching Database implementation, the metadata of the corresponding table is deleted after the columns are returned and the reference is invalidated. #82939 (buyval01).
- Fix filter modification for queries with a JOIN expression with a table with storage
Merge. Fixes #82092. #82950 (Dmitry Novik). - Fix LOGICAL_ERROR in QueryMetricLog: Mutex cannot be NULL. #82979 (Pablo Marcos).
- Fixed incorrect output of function
formatDateTimewhen formatter%fis used together with variable-size formatters (e.g.%M). #83020 (Robert Schulze). - Fix performance degradation with the enabled analyzer when secondary queries always read all columns from the VIEWs. Fixes #81718. #83036 (Dmitry Novik).
- Fix misleading error message when restoring a backup on a read-only disk. #83051 (Julia Kartseva).
- Do not check for cyclic dependencies on create table with no dependencies. It fixes performance degradation of the use cases with creation of thousands of tables that was introduced in https://github.com/ClickHouse/ClickHouse/pull/65405. #83077 (Pavel Kruglov).
- Fixes issue with implicit reading of negative Time values into the table and make the docs not confusing. #83091 (Yarik Briukhovetskyi).
- Do not use unrelated parts of a shared dictionary in the
lowCardinalityKeysfunction. #83118 (Alexey Milovidov). - Fix the regression in use of subcolumns with Materialized Views. This fixes: #82784. #83221 (Nikita Mikhaylov).
- Fix crash in client due to connection left in disconnected state after bad INSERT. #83253 (Azat Khuzhin).
- Fix crash when calculating the size of a block with empty columns. #83271 (Raúl Marín).
- Fix possible crash in Variant type in UNION. #83295 (Pavel Kruglov).
- Fix LOGICAL_ERROR in clickhouse-local for unsupported SYSTEM queries. #83333 (Surya Kant Ranjan).
- Fix
no_sign_requestfor S3 client. It can be used to explicitly avoid signing S3 requests. It can also be defined for specific endpoints using endpoint-based settings. #83379 (Antonio Andelic). - Fixes a crash that may happen for a query with a setting 'max_threads=1' when executed under load with CPU scheduling enabled. #83387 (Fan Ziqi).
- Fix
TOO_DEEP_SUBQUERIESexception when CTE definition references another table expression with the same name. #83413 (Dmitry Novik). - Fix incorrect behavior when executing
REVOKE S3 ON system.*revokes S3 permissions for*.*. This fixes #83417. #83420 (pufit). - Do not share async_read_counters between queries. #83423 (Azat Khuzhin).
- Disable parallel replicas when a subquery contains the FINAL. #83455 (zoomxi).
- Resolve minor integer overflow in configuration of setting
role_cache_expiration_time_seconds(issue #83374). #83461 (wushap). - Fix a bug introduced in https://github.com/ClickHouse/ClickHouse/pull/79963. When inserting into an MV with a definer, the permission check should use the definer's grants. This fixes #79951. #83502 (pufit).
- Disable bounds-based file pruning for iceberg array element and iceberg map values, including all their nested subfields. #83520 (Daniil Ivanik).
- Fix possible file cache not initialized errors when it's used as a temporary data storage. #83539 (Bharat Nallan).
- Keeper fix: update total watch count correctly when ephemeral nodes are deleted on session close. #83583 (Antonio Andelic).
- Fix incorrect memory around max_untracked_memory. #83607 (Azat Khuzhin).
- INSERT SELECT with UNION ALL could lead to a null pointer dereference in a corner case. This closes #83618. #83643 (Alexey Milovidov).
- Disallow zero value for max_insert_block_size as it could cause logical error. #83688 (Bharat Nallan).
- Fix endless loop in estimateCompressionRatio() with block_size_bytes=0. #83704 (Azat Khuzhin).
- Fix
IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFilesmetrics (previously they were included into metric w/oCacheprefix). #83730 (Azat Khuzhin). - Fix possible abort (due to joining threads from the task) and hopefully hungs (in unit tests) during
BackgroundSchedulePoolshutdown. #83769 (Azat Khuzhin). - Introduce backward compatibility setting to allow new analyzer to reference outer alias in WITH clause in the case of name clashes. Fixes #82700. #83797 (Dmitry Novik).
- Fix deadlock on shutdown due to recursive context locking during library bridge cleanup. #83824 (Azat Khuzhin).
Build/Testing/Packaging Improvement
- Build a minimal C library (10 KB) for the ClickHouse lexer. This is needed for #80977. #81347 (Alexey Milovidov). Add test for standalone lexer, add test tag
fasttest-only. #82472 (Yakov Olkhovskiy). - Add a check for Nix submodule inputs. #81691 (Konstantin Bogdanov).
- Fix a list of problems that can occur when trying to run integration tests on a localhost. #82135 (Oleg Doronin).
- Compile SymbolIndex on Mac and FreeBSD. (But it will work only on ELF systems, Linux and FreeBSD). #82347 (Alexey Milovidov).
- Bumped Azure SDK to v1.15.0. #82747 (Smita Kulkarni).
- Add storage module from google-cloud-cpp to build system. #82881 (Pablo Marcos).
- Change
Dockerfile.ubuntufor clickhouse-server to fit requirements in Docker Official Library. #83039 (Mikhail f. Shiryaev). - A follow-up for #83158 to fix uploading builds to
curl clickhouse.com. #83463 (Mikhail f. Shiryaev). - Adding
busyboxbinary and install tools inclickhouse/clickhouse-serverand officialclickhouseimages. #83735 (Mikhail f. Shiryaev). - Added support for the
CLICKHOUSE_HOSTenvironment variable to specify the ClickHouse server host, aligning with existingCLICKHOUSE_USERandCLICKHOUSE_PASSWORDenvironment variables. This allows for easier configuration without modifying client or configuration files directly. #83659 (Doron David).
ClickHouse release 25.6, 2025-06-26
Backward Incompatible Change
- Previously, function
countMatcheswould stop counting at the first empty match even if the pattern accepts it. To overcome this issue,countMatchesnow continues execution by advancing by a single character when an empty match occurs. Users who like to retain the old behavior can enable settingcount_matches_stop_at_empty_match. #81676 (Elmi Ahmadov). - Minor: Force
backup_threadsandrestore_threadsserver settings to be non zero. #80224 (Raúl Marín). - Minor: Fix
bitNotforStringwill return a zero-terminated string in the internal memory representation. This should not affect any user visible behavior, however the author wanted to highlight this change. #80791 (Azat Khuzhin).
New Feature
- New data types:
Time([H]HH:MM:SS) andTime64([H]HH:MM:SS[.fractional]), and some basic cast functions and functions to interact with other data types. Added settings for compatibility with the existing functiontoTime. The settinguse_legacy_to_timeis set to keep the old behavior for now. #81217 (Yarik Briukhovetskyi). Support comparison between Time/Time64. #80327 (Yarik Briukhovetskyi). - A new CLI tool,
chdig- TUI interface for ClickHouse (top like) as part of ClickHouse. #79666 (Azat Khuzhin). - Support
disksetting forAtomicandOrdinarydatabase engines, specifying the disk to store table metadata files. #80546 (Tuan Pham Anh). This allows attaching databases from external sources. - A new type of MergeTree,
CoalescingMergeTree- the engine takes the first non-Null value during background merges. This closes #78869. #79344 (scanhex12). - Support functions to read WKB ("Well-Known Binary" is a format for binary encoding of various geometry types, used in GIS applications). See #43941. #80139 (scanhex12).
- Added query slot scheduling for workloads, see workload scheduling for details. #78415 (Sergei Trifonov).
timeSeries*helper functions to speedup some scenarios when working with time series data: - re-sample the data to the time grid with specified start timestamp, end timestamp and step - calculate PromQL-likedelta,rate,ideltaandirate. #80590 (Alexander Gololobov).- Add
mapContainsValuesLike/mapContainsValues/mapExtractValuesLikefunctions to filter on map values and their support in bloom filter based indexes. #78171 (UnamedRus). - Now settings constraints can specify a set of disallowed values. #78499 (Bharat Nallan).
- Added a setting
enable_shared_storage_snapshot_in_queryto enable sharing the same storage snapshot across all subqueries in a single query. This ensures consistent reads from the same table, even when the table is referenced multiple times within a query. #79471 (Amos Bird). - Support writing
JSONcolumns toParquetand readingJSONcolumns fromParquetdirectly. #79649 (Nihal Z. Miaji). - Add
MultiPolygonsupport forpointInPolygon. #79773 (Nihal Z. Miaji). - Add support for querying local filesystem-mounted Delta tables via
deltaLakeLocaltable function. #79781 (roykim98). - Add new setting
cast_string_to_date_time_modethat allows to choose DateTime parsing mode during cast from String. #80210 (Pavel Kruglov). For example, you can set it to the best effort mode. - Added
bech32Encodeandbech32Decodefunctions for working with Bitcoin's Bech algorithm (issue #40381). #80239 (George Larionov). - Add SQL functions to analyse the names of MergeTree parts. #80573 (Mikhail Artemenko).
- Allow filtering parts selected for query by the disk they reside on by introducing a new virtual column,
_disk_name. #80650 (tanner-bruce). - Add a landing page with the list of embedded web tools. It will open when requested by a browser-like user agent. #81129 (Alexey Milovidov).
- Function
arrayFirst,arrayFirstIndex,arrayLastandarrayLastIndexwill filter away NULL values returned by the filter expression. In previous versions, Nullable filter results were not supported. Fixes #81113. #81197 (Lennard Eijsackers). - It's now possible to write
USE DATABASE nameinstead ofUSE name. #81307 (Yarik Briukhovetskyi). - Added a new system table
system.codecsto introspect the available codecs. (issue #81525). #81600 (Jimmy Aguilar Mena). - Support
lagandleadwindow functions. Closes #9887. #82108 (Dmitry Novik). - Function
tokensnow supports a new tokenizer, namedsplit, which is good for logs. #80195 (Robert Schulze). - Add support for the
--databaseargument inclickhouse-local. You can switch to a previously created database. This closes #44115. #81465 (Alexey Milovidov).
Experimental Feature
- Implement Kafka rebalance like logic for
Kafka2using ClickHouse Keeper For each replica we support two types of partition locks: permanent locks and temporary locks. The replica tries to hold permanent locks as long as possible, at any given time there are no more thanall_topic_partitions / active_replicas_count(hereall_topic_partitionsis the number of all partitions,active_replicas_countis the number of active replicas) permanent locks on the replica, if there are more, then the replica releases some partitions. Some partitions are temporarily held by the replica. The maximum number of temporary locks on a replica changes dynamically to give other replicas a chance to take some partitions into permanent locks. When updating temporary locks, the replica releases them all and tries to take some others again. #78726 (Daria Fomina). - An improvement for the experimental text index: explicit parameters are supported via key-value pairs. Currently, supported parameters are a mandatory
tokenizerand two optionalmax_rows_per_postings_listandngram_size. #80262 (Elmi Ahmadov). - Previously,
packedstorage was not supported for the full-text index, because the segment id was updated on-fly by reading and writing (.gin_sid) file on disk. In case of packed storage, reading a value from the uncommited file is not supported and this led to an issue. Now it is alright. #80852 (Elmi Ahmadov). - Experimental indexes of type
gin(which I don't like because it is an inside joke of PostgreSQL hackers) were renamed totext. Existing indexes of typeginremain loadable but they will throw an exception (suggestingtextindexes instead) when one tries to use them in searches. #80855 (Robert Schulze).
Performance Improvement
- Enable multiple-projection filtering support, allowing to use more than one projection for part-level filtering. This addresses #55525. This is the second step to implement projection index, following #78429. #80343 (Amos Bird).
- Use
SLRUcache policy in filesystem cache by default. #75072 (Kseniia Sumarokova). - Remove contention in the Resize step in query pipeline. #77562 (Zhiguo Zhou).
- Introduced an option to offload (de)compression and (de)serialization of blocks into pipeline threads instead of a single thread associated with a network connection. Controlled by the setting
enable_parallel_blocks_marshalling. It should speed up distributed queries that transfer significant amounts of data between the initiator and remote nodes. #78694 (Nikita Taranov). - Performance improvements to all bloom filter types. Video from the OpenHouse conference #79800 (Delyan Kratunov).
- Introduced a happy path in
UniqExactSet::mergewhen one of the sets is empty. Also, now if the LHS set is two-level and the RHS is single-level, we won't do the conversion to two-level for the RHS. #79971 (Nikita Taranov). - Improve memory reuse efficiency and reduce page faults when using the two-level hash tables. This meant to speed-up GROUP BY. #80245 (Jiebin Sun).
- Avoid unnecessary update and reduce lock contention in query condition cache. #80247 (Jiebin Sun).
- Trivial optimization for
concatenateBlocks. Chances are it's good for parallel hash join. #80328 (李扬). - When selecting mark ranges from the primary key range, binary search cannot be used if the primary key is wrapped with functions. This PR improves this limitation: binary search can still be applied when the primary key is wrapped with an always monotonic function chain, or when the RPN contains an element that is always true. Closes #45536. #80597 (zoomxi).
- Improve shutdown speed of
Kafkaengine (remove extra 3 seconds delay in case of multipleKafkatables). #80796 (Azat Khuzhin). - Async inserts: reduce memory usage and improve performance of insert queries. #80972 (Raúl Marín).
- Don't profile processors if the log table is disabled. #81256 (Raúl Marín). This speeds up very short queries.
- Speed up
toFixedStringwhen the source is exactly what's requested. #81257 (Raúl Marín). - Don't process quota values if the user is not limited. #81549 (Raúl Marín). This speeds up very short queries.
- Fixed performance regression in memory tracking. #81694 (Michael Kolupaev).
- Improve sharding key optimization on distributed query. #78452 (fhw12345).
- Parallel replicas: avoid waiting for slow unused replicas if all read tasks have been assigned to other replicas. #80199 (Igor Nikonov).
- Parallel replicas uses separate connection timeout, see
parallel_replicas_connect_timeout_mssetting. Beforeconnect_timeout_with_failover_ms/connect_timeout_with_failover_secure_mssettings were used as connection timeout values for parallel replicas queries (1 second by default). #80421 (Igor Nikonov). - In filesystem with journal
mkdiris written to the journal of filesystem which is persisted to disk. In case of slow disk this can take long time. Move it out from reserve lock scope. #81371 (Kseniia Sumarokova). - Postpone reading of Iceberg manifest files until first reading query. #81619 (Daniil Ivanik).
- Allow moving
GLOBAL [NOT] INpredicate toPREWHEREclause if applicable. #79996 (Eduard Karacharov).
Improvement
EXPLAIN SYNTAXnow uses a new analyzer. It returns AST built from the query tree. Added optionquery_tree_passesto control the number of passes to executed before converting query tree to the AST. #74536 (Vladimir Cherkasov).- Implement flattened serialization for Dynamic and JSON in Native format that allows to serialize/deserialize Dynamic and JSON data without special structures like shared variant for Dynamic and shared data for JSON. This serialization can be enabled by setting
output_format_native_use_flattened_dynamic_and_json_serialization. This serialization can be used for easier support for Dynamic and JSON in TCP protocol in clients in different languages. #80499 (Pavel Kruglov). - Refresh
S3credentials after errorAuthenticationRequired. #77353 (Vitaly Baranov). - Added dictionary metrics to
system.asynchronous_metrics-DictionaryMaxUpdateDelay- the maximum delay (in seconds) of dictionary update. -DictionaryTotalFailedUpdates- the number of errors since last successful loading in all dictionaries. #78175 (Vlad). - Add a warning about databases that were potentially created to save broken tables. #78841 (János Benjamin Antal).
- Add
_timevirtual column inS3Queue,AzureQueueengine. #78926 (Anton Ivashkin). - Make settings controlling connection drop on overloaded CPU hot-reloadable. #79052 (Alexey Katsman).
- Add container prefix to data paths reported in system.tables for plain disks in Azure blob storage, making reporting consistent with S3 and GCP. #79241 (Julia Kartseva).
- Now, clickhouse-client and local also accept query parameters as
param-<name>(dash) along withparam_<name>(underscore). This closes #63093. #79429 (Engel Danila). - Detailed warning msg for bandwidth discount when copying data from local to remote S3 with checksum enabled. #79464 (VicoWu).
- Previously, when
input_format_parquet_max_block_size = 0(an invalid value) ClickHouse would stuck. Now this behaviour is fixed. This closes #79394. #79601 (abashkeev). - Add
throw_on_errorsetting forstartup_scripts: whenthrow_on_erroris true, the server will not start unless all queries complete successfully. By default,throw_on_erroris false, preserving the previous behavior. #79732 (Aleksandr Musorin). - Allow to add
http_response_headersinhttp_handlersof any kind. #79975 (Andrey Zvonov). - Function
reversenow supportsTupledata type. Closes #80053. #80083 (flynn). - Resolve #75817: allow getting
auxiliary_zookeepersdata fromsystem.zookeepertable. #80146 (Nikolay Govorov). - Add asynchronous metrics about the server's TCP sockets. This improves the observability. Closes #80187. #80188 (Alexey Milovidov).
- Support
anyLast_respect_nullsandany_respect_nullsas aSimpleAggregateFunction. #80219 (Diskein). - Remove unnecessary call
adjustCreateQueryForBackupfor replicated databases. #80282 (Vitaly Baranov). - Allow extra options (that go after
--like-- --config.value='abc') inclickhouse-localwithout the equality sign. Closes #80292. #80293 (Alexey Milovidov). - Highlight metacharacters in
SHOW ... LIKEqueries. This closes #80275. #80297 (Alexey Milovidov). - Make SQL UDF persistent in
clickhouse-local. The previously created function will be loaded at startup. This closes #80085. #80300 (Alexey Milovidov). - Fix description in explain plan for preliminary DISTINCT step. #80330 (UnamedRus).
- Allow to use named collections in ODBC/JDBC. #80334 (Andrey Zvonov).
- Metrics for number of readonly and broken disks. Indicator logs when DiskLocalCheckThread is started. #80391 (VicoWu).
- Implement support for
s3_plain_rewritablestorage with projections. In previous versions, metadata objects in S3 referencing projections would not get updated when moved. Closes #70258. #80393 (Sav). - The
SYSTEM UNFREEZEcommand will not try to look up parts in readonly and write-once disks. This closes #80430. #80432 (Alexey Milovidov). - Lowered the log level of merged parts messages. #80476 (Hans Krutzer).
- Change the default behavior of partition pruning for Iceberg tables. #80583 (Melvyn Peignon).
- Add two new ProfileEvents for index search algorithm observability:
IndexBinarySearchAlgorithmandIndexGenericExclusionSearchAlgorithm. #80679 (Pablo Marcos). - Do not complain about unsupported
MADV_POPULATE_WRITEfor older kernels in logs (to avoid logs polluting). #80704 (Robert Schulze). - Added support for
Date32andDateTime64inTTLexpressions. #80710 (Andrey Zvonov). - Adjust compatibility values for
max_merge_delayed_streams_for_parallel_write. #80760 (Azat Khuzhin). - Fix a crash: if an exception is thrown in an attempt to remove a temporary file (they are used for spilling temporary data on disk) in the destructor, the program can terminate. #80776 (Alexey Milovidov).
- Add
IF EXISTSmodifier toSYSTEM SYNC REPLICA. #80810 (Raúl Marín). - Extend exception message about "Having zero bytes, but read range is not finished...", add finished_download_time column to
system.filesystem_cache. #80849 (Kseniia Sumarokova). - Add search algorithm section to
EXPLAINoutput when using it with indexes = 1. If shows either "binary search" or "generic exclusion search". #80881 (Pablo Marcos). - At the beginning of 2024,
prefer_column_name_to_aliaswas hardcoded to true for MySQL handler because the new analyzer was not enabled by default. Now, it can be unhardcoded. #80916 (Yarik Briukhovetskyi). - Now
system.iceberg_historyshows history for catalogs databases like glue or iceberg rest. Also renamedtable_nameanddatabase_namecolumns totableanddatabaseinsystem.iceberg_historyfor consistency. #80975 (alesapin). - Allow read-only mode for the
mergetable function, so theCREATE TEMPORARY TABLEgrant is not required for using it. #80981 (Miсhael Stetsyuk). - Better introspection of in-memory caches (expose information about caches in
system.metricsover incompletesystem.asynchronouse_metrics). Add in-memory caches size (in bytes) intodashboard.html.VectorSimilarityIndexCacheSize/IcebergMetadataFilesCacheSizehas been renamed toVectorSimilarityIndexCacheBytes/IcebergMetadataFilesCacheBytes. #81023 (Azat Khuzhin). - Ignore databases with engines that can't contain
RocksDBtables while reading fromsystem.rocksdb. #81083 (Pervakov Grigorii). - Allow
filesystem_cachesandnamed_collectionsin theclickhouse-localconfiguration file. #81105 (Alexey Milovidov). - Fix highlighting of
PARTITION BYinINSERTqueries. In previous versions,PARTITION BYwas not highlighted as a keyword. #81106 (Alexey Milovidov). - Two mini improvements in Web UI: - correctly handle queries without output, such as
CREATE,INSERT(until recently, these queries resulted in an infinite spinner); - when double clicking on a table, scroll to the top. #81131 (Alexey Milovidov). MemoryResidentWithoutPageCachemetric provides the amount of physical memory used by the server process, excluding userspace page cache, in bytes. This provides a more accurate view of actual memory usage when userspace page cache is utilized. When userspace page cache is disabled, this value equalsMemoryResident. #81233 (Jayme Bird).- Mark manually logged exceptions in client, local server, keeper client and disks app as logged, so that they are not logged twice. #81271 (Miсhael Stetsyuk).
- Setting
use_skip_indexes_if_finalanduse_skip_indexes_if_final_exact_modenow default toTrue. Queries withFINALclause will now use skip indexes (if applicable) to shortlist granules and also read any additional granules corresponding to matching primary key ranges. Users needing earlier behaviour of approximate/imprecise results can setuse_skip_indexes_if_final_exact_modeto FALSE after careful evaluation. #81331 (Shankar Iyer). - When you have multiple queries in the web UI, it will run the one under the cursor. Continuation of #80977. #81354 (Alexey Milovidov).
- This PR addresses issues with the implementation of
is_strictin the monotonicity checks for conversion functions. Currently, some conversion functions, such astoFloat64(UInt32)andtoDate(UInt8), incorrectly returnis_strictas false when they should return true. #81359 (zoomxi). - When checking if a
KeyConditionmatches a continuous range, if the key is wrapped with a non-strict function chain, aConstraint::POINTmay needs to be converted to aConstraint::RANGE. For example:toDate(event_time) = '2025-06-03'implies a range forevent_time: ['2025-06-03 00:00:00', '2025-06-04 00:00:00'). This PR fixes this behavior. #81400 (zoomxi). clickhouse/chaliases will invokeclickhouse-clientinstead ofclickhouse-localif--hostor--portare specified. Continuation of #79422. Closes #65252. #81509 (Alexey Milovidov).- Now that we have the keeper response time distribution data, we can tune the histogram buckets for metrics. #81516 (Miсhael Stetsyuk).
- Add profile event
PageCacheReadBytes. #81742 (Kseniia Sumarokova). - Fix logical error in filesystem cache: "Having zero bytes but range is not finished". #81868 (Kseniia Sumarokova).
Bug Fix (user-visible misbehavior in an official stable release)
- Fix parameterized view with SELECT EXCEPT query. Closes #49447. #57380 (Nikolay Degterinsky).
- Analyzer: Fix column projection name after column type promotion in join. Closes #63345. #63519 (Dmitry Novik).
- Fixed a logical error in cases of column name clashes when analyzer_compatibility_join_using_top_level_identifier is enabled. #75676 (Vladimir Cherkasov).
- Fix CTE usage in pushed-down predicates when
allow_push_predicate_ast_for_distributed_subqueriesis enabled. Fixes #75647. Fixes #79672. #77316 (Dmitry Novik). - Fixes an issue where SYSTEM SYNC REPLICA LIGHTWEIGHT 'foo' would report success even when the specified replica didn't exist. The command now properly validates that the replica exists in Keeper before attempting synchronization. #78405 (Jayme Bird).
- Fix crash for a very specific situation when the
currentDatabasefunction was used inCONSTRAINTsections forON CLUSTERqueries Closes #78100. #79070 (pufit). - Fix passing of external roles in interserver queries. #79099 (Andrey Zvonov).
- Try to use IColumn instead of Field in SingleValueDataGeneric. It fixes the incorrect return values for some aggregate functions like
argMaxfor typesDynamic/Variant/JSON. #79166 (Pavel Kruglov). - Fix applying use_native_copy and allow_azure_native_copy setting for azure blob storage and updated to use native copy only when credentials match resolves #78964. #79561 (Smita Kulkarni).
- Fix logical errors about a column's unknown origin scope produced while checking if this column is correlated. Fixes #78183. Fixes #79451. #79727 (Dmitry Novik).
- Fix wrong results for grouping sets with ColumnConst and Analyzer. #79743 (Andrey Zvonov).
- Fix local shard result duplication when reading from distributed table with local replica being stale. #79761 (Eduard Karacharov).
- Fix the sorting order of the NaNs with a negative sign bit. #79847 (Pervakov Grigorii).
- Now GROUP BY ALL doesn't take into account the GROUPING part. #79915 (Yarik Briukhovetskyi).
- Fixed incorrect state merging for
TopK/TopKWeightedfunctions that would cause excessive error values even when capacity was not exhausted. #79939 (Joel Höner). - Respect
readonlysetting inazure_blob_storageobject storage. #79954 (Julia Kartseva). - Fixed incorrect query results and out-of-memory crashes when using
match(column, '^…')with backslash-escaped characters. #79969 (filimonov). - Disabling hive partitioning for datalakes Partially addresses https://github.com/issues/assigned?issue=ClickHouse%7CClickHouse%7C79937. #80005 (Daniil Ivanik).
- Skip indexes with lambda expressions could not be applied. Fix the case when high-level functions in the index definition exactly match the one in the query. #80025 (Nikolai Kochetov).
- Fix metadata version during attach part on the replica executing ATTACH_PART command from replication log. #80038 (Aleksei Filatov).
- Executable User Defined Functions (eUDF) names are not added to the
used_functionscolumn of thesystem.query_logtable, unlike other functions. This PR implements the addition of the eUDF name if the eUDF was used in the request. #80073 (Kyamran). - Fix logical error in Arrow format with LowCardinality(FixedString). #80156 (Pavel Kruglov).
- Fix reading subcolumns from Merge engine. #80158 (Pavel Kruglov).
- Fix a bug about the comparison between numeric types in
KeyCondition. #80207 (Yarik Briukhovetskyi). - Fix AMBIGUOUS_COLUMN_NAME when lazy materialization applied to table with projections. #80251 (Igor Nikonov).
- Fix incorrect count optimization for string prefix filters like LIKE 'ab_c%' when using implicit projections. This fixes #80250. #80261 (Amos Bird).
- Fix improper serialization of nested numeric fields as strings in MongoDB documents. Remove maximum depth limit for documents from MongoDB. #80289 (Kirill Nikiforov).
- Perform less strict metadata checks for RMT in the Replicated database. Closes #80296. #80298 (Nikolay Degterinsky).
- Fix text representation of DateTime and DateTime64 for PostgreSQL storage. #80301 (Yakov Olkhovskiy).
- Allow
DateTimewith timezone inStripeLogtables. This closes #44120. #80304 (Alexey Milovidov). - Disable filter-push-down for the predicate with a non-deterministic function in case the query plan step changes the number of rows. Fixes #40273. #80329 (Nikolai Kochetov).
- Fix possible logical errors and crashes in projections with subcolumns. #80333 (Pavel Kruglov).
- Fix
NOT_FOUND_COLUMN_IN_BLOCKerror caused by filter-push-down optimization of the logical JOIN sep in caseONexpression is not a trivial equality. Fixes #79647 Fixes #77848. #80360 (Nikolai Kochetov). - Fix incorrect result when reading reverse-ordered keys in partitioned tables. This fixes #79987. #80448 (Amos Bird).
- Fixed wrong sorting in tables with a nullable key and enabled optimize_read_in_order. #80515 (Pervakov Grigorii).
- Fixed refreshable materialized view DROP getting stuck if the view was paused using SYSTEM STOP REPLICATED VIEW. #80543 (Michael Kolupaev).
- Fix 'Cannot find column' with constant tuple in distributed query. #80596 (Yakov Olkhovskiy).
- Fix
shardNumfunction in Distributed tables withjoin_use_nulls. #80612 (János Benjamin Antal). - Fix incorrect result during reading column that exists in subset of tables in Merge engine. #80643 (Pavel Kruglov).
- Fix possible SSH protocol (due to hang in replxx). #80688 (Azat Khuzhin).
- The timestamp in the iceberg_history table should now be correct. #80711 (Melvyn Peignon).
- Fix possible crash in case of dictionary registration failed (when
CREATE DICTIONARYfailed withCANNOT_SCHEDULE_TASKit is possible to leave dangling pointer in the dictionary registry, which later lead to crash). #80714 (Azat Khuzhin). - Fix handling of enum globs of a single element in object storage table functions. #80716 (Konstantin Bogdanov).
- Fix wrong result type of comparison functions with Tuple(Dynamic) and String that led to logical error. #80728 (Pavel Kruglov).
- Add missing support data type
timestamp_ntzfor unity catalog. Fixes #79535, Fixes #79875. #80740 (alesapin). - Fix
THERE_IS_NO_COLUMNerror for distributed queries withIN cte. Fixes #75032. #80757 (Nikolai Kochetov). - Fix excessive number of files (leads to excessive memory usage) for external ORDER BY. #80777 (Azat Khuzhin).
- This PR might close #80742. #80783 (zoomxi).
- Fix crash in Kafka due to get_member_id() was creating std::string from NULL (it was likely an issue only in case of connection to broker had been failed). #80793 (Azat Khuzhin).
- Properly wait consumers before shutting down Kafka engine (active consumers after shutdown can trigger various debug assertions and also may read data from brokers in background after table has been dropped/detached). #80795 (Azat Khuzhin).
- Fix
NOT_FOUND_COLUMN_IN_BLOCK, which is caused bypredicate-push-downoptimization. Fixes #80443. #80834 (Nikolai Kochetov). - Fix logical error when resolving star (*) matcher in table function in JOIN with USING. #80894 (Vladimir Cherkasov).
- Fix memory accounting for Iceberg metadata files cache. #80904 (Azat Khuzhin).
- Fix wrong partitioning with nullable partition key. #80913 (Pervakov Grigorii).
- Fix
Table does not existerror for distributed queries with pushed-down predicate (allow_push_predicate_ast_for_distributed_subqueries=1) when the source table does not exist on the initialtor. Fixes #77281. #80915 (Nikolai Kochetov). - Fix the logical error in the nested functions with named windows. #80926 (Pervakov Grigorii).
- Fix extremes for nullable and floating-point columns. #80970 (Pervakov Grigorii).
- Fix possible crash while querying from system.tables (likely the case under memory pressure). #80976 (Azat Khuzhin).
- Fix atomic rename with truncate for files which compression is inferred from their file extension. #80979 (Pablo Marcos).
- Fix ErrorCodes::getName. #81032 (RinChanNOW).
- Fix bug when user cannot list tables in Unity Catalog without permissions for all of them. Now all tables are listed properly, attempt to read from restricted table will throw an exception. #81044 (alesapin).
- Now ClickHouse will ignore errors and unexpected responses from data lake catalogs in
SHOW TABLESquery. Fixes #79725. #81046 (alesapin). - Fix parsing of DateTime64 from integers in JSONExtract and JSON type parsing. #81050 (Pavel Kruglov).
- Reflect date_time_input_format setting in schema inference cache. #81052 (Pavel Kruglov).
- Fix crash on INSERT if table was DROPed after query started but before columns sent. #81053 (Azat Khuzhin).
- Fix use-of-uninitialized-value in quantileDeterministic. #81062 (Azat Khuzhin).
- Fix hardlinks count management for metadatastoragefromdisk disk transactions. add tests. #81066 (Sema Checherinda).
- User Defined Functions (UDF) names are not added to the
system.query_logtable, unlike other functions. This PR implements the addition of the UDF name to one of the two columnsused_executable_user_defined_functionsorused_sql_user_defined_functionsif the UDF was used in the request. #81101 (Kyamran). - Fixed
Too large size ... passed to allocatorerrors or possible crashes on inserts via http protocol with text formats (JSON,Values, ...) and omittedEnumfields. #81145 (Anton Popov). - Fix LOGICAL_ERROR in case of Sparse column in INSERT block pushed to non-MT MV. #81161 (Azat Khuzhin).
- Fix
Unknown table expression identifierfordistributed_product_mode_local=localwith cross-replication. #81162 (Nikolai Kochetov). - Fixed incorrectly caching number of rows in parquet files after filtering. #81184 (Michael Kolupaev).
- Fix fs cache max_size_to_total_space setting when used with relative cache path. #81237 (Kseniia Sumarokova).
- Fixed clickhouse-local crashing when outputting const tuples or maps in Parquet format. #81249 (Michael Kolupaev).
- Verify array offsets received over network. #81269 (Azat Khuzhin).
- Fix some corner case in query that joins empty tables and uses window functions. The bug leads to exploding number of parallel streams which leads to OOMs. #81299 (Alexander Gololobov).
- Fixes for datalake Cluster functions (
deltaLakeCluster,icebergCluster, etc): (1) fix potential segfault inDataLakeConfigurationwhen usingClusterfunction with old analyzer; (2) remove duplicating data lake metadata updates (extra object storage requests); (3) fix redundant listing in object storage when format is not explicitly specified (which was already done for non-cluster data lake engines). #81300 (Kseniia Sumarokova). - Make force_restore_data flag recover lost keeper metadata. #81324 (Raúl Marín).
- Fix region error in delta-kernel. Fixes #79914. #81353 (Kseniia Sumarokova).
- Disable incorrect JIT for divideOrNull. #81370 (Raúl Marín).
- Fix insert error when MergeTree table has a long partition column name. #81390 (hy123q).
- Backported in #81957: Fixed possible crash in
Aggregatorin case of exception during merge. #81450 (Nikita Taranov). - Don't store content of several manifest files in memory. #81470 (Daniil Ivanik).
- Fix possible crash during shutting down background pools (
background_.*pool_size). #81473 (Azat Khuzhin). - Fix out-of-bounds read in the
Npyformat happening when writing to a table with theURLengine. This closes #81356. #81502 (Alexey Milovidov). - There is a chance that Web UI displays
NaN%(typical JavaScript problems). #81507 (Alexey Milovidov). - Fix
DatabaseReplicatedfordatabase_replicated_enforce_synchronous_settings=1. #81564 (Azat Khuzhin). - Fix sorting order for LowCardinality(Nullable(...)) types. #81583 (Pervakov Grigorii).
- Server should not preserve a HTTP connection if the request has not been fully read from the socket. #81595 (Sema Checherinda).
- Make scalar correlated subqueries return a nullable result of the projection expression. Fix the case when a correlated subquery produces an empty result set. #81632 (Dmitry Novik).
- Fix
Unexpected relative path for a deduplicated partduringATTACHtoReplicatedMergeTree. #81647 (Azat Khuzhin). - Query settings
use_iceberg_partition_pruningwill not take effect for iceberg storage, because it uses global context rather than query context. it's not critical because its default value is true. this pr can fix it. #81673 (Han Fei). - Backported in #82128: Fix "Context has expired" during merges when dict used in TTL expression. #81690 (Azat Khuzhin).
- Add validation for mergetree setting
merge_max_block_sizeto ensure that it's non zero. #81693 (Bharat Nallan). - Fix issues with
clickhouse-localinvolving stuckDROP VIEWqueries. #81705 (Bharat Nallan). - Fix StorageRedis join in some cases. #81736 (Pervakov Grigorii).
- Fix crash in
ConcurrentHashJoinwith emptyUSING ()and old analyzer enabled. #81754 (Nikita Taranov). - Keeper fix: block commits of new logs if there is invalid entry in the logs. Previously, if leader applied some logs incorrectly, it would continue to commit new logs, even though the follower would detect digest mismatch and abort. #81780 (Antonio Andelic).
- Fix the issue where required columns are not read during scalar correlated subquery processing. Fixes #81716. #81805 (Dmitry Novik).
- Someone littered our code with Kusto. Cleaned it up. This closes #81643. #81885 (Alexey Milovidov).
- In previous versions, the server returned excessive content for requests to
/js. This closes #61890. #81895 (Alexey Milovidov). - Previously,
MongoDBtable engine definitions could include a path component in thehost:portargument which was silently ignored. The mongodb integration refuses to load such tables. With this fix we allow loading such tables and ignore path component ifMongoDBengine has five arguments, using the database name from arguments. Note: The fix is not applied for newly created tables or queries withmongotable function, as well as for dictionary sources and named collections. #81942 (Vladimir Cherkasov). - Fixed possible crash in
Aggregatorin case of exception during merge. #82022 (Nikita Taranov). - Fixing copy-paste error in
arraySimilarity, disallowing the use ofUInt32andInt32weights. Update tests and docs. #82103 (Mikhail f. Shiryaev). - Fix possible data-race between suggestion thread and main client thread. #82233 (Azat Khuzhin).
Build/Testing/Packaging Improvement
- Use
postgres16.9. #81437 (Konstantin Bogdanov). - Use
openssl3.2.4. #81438 (Konstantin Bogdanov). - Use
abseil-cpp2025-01-27. #81440 (Konstantin Bogdanov). - Use
mongo-c-driver1.30.4. #81449 (Konstantin Bogdanov). - Use
krb51.21.3-final. #81453 (Konstantin Bogdanov). - Use
orc2.1.2. #81455 (Konstantin Bogdanov). - Use
grpc1.73.0. #81629 (Konstantin Bogdanov). - Use
delta-kernel-rsv0.12.1. #81707 (Konstantin Bogdanov). - Update
c-arestov1.34.5. #81159 (Konstantin Bogdanov). - Upgrade
curlto 8.14 to address CVE-2025-5025 and CVE-2025-4947. #81171 (larryluogit). - Upgrade
libarchiveto 3.7.9 to address: CVE-2024-20696 CVE-2025-25724 CVE-2024-48958 CVE-2024-57970 CVE-2025-1632 CVE-2024-48957 CVE-2024-48615. #81174 (larryluogit). - Upgrade
libxml2to 2.14.3. #81187 (larryluogit). - Avoid copying vendored Rust sources to
CARGO_HOME. #79560 (Konstantin Bogdanov). - Remove dependency on the Sentry library by replacing it with our own endpoint. #80236 (Alexey Milovidov).
- Update python dependencies in CI images to address Dependabot alerts. #80658 (Raúl Marín).
- Retry reading of replicated DDL stop flag from Keeper at startup to make tests more robust when fault injection is enabled for Keeper. #80964 (Alexander Gololobov).
- Use https for ubuntu archive url. #81016 (Raúl Marín).
- Update python dependencies in test images. #81042 (dependabot[bot]).
- Introduce
flake.nixfor Nix builds. #81463 (Konstantin Bogdanov). - Fix
delta-kernel-rsrequiring network access during build. Closes #80609. #81602 (Konstantin Bogdanov). Read the article A Year of Rust in ClickHouse.
ClickHouse release 25.5, 2025-05-22
Backward Incompatible Change
- Function
geoToH3now accepts the input in the order (lat, lon, res) (which is common for other geometric functions). Users who wish to retain the previous result order (lon, lat, res) can set settinggeotoh3_argument_order = 'lon_lat'. #78852 (Pratima Patel). - Add a filesystem cache setting
allow_dynamic_cache_resize, by defaultfalse, to allow dynamic resize of filesystem cache. Why: in certain environments (ClickHouse Cloud) all the scaling events happen through the restart of the process and we would love this feature to be explicitly disabled to have more control over the behaviour + as a safety measure. This PR is marked as backward incompatible, because in older versions dynamic cache resize worked by default without special setting. #79148 (Kseniia Sumarokova). - Removed support for legacy index types
annoyandusearch. Both have been stubs for a long time, i.e. every attempt to use the legacy indexes returned an error anyways. If you still haveannoyandusearchindexes, please drop them. #79802 (Robert Schulze). - Remove
format_alter_commands_with_parenthesesserver setting. The setting was introduced and disabled by default in 24.2. It was enabled by default in 25.2. As there are no LTS versions that don't support the new format, we can remove the setting. #79970 (János Benjamin Antal). - Enable
DeltaLakestoragedelta-kernel-rsimplementation by default. #79541 (Kseniia Sumarokova). - If reading from an
URLinvolves multiple redirects, settingenable_url_encodingis correctly applied across all redirects in the chain. #79563 (Shankar Iyer). Settingenble_url_encodingdefault value is now set tofalse. #80088 (Shankar Iyer).
New Feature
- Support scalar correlated subqueries in the WHERE clause. Closes #6697. #79600 (Dmitry Novik). Support correlated subqueries in the projection list in simple cases. #79925 (Dmitry Novik). #76078 (Dmitry Novik). Now it covers 100% of TPC-H test suite.
- Vector search using the vector similarity index is now beta (from previously experimental). #80164 (Robert Schulze).
- Support geo types in
Parquetformat. This closes #75317. #79777 (scanhex12). - New functions
sparseGrams,sparseGramsHashes,sparseGramsHashesUTF8,sparseGramsUTF8for calculating "sparse-ngrams" - a robust algorithm for extracting substrings for indexing and search. #79517 (scanhex12). clickhouse-local(and its shorthand alias,ch) now use an implicitFROM tablewhen there is input data for processing. This closes #65023. Also enabled format inference in clickhouse-local if--input-formatis not specified and it processes a regular file. #79085 (Alexey Milovidov).- Add
stringBytesUniqandstringBytesEntropyfunctions to search for possibly random or encrypted data. #79350 (Sachin Kumar Singh). - Added functions for encoding and decoding base32. #79809 (Joanna Hulboj).
- Add
getServerSettingandgetMergeTreeSettingfunction. Closes #78318. #78439 (NamNguyenHoai). - Add new
iceberg_enable_version_hintsetting to leverageversion-hint.textfile. #78594 (Arnaud Briche). - Gives the possibility to truncate specific tables from a database, filtered with the
LIKEkeyword. #78597 (Yarik Briukhovetskyi). - Support
_part_starting_offsetvirtual column inMergeTree-family tables. This column represents the cumulative row count of all preceding parts, calculated at query time based on the current part list. The cumulative values are retained throughout query execution and remain effective even after part pruning. Related internal logic has been refactored to support this behavior. #79417 (Amos Bird). - Add functions
divideOrNull,moduloOrNull,intDivOrNull,positiveModuloOrNullto return NULL when right argument is zero. #78276 (kevinyhzou). - Clickhouse vector search now supports both pre-filtering and post-filtering and provides related settings for finer control. (issue #78161). #79854 (Shankar Iyer).
- Add
icebergHashandicebergBucketfunctions. Support data files pruning inIcebergtables partitioned withbucket transfom. #79262 (Daniil Ivanik).
Experimental Feature
- New
Time/Time64data types:Time(HHH:MM:SS) andTime64(HHH:MM:SS.<fractional>) and some basic cast functions and functions to interact with other data types. Also, changed the existing function's name toTime to toTimeWithFixedDate because the function toTime is required for the cast function. #75735 (Yarik Briukhovetskyi). 72459). - Hive metastore catalog for Iceberg datalake. #77677 (scanhex12).
- Indexes of type
full_textwere renamed togin. This follows the more familiar terminology of PostgreSQL and other databases. Existing indexes of typefull_textremain loadable but they will throw an exception (suggestingginindexes instead) when one tries to use them in searches. #79024 (Robert Schulze).
Performance Improvement
- Change the Compact part format to save marks for each substream to be able to read individual subcolumns. Old Compact format is still supported for reads and can be enabled for writes using MergeTree setting
write_marks_for_substreams_in_compact_parts. It's disabled by default for safer upgrades as it changes the compact parts storage. It will be enabled by default in one of the next releases. #77940 (Pavel Kruglov). - Allow moving conditions with subcolumns to prewhere. #79489 (Pavel Kruglov).
- Speed up secondary indices by evaluating their expressions on multiple granules at once. #64109 (Alexey Milovidov).
- Enable
compile_expressions(JIT compiler for fragments of ordinary expressions) by default. This closes #51264 and #56386 and #66486. #79907 (Alexey Milovidov). - New setting introduced:
use_skip_indexes_in_final_exact_mode. If a query on aReplacingMergeTreetable has FINAL clause, reading only table ranges based on skip indexes may produce incorrect result. This setting can ensure that correct results are returned by scanning newer parts that have overlap with primary key ranges returned by the skip index. Set to 0 to disable, 1 to enable. #78350 (Shankar Iyer). - Object storage cluster table functions (e.g.
s3Cluster) will now assign files to replicas for reading based on consistent hash to improve cache locality. #77326 (Andrej Hoos). - Improve performance of
S3Queue/AzureQueueby allowing INSERTs data in parallel (can be enabled withparallel_inserts=truequeue setting). Previously S3Queue/AzureQueue can only do first part of pipeline in parallel (downloading, parsing), INSERT was single-threaded. AndINSERTs are almost always the bottleneck. Now it will scale almost linear withprocessing_threads_num. #77671 (Azat Khuzhin). More fair max_processed_files_before_commit in S3Queue/AzureQueue. #79363 (Azat Khuzhin). - Introduced threshold (regulated by setting
parallel_hash_join_threshold) to fall back to thehashalgorithm when the size of the right table is below the threshold. #76185 (Nikita Taranov). - Now we use number of replicas to determine task size for reading with parallel replicas enabled. This provides better work distribution between replicas when the amount of data to read is not really big. #78695 (Nikita Taranov).
- Allow parallel merging of
uniqExactstates during the final stage of distributed aggregation. #78703 (Nikita Taranov). - Fix possible performance degradation of the parallel merging of
uniqExactstates for aggregation with key. #78724 (Nikita Taranov). - Reduce the number of List Blobs API calls to Azure storage. #78860 (Julia Kartseva).
- Fix performance of the distributed INSERT SELECT with parallel replicas. #79441 (Azat Khuzhin).
- Prevent
LogSeriesLimiterfrom doing cleanup on every construction, avoiding lock contention and performance regressions in high-concurrency scenarios. #79864 (filimonov). - Speedup queries with trivial count optimization. #79945 (Raúl Marín).
- Better inlining for some operations with
Decimal. #79999 (Konstantin Bogdanov). - Set
input_format_parquet_bloom_filter_push_downto true by default. Also, fix a mistake in the settings changes history. #80058 (Alexey Milovidov). - Optimized
ALTER ... DELETEmutations for parts in which all rows should be deleted. Now, in such cases an empty part is created instead of original without executing a mutation. #79307 (Anton Popov). - Avoid extra copying of the block during insertion into Compact part when possible. #79536 (Pavel Kruglov).
- Add setting
input_format_max_block_size_bytesto limit blocks created in input formats in bytes. It can help to avoid high memory usage during data import when rows contains large values. #79495 (Pavel Kruglov). - Remove guard pages for threads and async_socket_for_remote/use_hedge_requests. Change the allocation method in
FiberStackfrommmaptoaligned_alloc. Since this splits VMAs and under heavy load vm.max_map_count can be reached. #79147 (Sema Checherinda). - Lazy Materialization with parallel replicas. #79401 (Igor Nikonov).
Improvement
- Added an ability to apply lightweight deletes on the fly (with settings
lightweight_deletes_sync = 0,apply_mutations_on_fly = 1. #79281 (Anton Popov). - If data in the pretty format is displayed in the terminal, and a subsequent block has the same column widths, it can continue from the previous block, glue it to the previous block by moving the cursor up. This closes #79333. The feature is controlled by the new setting,
output_format_pretty_glue_chunks. #79339 (Alexey Milovidov). - Extend the
isIPAddressInRangefunction toString,IPv4,IPv6,Nullable(String),Nullable(IPv4), andNullable(IPv6)data types. #78364 (YjyJeff). - Allow changing
PostgreSQLengine connection pooler settings dynamically. #78414 (Samay Sharma). - Allow to specify
_part_offsetin normal projection. This is the first step to build projection index. It can be used with #58224 and can help improve #63207. #78429 (Amos Bird). - Add new columns (
create_queryandsource) forsystem.named_collections. Closes #78179. #78582 (MikhailBurdukov). - Added a new field
conditionto system tablesystem.query_condition_cache. It stores the plaintext condition whose hash is used as a key in the query condition cache. #78671 (Robert Schulze). - Vector similarity indexes can now be created on top of
BFloat16columns. #78850 (Robert Schulze). - Support unix timestapms with fractional part in best effort
DateTime64parsing. #78908 (Pavel Kruglov). - In the storage
DeltaLakedelta-kernel implementation, fix for column mapping mode, add tests for schema evolution. #78921 (Kseniia Sumarokova). - Improve insert into
Variantcolumn in Values format by better conversion of values. #78923 (Pavel Kruglov). - The
tokensfunction was extended to accept an additional "tokenizer" argument plus further tokenizer-specific arguments. #79001 (Elmi Ahmadov). - The
SHOW CLUSTERstatement now expands macros (if any) in its argument. #79006 (arf42). - Hash functions now support
NULLs inside arrays, tuples, and maps. (issues #48365 and #48623). #79008 (Michael Kolupaev). - Update cctz to 2025a. #79043 (Raúl Marín).
- Change the default stderr processing for UDFs to "log_last". It's better for usability. #79066 (Alexey Milovidov).
- Make tabs undo-able in the Web UI. This closes #71284. #79084 (Alexey Milovidov).
- Remove settings during
recoverLostReplicasame as it was done in: https://github.com/ClickHouse/ClickHouse/pull/78637. #79113 (Nikita Mikhaylov). - Add profile events:
ParquetReadRowGroupsandParquetPrunedRowGroupsto profile parquet index prune. #79180 (flynn). - Support
ALTERing database on cluster. #79242 (Tuan Pham Anh). - Explicitly skip missed runs of statistics collection for QueryMetricLog, otherwise the log will take a long time to catch up with the current time. #79257 (Mikhail Artemenko).
- Some small optimizations for reading
Arrow-based formats. #79308 (Bharat Nallan). - The setting
allow_archive_path_syntaxwas marked as experimental by mistake. Add a test to prevent having experimental settings enabled by default. #79320 (Alexey Milovidov). - Made page cache settings adjustable on a per-query level. This is needed for faster experimentation and for the possibility of fine-tuning for high-throughput and low-latency queries. #79337 (Alexey Milovidov).
- Do not print number tips in pretty formats for numbers that look like most of the 64-bit hashes. This closes #79334. #79338 (Alexey Milovidov).
- Colors of graphs on the advanced dashboards will be calculated from the hash of the corresponding query. This makes it easier to remember and locate a graph while scrolling the dashboard. #79341 (Alexey Milovidov).
- Add asynchronous metric,
FilesystemCacheCapacity- total capacity in thecachevirtual filesystem. This is useful for global infrastructure monitoring. #79348 (Alexey Milovidov). - Optimize access to system.parts (read columns/indexes size only when requested). #79352 (Azat Khuzhin).
- Calculate the relevant fields for query
'SHOW CLUSTER <name>'instead of all fields. #79368 (Tuan Pham Anh). - Allow to specify storage settings for
DatabaseCatalog. #79407 (Kseniia Sumarokova). - Support local storage in
DeltaLake. #79416 (Kseniia Sumarokova). - Add a query level setting to enable delta-kernel-rs:
allow_experimental_delta_kernel_rs. #79418 (Kseniia Sumarokova). - Fix possible endless loop when listing blobs from Azure/S3 blob storage. #79425 (Alexander Gololobov).
- Add filesystem cache setting
max_size_ratio_to_total_space. #79460 (Kseniia Sumarokova). - For
clickhouse-benchmarkreconfigurereconnectoption to take 0, 1 or N as values for reconnecting accordingly. #79465 (Sachin Kumar Singh). - Allow
ALTER TABLE ... MOVE|REPLACE PARTITIONfor tables on differentplain_rewritabledisks. #79566 (Julia Kartseva). - The vector similarity index is now also used if the reference vector is of type
Array(BFloat16). #79745 (Shankar Iyer). - Add last_error_message, last_error_trace and query_id to the system.error_log table. Related ticket #75816. #79836 (Andrei Tinikov).
- Enable sending crash reports by default. This can be turned off in the server's configuration file. #79838 (Alexey Milovidov).
- System table
system.functionsnow shows in which ClickHouse version functions were first introduced. #79839 (Robert Schulze). - Added
access_control_improvements.enable_user_name_access_typesetting. This setting allows enabling/disabling of precise grants for users/roles, introduced in https://github.com/ClickHouse/ClickHouse/pull/72246. You may want to turn this setting off in case you have a cluster with the replicas older than 25.1. #79842 (pufit). - Proper implementation of
ASTSelectWithUnionQuery::clone()method now takes into accountis_normalizedfield as well. This might help with #77569. #79909 (Nikita Mikhaylov). - Fix the inconsistent formatting of certain queries with the EXCEPT operator. If the left-hand side of the EXCEPT operator ends with
*, the formatted query loses parentheses and is then parsed as a*with theEXCEPTmodifier. These queries are found by the fuzzer and are unlikely to be found in practice. This closes #79950. #79952 (Alexey Milovidov). - Small improvement in
JSONtype parsing by using cache of variants deserialization order. #79984 (Pavel Kruglov). - Add setting
s3_slow_all_threads_after_network_error. #80035 (Vitaly Baranov). - The logging level about the selected parts to merge was wrong (Information). Closes #80061. #80062 (Alexey Milovidov).
- trace-visualizer: add runtime/share in tooltips and status messages. #79040 (Sergei Trifonov).
- trace-visualizer: load data from clickhouse server. #79042 (Sergei Trifonov).
- Add metrics on failing merges. #79228 (Miсhael Stetsyuk).
clickhouse-benchmarkwill display percentage based on the max iterations if specified. #79346 (Alexey Milovidov).- Add system.parts table visualizer. #79437 (Sergei Trifonov).
- Add tool for query latency analyzing. #79978 (Sergei Trifonov).
Bug Fix (user-visible misbehavior in an official stable release)
- Fix renames of columns missing in part. #76346 (Anton Popov).
- A materialized view can start too late, e.g. after the Kafka table that streams to it. #72123 (Ilya Golshtein).
- Fix
SELECTquery rewriting duringVIEWcreation with enabled analyzer. closes #75956. #76356 (Dmitry Novik). - Fix applying
async_insertfrom server (viaapply_settings_from_server) (previously leads toUnknown packet 11 from servererrors on the client). #77578 (Azat Khuzhin). - Fixed refreshable materialized view in Replicated database not working on newly added replicas. #77774 (Michael Kolupaev).
- Fixed refreshable materialized views breaking backups. #77893 (Michael Kolupaev).
- Fix old firing logical error for
transform. #78247 (Yarik Briukhovetskyi). - Fix some cases where secondary index was not applied with analyzer. Fixes #65607 , fixes #69373. #78485 (Nikolai Kochetov).
- Fix dumping profile events (
NetworkSendElapsedMicroseconds/NetworkSendBytes) for HTTP protocol with compression enabled (the error should not be more then the buffer size, usually around 1MiB). #78516 (Azat Khuzhin). - Fix analyzer producing LOGICAL_ERROR when JOIN ... USING involves ALIAS column - should produce appropriate error. #78618 (Yakov Olkhovskiy).
- Fix analyzer: CREATE VIEW ... ON CLUSTER fails if SELECT contains positional arguments. #78663 (Yakov Olkhovskiy).
- Fix
Block structure mismatcherror in case ofINSERT SELECTinto table a function with schema inference ifSELECThas scalar subqueries. #78677 (Pervakov Grigorii). - Fix analyzer: with prefer_global_in_and_join=1 for Distributed table in SELECT query
infunction should be replaced byglobalIn. #78749 (Yakov Olkhovskiy). - Fixed several types of
SELECTqueries that read from tables withMongoDBengine ormongodbtable function: queries with implicit conversion of const value inWHEREclause (e.g.WHERE datetime = '2025-03-10 00:00:00') ; queries withLIMITandGROUP BY. Previously, they could return the wrong result. #78777 (Anton Popov). - Fix conversion between different JSON types. Not it's performed by simple cast through convertion to/from String. It's less effective but 100% accurate. #78807 (Pavel Kruglov).
- Fix logical error during convertion of Dynamic type to Interval. #78813 (Pavel Kruglov).
- Fix column rollback on JSON parsing error. #78836 (Pavel Kruglov).
- Fix 'bad cast' error when join using constant alias column. #78848 (Vladimir Cherkasov).
- Don't allow prewhere in materialized view on columns with different types in view and target table. #78889 (Pavel Kruglov).
- Fix logical error during parsing of bad binary data of Variant column. #78982 (Pavel Kruglov).
- Throw an exception when the parquet batch size is set to 0. Previously when output_format_parquet_batch_size = 0 ClickHouse would hang. Now this behavior is fixed. #78991 (daryawessely).
- Fix deserialization of variant discriminators with basic format in compact parts. It was introduced in https://github.com/ClickHouse/ClickHouse/pull/55518. #79000 (Pavel Kruglov).
- Dictionaries of type
complex_key_ssd_cachenow reject zero or negativeblock_sizeandwrite_buffer_sizeparameters (issue #78314). #79028 (Elmi Ahmadov). - Avoid using Field for non-aggregated columns in SummingMergeTree. It could lead to unexpected errors with Dynamic/Variant types used in SummingMergeTree. #79051 (Pavel Kruglov).
- Fix read from Materialized View with Distributed destination table and different header in analyzer. #79059 (Pavel Kruglov).
- Fixes a bug where
arrayUnion()returned extra (incorrect) values on tables that had batch inserts. Fixes #75057. #79079 (Peter Nguyen). - Fix segfault in
OpenSSLInitializer. Closes #79092. #79097 (Konstantin Bogdanov). - Always set prefix for S3 ListObject. #79114 (Azat Khuzhin).
- Fixes a bug where arrayUnion() returned extra (incorrect) values on tables that had batch inserts. Fixes #79157. #79158 (Peter Nguyen).
- Fix logical error after filter pushdown. #79164 (Pervakov Grigorii).
- Fix DeltaLake table engine with delta-kernel implementation being used with http based endpoints, fix NOSIGN. Closes #78124. #79203 (Kseniia Sumarokova).
- Keeper fix: Avoid triggering watches on failed multi requests. #79247 (Antonio Andelic).
- Forbid Dynamic and JSON types in IN. With current implementation of
INit can lead to incorrect results. Proper support of this types inINis complicated and can be done in future. #79282 (Pavel Kruglov). - Fix check for duplicate paths in JSON type parsing. #79317 (Pavel Kruglov).
- Fix SecureStreamSocket connection issues. #79383 (Konstantin Bogdanov).
- Fix loading of plain_rewritable disks containing data. #79439 (Julia Kartseva).
- Fix crash in dynamic subcolumns discovery in Wide parts in MergeTree. #79466 (Pavel Kruglov).
- Verify the table name's length only for initial create queries. Do not verify this for secondary creates to avoid backward compatibility issues. #79488 (Miсhael Stetsyuk).
- Fixed error
Block structure mismatchin several cases with tables with sparse columns. #79491 (Anton Popov). - Fix two cases of "Logical Error: Can't set alias of * of Asterisk on alias". #79505 (Raúl Marín).
- Fix using incorrect paths when renaming an Atomic database. #79569 (Tuan Pham Anh).
- Fix order by JSON column with other columns. #79591 (Pavel Kruglov).
- Fix result duplication when reading from remote with both
use_hedged_requestsandallow_experimental_parallel_reading_from_replicasdisabled. #79599 (Eduard Karacharov). - Fix crash in delta-kernel implementation when using unity catalog. #79677 (Kseniia Sumarokova).
- Resolve macros for autodiscovery clusters. #79696 (Anton Ivashkin).
- Handle incorrectly configured page_cache_limits suitably. #79805 (Bharat Nallan).
- Fixes the result of SQL function
formatDateTimeif a variable-size formatter (e.g.%Waka. weekdayMondayTuesday, etc.) is followed by a compound formatter (a formatter that prints multiple components at once, e.g.%Daka. the American date05/04/25). #79835 (Robert Schulze). - IcebergS3 supports count optimization, but IcebergS3Cluster does not. As a result, the count() result returned in cluster mode may be a multiple of the number of replicas. #79844 (wxybear).
- Fixes AMBIGUOUS_COLUMN_NAME error with lazy materialization when no columns are used for query execution until projection. Example, SELECT * FROM t ORDER BY rand() LIMIT 5. #79926 (Igor Nikonov).
- Hide password for query
CREATE DATABASE datalake ENGINE = DataLakeCatalog(\'http://catalog:8181\', \'admin\', \'password\'). #79941 (Han Fei). - Allow to specify an alias in JOIN USING. Specify this alias in case the column was renamed (e.g., because of ARRAY JOIN). Fixes #73707. #79942 (Nikolai Kochetov).
- Allow materialized views with UNIONs to work correctly on new replicas. #80037 (Samay Sharma).
- Format specifier
%ein SQL functionparseDateTimenow recognizes single-digit days (e.g.3), whereas it previously required space padding (e.g.3). This makes its behavior compatible with MySQL. To retain the previous behaviour, set settingparsedatetime_e_requires_space_padding = 1. (issue #78243). #80057 (Robert Schulze). - Fix warnings
Cannot find 'kernel' in '[...]/memory.stat'in ClickHouse's log (issue #77410). #80129 (Robert Schulze). - Check stack size in FunctionComparison to avoid stack overflow crash. #78208 (Julia Kartseva).
- Fix race during SELECT from
system.workloads. #78743 (Sergei Trifonov). - Fix: lazy materialization in distributed queries. #78815 (Igor Nikonov).
- Fix
Array(Bool)toArray(FixedString)conversion. #78863 (Nikita Taranov). - Make parquet version selection less confusing. #78818 (Michael Kolupaev).
- Fix
ReservoirSamplerself-merging. #79031 (Nikita Taranov). - Fix storage of insertion table in client context. #79046 (Pervakov Grigorii).
- Fix the destruction order of data members of
AggregatingSortedAlgorithmandSummingSortedAlgorithm. #79056 (Nikita Taranov). enable_user_name_access_typemust not affectDEFINERaccess type. #80026 (pufit).- Query to system database can hang if system database metadata located in keeper. #79304 (Mikhail Artemenko).
Build/Testing/Packaging Improvement
- Make it possible to reuse the built
chcachebinary instead of always rebuilding it. #78851 (János Benjamin Antal). - Add NATS pause waiting. #78987 (Dmitry Novikov).
- Fix for incorrectly publishing ARM build as amd64compat. #79122 (Alexander Gololobov).
- Use generated ahead of time assembly for OpenSSL. #79386 (Konstantin Bogdanov).
- Fixes to allow building with
clang20. #79588 (Konstantin Bogdanov). chcache: Rust caching support. #78691 (Konstantin Bogdanov).- Add unwind information for
zstdassembly files. #79288 (Michael Kolupaev).
ClickHouse release 25.4, 2025-04-22
Backward Incompatible Change
- Check if all columns in a materialized view match the target table when
allow_materialized_view_with_bad_selectisfalse. #74481 (Christoph Wurm). - Fix cases where
dateTruncis used with negative Date/DateTime arguments. #77622 (Yarik Briukhovetskyi). - The legacy
MongoDBintegration has been removed. Server settinguse_legacy_mongodb_integrationbecame obsolete and now does nothing. #77895 (Robert Schulze). - Enhance
SummingMergeTreevalidation to skip aggregation for columns used in partition or sort keys. #78022 (Pervakov Grigorii).
New Feature
- Added CPU slot scheduling for workloads, see the docs for details. #77595 (Sergei Trifonov).
clickhouse-localwill retain its databases after restart if you specify the--pathcommand line argument. This closes #50647. This closes #49947. #71722 (Alexey Milovidov).- Reject queries when the server is overloaded. The decision is made based on the ratio of wait time (
OSCPUWaitMicroseconds) to busy time (OSCPUVirtualTimeMicroseconds). The query is dropped with some probability, when this ratio is betweenmin_os_cpu_wait_time_ratio_to_throwandmax_os_cpu_wait_time_ratio_to_throw(those are query level settings). #63206 (Alexey Katsman). - Time travel in
Iceberg: add setting to queryIcebergtables as of a specific timestamp. #71072 (Brett Hoerner). #77439 (Daniil Ivanik). - An in-memory cache for
Icebergmetadata, which stores manifest files/list andmetadata.jsonto speed up queries. #77156 (Han Fei). - Support
DeltaLaketable engine for Azure Blob Storage. Fixes #68043. #74541 (Smita Kulkarni). - Added an in-memory cache for deserialized vector similarity indexes. This should make repeated approximate nearest neighbor (ANN) search queries faster. The size of the new cache is controlled by server settings
vector_similarity_index_cache_sizeandvector_similarity_index_cache_max_entries. This feature supersedes the skipping index cache feature of earlier releases. #77905 (Shankar Iyer). - Support partition pruning in DeltaLake. #78486 (Kseniia Sumarokova).
- Support for a background refresh in readonly
MergeTreetables which allows querying updateable tables with an infinite amount of distributed readers (ClickHouse-native data lake). #76467 (Alexey Milovidov). - Support using custom disks to store databases metadata files. Currently it can be configured only on a global server level. #77365 (Tuan Pham Anh).
- Support ALTER TABLE ... ATTACH|DETACH|MOVE|REPLACE PARTITION for the plain_rewritable disk. #77406 (Julia Kartseva).
- Add table settings for
SASLconfiguration and credentials to theKafkatable engine. This allows configuring SASL-based authentication to Kafka and Kafka-compatible systems directly in the CREATE TABLE statement rather than having to use configuration files or named collections. #78810 (Christoph Wurm). - Allow setting
default_compression_codecfor MergeTree tables: it is used when the CREATE query does not explicitly define one for the given columns. This closes #42005. #66394 (gvoelfin). - Add
bind_hostsetting in the clusters configuration so that ClickHouse can use a specific network for distributed connections. #74741 (Todd Yocum). - Introduce a new column,
parametrized_view_parametersinsystem.tables. Closes https://github.com/clickhouse/clickhouse/issues/66756. #75112 (NamNguyenHoai). - Allow changing a database comment. Closes #73351 ### Documentation entry for user-facing changes. #75622 (NamNguyenHoai).
- Support
SCRAM-SHA-256authentication in the PostgreSQL compatibility protocol. #76839 (scanhex12). - Add functions
arrayLevenshteinDistance,arrayLevenshteinDistanceWeighted, andarraySimilarity. #77187 (Mikhail f. Shiryaev). - The setting
parallel_distributed_insert_selectmakes effect forINSERT SELECTintoReplicatedMergeTree(previously it required Distribued tables). #78041 (Igor Nikonov). - Introduce
toIntervalfunction. This function accepts 2 arguments (value and unit), and converts the value to a specificIntervaltype. #78723 (Andrew Davis). - Add several convenient ways to resolve root
metadata.jsonfile in an iceberg table function and engine. Closes #78455. #78475 (Daniil Ivanik). - Support password based auth in SSH protocol in ClickHouse. #78586 (Nikita Mikhaylov).
Experimental Feature
- Support correlated subqueries as an argument of
EXISTSexpression in theWHEREclause. Closes #72459. #76078 (Dmitry Novik). - Functions
sparseGramsandsparseGramsHasheswith ASCII and UTF8 versions added. Author: scanhex12. #78176 (Pervakov Grigorii). Do not use it: the implementation will change in the next versions.
Performance Improvement
- Optimize performance with lazy columns, that read the data after ORDER BY and LIMIT. #55518 (Xiaozhe Yu).
- Enabled the query condition cache by default. #79080 (Alexey Milovidov).
- Speed-up building JOIN result by de-virtualizing calls to
col->insertFrom(). #77350 (Alexander Gololobov). - Merge equality conditions from filter query plan step into JOIN condition if possible to allow using them as hash table keys. #78877 (Dmitry Novik).
- Use dynamic sharding for JOIN if the JOIN key is a prefix of PK for both parts. This optimization is enabled with
query_plan_join_shard_by_pk_rangessetting (disabled by default). #74733 (Nikolai Kochetov). - Support
Icebergdata pruning based on lower and upper boundary values for columns. Fixes #77638. #78242 (alesapin). - Implement trivial count optimization for
Iceberg. Now queries withcount()and without any filters should be faster. Closes #77639. #78090 (alesapin). - Add ability to configure the number of columns that merges can flush in parallel using
max_merge_delayed_streams_for_parallel_write(this should reduce memory usage for vertical merges to S3 about 25x times). #77922 (Azat Khuzhin). - Disable
filesystem_cache_prefer_bigger_buffer_sizewhen the cache is used passively, such as for merges. This lowers memory consumption on merges. #77898 (Kseniia Sumarokova). - Now we use number of replicas to determine task size for reading with parallel replicas enabled. This provides better work distribution between replicas when the amount of data to read is not really big. #78695 (Nikita Taranov).
- Support asynchronous IO prefetch for the
ORCformat, which improves overall performance by hiding remote IO latency. #70534 (李扬). - Preallocate memory used by asynchronous inserts to improve performance. #74945 (Ilya Golshtein).
- Decrease the amount of Keeper requests by eliminating the use of single
getrequests, which could have caused a significant load on Keeper with the increased number of replicas, in places wheremultiReadis available. #56862 (Nikolay Degterinsky). - A marginal optimization for running functions on Nullable arguments. #76489 (李扬).
- Optimize
arraySort. #76850 (李扬). - Merge marks of the same part and write them to the query condition cache at one time to reduce the consumption of locks. #77377 (zhongyuankai).
- Optimize
s3Clusterperformance for queries with one bracket expansion. #77686 (Tomáš Hromada). - Optimize order by single Nullable or LowCardinality columns. #77789 (李扬).
- Optimize memory usage of the
Nativeformat. #78442 (Azat Khuzhin). - Trivial optimization: do not rewrite
count(if(...))tocountIfif a type cast is required. Close #78564. #78565 (李扬). - The
hasAllfunction can now take advantage of thetokenbf_v1,ngrambf_v1full-text skipping indices. #77662 (UnamedRus). - Vector similarity index could over-allocate main memory by up to 2x. This fix reworks the memory allocation strategy, reducing the memory consumption and improving the effectiveness of the vector similarity index cache. (issue #78056). #78394 (Shankar Iyer).
- Introduce a setting
schema_typeforsystem.metric_logtable with schema type. There are three allowed schemas:wide-- current schema, each metric/event in a separate column (most effective for reads of separate columns),transposed-- similar tosystem.asynchronous_metric_log, metrics/events are stored as rows, and the most interestingtransposed_with_wide_view-- create underlying table withtransposedschema, but also introduce a view withwideschema which translates queries to underlying table. Intransposed_with_wide_viewsubsecond resolution for view is not supported,event_time_microsecondsis just an alias for backward compatibility. #78412 (alesapin).
Improvement
- Serialize query plan for
Distributedqueries. A new settingserialize_query_planis added. When enabled, queries fromDistributedtable will use a serialized query plan for remote query execution. This introduces a new packet type to TCP protocol,<process_query_plan_packet>true</process_query_plan_packet>should be added to the server config to allow processing this packet. #69652 (Nikolai Kochetov). - Support
JSONtype and subcolumns reading from views. #76903 (Pavel Kruglov). - Support ALTER DATABASE ... ON CLUSTER. #79242 (Tuan Pham Anh).
- Refreshes of refreshable materialized views now appear in
system.query_log. #71333 (Michael Kolupaev). - User-defined functions (UDFs) can now be marked as deterministic via a new setting in their configuration. Also, the query cache now checks if UDFs called within a query are deterministic. If this is the case, it caches the query result. (Issue #59988). #77769 (Jimmy Aguilar Mena).
- Enabled a backoff logic for all types of replicated tasks. It will provide the ability to reduce CPU usage, memory usage, and log file sizes. Added new settings
max_postpone_time_for_failed_replicated_fetches_ms,max_postpone_time_for_failed_replicated_merges_msandmax_postpone_time_for_failed_replicated_tasks_mswhich are similar tomax_postpone_time_for_failed_mutations_ms. #74576 (MikhailBurdukov). - Add
query_idtosystem.errors. Closes #75815. #76581 (Vladimir Baikov). - Adding support for converting
UInt128toIPv6. This allows thebitAndoperation and arithmatics forIPv6and conversion back toIPv6. Closes #76752. This allows the result frombitAndoperation onIPv6to be converted back toIPv6, as well. See also #57707. #76928 (Muzammil Abdul Rehman). - Don't parse special
Boolvalues in text formats insideVarianttype by default. It can be enabled using settingallow_special_bool_values_inside_variant. #76974 (Pavel Kruglov). - Support configurable per task waiting time of low
priorityquery in session level and in server level. #77013 (VicoWu). - Implement comparison for values of JSON data type. Now JSON objects can be compared similarly to Maps. #77397 (Pavel Kruglov).
- Better permission support by
system.kafka_consumers. Forward internallibrdkafkaerrors (worth noting that this library is a crap). #77700 (Ilya Golshtein). - Added validation for the settings of the Buffer table engine. #77840 (Pervakov Grigorii).
- Add config
enable_hdfs_preadto enable or disable pread inHDFS. #77885 (kevinyhzou). - Add profile events for number of zookeeper
multiread and write requests. #77888 (JackyWoo). - Allow creating and inserting into temporary tables when
disable_insertion_and_mutationis on. #77901 (Xu Jia). - Decrease
max_insert_delayed_streams_for_parallel_write(to 100). #77919 (Azat Khuzhin). - Fix year parsing in Joda syntax (this is from the Java world if you're wondering) like
yyy. #77973 (李扬). - Attaching parts of
MergeTreetables will be performed in their block order, which is important for special merging algorithms, such asReplacingMergeTree. This closes #71009. #77976 (Alexey Milovidov). - Query masking rules are now able to throw a
LOGICAL_ERRORin case if the match happened. This will help to check if pre-defined password is leaking anywhere in logs. #78094 (Nikita Mikhaylov). - Added column
index_length_columntoinformation_schema.tablesfor better compatibility with MySQL. #78119 (Paweł Zakrzewski). - Introduce two new metrics:
TotalMergeFailuresandNonAbortedMergeFailures. These metrics are needed to detect the cases where too many merges fail within a short period. #78150 (Miсhael Stetsyuk). - Fix incorrect S3 URL parsing when key is not specified on path style. #78185 (Arthur Passos).
- Fix incorrect values of
BlockActiveTime,BlockDiscardTime,BlockWriteTime,BlockQueueTime, andBlockReadTimeasynchronous metrics (before the change 1 second was incorrectly reported as 0.001). #78211 (filimonov). - Respect
loading_retrieslimit for errors during push to materialized view for StorageS3(Azure)Queue. Before that such errors were retried indefinitely. #78313 (Kseniia Sumarokova). - In DeltaLake with
delta-kernel-rsimplementation, fix performance and progress bar. #78368 (Kseniia Sumarokova). - Support
include,from_env,from_zkfor runtime disks. Closes #78177. #78470 (Kseniia Sumarokova). - Add a dynamic warning to the
system.warningstable for long running mutations. #78658 (Bharat Nallan). - Added field
conditionto system tablesystem.query_condition_cache. It stores the plaintext condition whose hash is used as a key in the query condition cache. #78671 (Robert Schulze). - Allow an empty value for Hive partitioning. #78816 (Arthur Passos).
- Fix
INclause type coercion forBFloat16(i.e.SELECT toBFloat16(1) IN [1, 2, 3];now returns1). Closes #78754. #78839 (Raufs Dunamalijevs). - Do not check parts on other disks for
MergeTreeifdisk = ...is set. #78855 (Azat Khuzhin). - Make data types in
used_data_type_familiesinsystem.query_logto be recorded with canonical names. #78972 (Kseniia Sumarokova). - Cleanup settings during
recoverLostReplicasame as it was done in: #78637. #79113 (Nikita Mikhaylov). - Use insertion columns for INFILE schema inference. #78490 (Pervakov Grigorii).
Bug Fix (user-visible misbehavior in an official stable release)
- Fix incorrect projection analysis when
count(Nullable)is used in aggregate projections. This fixes #74495 . This PR also adds some logs around projection analysis to clarify why a projection is used or why not. #74498 (Amos Bird). - Fix
Part <...> does not contain in snapshot of previous virtual parts. (PART_IS_TEMPORARILY_LOCKED)duringDETACH PART. #76039 (Aleksei Filatov). - Fix not working skip indexes with expression with literals in analyzer and remove trivial casts during indexes analysis. #77229 (Pavel Kruglov).
- Fix a bug when
close_sessionquery parameter didn't have any effect leading to named sessions being closed only aftersession_timeout. #77336 (Alexey Katsman). - Fixed receiving messages from NATS server without attached Materialized Views. #77392 (Dmitry Novikov).
- Fix logical error while reading from empty
FileLogviamergetable function, close #75575. #77441 (Vladimir Cherkasov). - Use default format settings in
Dynamicserialization from shared variant. #77572 (Pavel Kruglov). - Fix checking if the table data path exists on the local disk. #77608 (Tuan Pham Anh).
- Fix sending constant values to remote for some types. #77634 (Pavel Kruglov).
- Fix a crash because of expired context in S3/AzureQueue. #77720 (Kseniia Sumarokova).
- Hide credentials in RabbitMQ, Nats, Redis, AzureQueue table engines. #77755 (Kseniia Sumarokova).
- Fix undefined behaviour on
NaNcomparison inargMin/argMax. #77756 (Raúl Marín). - Regularly check if merges and mutations were cancelled even in case when the operation doesn't produce any blocks to write. #77766 (János Benjamin Antal).
- Fixed refreshable materialized view in Replicated database not working on newly added replicas. #77774 (Michael Kolupaev).
- Fix possible crash when
NOT_FOUND_COLUMN_IN_BLOCKerror occurs. #77854 (Vladimir Cherkasov). - Fix crash that happens in the S3/AzureQueue while filling data. #77878 (Bharat Nallan).
- Disable fuzzy search for history in SSH server (since it requires the skim library). #78002 (Azat Khuzhin).
- Fixes a bug that a vector search query on a non-indexed column was returning incorrect results if there was another vector column in the table with a defined vector similarity index. (Issue #77978). #78069 (Shankar Iyer).
- Fix a minuscule error "The requested output format is binary... Do you want to output it anyway? [y/N]" prompt. #78095 (Azat Khuzhin).
- Fix of a bug in case of
toStartOfIntervalwith zero origin argument. #78096 (Yarik Briukhovetskyi). - Disallow specifying an empty
session_idquery parameter for HTTP interface. #78098 (Alexey Katsman). - Fix metadata override in
Replicateddatabase which could have happened due to aRENAMEquery executed right after anALTERquery. #78107 (Nikolay Degterinsky). - Fix crash in
NATSengine. #78108 (Dmitry Novikov). - Do not try to create history_file in embedded client for SSH (in previous versions the creation was always unsuccessful, but attempted). #78112 (Azat Khuzhin).
- Fix
system.detached_tablesdisplaying incorrect information afterRENAME DATABASEorDROP TABLEqueries. #78126 (Nikolay Degterinsky). - Fix for checks for too many tables with
Replicateddatabase after #77274. Also, perform the check before creating the storage to avoid creating unaccounted nodes in Keeper in the case ofReplicatedMergeTreeorKeeperMap. #78127 (Nikolay Degterinsky). - Fix possible crash due to concurrent
S3Queuemetadata initialization. #78131 (Azat Khuzhin). groupArray*functions now produceBAD_ARGUMENTSerror for Int-typed 0 value of themax_sizeargument, like it's already done for UInt one, instead of trying to execute with it. #78140 (Eduard Karacharov).- Prevent crash on recovering a lost replica if the local table is removed before it's detached. #78173 (Raúl Marín).
- Fix the fact that "alterable" column in
system.s3_queue_settingsreturning alwaysfalse. #78187 (Kseniia Sumarokova). - Mask Azure access signature to be not visible to user or in logs. #78189 (Kseniia Sumarokova).
- Fix prefetching of substreams with prefixes in Wide parts. #78205 (Pavel Kruglov).
- Fixed crashes / incorrect result for
mapFromArraysin case ofLowCardinality(Nullable)type of keys array. #78240 (Eduard Karacharov). - Fix delta-kernel-rs auth options. #78255 (Kseniia Sumarokova).
- Not schedule Refreshable Materialized Views task if a replica's
disable_insertion_and_mutationis true. A task is some insertion, it will failed ifdisable_insertion_and_mutationis true. #78277 (Xu Jia). - Validate access to underlying tables for the
Mergeengine. #78339 (Pervakov Grigorii). FINALmodifier can be ignored when querying aDistributedtable. #78428 (Yakov Olkhovskiy).bitmapMinreturns the uint32_max when the bitmap is empty (and uint64_max when the input type is larger), which matches the behavior of empty roaring_bitmap's minimum. #78444 (wxybear).- Disable parallelization of query processing right after reading FROM when
distributed_aggregation_memory_efficientenabled, it may lead to logical error. Closes #76934. #78500 (flynn). - Set at least one stream for reading in case there are zero planned streams after applying
max_streams_to_max_threads_ratiosetting. #78505 (Eduard Karacharov). - In storage
S3Queuefix logical error "Cannot unregister: table uuid is not registered". Closes #78285. #78541 (Kseniia Sumarokova). - ClickHouse is now able to figure out its cgroup v2 on systems with both cgroups v1 and v2 enabled. #78566 (Grigory Korolev).
-Clustertable functions were failing when used with table-level settings. #78587 (Daniil Ivanik).- Better checks when transactions are not supported by ReplicatedMergeTree on INSERT. #78633 (Azat Khuzhin).
- Cleanup query settings during attach. #78637 (Raúl Marín).
- Fix a crash when an invalid path was specified in
iceberg_metadata_file_path. #78688 (alesapin). - In
DeltaLaketable engine with delta-kernel-s implementation, fix the case when the read schema is different from the table schema and there are partition columns at the same time leading to a "not found column" error. #78690 (Kseniia Sumarokova). - Fix a problem when after scheduling to close a named session (but before timeout expiration), creation of a new named session with the same name led to it being closed at a time point when the first session was scheduled to close. #78698 (Alexey Katsman).
- Fixed several types of
SELECTqueries that read from tables withMongoDBengine ormongodbtable function: queries with implicit conversion of const value inWHEREclause (e.g.WHERE datetime = '2025-03-10 00:00:00') ; queries withLIMITandGROUP BY. Previously, they could return the wrong result. #78777 (Anton Popov). - Don't block table shutdown while running
CHECK TABLE. #78782 (Raúl Marín). - Keeper fix: fix ephemeral count in all cases. #78799 (Antonio Andelic).
- Fix bad cast in
StorageDistributedwhen using table functions other thanview. Closes #78464. #78828 (Konstantin Bogdanov). - Fix the consistency of formatting for
tupleElement(*, 1). Closes #78639. #78832 (Konstantin Bogdanov). - Dictionaries of type
ssd_cachenow reject zero or negativeblock_sizeandwrite_buffer_sizeparameters (issue #78314). #78854 (Elmi Ahmadov). - Fix crash in Refreshable MATERIALIZED VIEW inthe case of ALTER after an incorrect shutdown. #78858 (Azat Khuzhin).
- Fix parsing of bad
DateTimevalues inCSVformat. #78919 (Pavel Kruglov). - Keeper fix: Avoid triggering watches on failed multi requests. #79247 (Antonio Andelic).
- Fix reading Iceberg table failed when min-max value is specified explicitly but is
NULL. The Go Iceberg library was noted for generating such an atrocious files. Closes #78740. #78764 (flynn).
Build/Testing/Packaging Improvement
- Respect CPU target features in Rust and enable LTO in all crates. #78590 (Raúl Marín).
ClickHouse release 25.3 LTS, 2025-03-20
Backward Incompatible Change
- Disallow truncating replicated databases. #76651 (Bharat Nallan).
- Skipping index cache is reverted. #77447 (Nikita Mikhaylov).
New Feature
JSONdata type is production-ready. See https://jsonbench.com/.DynamicandVariantdata types are production-ready. #77785 (Alexey Milovidov).- Introduce the SSH protocol for clickhouse-server. Now, it is possible to connect to ClickHouse using any SSH client. This closes: #74340. #74989 (George Gamezardashvili).
- Replace table functions with their -Cluster alternatives if parallel replicas are enabled. Fixes #65024. #70659 (Konstantin Bogdanov).
- A new implementation of the Userspace Page Cache, which allows caching data in the in-process memory instead of relying on the OS page cache, which is useful when the data is stored on a remote virtual filesystem without backing with the local filesystem cache. #70509 (Michael Kolupaev).
- Added
concurrent_threads_schedulerserver setting that governs how CPU slots are distributed among concurrent queries. Could be set toround_robin(previous behavior) orfair_round_robinto address the issue of unfair CPU distribution between INSERTs and SELECTs. #75949 (Sergei Trifonov). - Add
estimateCompressionRatioaggregate function #70801. #76661 (Tariq Almawash). - Added function
arraySymmetricDifference. It returns all elements from multiple array arguments which do not occur in all arguments. Example:SELECT arraySymmetricDifference([1, 2], [2, 3])returns[1, 3]. (issue #61673). #76231 (Filipp Abapolov). - Allow to explicitly specify metadata file to read for Iceberg with storage/table function setting
iceberg_metadata_file_path. Fixes #47412. #77318 (alesapin). - Added the
keccak256hash function, commonly used in blockchain implementations, especially in EVM-based systems. #76669 (Arnaud Briche). - Add three new functions.
icebergTruncateaccording to specification. https://iceberg.apache.org/spec/#truncate-transform-details,toYearNumSinceEpochandtoMonthNumSinceEpoch. Supporttruncatetransform in partition pruning forIcebergengine. #77403 (alesapin). - Support
LowCardinality(Decimal)data types #72256. #72833 (zhanglistar). FilterTransformPassedRowsandFilterTransformPassedBytesprofile events will show the number of rows and number of bytes filtered during the query execution. #76662 (Onkar Deshpande).- Support for the histogram metric type. The interface closely mirrors the Prometheus client, where you simply call
observe(value)to increment the counter in the bucket corresponding to the value. The histogram metrics are exposed viasystem.histogram_metrics. #75736 (Miсhael Stetsyuk). - Non-constant CASE support for switching on explicit values. #77399 (Yarik Briukhovetskyi).
Experimental Feature
- Add support for Unity Catalog for DeltaLake tables on top of AWS S3 and local filesystem. #76988 (alesapin).
- Introduce experimental integration with AWS Glue service catalog for Iceberg tables. #77257 (alesapin).
- Added support for dynamic cluster autodiscovery. This extends the existing node autodiscovery feature. ClickHouse can now automatically detect and register new clusters under a common ZooKeeper path using
<multicluster_root_path>. #76001 (Anton Ivashkin). - Allow automatic cleanup merges of entire partitions after a configurable timeout with a new setting
enable_replacing_merge_with_cleanup_for_min_age_to_force_merge. #76440 (Christoph Wurm).
Performance Improvement
- Implement query condition cache to improve query performance using repeated conditions. The range of the portion of data that does not meet the condition is remembered as a temporary index in memory. Subsequent queries will use this index. Close #67768 #69236 (zhongyuankai).
- Actively evict data from the cache on parts removal. Do not let the cache grow to the maximum size if the amount of data is less. #76641 (Alexey Milovidov).
- Replace Int256 and UInt256 with clang builtin i256 in arithmetic calculation, and it gives a performance improvement #70502. #73658 (李扬).
- In some cases (e.g. empty array column) data parts can contain empty files. We can skip writing empty blobs to ObjectStorage and only store metadata for such files when the table resides on disk with separated metadata and object storages. #75860 (Alexander Gololobov).
- Improve min/max performance for Decimal32/Decimal64/DateTime64. #76570 (李扬).
- Query compilation (setting
compile_expressions) now considers the machine type. This speeds up such queries significantly. #76753 (ZhangLiStar). - Optimize
arraySort. #76850 (李扬). - Disable
filesystem_cache_prefer_bigger_buffer_sizewhen the cache is used passively, such as for merges. #77898 (Kseniia Sumarokova). - Apply
preserve_mostattribute at some places in code, which allows slightly better code generation. #67778 (Nikita Taranov). - Faster ClickHouse servers shutdown (get rid of 2.5sec delay). #76550 (Azat Khuzhin).
- Avoid excess allocation in ReadBufferFromS3 and other remote reading buffers, reduce their memory consumption in half. #76692 (Sema Checherinda).
- Update zstd from 1.5.5 to 1.5.7 which could lead to some performance improvements. #77137 (Pradeep Chhetri).
- Reduce memory usage during prefetches of JSON column in Wide parts. This is relevant when ClickHouse is used on top of a shared storage, such as in ClickHouse Cloud. #77640 (Pavel Kruglov).
Improvement
- Support atomic rename when
TRUNCATEis used withINTO OUTFILE. Resolves #70323. #77181 (Onkar Deshpande). - It's no longer possible to use
NaNorinffor float values as settings. Not like it did make any sense before. #77546 (Yarik Briukhovetskyi). - Disable parallel replicas by default when analyzer is disabled regardless
compatibilitysetting. It's still possible to change this behavior by explicitly settingparallel_replicas_only_with_analyzertofalse. #77115 (Igor Nikonov). - Add the ability to define a list of headers that are forwarded from the headers of the client request to the external HTTP authenticator. #77054 (inv2004).
- Respect column insensitive column matching for fields in tuple columns. Close https://github.com/apache/incubator-gluten/issues/8324. #73780 (李扬).
- Parameters for the codec Gorilla will now always be saved in the table metadata in .sql file. This closes: #70072. #74814 (Nikita Mikhaylov).
- Implemented parsing enhancements for certain data lakes (Sequence ID parsing: Added functionality to parse sequence identifiers in manifest files AND Avro metadata parsing: Redesigned the Avro metadata parser to be easily extendable for future enhancements). #75010 (Daniil Ivanik).
- Remove trace_id from default ORDER BY for
system.opentelemetry_span_log. #75907 (Azat Khuzhin). - Encryption (the attribute
encrypted_by) can now be applied to any configuration file (config.xml, users.xml, nested configuration files). Previously, it worked only for the top-level config.xml file. #75911 (Mikhail Gorshkov). - Improve the
system.warningstable and add some dynamic warning messages that can be added, updated or removed. #76029 (Bharat Nallan). - This PR makes it impossible to run a query
ALTER USER user1 ADD PROFILES a, DROP ALL PROFILESbecause allDROPoperations should come first in the order. #76242 (pufit). - Various enhancements for SYNC REPLICA (better error messages, better tests, sanity checks). #76307 (Azat Khuzhin).
- Use correct fallback when multipart copy to S3 fails during backup with Access Denied. Multi part copy can generate Access Denied error when backup is done between buckets that have different credentials. #76515 (Antonio Andelic).
- Upgraded librdkafka (which is a pile of crap) to version 2.8.0 (the pile does not get any better) and improved the shutdown sequence for Kafka tables, reducing delays during table drops and server restarts. The
engine=Kafkano longer explicitly leaves the consumer group when a table is dropped. Instead, the consumer remains in the group until it is automatically removed aftersession_timeout_ms(default: 45 seconds) of inactivity. #76621 (filimonov). - Fix validation of S3 request settings. #76658 (Vitaly Baranov).
- System tables like
server_settingsorsettingshave adefaultvalue column which is convenient. Add them tomerge_tree_settingsandreplicated_merge_tree_settings. #76942 (Diego Nieto). - Added
ProfileEvents::QueryPreempted, which has a similar logic toCurrentMetrics::QueryPreempted. #77015 (VicoWu). - Previously, a Replicated database could print credentials specified in a query to logs. This behaviour is fixed. This closes: #77123. #77133 (Nikita Mikhaylov).
- Allow ALTER TABLE DROP PARTITION for
plain_rewritable disk. #77138 (Julia Kartseva). - Backup/restore setting
allow_s3_native_copynow supports value three possible values: -False- s3 native copy will not be used; -True(old default) - ClickHouse will try s3 native copy first, if it fails then fallback to the reading+writing approach; -'auto'(new default) - ClickHouse will compare the source and destination credentials first. If they are same, ClickHouse will try s3 native copy and then may fallback to the reading+writing approach. If they are different, ClickHouse will go directly to the reading+writing approach. #77401 (Vitaly Baranov). - Support aws session token and environment credentials usage in delta kernel for DeltaLake table engine. #77661 (Kseniia Sumarokova).
Bug Fix (user-visible misbehavior in an official stable release)
- Fix stuck while processing pending batch for async distributed INSERT (due to i.e.
No such file or directory). #72939 (Azat Khuzhin). - Improved datetime conversion during index analysis by enforcing saturating behavior for implicit Date to DateTime conversions. This resolves potential index analysis inaccuracies caused by datetime range limitations. This fixes #73307. It also fixes explicit
toDateTimeconversion whendate_time_overflow_behavior = 'ignore'which is the default value. #73326 (Amos Bird). - Fix all sort of bugs due to race between UUID and table names (for instance it will fix the race between
RENAMEandRESTART REPLICA, in case of concurrentRENAMEwithSYSTEM RESTART REPLICAyou may get end up restarting wrong replica, or/and leaving one of the tables in aTable X is being restartedstate). #76308 (Azat Khuzhin). - Fix data loss when enable async insert and insert into ... from file ... with unequal block size if the first block size < async_max_size but the second block > async_max_size, the second block will not be inserted. these data is left in
squashing. #76343 (Han Fei). - Renamed field 'marks' to 'marks_bytes' in
system.data_skipping_indices. #76374 (Robert Schulze). - Fix dynamic filesystem cache resize handling unexpected errors during eviction. #76466 (Kseniia Sumarokova).
- Fixed
used_flaginitialization in parallel hash. It might cause a server crash. #76580 (Nikita Taranov). - Fix a logical error when calling
defaultProfilesfunction inside a projection. #76627 (pufit). - Do not request interactive basic auth in the browser in Web UI. Closes #76319. #76637 (Alexey Milovidov).
- Fix THERE_IS_NO_COLUMN exception when selecting boolean literal from distributed tables. #76656 (Yakov Olkhovskiy).
- The subpath inside the table directory is chosen in a more profound way. #76681 (Daniil Ivanik).
- Fix an error
Not found column in blockafter altering a table with a subcolumn in PK. After https://github.com/ClickHouse/ClickHouse/pull/72644, requires https://github.com/ClickHouse/ClickHouse/pull/74403. #76686 (Nikolai Kochetov). - Add performance tests for null shortcircuit and fix bugs. #76708 (李扬).
- Flush output write buffers before finalizing them. Fix
LOGICAL_ERRORgenerated during the finalization of some output format, e.g.JSONEachRowWithProgressRowOutputFormat. #76726 (Antonio Andelic). - Added support for MongoDB's binary UUID (#74452) - Fixed WHERE pushdown to MongoDB when using the table function (#72210) - Changed the MongoDB - ClickHouse type mapping such that MongoDB's binary UUID can only be parsed to ClickHouse's UUID. This should avoid ambiguities and surprises in future. - Fixed OID mapping, preserving backward compatibility. #76762 (Kirill Nikiforov).
- Fix exception handling in parallel prefixes deserialization of JSON subcolumns. #76809 (Pavel Kruglov).
- Fix lgamma function behavior for negative integers. #76840 (Ilya Kataev).
- Fix reverse key analysis for explicitly defined primary keys. Similar to #76654. #76846 (Amos Bird).
- Fix pretty print of Bool values in JSON format. #76905 (Pavel Kruglov).
- Fix possible crash because of bad JSON column rollback on error during async inserts. #76908 (Pavel Kruglov).
- Previously,
multiIfmay return different types of columns during planning and main execution. This resulted in code producing undefined behavior from the C++ perspective. #76914 (Nikita Taranov). - Fixed incorrect serialization of constant nullable keys in MergeTree. This fixes #76939. #76985 (Amos Bird).
- Fix sorting of
BFloat16values. This closes #75487. This closes #75669. #77000 (Alexey Milovidov). - Bug fix JSON with Variant subcolumn by adding check to skip ephemeral subcolumns in part consistency check. #72187. #77034 (Smita Kulkarni).
- Fix crash in template parsing in Values format in case of types mismatch. #77071 (Pavel Kruglov).
- Don't allow creating EmbeddedRocksDB table with subcolumn in primary key. Previosly such table could be created but select queries were failing. #77074 (Pavel Kruglov).
- Fix illegal comparison in distributed queries because pushing down predicates to remote doesn't respect literal types. #77093 (Duc Canh Le).
- Fix crash during Kafka table creation with exception. #77121 (Pavel Kruglov).
- Support JSON and subcolumns in Kafka and RabbitMQ engines. #77122 (Pavel Kruglov).
- Fix exceptions stack unwinding on MacOS. #77126 (Eduard Karacharov).
- Fix reading 'null' subcolumn in getSubcolumn function. #77163 (Pavel Kruglov).
- Fix bloom filter index with Array and not supported functions. #77271 (Pavel Kruglov).
- We should only check the restriction on the amount of tables during the initial CREATE query. #77274 (Nikolay Degterinsky).
- Not a bug:
SELECT toBFloat16(-0.0) == toBFloat16(0.0)now correctly returnstrue(from previouslyfalse). This makes the behavior consistent withFloat32andFloat64. #77290 (Shankar Iyer). - Fix posbile incorrect reference to unintialized key_index variable, which may lead to crash in debug builds (this uninitialized reference won't cause issues in release builds because subsequent code are likely to throw errors.) ### documentation entry for user-facing changes. #77305 (wxybear).
- Fix name for partition with a Bool value. It was broken in https://github.com/ClickHouse/ClickHouse/pull/74533. #77319 (Pavel Kruglov).
- Fix comparison between tuples with nullable elements inside and strings. As an example, before the change comparison between a Tuple
(1, null)and a String'(1,null)'would result in an error. Another example would be a comparison between a Tuple(1, a), whereais a Nullable column, and a String'(1, 2)'. This change addresses these issues. #77323 (Alexey Katsman). - Fix crash in ObjectStorageQueueSource. Was intoduced in https://github.com/ClickHouse/ClickHouse/pull/76358. #77325 (Pavel Kruglov).
- Fix
async_insertwithinput. #77340 (Azat Khuzhin). - Fix:
WITH FILLmay fail with NOT_FOUND_COLUMN_IN_BLOCK when sorting column is removed by planer. Similar issue related to inconsistent DAG calculated for INTERPOLATE expression. #77343 (Yakov Olkhovskiy). - Fix several LOGICAL_ERRORs around setting alias of invalid AST nodes. #77445 (Raúl Marín).
- In filesystem cache impementation fix error processing during file segment write. #77471 (Kseniia Sumarokova).
- Make DatabaseIceberg use correct metadata file provided by catalog. Closes #75187. #77486 (Kseniia Sumarokova).
- The query cache now assumes that UDFs are non-deterministic. Accordingly, results of queries with UDFs are no longer cached. Previously, users were able to define non-deterministic UDFs whose result would erronously be cached (issue #77553). #77633 (Jimmy Aguilar Mena).
- Fix system.filesystem_cache_log working only under setting
enable_filesystem_cache_log. #77650 (Kseniia Sumarokova). - Fix a logical error when calling
defaultRolesfunction inside a projection. Follow-up for #76627. #77667 (pufit). - Second arguments of type
Nullablefor functionarrayResizeare now disallowed. Previously, anything from errors to wrong results could happen withNullableas second argument. (issue #48398). #77724 (Manish Gill). - Regularly check if merges and mutations were cancelled even in case when the operation doesn't produce any blocks to write. #77766 (János Benjamin Antal).
Build/Testing/Packaging Improvement
clickhouse-odbc-bridgeandclickhouse-library-bridgeare moved to a separate repository, https://github.com/ClickHouse/odbc-bridge/. #76225 (Alexey Milovidov).- Fix Rust cross-compilation and allow disabling Rust completely. #76921 (Raúl Marín).
ClickHouse release 25.2, 2025-02-27
Backward Incompatible Change
- Completely enable
async_load_databasesby default (even for those installations that do not upgradeconfig.xml). #74772 (Azat Khuzhin). - Add
JSONCompactEachRowWithProgressandJSONCompactStringsEachRowWithProgressformats. Continuation of #69989. TheJSONCompactWithNamesandJSONCompactWithNamesAndTypesno longer output "totals" - apparently, it was a mistake in the implementation. #75037 (Alexey Milovidov). - Change the
format_alter_operations_with_parenthesesdefault to true to disambiguate the ALTER commands list (see https://github.com/ClickHouse/ClickHouse/pull/59532). This breaks replication with clusters prior to 24.3. If you are upgrading a cluster using older releases turn off the setting in the server config or upgrade to 24.3 first. #75302 (Raúl Marín). - Remove the possibility of filtering log messages using regular expressions. The implementation introduced a data race, so it has to be removed. #75577 (János Benjamin Antal).
- The setting
min_chunk_bytes_for_parallel_parsingcannot be zero anymore. This fixes: #71110. #75239 (Nikita Mikhaylov). - Validate settings in the cache configuration. Non existing settings were ignored before, now they will throw an error and they should be removed. #75452 (Kseniia Sumarokova).
New Feature
- Support type
Nullable(JSON). #73556 (Pavel Kruglov). - Support subcolumns in the DEFAULT and MATERIALIZED expressions. #74403 (Pavel Kruglov).
- Support writing Parquet bloom filters using the
output_format_parquet_write_bloom_filtersetting (enabled by default). #71681 (Michael Kolupaev). - Web UI now has interactive database navigation. #75777 (Alexey Milovidov).
- Allow the combination of read-only and read-write disks in the storage policy (as multiple volumes or multiple disks). This allows data to be read from the entire volume, while inserts will prefer the writable disk (i.e., Copy-on-Write storage policy). #75862 (Azat Khuzhin).
- Add a new Database engine,
DatabaseBackup,that allows to instantly attach table/database from backup. #75725 (Maksim Kita). - Support prepared statements in the Postgres wire protocol. #75035 (scanhex12).
- Add the ability to ATTACH tables without a database layer, which is useful for MergeTree tables located on Web, S3, and similar external virtual filesystems. #75788 (Azat Khuzhin).
- Add a new string comparison function,
compareSubstringsto compare parts of two strings. Example:SELECT compareSubstrings('Saxony', 'Anglo-Saxon', 0, 6, 5) AS resultmeans "compare 6 bytes of strings 'Saxon' and 'Anglo-Saxon' lexicographically, starting at offset 0 in the first string, offset 5 in the second string". #74070 (lgbo). - A new function,
initialQueryStartTimeis added. It returns the start time of the current query. The value is the same across all shards during a distributed query. #75087 (Roman Lomonosov). - Add support for SSL authentication with named collections for MySQL. Closes #59111. #59452 (Nikolay Degterinsky).
Experimental Features
- Added a new setting,
enable_adaptive_memory_spill_schedulerthat allows multiple Grace JOINs in the same query to monitor their combined memory footprint and trigger spilling into external storage adaptively to prevent MEMORY_LIMIT_EXCEEDED. #72728 (lgbo). - Make the new, experimental
Kafkatable engine fully respect Keeper feature flags. #76004 (János Benjamin Antal). - Restore the (Intel) QPL codec, which was removed in v24.10 due to licensing issues. #76021 (Konstantin Bogdanov).
- For the integration with HDFS added support for the
dfs.client.use.datanode.hostnameconfiguration option. #74635 (Mikhail Tiukavkin).
Performance Improvement
- Improve performance of the whole JSON column reading in Wide parts from S3. It's done by adding prefetches for subcolumn prefixes deserialization, cache of deserialized prefixes, and parallel deserialization of subcolumn prefixes. It improves the reading of the JSON column from S3 4 times in queries like
SELECT data FROM tableand about 10 times in queries likeSELECT data FROM table LIMIT 10. #74827 (Pavel Kruglov). - Fixed unnecessary contention in
parallel_hashwhenmax_rows_in_join = max_bytes_in_join = 0. #75155 (Nikita Taranov). - Fixed double preallocation in
ConcurrentHashJoinin case join sides are swapped by the optimizer. #75149 (Nikita Taranov). - Slight improvement in some join scenarios: precalculate the number of output rows and reserve memory for them. #75376 (Alexander Gololobov).
- For queries like
WHERE a < b AND b < c AND c < 5, we can infer new comparing conditions (a < 5 AND b < 5) to have better filter ability. #73164 (Shichao Jin). - Keeper improvement: disable digest calculation when committing to in-memory storage for better performance. It can be enabled with
keeper_server.digest_enabled_on_commitconfig. Digest is still calculated when preprocessing requests. #75490 (Antonio Andelic). - Push down filter expression from JOIN ON when possible. #75536 (Vladimir Cherkasov).
- Calculate columns and indices sizes lazily in MergeTree. #75938 (Pavel Kruglov).
- Reintroduce respect
ttl_only_drop_partsonMATERIALIZE TTL; only read necessary columns to recalculate TTL and drop parts by replacing them with an empty ones. #72751 (Andrey Zvonov). - Reduce write buffer size for plain_rewritable metadata files #75758 (Julia Kartseva).
- Reduce memory usage for some window functions. #65647 (lgbo).
- Evaluate parquet bloom filters and min/max indexes together. Necessary to properly support:
x = 3 or x > 5where data = [1, 2, 4, 5]. #71383 (Arthur Passos). - Queries passed to the
Executablestorage are no longer limited to a single-threaded execution. #70084 (yawnt). - Fetch parts in parallel in ALTER TABLE FETCH PARTITION (thread pool size is controlled with
max_fetch_partition_thread_pool_size). #74978 (Azat Khuzhin). - Allow to move predicates with the
indexHintfunction toPREWHERE. #74987 (Anton Popov).
Improvement
- Fixed calculation of size in memory for
LowCardinalitycolumns. #74688 (Nikita Taranov). processors_profile_logtable now has a default configuration with a TTL of 30 days. #66139 (Ilya Yatsishin).- Allow naming shards in the cluster configuration. #72276 (MikhailBurdukov).
- Change Prometheus remote write response success status from 200/OK to 204/NoContent. #74170 (Michael Dempsey).
- Add ability to reload
max_remote_read_network_bandwidth_for_serveandmax_remote_write_network_bandwidth_for_serveron the fly without restart server. #74206 (Kai Zhu). - Allow using blob paths to calculate checksums while making a backup. #74729 (Vitaly Baranov).
- Added a query ID column to
system.query_cache(closes #68205). #74982 (NamHoaiNguyen). - It is allowed to cancel
ALTER TABLE ... FREEZE ...queries withKILL QUERYand automatically by a timeout (max_execution_time). #75016 (Kirill). - Add support for
groupUniqArrayArrayMapasSimpleAggregateFunction. #75034 (Miel Donkers). - Hide catalog credential settings in database engine
Iceberg. Closes #74559. #75080 (Kseniia Sumarokova). intExp2/intExp10: Define undefined behaviour: return 0 for too small argument,18446744073709551615for too big argument, throw exception ifnan. #75312 (Vitaly Baranov).- Support
s3.endpointnatively from catalog config inDatabaseIceberg. Closes #74558. #75375 (Kseniia Sumarokova). - Don't fail silently if a user executing
SYSTEM DROP REPLICAdoesn't have enough permissions. #75377 (Bharat Nallan). - Add a ProfileEvent about the number of times any of the system logs have failed to flush. #75466 (Alexey Milovidov).
- Add a check and extra logging for decrypting and decompressing. #75471 (Vitaly Baranov).
- Added support for the micro sign (U+00B5) in the
parseTimeDeltafunction. Now both the micro sign (U+00B5) and the Greek letter mu (U+03BC) are recognized as valid representations for microseconds, aligning ClickHouse's behavior with Go’s implementation (see time.go and time/format.go). #75472 (Vitaly Orlov). - Replace server setting (
send_settings_to_client) with client setting (apply_settings_from_server) that controls whether client-side code (e.g., parsing INSERT data and formatting query output) should use settings from server'susers.xmland user profile. Otherwise, only settings from the client command line, session, and query are used. Note that this only applies to native client (not e.g. HTTP), and doesn't apply to most of query processing (which happens on the server). #75478 (Michael Kolupaev). - Better error messages for syntax errors. Previously, if the query was too large, and the token whose length exceeds the limit is a very large string literal, the message about the reason was lost in the middle of two examples of this very long token. Fix the issue when a query with UTF-8 was cut incorrectly in the error message. Fix excessive quoting of query fragments. This closes #75473. #75561 (Alexey Milovidov).
- Add profile events in storage
S3(Azure)Queue. #75618 (Kseniia Sumarokova). - Disable sending settings from server to client (
send_settings_to_client=false) for compatibility (This feature will be re-implemented as a client setting later for better usability). #75648 (Michael Kolupaev). - Add a config
memory_worker_correct_memory_trackerto enable correction of the internal memory tracker with information from different sources read in the background thread periodically. #75714 (Antonio Andelic). - Add column
normalized_query_hashintosystem.processes. Note: while it can be easily calculated on the fly with thenormalizedQueryHashfunction, this is needed to prepare for subsequent changes. #75756 (Alexey Milovidov). - Querying
system.tableswill not throw even if there is aMergetable created over a database that no longer exists. Remove thegetTotalRowsmethod fromHivetables because we don't allow it to do complex work. #75772 (Alexey Milovidov). - Store start_time/end_time for Backups with microseconds. #75929 (Aleksandr Musorin).
- Add
MemoryTrackingUncorrectedmetric showing the value of the internal global memory tracker which is not corrected by RSS. #75935 (Antonio Andelic). - Allow parsing endpoints like
localhost:1234/handleinPostgreSQLorMySQLtable functions. This fixes a regression introduced in https://github.com/ClickHouse/ClickHouse/pull/52503. #75944 (Nikita Mikhaylov). - Added a server setting
throw_on_unknown_workloadthat allows to choose behavior on query withworkloadsetting set to unknown value: either allow unlimited access (default) or throw aRESOURCE_ACCESS_DENIEDerror. It is useful to force all queries to use workload scheduling. #75999 (Sergei Trifonov). - Don't rewrite subcolumns to
getSubcolumninARRAY JOINif not necessary. #76018 (Pavel Kruglov). - Retry coordination errors when loading tables. #76020 (Alexander Tokmakov).
- Support flushing individual logs in
SYSTEM FLUSH LOGS. #76132 (Raúl Marín). - Improved the
/binaryserver's page. Using the Hilbert curve instead of the Morton curve. Display 512 MB worth of addresses in the square, which fills the square better (in previous versions, addresses fill only half of the square). Color addresses closer to the library name rather than the function name. Allow scrolling a bit more outside of the area. #76192 (Alexey Milovidov). - Retry ON CLUSTER queries in case of TOO_MANY_SIMULTANEOUS_QUERIES. #76352 (Patrick Galbraith).
- Add the
CPUOverloadasynchronous metric, which calculates the server's relative CPU deficit. #76404 (Alexey Milovidov). - Changed the default value of
output_format_pretty_max_rowsfrom 10000 to 1000. I think it is better for usability. #76407 (Alexey Milovidov).
Bug Fix (user-visible misbehavior in an official stable release)
- Fix formatting of exceptions using a custom format if they appear during query interpretation. In previous versions, exceptions were formatted using the default format rather than the format specified in the query. This closes #55422. #74994 (Alexey Milovidov).
- Fix type mapping for SQLite (integer types into
int64, floating points intofloat64). #73853 (Joanna Hulboj). - Fix identifier resolution from parent scopes. Allow the use of aliases to expressions in the WITH clause. Fixes #58994. Fixes #62946. Fixes #63239. Fixes #65233. Fixes #71659. Fixes #71828. Fixes #68749. #66143 (Dmitry Novik).
- Fix negate function monotonicity. In previous versions, the query
select * from a where -x = -42;wherexis the primary key, can return a wrong result. #71440 (Michael Kolupaev). - Fix empty tuple handling in arrayIntersect. This fixes #72578. #72581 (Amos Bird).
- Fix reading JSON sub-object subcolumns with incorrect prefix. #73182 (Pavel Kruglov).
- Propagate Native format settings properly for client-server communication. #73924 (Pavel Kruglov).
- Check for not supported types for some storages. #74218 (Pavel Kruglov).
- Fix crash with query
INSERT INTO SELECTover PostgreSQL interface on macOS (issue #72938). #74231 (Artem Yurov). - Fixed uninitialized max_log_ptr in the replicated database. #74336 (Konstantin Morozov).
- Fix crash when inserting interval (issue #74299). #74478 (NamHoaiNguyen).
- Fix formatting constant JSON literals. Previously it could lead to syntax errors during sending the query to another server. #74533 (Pavel Kruglov).
- Fix broken create query when using constant partition expressions with implicit projections enabled. This fixes #74596 . #74634 (Amos Bird).
- Avoid leaving connection in broken state after INSERT finishes with exception. #74740 (Azat Khuzhin).
- Avoid reusing connections that had been left in the intermediate state. #74749 (Azat Khuzhin).
- Fix crash during JSON type declaration parsing when type name is not uppercase. #74784 (Pavel Kruglov).
- Keeper: fix logical_error when the connection had been terminated before establishing. #74844 (Michael Kolupaev).
- Fix a behavior when the server couldn't startup when there's a table using
AzureBlobStorage. Tables are loaded without any requests to Azure. #74880 (Alexey Katsman). - Fix missing
used_privilegesandmissing_privilegesfields inquery_logfor BACKUP and RESTORE operations. #74887 (Alexey Katsman). - HDFS refresh krb ticket if sasl error during hdfs select request. #74930 (inv2004).
- Fix queries to Replicated database in startup_scripts. #74942 (Azat Khuzhin).
- Fix issues with expressions type aliased in the JOIN ON clause when a null-safe comparison is used. #74970 (Vladimir Cherkasov).
- Revert part's state from deleting back to outdated when remove operation has failed. #74985 (Sema Checherinda).
- In previous versions, when there was a scalar subquery, we started writing the progress (accumulated from processing the subquery) during the initialization of the data format, which was before HTTP headers were written. This led to the loss of HTTP headers, such as X-ClickHouse-QueryId and X-ClickHouse-Format, as well as Content-Type. #74991 (Alexey Milovidov).
- Fix
CREATE TABLE AS...queries fordatabase_replicated_allow_replicated_engine_arguments=0. #75000 (Bharat Nallan). - Fix leaving connection in a bad state in client after INSERT exceptions. #75030 (Azat Khuzhin).
- Fix crash due to uncaught exception in PSQL replication. #75062 (Azat Khuzhin).
- Sasl can fail any rpc call, the fix helps to repeat the call in case if krb5 ticker is expired. #75063 (inv2004).
- Fixed usage of indexes (primary and secondary) for
Array,MapandNullable(..)columns with enabled settingoptimize_function_to_subcolumns. Previously, indexes for these columns could have been ignored. #75081 (Anton Popov). - Disable
flatten_nestedwhen creating materialized views with inner tables since it will not be possible to use such flattened columns. #75085 (Christoph Wurm). - Fix for some of IPv6 addresses (such as ::ffff:1.1.1.1) in forwarded_for field is wrongly interpreted resulting in client disconnect with exception. #75133 (Yakov Olkhovskiy).
- Fix nullsafe JOIN handling for LowCardinality nullable data type. Previously JOIN ON with nullsafe comparison, such as
IS NOT DISTINCT FROM,<=>,a IS NULL AND b IS NULL OR a == bdidn't work correctly with LowCardinality columns. #75143 (Vladimir Cherkasov). - Checks that we don't specify key_condition when counting total_number_of_rows for NumRowsCache. #75164 (Daniil Ivanik).
- Fix queries with unused interpolation with the new analyzer. #75173 (János Benjamin Antal).
- Fix the crash bug of CTE with Insert. #75188 (Shichao Jin).
- Keeper fix: avoid writing to broken changelogs when rolling back logs. #75197 (Antonio Andelic).
- Use
BFloat16as a supertype where appropriate. This closes: #74404. #75236 (Nikita Mikhaylov). - Fix unexpected defaults in join result with any_join_distinct_right_table_keys and OR in JOIN ON. #75262 (Vladimir Cherkasov).
- Mask azureblobstorage table engine credentials. #75319 (Garrett Thomas).
- Fixed behavior when ClickHouse may erroneously do a filter pushdown to an external database like PostgreSQL, MySQL, or SQLite. This closes: #71423. #75320 (Nikita Mikhaylov).
- Fix crash in protobuf schema cache that can happen during output in Protobuf format and parallel query
SYSTEM DROP FORMAT SCHEMA CACHE. #75357 (Pavel Kruglov). - Fix a possible logical error or uninitialized memory issue when a filter from
HAVINGis pushed down with parallel replicas. #75363 (Vladimir Cherkasov). - Hide sensitive info for
icebergS3,icebergAzuretable functions and table engines. #75378 (Kseniia Sumarokova). - Function
TRIMwith computed empty trim characters are now correctly handled. Example:SELECT TRIM(LEADING concat('') FROM 'foo')(Issue #69922). #75399 (Manish Gill). - Fix data race in IOutputFormat. #75448 (Pavel Kruglov).
- Fix possible error
Elements ... and ... of Nested data structure ... (Array columns) have different array sizeswhen JSON subcolumns with Array type are used in JOIN over distributed tables. #75512 (Pavel Kruglov). - Fix data corruption with
CODEC(ZSTD, DoubleDelta). Closes #70031. #75548 (Konstantin Bogdanov). - Fix interaction between allow_feature_tier and compatibility mergetree setting. #75635 (Raúl Marín).
- Fix incorrect processed_rows value in system.s3queue_log in case file was retried. #75666 (Kseniia Sumarokova).
- Respect
materialized_views_ignore_errorswhen a materialized view writes to a URL engine and there is a connectivity issue. #75679 (Christoph Wurm). - Fixed rare crashes while reading from
MergeTreetable after multiple asynchronousRENAMEqueries (withalter_sync = 0) between columns with different types. #75693 (Anton Popov). - Fix
Block structure mismatch in QueryPipeline streamerror for some queries withUNION ALL. #75715 (Nikolai Kochetov). - Rebuild projection on alter modify of its PK column. Previously it could lead to
CANNOT_READ_ALL_DATAerrors during selects after alter modify of the column used in projection PK. #75720 (Pavel Kruglov). - Fix incorrect result of
ARRAY JOINfor scalar subqueries (with analyzer). #75732 (Nikolai Kochetov). - Fixed null pointer dereference in
DistinctSortedStreamTransform. #75734 (Nikita Taranov). - Fix
allow_suspicious_ttl_expressionsbehaviour. #75771 (Aleksei Filatov). - Fix uninitialized memory read in function
translate. This closes #75592. #75794 (Alexey Milovidov). - Propagate format settings to JSON as string formatting in Native format. #75832 (Pavel Kruglov).
- Recorded the default enablement of parallel hash as join algorithm in v24.12 in the settings change history. This means that ClickHouse will continue to join using non-parallel hash if an older compatibility level than v24.12 is configured. #75870 (Robert Schulze).
- Fixed a bug that tables with implicitly added min-max indices could not be copied into a new table (issue #75677). #75877 (Smita Kulkarni).
clickhouse-library-bridgeallows opening arbitrary libraries from the filesystem, which makes it safe to run only inside an isolated environment. To prevent a vulnerability when it is run near the clickhouse-server, we will limit the paths of libraries to a location, provided in the configuration. This vulnerability was found with the ClickHouse Bug Bounty Program by Arseniy Dugin. #75954 (Alexey Milovidov).- We happened to use JSON serialization for some metadata, which was a mistake, because JSON does not support binary data inside string literals, including zero bytes. SQL queries can contain binary data and invalid UTF-8, so we have to support this in our metadata files as well. At the same time, ClickHouse's
JSONEachRowand similar formats work around that by deviating from the JSON standard in favor of a perfect roundtrip for the binary data. See the motivation here: https://github.com/ClickHouse/ClickHouse/pull/73668#issuecomment-2560501790. The solution is to makePoco::JSONlibrary consistent with the JSON format serialization in ClickHouse. This closes #73668. #75963 (Alexey Milovidov). - Fix check for commit limits in storage
S3Queue. #76104 (Kseniia Sumarokova). - Fix attaching MergeTree tables with auto indexes (
add_minmax_index_for_numeric_columns/add_minmax_index_for_string_columns). #76139 (Azat Khuzhin). - Fixed issue of stack traces from parent threads of a job (
enable_job_stack_tracesetting) are not printed out. Fixed issueenable_job_stack_tracesetting is not properly propagated to the threads resulting stack trace content not always respects this setting. #76191 (Yakov Olkhovskiy). - Fix incorrect permission check where
ALTER RENAMErequiredCREATE USERgrant. Closes #74372. #76241 (pufit). - Fix reinterpretAs with FixedString on big-endian architecture. #76253 (Azat Khuzhin).
- Fix logical error in S3Queue "Expected current processor to be equal to for bucket ". #76358 (Kseniia Sumarokova).
- Fix deadlock for ALTER with Memory database. #76359 (Azat Khuzhin).
- Fix logical error in index analysis if condition in
WHEREhaspointInPolygonfunction. #76360 (Anton Popov). - Fix potentially unsafe call in signal handler. #76549 (Yakov Olkhovskiy).
- Fix reverse key support in PartsSplitter. This fixes #73400. #73418 (Amos Bird).
Build/Testing/Packaging Improvement
- Support build HDFS on both ARM and Intel Mac. #74244 (Yan Xin).
- Enable ICU and GRPC when cross-compiling for Darwin. #75922 (Raúl Marín).
- Update to embedded LLVM 19. #75148 (Konstantin Bogdanov).
- Disable network access for user default in the docker image. #75259 (Mikhail f. Shiryaev). Make all clickhouse-server related actions a function, and execute them only when launching the default binary in
entrypoint.sh. A long-postponed improvement was suggested in #50724. Added switch--userstoclickhouse-extract-from-configto get values from theusers.xml. #75643 (Mikhail f. Shiryaev). - Remove about 20MB of dead code from the binary. #76226 (Alexey Milovidov).
ClickHouse release 25.1, 2025-01-28
Backward Incompatible Change
JSONEachRowWithProgresswill write the progress whenever the progress happens. In previous versions, the progress was shown only after each block of the result, which made it useless. Change the way how the progress is displayed: it will not show zero values. This closes #70800. #73834 (Alexey Milovidov).Mergetables will unify the structure of underlying tables by using a union of their columns and deriving common types. This closes #64864. In certain cases, this change could be backward incompatible. One example is when there is no common type between tables, but conversion to the type of the first table is still possible, such as in the case of UInt64 and Int64 or any numeric type and String. If you want to return to the old behavior, setmerge_table_max_tables_to_look_for_schema_inferenceto1or setcompatibilityto24.12or earlier. #73956 (Alexey Milovidov).- Parquet output format converts Date and DateTime columns to date/time types supported by Parquet, instead of writing them as raw numbers.
DateTimebecomesDateTime64(3)(was:UInt32); settingoutput_format_parquet_datetime_as_uint32brings back the old behavior.DatebecomesDate32(was:UInt16). #70950 (Michael Kolupaev). - Don't allow not comparable types (like
JSON/Object/AggregateFunction) inORDER BYand comparison functionsless/greater/equal/etcby default. #73276 (Pavel Kruglov). - The obsolete
MaterializedMySQLdatabase engine has been removed and is no longer available. #73879 (Alexey Milovidov). - The
mysqldictionary source no longer doesSHOW TABLE STATUSquery, because it does not provide any value for InnoDB tables, as long as for any recent MySQL versions. This closes #72636. This change is backward compatible, but put in this category so you have a chance to notice it. #73914 (Alexey Milovidov). CHECK TABLEqueries now require a separate,CHECKgrant. In previous versions, it was enough to haveSHOW TABLESgrant to run these queries. But aCHECK TABLEquery can be heavy, and usual query complexity limits forSELECTqueries don't apply to it. It led to the potential of DoS. #74471 (Alexey Milovidov).- Function
h3ToGeo()now returns the results in the order(lat, lon)(which is the standard order for geometric functions). Users who wish to retain the legacy result order(lon, lat)can set settingh3togeo_lon_lat_result_order = true. #74719 (Manish Gill). - A new MongoDB driver is now the default. Users who like to continue using the legacy driver can set server setting
use_legacy_mongodb_integrationto true. #73359 (Robert Schulze).
New Feature
- Added an ability to apply non-finished (not materialized by background process) mutations during the execution of
SELECTqueries immediately after submitting. It can be enabled by settingapply_mutations_on_fly. #74877 (Anton Popov). - Implement
Icebergtables partition pruning for time-related transform partition operations in Iceberg. #72044 (Daniil Ivanik). - Support subcolumns in MergeTree sorting key and skip indexes. #72644 (Pavel Kruglov).
- Support reading
HALF_FLOATvalues fromApache Arrow/Parquet/ORC(they are read intoFloat32). This closes #72960. Keep in mind that IEEE-754 half float is not the same asBFloat16. Closes #73835. #73836 (Alexey Milovidov). - The
system.trace_logtable will contain two new columns,symbolsandlinescontaining symbolized stack trace. It allows for easy collection and export of profile information. This is controlled by the server configuration valuesymbolizeinsidetrace_logand is enabled by default. #73896 (Alexey Milovidov). - Add a new function,
generateSerialID, which can be used to generate auto-incremental numbers in tables. Continuation of #64310 by kazalika. This closes #62485. #73950 (Alexey Milovidov). - Add syntax
query1 PARALLEL WITH query2 PARALLEL WITH query3 ... PARALLEL WITH queryNfor DDL queries. That means subqueries{query1, query2, ... queryN}are allowed to run in parallel with each other (and it's preferable). #73983 (Vitaly Baranov). - Added an in-memory cache for deserialized skipping index granules. This should make repeated queries that use skipping indexes faster. The size of the new cache is controlled by server settings
skipping_index_cache_sizeandskipping_index_cache_max_entries. The original motivation for the cache were vector similarity indexes which became a lot faster now. #70102 (Robert Schulze). - Now, the embedded Web UI has a progress bar during query runtime. It allows cancelling queries. It displays the total number of records and the extended information about the speed. The table can be rendered incrementally as soon as data arrives. Enable HTTP compression. Rendering of the table became faster. The table header became sticky. It allows selecting cells and navigating them by arrow keys. Fix the issue when the outline of the selected cell makes it smaller. Cells no longer expand on mouse hover but only on selection. The moment to stop rendering the incoming data is decided on the client rather than on the server side. Highlight digit groups for numbers. The overall design was refreshed and became bolder. It checks if the server is reachable and the correctness of credentials and displays the server version and uptime. The cloud icon is contoured in every font, even in Safari. Big integers inside nested data types will be rendered better. It will display inf/nan correctly. It will display data types when the mouse is over a column header. #74204 (Alexey Milovidov).
- Add the ability to create min-max (skipping) indices by default for columns managed by MergeTree using settings
add_minmax_index_for_numeric_columns(for numeric columns) andadd_minmax_index_for_string_columns(for string columns). For now, both settings are disabled, so there is no behavior change yet. #74266 (Smita Kulkarni). - Add
script_query_numberandscript_line_numberfields tosystem.query_log, to the ClientInfo in the native protocol, and to server logs. This closes #67542. Credits to pinsvin00 for kicking off this feature earlier in #68133. #74477 (Alexey Milovidov). - Added aggregation function
sequenceMatchEventswhich return timestamps of matched events for longest chain of events in pattern. #72349 (UnamedRus). - Added function
arrayNormalizedGini. #72823 (flynn). - Add minus operator support for
DateTime64, to allow subtraction betweenDateTime64values, as well asDateTime. #74482 (Li Yin).
Experimental Features
- The
BFloat16data type is production-ready. #73840 (Alexey Milovidov).
Performance Improvement
- Optimized function
indexHint. Now, columns that are only used as arguments of functionindexHintare not read from the table. #74314 (Anton Popov). If theindexHintfunction is a central piece of your enterprise data architecture, this optimization will save your life. - More accurate accounting for
max_joined_block_size_rowssetting forparallel_hashJOIN algorithm. Helps to avoid increased memory consumption compared tohashalgorithm. #74630 (Nikita Taranov). - Support predicate push down optimization on the query plan level for the
MergingAggregatedstep. It improves performance for some queries with the analyzer. #74073 (Nikolai Kochetov). - Splitting of left table blocks by hash was removed from the probe phase of the
parallel_hashJOIN algorithm. #73089 (Nikita Taranov). - Optimize RowBinary input format. Closes #63805. #65059 (Pavel Kruglov).
- Write parts with level 1 if
optimize_on_insertis enabled. It allows to use several optimizations of queries withFINALfor freshly written parts. #73132 (Anton Popov). - Speedup string deserialization by some low-level optimisation. #65948 (Nikita Taranov).
- When running an equality comparison between records, such as during merges, start to compare rows from most likely unequal columns first. #63780 (UnamedRus).
- Improve grace hash join performance by re-ranking the right join table by keys. #72237 (kevinyhzou).
- Allow
arrayROCAUCandarrayAUCPRto compute partial area of the whole curve, so that its calculation can be parallelized over huge datasets. #72904 (Emmanuel). - Avoid spawn too many idle threads. #72920 (Guo Wangyang).
- Don't list blob storage keys if we only have curly brackets expansion in table function. Closes #73333. #73518 (Konstantin Bogdanov).
- Short circuit optimization for functions executed over Nullable arguments. #73820 (李扬).
- Do not apply
maskedExecuteon non-function columns, improve the performance of short circuit execution. #73965 (lgbo). - Disable the autodetection of headers in input formats for
Kafka/NATS/RabbitMQ/FileLogto improve performance. #74006 (Azat Khuzhin). - Execute pipeline with a higher degree of parallelism after aggregation with grouping sets. #74082 (Nikita Taranov).
- Reduce critical section in
MergeTreeReadPool. #74202 (Guo Wangyang). - Parallel replicas performance improvement. Packets deserialization on query initiator, for packets not related to parallel replicas protocol, now always happens in pipeline thread. Before, it could happen in a thread responsible for pipeline scheduling, which could make initiator less responsive and delay pipeline execution. #74398 (Igor Nikonov).
- Improve performance of larger multi requests in Keeper. #74849 (Antonio Andelic).
- Use log wrappers by value and don't allocate them in a heap. #74034 (Mikhail Artemenko).
- Reestablish connection to MySQL and Postgres dictionary replicas in the background, so it wouldn't delay requests to corresponding dictionaries. #71101 (Yakov Olkhovskiy).
- Parallel replicas used historical information about replica availability to improve replica selection but did not update the replica's error count when the connection was unavailable. This PR updates the replica's error count when unavailable. #72666 (zoomxi).
- Added a merge tree setting
materialize_skip_indexes_on_mergewhich suppresses the creation of skip indexes during merge. This allows users to control explicitly (viaALTER TABLE [..] MATERIALIZE INDEX [...]) when skip indexes are created. This can be useful if skip indexes are expensive to build (e.g. vector similarity indexes). #74401 (Robert Schulze). - Optimize keeper requests in Storage(S3/Azure)Queue. #74410 (Kseniia Sumarokova). #74538 (Kseniia Sumarokova).
- Use up to
1000parallel replicas by default. #74504 (Konstantin Bogdanov). - Improve HTTP session reuse when reading from s3 disk (#72401). #74548 (Julian Maicher).
Improvement
- Support SETTINGS in a CREATE TABLE query with an implicit ENGINE and support mixing engine and query settings. #73120 (Raúl Marín).
- Enable
use_hive_partitioningby default. #71636 (Yarik Briukhovetskyi). - Support CAST and ALTER between JSON types with different parameters. #72303 (Pavel Kruglov).
- Support equal comparison for values of JSON column. #72991 (Pavel Kruglov).
- Improve formatting of identifiers with JSON subcolumns to avoid unnecessary back quotes. #73085 (Pavel Kruglov).
- Interactive metrics improvements. Fix metrics from parallel replicas not being fully displayed. Display the metrics in order of the most recent update, then lexicographically by name. Do not display stale metrics. #71631 (Julia Kartseva).
- Make JSON output format pretty by default. Add new setting
output_format_json_pretty_printto control it and enable it by default. #72148 (Pavel Kruglov). - Allow
LowCardinality(UUID)by default. This has proven practical among ClickHouse Cloud customers. #73826 (Alexey Milovidov). - Better message during installation. #73827 (Alexey Milovidov).
- Better message about password reset for ClickHouse Cloud. #73831 (Alexey Milovidov).
- Improve the error message with a File table that cannot perform appends into a file. #73832 (Alexey Milovidov).
- Ask when a user accidentally requests to output binary format (such as Native, Parquet, Avro) in the terminal. This closes #59524. #73833 (Alexey Milovidov).
- Highlight trailing spaces in Pretty and Vertical formats in the terminal for better clarity. This is controlled with the
output_format_pretty_highlight_trailing_spacessetting. Initial implementation by Braden Burns from #72996. Closes #71590. #73847 (Alexey Milovidov). clickhouse-clientandclickhouse-localwill autodetect compression of stdin when it is redirected from a file. This closes #70865. #73848 (Alexey Milovidov).- Cut too long column names in pretty formats by default. This is controlled by the
output_format_pretty_max_column_name_width_cut_toandoutput_format_pretty_max_column_name_width_min_chars_to_cutsettings. This is the continuation of the work of tanmaydatta in #66502. This closes #65968. #73851 (Alexey Milovidov). - Make
Prettyformats prettier: squash blocks if not much time passed since the output of the previous block. This is controlled by new settingsoutput_format_pretty_squash_consecutive_ms(50 ms by default) andoutput_format_pretty_squash_max_wait_ms(1000 ms by default). Continuation of #49537. This closes #49153. #73852 (Alexey Milovidov). - Add a metric on the number of currently merging source parts. This closes #70809. #73868 (Alexey Milovidov).
- Highlight columns in the
Verticalformat if the output is to a terminal. This can be disabled with theoutput_format_pretty_colorsetting. #73898 (Alexey Milovidov). - Enhanced the MySQL compatibility to a level that now,
mysqlsh(a rich MySQL CLI from Oracle) can connect to ClickHouse. This is needed to facilitate testing. #73912 (Alexey Milovidov). - Pretty formats can render multi-line fields inside a table cell, which improves readability. This is enabled by default and can be controlled by the setting
output_format_pretty_multiline_fields. Continuation of the work by Volodyachan in #64094. This closes #56912. #74032 (Alexey Milovidov). - Expose X-ClickHouse HTTP headers to JavaScript in the browser. It makes writing applications more convenient. #74180 (Alexey Milovidov).
- The
JSONEachRowWithProgressformat will include events with metadata, as well as totals and extremes. It also includesrows_before_limit_at_leastandrows_before_aggregation. The format prints the exception properly if it arrives after partial results. The progress now includes elapsed nanoseconds. One final progress event is emitted at the end. The progress during query runtime will be printed no more frequently than the value of theinteractive_delaysetting. #74181 (Alexey Milovidov). - Hourglass will rotate smoothly in Play UI. #74182 (Alexey Milovidov).
- Even if the HTTP response is compressed, send packets as soon as they arrive. This allows the browser to receive progress packets and compressed data. #74201 (Alexey Milovidov).
- If the number of output records is larger than N =
output_format_pretty_max_rows, instead of displaying only the first N rows, we will cut the output table in the middle, displaying N/2 first rows and N/2 last rows. Continuation of #64200. This closes #59502. #73929 (Alexey Milovidov). - Allow more general join planning algorithm when hash join algorithm is enabled. #71926 (János Benjamin Antal).
- Allow to create bloom_filter index on columns with data type
DateTime64. #66416 (Yutong Xiao). - When
min_age_to_force_merge_secondsandmin_age_to_force_merge_on_partition_onlyare both enabled, the part merging will ignore the max bytes limit. #73656 (Kai Zhu). - Added HTTP headers to OpenTelemetry span logs table for enhanced traceability. #70516 (jonymohajanGmail).
- Support writing
orcfile by custom time zone, not always by theGMTtime zone. #70615 (kevinyhzou). - Respect IO scheduling settings when writing backups across clouds. #71093 (János Benjamin Antal).
- Add
metriccolumn aliasnametosystem.asynchronous_metrics. #71164 (megao). - Historically for some reason, the query
ALTER TABLE MOVE PARTITION TO TABLEcheckedSELECTandALTER DELETErights instead of dedicatedALTER_MOVE_PARTITION. This PR makes use of this access type. For compatibility, this permission is also will be granted implicitly ifSELECTandALTER DELETEare granted, but this behavior will be removed in future releases. Closes #16403. #71632 (pufit). - Throw an exception when trying to materialize a column in the sort key instead of allowing it to break the sort order. #71891 (Peter Nguyen).
- Hide secrets in
EXPLAIN QUERY TREE. #72025 (Yakov Olkhovskiy). - Support parquet integer logical types in the "native" reader. #72105 (Arthur Passos).
- Interactively request credentials in the browser if the default user requires a password. In previous versions, the server returned HTTP 403; now, it returns HTTP 401. #72198 (Alexey Milovidov).
- Convert access types
CREATE_USER,ALTER_USER,DROP_USER,CREATE_ROLE,ALTER_ROLE,DROP_ROLEfrom global to parameterized. That means users can now grant access management grants more precise:. #72246 (pufit). - Add the
latest_fail_error_code_namecolumn tosystem.mutations. We need this column to introduce a new metric on stuck mutations and use it to build graphs of the errors encountered in the cloud as well as, optionally, adding a new less-noisy alert. #72398 (Miсhael Stetsyuk). - Reduce amount of allocation in the
ATTACH PARTITIONquery. #72583 (Konstantin Morozov). - Make
max_bytes_before_external_sortlimit depends on total query memory consumption (previously it was number of bytes in the sorting block for one sorting thread, now it has the same meaning asmax_bytes_before_external_group_by- it is total limit for the whole query memory for all threads). Also one more setting added to control on disk block size -min_external_sort_block_bytes. #72598 (Azat Khuzhin). - Ignore memory restrictions by trace collector. #72606 (Azat Khuzhin).
- Add server settings
dictionaries_lazy_loadandwait_dictionaries_load_at_startuptosystem.server_settings. #72664 (Christoph Wurm). - Adds setting
max_backup_bandwidthto the list of settings that can be specified as part ofBACKUP/RESTOREqueries. #72665 (Christoph Wurm). - Reducing the log level for appearing replicated parts in the ReplicatedMergeTree engine to help minimize the volume of logs generated in a replicated cluster. #72876 (mor-akamai).
- Improve extraction of common expression in disjunctions. Allow simplifying the resulting filter expression even if there's no common subexpression for all the disjuncts. Continuation of #71537. #73271 (Dmitry Novik).
- In Storage
S3Queue/AzureQueueallow to add settings where table was created without settings. #73283 (Kseniia Sumarokova). - Introduce a setting
least_greatest_legacy_null_behavior(default:false) which controls if functionsleastandgreatesthandleNULLarguments by unconditionally returningNULL(iftrue) or by ignoring them (iffalse). #73344 (Robert Schulze). - Use Keeper multi requests in the cleanup thread of ObjectStorageQueueMetadata. #73357 (Antonio Andelic).
- When ClickHouse runs under a cgroup we will still collect system-wide asynchronous metrics related to system load, process scheduling, memory etc. They might provide useful signals when ClickHouse is the only process on the host with high resource consumption. #73369 (Nikita Taranov).
- In storage
S3Queueallow to transfer old ordered tables created before 24.6 to new structure with buckets. #73467 (Kseniia Sumarokova). - Add
system.azure_queuesimilar to existingsystem.s3queue. #73477 (Kseniia Sumarokova). - Function
parseDateTime64(and its variants) now produces correct results for input dates before 1970 / after 2106. Example:SELECT parseDateTime64InJodaSyntax('2200-01-01 00:00:00.000', 'yyyy-MM-dd HH:mm:ss.SSS'). #73594 (zhanglistar). - Address some
clickhouse-disksusability issues addressed by users. Closes #67136. #73616 (Daniil Ivanik). - Allow to alter commit settings in storage S3(Azure)Queue. (Commit settings are:
max_processed_files_before_commit,max_processed_rows_before_commit,max_processed_bytes_before_commit,max_processing_time_sec_before_commit). #73635 (Kseniia Sumarokova). - In storage S3(Azure)Queue aggregate progress between sources to compare with commit limit settings. #73641 (Kseniia Sumarokova).
- Support core settings in
BACKUP/RESTOREquery. #73650 (Vitaly Baranov). - Take into account the
output_format_compression_levelon Parquet output. #73651 (Arthur Passos). - Adds reading Apache Arrow's
fixed_size_listas anArrayinstead of treating it as an unsupported type. #73654 (Julian Meyers). - Add two backup engines:
Memory(keeps backups inside the current user session), andNull(don't keep backups anywhere), which is for testing. #73690 (Vitaly Baranov). concurrent_threads_soft_limit_numandconcurrent_threads_soft_limit_num_ratio_to_corescould be changed w/o restart of a server. #73713 (Sergei Trifonov).- Add support for extended numeric types (
Decimal, big integers) informatReadablefunctions. #73765 (Raúl Marín). - Support TLS for Postgres wire protocol compatibility. #73812 (scanhex12).
- The function
isIPv4Stringreturned true if the correct IPv4 address was followed by a zero byte, while it should return false in this case. Continuation of #65387. #73946 (Alexey Milovidov). - Make the error code in the MySQL wire protocol compatible with MySQL. Continuation of #56831. Closes #50957. #73948 (Alexey Milovidov).
- Add setting
validate_enum_literals_in_opearatorsto validate enum literals in operators likeIN,NOT INagainst the enum type and throw an exception if the literal is not a valid enum value. #73985 (Vladimir Cherkasov). - In Storage
S3(Azure)Queuecommit all files (in a single butch defined by commit settings) in a single keeper transaction. #73991 (Kseniia Sumarokova). - Disable header detection for executable UDFs and dictionaries (could lead to Function 'X': wrong result, expected Y row(s), actual Y-1). #73992 (Azat Khuzhin).
- Add the
distributedoption forEXPLAIN PLAN.Now,EXPLAIN distributed=1 ...appends remote plan toReadFromParallelRemote*steps. #73994 (Nikolai Kochetov). - Use correct return type for not/xor with Dynamic arguments. #74013 (Pavel Kruglov).
- Allow changing
add_implicit_sign_column_constraint_for_collapsing_engineafter table creation. #74014 (Christoph Wurm). - Support subcolumns in materialized view select query. #74030 (Pavel Kruglov).
- There are now three simple ways to set a custom prompt in
clickhouse-client: 1. via command-line parameter--prompt, 2. in the configuration file, via settings<prompt>[...]</prompt>, and 3. also in the configuration file, via per-connection settings<connections_credentials><prompt>[...]</prompt></connection_credentials>. #74168 (Christoph Wurm). - Autodetect secure connection based on connecting to port 9440 in ClickHouse Client. #74212 (Christoph Wurm).
- Authenticate users with username only for http_handlers (previously it requires user to put the password as well). #74221 (Azat Khuzhin).
- Support for the alternative query languages PRQL and KQL was marked experimental. To use them, specify settings
allow_experimental_prql_dialect = 1andallow_experimental_kusto_dialect = 1. #74224 (Robert Schulze). - Support returning the default Enum type in more aggregate functions. #74272 (Raúl Marín).
- In
OPTIMIZE TABLE, it is now possible to specify keywordFORCEas an alternative to existing keywordFINAL. #74342 (Robert Schulze). - Add the
IsServerShuttingDownmetric, which is needed to trigger an alert when the server shutdown takes too much time. #74429 (Miсhael Stetsyuk). - Added Iceberg tables names to EXPLAIN. #74485 (alekseev-maksim).
- Provide a better error message when using RECURSIVE CTE with the old analyzer. #74523 (Raúl Marín).
- Show extended error messages in
system.errors. #74574 (Vitaly Baranov). - Allow to use password for client communication with clickhouse-keeper. This feature is not very useful if you specify proper SSL configuration for server and client, but still can be useful for some cases. Password cannot be longer than 16 characters. It's not connected with Keeper Auth model. #74673 (alesapin).
- Add error code for config reloader. #74746 (Garrett Thomas).
- Added support for IPv6 addresses in MySQL and PostgreSQL table functions and engines. #74796 (Mikhail Koviazin).
- Implement short circuit optimization for
divideDecimal. Fixes #74280. #74843 (Kevin Mingtarja). - Now users can be specified inside the startup scripts. #74894 (pufit).
- Add support for Azure SAS Tokens. #72959 (Azat Khuzhin).
Bug Fix (user-visible misbehavior in an official stable release)
- Set parquet compression level only if compression codec supports it. #74659 (Arthur Passos).
- Fixed a regression that using collation locales with modifiers throws an error. As an example,
SELECT arrayJoin(['kk 50', 'KK 01', ' KK 2', ' KK 3', 'kk 1', 'x9y99', 'x9y100']) item ORDER BY item ASC COLLATE 'tr-u-kn-true-ka-shiftednow works. #73544 (Robert Schulze). - Fix cannot create SEQUENTIAL node with keeper-client. #64177 (Duc Canh Le).
- Fix incorrect character counting in the position functions. #71003 (思维).
RESTOREoperations for access entities required more permission than necessary because of unhandled partial revokes. This PR fixes the issue. Closes #71853. #71958 (pufit).- Avoid pause after
ALTER TABLE REPLACE/MOVE PARTITION FROM/TO TABLE. Retrieve correct settings for background task scheduling. #72024 (Aleksei Filatov). - Fix handling of empty tuples in some input and output formats (e.g. Parquet, Arrow). #72616 (Michael Kolupaev).
- Column-level GRANT SELECT/INSERT statements on wildcard databases/tables now throw an error. #72646 (Johann Gan).
- Fix the situation when a user can't run
REVOKE ALL ON *.*because of implicit grants in the target access entity. #72872 (pufit). - Fix positive timezone formatting of formatDateTime scalar function. #73091 (ollidraese).
- Fix to correctly reflect source port when connection made through PROXYv1 and
auth_use_forwarded_addressis set - previously proxy port was incorrectly used. AddcurrentQueryID()function. #73095 (Yakov Olkhovskiy). - Propagate format settings to NativeWriter in TCPHandler, so settings like
output_format_native_write_json_as_stringare applied correctly. #73179 (Pavel Kruglov). - Fix a crash in StorageObjectStorageQueue. #73274 (Kseniia Sumarokova).
- Fix rare crash in refreshable materialized view during server shutdown. #73323 (Michael Kolupaev).
- The
%fplaceholder of functionformatDateTimenow unconditionally generates six (sub-second) digits. This makes the behavior compatible with MySQLDATE_FORMATfunction. The previous behavior can be restored using settingformatdatetime_f_prints_scale_number_of_digits = 1. #73324 (ollidraese). - Fixed filtering by
_etagcolumn while reading froms3storage and table function. #73353 (Anton Popov). - Fix
Not-ready Set is passed as the second argument for function 'in'error whenIN (subquery)is used inJOIN ONexpression, with the old analyzer. #73382 (Nikolai Kochetov). - Fix preparing for squashin for Dynamic and JSON columns. Previously in some cases new types could be inserted into shared variant/shared data even when the limit on types/paths is not reached. #73388 (Pavel Kruglov).
- Check for corrupted sizes during types binary decoding to avoid too big allocations. #73390 (Pavel Kruglov).
- Fixed a logical error when reading from single-replica cluster with parallel replicas enabled. #73403 (Michael Kolupaev).
- Fix ObjectStorageQueue with ZooKeeper and older Keeper. #73420 (Antonio Andelic).
- Implements fix, needed to enable hive partitioning by default. #73479 (Yarik Briukhovetskyi).
- Fix data race when creating vector similarity index. #73517 (Antonio Andelic).
- Fixes segfault when the source of the dictionary contains a function with wrong data. #73535 (Yarik Briukhovetskyi).
- Fix retries on failed insert in storage S3(Azure)Queue. Closes #70951. #73546 (Kseniia Sumarokova).
- Fixed error in function
tupleElementwhich may appear in some cases for tuples withLowCardinalityelements and enabled settingoptimize_functions_to_subcolumns. #73548 (Anton Popov). - Fix parsing enum glob followed by range one. Fixes #73473. #73569 (Konstantin Bogdanov).
- Fixed parallel_replicas_for_non_replicated_merge_tree being ignored in subqueries for non-replicated tables. #73584 (Igor Nikonov).
- Fix for std::logical_error thrown when task cannot be scheduled. Found in stress tests. #73629 (Alexander Gololobov).
- Do not interpret queries in
EXPLAIN SYNTAXto avoid logical errors with incorrect processing stage for distributed queries. Fixes #65205. #73634 (Dmitry Novik). - Fix possible data inconsistency in Dynamic column. Fixes possible logical error
Nested columns sizes are inconsistent with local_discriminators column size. #73644 (Pavel Kruglov). - Fixed
NOT_FOUND_COLUMN_IN_BLOCKin queries withFINALandSAMPLE. Fixed incorrect result in selects withFINALfromCollapsingMergeTreeand enabled optimizations ofFINAL. #73682 (Anton Popov). - Fix crash in LIMIT BY COLUMNS. #73686 (Raúl Marín).
- Fix the bug when the normal projection is forced to use, and query is exactly the same as the projection defined, but the projection is not selected and thus error is prompted. #73700 (Shichao Jin).
- Fix deserialization of Dynamic/Object structure. It could lead to CANNOT_READ_ALL_DATA exceptions. #73767 (Pavel Kruglov).
- Skip
metadata_version.txtin while restoring parts from a backup. #73768 (Vitaly Baranov). - Fix segmentation fault when Casting to Enum with LIKE. #73775 (zhanglistar).
- Fix for S3 Express bucket not working as disk. #73777 (Sameer Tamsekar).
- Allow merging of rows with invalid sign column values in CollapsingMergeTree tables. #73864 (Christoph Wurm).
- Fix getting error when querying ddl with offline replica. #73876 (Tuan Pham Anh).
- Fixes occasional failure to compare
map()types due to possibility to createMaplacking explicit naming ('keys','values') of its nested tuple. #73878 (Yakov Olkhovskiy). - Ignore window functions during GROUP BY ALL clause resolution. Fix #73501. #73916 (Dmitry Novik).
- Fix implicit privileges (worked as wildcard before). #73932 (Azat Khuzhin).
- Fix high memory usage during nested Maps creation. #73982 (Pavel Kruglov).
- Fix parsing nested JSON with empty keys. #73993 (Pavel Kruglov).
- Fix: alias can be not added to the projection if it is referenced by another alias and selected in inverse order. #74033 (Yakov Olkhovskiy).
- Ignore object not found errors for Azure during plain_rewritable disk initialization. #74059 (Julia Kartseva).
- Fix behaviour of
anyandanyLastwith enum types and empty table. #74061 (Joanna Hulboj). - Fixes case when the user specifies keyword arguments in the kafka table engine. #74064 (Yarik Briukhovetskyi).
- Fix altering Storage
S3Queuesettings with "s3queue_" prefix to without and vice versa. #74075 (Kseniia Sumarokova). - Add a setting
allow_push_predicate_ast_for_distributed_subqueries. This adds AST-based predicate push-down for distributed queries with the analyzer. This is a temporary solution that we use until distributed queries with query plan serialization are supported. Closes #66878 #69472 #65638 #68030 #73718. #74085 (Nikolai Kochetov). - Fixes issue when after #73095 port can be present in the forwarded_for field, which leads to inability to resolve host name with port included. #74116 (Yakov Olkhovskiy).
- Fixed incorrect formatting of
ALTER TABLE (DROP STATISTICS ...) (DROP STATISTICS ...). #74126 (Han Fei). - Fix for issue #66112. #74128 (Anton Ivashkin).
- It is no longer possible to use
Loopas a table engine inCREATE TABLE. This combination was previously causing segfaults. #74137 (Yarik Briukhovetskyi). - Fix security issue to prevent SQL injection in postgresql and sqlite table functions. #74144 (Pablo Marcos).
- Fix crash when reading a subcolumn from the compressed Memory engine table. Fixes #74009. #74161 (Nikita Taranov).
- Fixed an infinite loop occurring with queries to the system.detached_tables. #74190 (Konstantin Morozov).
- Fix logical error in s3queue during setting file as failed. #74216 (Kseniia Sumarokova).
- Fix native copy settings (
allow_s3_native_copy/allow_azure_native_copy) forRESTOREfrom base backup. #74286 (Azat Khuzhin). - Fixed the issue when the number of detached tables in the database is a multiple of max_block_size. #74289 (Konstantin Morozov).
- Fix copying via ObjectStorage (i.e. S3) when source and destination credentials differs. #74331 (Azat Khuzhin).
- Fix detection of "use the Rewrite method in the JSON API" for native copy on GCS. #74338 (Azat Khuzhin).
- Fix incorrect calculation of
BackgroundMergesAndMutationsPoolSize(it was x2 from real value). #74509 (alesapin). - Fix the bug of leaking keeper watches when enable Cluster Discovery. #74521 (RinChanNOW).
- Fix mem alignment issue reported by UBSan #74512. #74534 (Arthur Passos).
- Fix KeeperMap concurrent cleanup during table creation. #74568 (Antonio Andelic).
- Do not remove unused projection columns in subqueries in the presence of
EXCEPTorINTERSECTto preserve the correct query result. Fixes #73930. Fixes #66465. #74577 (Dmitry Novik). - Fixed
INSERT SELECTqueries between tables withTuplecolumns and enabled sparse serialization. #74698 (Anton Popov). - Function
rightworks incorrectly for const negative offset. #74701 (Daniil Ivanik). - Fix insertion of gzip-ed data sometimes fails due to flawed decompression on client side. #74707 (siyuan).
- Partial revokes with wildcard grants could remove more privileges than expected. Closes #74263. #74751 (pufit).
- Keeper fix: fix reading log entries from disk. #74785 (Antonio Andelic).
- Fixed checking grants for SYSTEM REFRESH/START/STOP VIEW, now it's not required to have this grant on
*.*to execute a query for a specific view, only grant for this view are required. #74789 (Alexander Tokmakov). - The
hasColumnInTablefunction doesn't account for alias columns. Fix it to also work for alias columns. #74841 (Bharat Nallan). - Fix FILE_DOESNT_EXIST error occurring during data parts merge for a table with an empty column in Azure Blob Storage. #74892 (Julia Kartseva).
- Fix projection column name when joining temporary tables, close #68872. #74897 (Vladimir Cherkasov).
Build/Testing/Packaging Improvement
- The universal installation script will propose installation even on macOS. #74339 (Alexey Milovidov).