Skip to main content
Skip to main content

v25.12 Changelog for Cloud

Backward Incompatible Changes

Data type changes

  • Introduce Geometry type. Support reading WKB and WKT formats for it. In previous versions, the Geometry type was aliased to String, but now it is a full-featured type. #83344 (Konstantin Vedernikov).
  • Remove deprecated Object type. #85718 (Pavel Kruglov).
  • Escape filenames created for Variant type subcolumns in Wide data part of MergeTree tables. This change breaks compatibility with old tables with Variant/Dynamic/JSON data types. It fixes storing types with special symbols inside Variant (like DateTime with specific timezone that contains \). Escaping can be disabled by changing MergeTree setting escape_variant_subcolumn_filenames (to keep compatibility disable this setting in the config for MergeTree or set compatibility setting to the previous version before upgrade). Resolves #69590. #87300 (Pavel Kruglov).

Query and function changes

  • ALTER MODIFY COLUMN now requires explicit DEFAULT when converting nullable columns to non-nullable types. Previously such ALTERs could get stuck with cannot convert null to not null errors, now NULLs are replaced with column's default expression. Resolves #5985. #84770 (Vladimir Cherkasov).
  • Remove settings allow_not_comparable_types_in_order_by/allow_not_comparable_types_in_comparison_functions. Allowing non-comparable types in order by or comparison functions may lead to logical errors and unexpected results. Resolves #90028. #90527 (Pavel Kruglov).
  • Fix functions bitShiftLeft and bitShiftRight to return 0 or empty value in case of a shift exactly of the size of the type. #91943 (Pablo Marcos).
  • Ngram tokenizer will no longer return ngrams less than the length N it was set with. Text Search will return no rows when search tokens are empty. #89757 (George Larionov).

Storage and index changes

  • Remove the obsolete LIVE VIEW feature. If you use LIVE VIEW, upgrading to the new version will not be possible. #88706 (Alexey Milovidov).
  • Prohibit the creation of multiple plain-rewritable disks on top of the shared object storage path, as this can lead to undefined behavior during collisions of different metadata storage transactions. #89038 (Mikhail Artemenko).
  • It is now forbidden to create special MergeTree tables (such as ReplacingMergeTree, CollapsingMergeTree, etc.) with an empty ORDER BY key, since merge behavior in these tables is undefined. If you still need to create such a table, enable the allow_suspicious_primary_key setting. #91569 (Anton Popov).
  • Multiple fixes around implicit indices. The schema shown or stored (keeper metadata) won't include implicit indices, such as the ones created by settings add_minmax_index_for_numeric_columns or add_minmax_index_for_string_columns. This might cause metadata errors when a ReplicatedMergeTree table is created or updated in a newer version, while there is a replica in an older release. #91429 (Raúl Marín).

Settings and configuration changes

  • Support exception tagging for HTTP results response to enable clients to parse exceptions more reliably. Resolves #75175. The setting http_write_exception_in_output_format is disabled by default for consistency across formats. #88818 (Kaviraj Kanagaraj).
  • Fixes Kafka storage SASL settings precedence. Table-level SASL settings specified in CREATE TABLE queries now correctly override consumer/producer-specific settings from configuration files. #89401 (János Benjamin Antal).
  • Renamed ACME configuration parameters refresh_certificates_task_interval to refresh_certificates_task_interval_seconds and refresh_certificates_before to refresh_certificates_before_seconds. The refresh_certificates_task_interval_seconds parameter now expects a value in seconds. #92211 (Konstantin Bogdanov).
  • Marks disabled positional arguments in the projections as a backward-incompatible change. Additionally, it introduces the enable_positional_arguments_for_projections setting to enable a safe ClickHouse cluster upgrade when positional arguments are present in the projections. #92007 (Dmitry Novik).

Client changes

  • Update clickhouse-client to return a non-zero exit code (159 - TIMEOUT_EXCEEDED) when a query times out due to receive_timeout. Previously, timeouts would return exit code 0 (success), making it difficult for scripts and automation to detect timeout failures. #91432 (Sav).

Statistics format changes

  • When alter column from String to Nullable(String), we will not do mutation to the data. But for uniq aggregate function, it uses different data structure: for nullable column, it will use AggregateFunctionNull with a nested uniq aggregator. The AggregateFunctionNull will serialize an extra bool flag. This will make the statistics file incompatible. The format of statistics has changed, the server will crash if we have statistics with old format. To avoid exception, run ALTER TABLE [db.]table MATERIALIZE STATISTICS ALL to regenerate the statistics. #90311 (Han Fei).

Other breaking changes

  • Fix Fatal when compressing data with size not aligned to element size (in T64 codec). Resolves #89282. #89432 (yanglongwei).

New Features

Functions

  • Added new SQL statement EXECUTE AS to support user impersonation. Resolves #39048. #70775 (Shankar).
  • Add flipCoordinates function that unwraps the required number of dimensions in an array and swaps pointers inside the Tuple column. Resolves #79469. #79634 (Sachin Kumar Singh).
  • Enhanced IS NOT DISTINCT FROM (<=>) operator: added support for inverse IS DISTINCT FROM, support compatible numeric operands of different types (e.g., Nullable(UInt32) and Nullable(Int64)). #87581 (yanglongwei).
  • Added support for the cume_dist window function. Fixes #86920. #88102 (Manuel).
  • Functions to calculate area and perimeter for the geometry type. #89047 (Konstantin Vedernikov).
  • Implement dictGetKeys function that returns the dictionary key(s) whose attribute equals the specified value. It uses a per-query reverse-lookup cache, tuned by the max_reverse_dictionary_lookup_cache_size_bytes setting, to speed up repeated lookups. #89197 (Nihal Z. Miaji).
  • Support for arrayRemove(arr, elem) to remove all elements equal to elem from the array arr. Resolves #52099. #89585 (tiwarysaurav).
  • Introduces midpoint scalar function that calculates average. Resolves #89029. #89679 (simonmichal).
  • You can now retrieve both the argument and its corresponding minimum or maximum value using the new argAndMin and argAndMax functions. #89884 (AbdAlRahman Gad).
  • Add HMAC(algorithm, message, key) sql function as a part of #73900 and #38775. #90837 (Mikhail f. Shiryaev).
  • Add support for has() function to use primary key and data skipping indexes when the first argument is a constant array. Closes #90980. #91023 (Nihal Z. Miaji).

System tables

  • Add system.unicode table, containing a list of Unicode characters and their properties. Closes #80055. #80857 (wxybear).
  • Added a new system table shared_merge_tree_condemned_parts similar to shared_merge_tree_outdated_parts, which lists the condemned parts about to be killed by PartsKillerThread. (Smita Kulkarni).

Table engines and storage

  • Support for a part of the Prometheus HTTP Query API. To enable it, add a rule with type query_api in the <prometheus> section in the configuration file. Supported handlers are /api/v1/query_range and /api/v1/query. #86132 (Nikita Mikhaylov).
  • Users can now configure S3/Azure Queue tables to move or tag processed files, in addition to the previous options to keep or remove files. Resolves #72944. #86907 (Murat Khairulin).
  • Add a new MergeTree setting merge_max_dynamic_subcolumns_in_wide_part to be able to limit the number of dynamic subcolumns in the Wide part after merge regardless of the parameters specified in the data type. #87646 (Pavel Kruglov).
  • Microsoft OneLake catalog integration. #89366 (Konstantin Vedernikov).
  • Support CREATE OR REPLACE syntax for temporary tables. Closes #35888. #89450 (Aleksandr Musorin).
  • Support direct (nested loop) join for MergeTree tables. To use it, specify it as the single option in the setting: join_algorithm = 'direct'. #89920 (Vladimir Cherkasov).
  • This PR introduces projection-level settings, exposed through the new WITH SETTINGS clause in ALTER TABLE ... ADD PROJECTION. These settings allow projections to override certain MergeTree storage parameters (e.g. index_granularity, index_granularity_bytes) on a per-projection basis. #90158 (Amos Bird).

Iceberg and data lakes

SQL and query features

  • Add allow_reentry option to windowFunnel aggregate function. When enabled with strict_order, it ignores events that violate the order instead of stopping the funnel analysis. This enables handling user journeys with refreshes (A->A->B) or back-navigation (A->B->A->C) without underreporting conversion rates. #86916 (Lee ChaeRok).
  • User can now add a new argument preprocessor in text index construction. The argument is an arbitrary expression that transforms each document before tokenization. #88272 (Jimmy Aguilar Mena).
  • Add support for fractional LIMIT and OFFSET for selecting a fraction of a table. Closes #81892. #88755 (Ahmed Gouda).
  • Add setting into_outfile_create_parent_directories to automatically create parent directories for INTO OUTFILE, preventing errors when output paths do not exist. Resolves #88610. #88795 (Saksham).
  • Add setting type_json_skip_invalid_typed_paths to disable exceptions for inserts/type casts to JSON type when input JSON cannot be cast to explicit typed paths in JSON type. Falls back to null/zero value of typed path. Closes #86917. #89886 (Max Justus Spransy).

Client and CLI features

  • CLI client can now suppress the 'ClickHouse server version is older than ClickHouse client. It may indicate that the server is out of date and can be upgraded.' message by specifying --no-server-client-version-message or false. #87784 (Larry Snizek).
  • Access ClickHouse Cloud instances using Cloud credentials with --login. #89261 (Krishna Mannem).
  • Web UI now provides a download button. It downloads the full result even if the UI displays only part of it. #89768 (Alexey Milovidov).

Server configuration and monitoring

  • Adds a memory_usage field to X-ClickHouse-Progress and X-ClickHouse-Summary. This can be used to collect memory usage of queries in real time on the client side. #88393 (Christoph Wurm).
  • Added send_profile_events setting which allows clients to reduce network traffic when profile events are unused. #89588 (Kaviraj Kanagaraj).

Keeper

Input/Output formats

  • Implement new input output format Buffers. This format is similar to Native; however, unlike Native, it does not store column names, column types, or any extra metadata. Closes #84017. #91156 (Nihal Z. Miaji).
  • Add arrow_flight_request_descriptor_type setting to support Dremio and other Arrow Flight servers that require command-style descriptors. Fixes #89523. #89826 (Shreyas Ganesh).
  • Added kafka_schema_registry_skip_bytes setting to Kafka table engine to skip envelope header bytes (e.g., AWS Glue Schema Registry's 19-byte prefix) before parsing message payload. #89621 (Taras Polishchuk).

Other new features

  • Add a setting max_streams_for_files_processing_in_cluster_functions to control number of streams for parallel files reading in Cluster table functions. Closes #90223. #91323 (Pavel Kruglov).
  • Allow disabling background download of nearby part data on a per-query basis. Fixes #89524. #89668 (tanner-bruce).
  • Experimentally support e2k (Elbrus-2000) as a new platform for ClickHouse. #90159 (Ramil Sattarov).

Experimental Features

  • Support TLS certificates retrieval from ACME providers, RFC 8555. #66315 (Konstantin Bogdanov).
  • The new logic is introduced to automatically execute queries using parallel replicas, controlled by the setting automatic_parallel_replicas_mode. #87541 (Nikita Taranov).
  • Full-text search is now in private preview (from a previously experimental stage). #88928 (Robert Schulze).
  • Move Alias to experimental, can be enabled with allow_experimental_alias_table_engine=1. #89712 (Kai Zhu).

Performance Improvements

Query execution and optimization

  • Fail fast when queries reach row limits. Resolves #61872. #62804 (Sean Haynes).
  • Add optimization to remove unused columns in query plans. Resolves #75152. #76487 (János Benjamin Antal).
  • Optimization for large value in ConstantNode. Closes #72880. #81104 (Yakov Olkhovskiy).
  • Prefetch keys during hash table iteration to minimize cache misses. #84708 (lgbo).
  • Improve LZ4 decompression speed by simplifying the code and tweaking the selection algorithm. #88360 (Raúl Marín).
  • Implement lazy columns replication in JOIN and ARRAY JOIN. Avoid converting special columns representation like Sparse and Replicated to full columns in some output formats. This avoids unnecessary data copy in memory. #88752 (Pavel Kruglov).
  • Use advanced SIMD operations for logical functions via dynamic dispatch. #90432 (Raúl Marín).
  • Improve JIT function performing by not initializing the result column to zero unnecessarily. #90449 (Raúl Marín).
  • Speed up T64 decompression via dynamic dispatch. #90610 (Raúl Marín).
  • Speed up converting columns to bool (in WHERE clauses) via dynamic dispatch. #91203 (Raúl Marín).
  • Speed up sorting of single numeric block via dynamic dispatch. #91213 (Raúl Marín).

JOIN optimizations

  • RIGHT and FULL JOINs now use ConcurrentHashJoi`n; that means that these types of join are now running with a higher degree of parallelism. Improves various cases for RIGHT and FULL JOINs up to 2 times. Resolves #78027. #78462 (Yarik Briukhovetskyi).
  • Allow rewriting ANY LEFT JOIN or ANY RIGHT JOIN to ALL INNER JOIN in some cases. #89403 (Dmitry Novik).
  • Support JOIN runtime filters for ANTI JOINs. Also, refactor the runtime filters implementation to reduce lock contention. #89710 (Dmitry Novik).
  • Support keeping reading in order from the left table in LEFT/INNER JOIN operations, which can be utilized by subsequent steps. #89815 (Vladimir Cherkasov).

MergeTree and storage optimizations

  • Up to 8x faster SELECT queries with heavy partition pruning on tables with 10K+ parts. #85535 (James Morrison).
  • When a query uses fixed hash map for aggregation state(group by a small integer), ClickHouse would merge the aggregation state in parallel to speed up the query. Resolves #63666. #87366 (Jianfei Hu).
  • Parquet reader v3 is enabled by default. #88827 (Michael Kolupaev).
  • Queries can now benefit from optimize_read_in_order and query_plan_optimize_lazy_materialization simultaneously. Resolves #88767. #88866 (Manuel).
  • Use aggregate projection for queries with DISTINCT. Closes #86925. #88894 (Nihal Z. Miaji).
  • Run streaming LIMIT BY transform in cases when input sort order matches LIMIT BY keys. #88969 (Eduard Karacharov).
  • Added support of sparse serialization for columns of Nullable type. #88999 (Amos Bird).
  • Optimize MergeTree reader inplace filtering. Resolves #87119. #90630 (Xiaozhe Yu).
  • Introduce an additional heuristic to reduce the widths of the selected merge choices. #91163 (Mikhail Artemenko).

Index and text search optimizations

  • ClickHouse now uses skip indexes to perform index analysis on WHERE clauses with mixed AND- and OR-connected filter conditions. Previously, the WHERE clause needed to be a conjunction (AND) of filter conditions to utilize skip indexes. A new setting use_skip_indexes_for_disjunctions (default: on) controls this feature. #87781 (Shankar Iyer).
  • Improved filtering performance for predicates with functions such as like, equals, has, and others by leveraging an additional preliminary filter built from the text index. This optimization is enabled via the query_plan_text_index_add_hint setting. #88550 (Anton Popov).
  • Improved text index performance by caching dictionary blocks and using hashtables for token lookups instead of binary search. #88786 (Elmi Ahmadov).
  • Since posting lists are the largest by the data size, caching them would improve the performance in consecutive runs. #88912 (Elmi Ahmadov).
  • Optimize repeated inverse dictionary lookups by doing faster lookups into a precomputed set of possible key values. Closes #7968. #88971 (Nihal Z. Miaji).
  • Optimize ORDER BY...LIMIT N queries by using skip index and dynamic threshold filter to significantly reduce rows processed. #89835 (Shankar Iyer).
  • Users should see lower latency in index analysis when large minmax indexes (millions of granules) are present. #90428 (Shankar Iyer).

Aggregation optimizations

  • Optimize AggregateFunctionHistogram by sorting only the tail of points array and skipping sort for monotonic inputs, achieving ~10% speedup. #85760 (MakarDev).
  • Slightly speed up some countDistinct operations by reducing the overhead of HashSetTable::merge. #89727 (Raúl Marín).
  • Improve topK performance and behaviour. #90091 (Raúl Marín).
  • Improved performance of Decimal comparison operations. Resolves #28192. #90153 (Konstantin Bogdanov).

S3 and backup optimizations

  • S3 partitions objects internally based on key-name prefixes and automatically scales to high request rates per partition. This change introduces two new BACKUP settings: data_file_name_generator and data_file_name_prefix_length. When data_file_name_generator=checksum, backup data files are named using a hash of their contents. #88418 (Julia Kartseva).
  • Improve query performance for S3 tables created with glob pattern by pushing down _path filter values, which allows to avoid S3 listing operations. Controlled by the s3_path_filter_limit setting. #91165 (Eduard Karacharov).

Data lake optimizations

Improvements

Query optimization and execution

  • Allow FETCH PARTITION when there are broken disks in replicated merge tree tables. #58663 (Duc Canh Le).
  • Add h3PolygonToCells function which can fill geometry with h3 hexagons. Resolves #33991. #66262 (Zacharias Knudsen).
  • All DDL ON CLUSTER queries now execute with the original query user context for better access validation. #71334 (pufit).
  • Added parallelism for ALTER TABLE ... FREEZE queries. #71743 (Kirill).
  • Allows the use of non-constant second arguments for IN. It also supports a tuple as a second argument. #77906 (Yarik Briukhovetskyi).
  • This PR allows using normal projections as a secondary index. When enabled, certain query predicates can be used to read from projection parts and generate bitmaps to filter rows efficiently during the PREWHERE stage. #81021 (Amos Bird).
  • Enable enable_shared_storage_snapshot_in_query by default for better consistency guarantees. #82634 (Alexey Milovidov).
  • UNION should unify types with Variant if needed. Resolves #82772. #83246 (Mithun p).
  • Log internal queries (those executed internally by dictionaries, refreshable materialized views, etc) and add the new is_internal column to system.query_log. #83277 (Miсhael Stetsyuk).
  • Allows INSERT into ALIAS columns (columns that simply refers to a physical column without any expression). Closes #80060. #84154 (Shaurya Mohan).
  • You can see a progress bar, logs and performance statistics for CREATE OR REPLACE TABLE queries with SELECT in clickhouse-client. Resolves #38416. #87247 (Diskein).
  • Support JSON and Dynamic types in hash functions. Resolves #87734. #87791 (Pavel Kruglov).
  • The default value of query_plan_optimize_join_order_limit is changed to 10. #89312 (Alexey Milovidov).
  • The optimization enable_lazy_columns_replication is now the default, which will save memory usage in joins. #89316 (Alexey Milovidov).
  • Enable the setting allow_statistics_optimize by default, so the JOINs optimizer will use column statistics. #89332 (Alexey Milovidov).
  • Enable create_table_empty_primary_key_by_default by default. This is better for usability. #89333 (Alexey Milovidov).
  • Setting enable_time_time64_type is now enabled by default. #89345 (Yarik Briukhovetskyi).
  • Enable setting allow_special_serialization_kinds_in_output_formats by default. #89402 (Pavel Kruglov).
  • Ignore ON CLUSTER in queries executed through Shared Catalog. (Nikolay Degterinsky).
  • Add support for ALTER DATABASE MODIFY COMMENT to Shared Catalog. (Nikolay Degterinsky).
  • Support CREATE OR REPLACE for SharedSet/SharedJoin in Shared databases. (Tuan Pham Anh).
  • Avoid waiting for other queries when running SYNC REPLICA in SharedMergeTree. (Raúl Marín).

Storage and MergeTree improvements

  • Add new virtual column _tags (Map(String, String)) with all the tags associated with the blob in S3. Resolves #72945. #77773 (Zicong Qu).
  • Add error message that the part was deduplicated. #80264 (Aleksandr Musorin).
  • Use OpenSSL 3.5.4. #81389 (Konstantin Bogdanov).
  • Add cache for bcrypt authentication. #87115 (Nikolay Degterinsky).
  • Parquet no-timezone timestamps (isAdjustedToUTC=false) are now read as DateTime64(..., 'UTC') instead of DateTime64(...). #87872 (Michael Kolupaev).
  • Roles defined in SQL can now be granted to users defined in users.xml. #88139 (c-end).
  • If a skip index used in a FINAL query is on a column that is part of the primary key, the additional step to check for primary key intersection in other parts is unnecessary and now not performed. Resolves #85897. #88368 (Shankar Iyer).
  • Allow inserting into remote and data lake tables when disable_insertion_and_mutation is enabled. #88549 (Alexander Tokmakov).
  • Cache table-level statistics, add two settings: merge tree setting refresh_statistics_interval and session setting use_statistics_cache. #88670 (Han Fei).
  • Add a MergeTree setting alter_column_secondary_index_mode to control what to do with indices during mutations. Possible values: throw, drop, rebuild, and compatibility. Closes #77797. #89335 (Raúl Marín).
  • Introduce a per-table cache of ColumnsDescription for parts, reducing memory usage when tables contain many parts and many columns. #89352 (Azat Khuzhin).

System tables and monitoring

  • Add multiple histogram metrics for the server and the keeper to instrument the durations of the keeper request execution stages. #88158 (Miсhael Stetsyuk).
  • Add a new column statistics in system.columns, indicating the types of statistics built on this table. #89086 (Han Fei).
  • The HTTP interface will provide Age and Expires headers when the query result cache is used. Introduce new profile events: QueryCacheAgeSeconds, QueryCacheReadRows, QueryCacheReadBytes, QueryCacheWrittenRows, QueryCacheWrittenBytes. #89759 (Alexey Milovidov).
  • Show table properties in Web UI. Clicking on the number of rows or bytes will bring up a query from system.tables. #89771 (Alexey Milovidov).
  • Added fields last_error_time, last_error_message, last_error_query_id and last_error_trace to system.error_log table. #89879 (Narasimha Pakeer).
  • Store deduplication blocks ids in system.part_logs. #89928 (Sema Checherinda).
  • Changed the default of setting check_query_single_value_result from true to false. This causes CHECK TABLE to return detailed per-part results instead of an aggregated result. #90150 (Robert Schulze).
  • Add a new column parts_in_progress_names to system.mutations to improve diagnostics. #90155 (Shaohua Wang).
  • Introduce system.background_schedule_pool{,_log} to improve introspection of background jobs. #91157 (Azat Khuzhin).
  • Add profile events FailedInitialQuery and FailedInitialSelectQuery. #91172 (RinChanNOW).
  • Add three columns in system.tables for dangling parts metrics. (Han Fei).
  • Expose the value of distributed_cache_client.connection_pool_size as a metric. (Francesco Ciocchetti).

Client and UI improvements

  • User can now cancel the query by pressing Ctrl-C when the pager is running. Resolves #80778. #88935 (Grigorii Sokolik).
  • Web UI will display bars in the table even when the values are negative. #89016 (Alexey Milovidov).
  • Queries starting with whitespace are no longer saved to history. #89116 (Konstantin Bogdanov).
  • clickhouse-client and clickhouse-local in the interactive mode will highlight identifiers in the command line that have the same name as the current one under the cursor. #89689 (Alexey Milovidov).
  • Make the resizer of the query textarea in the Web UI full-width. #89457 (Alexey Milovidov).
  • Type hints in the Web UI no longer overflow into the table header. #89753 (Alexey Milovidov).
  • You can now quickly comment or uncomment your currently selected lines in the Web UI query editor using Ctrl+/ (or Cmd+/ on Mac). #91160 (Samuel K.).
  • Add support for loading ClickHouse Client configuration from XDG Base Directory paths. Resolves #89882. #90306 (Wujun Jiang).

S3 and cloud storage improvements

  • Allow using opt-in AWS regions for S3 automatically when the region is not specified in the endpoint. #88930 (Andrey Zvonov).
  • Set default s3_retry_attempts to 500 for 25.6 to make sure backups succeed when there's an S3 repartitioning. #89051 (Nikita Mikhaylov).
  • Cache S3 credentials interacting with STS endpoint so they can be reused for different function calls. #89734 (Antonio Andelic).
  • Now pre-signed URLs work with S3. Closes #65032. #90827 (Yarik Briukhovetskyi).

Data lakes improvements

  • Support reading DeltaLake CDF via deltaLake table function with settings delta_lake_snapshot_start_version, delta_lake_snapshot_end_version. #90431 (Kseniia Sumarokova).
  • Support storage settings in insert into table function for consistency with select. Closes #89386. #91707 (Kseniia Sumarokova).
  • Throw a "not implemented" error for truncate query for data lakes instead of silently doing nothing. Closes #86604. #91713 (Kseniia Sumarokova).

Kafka improvements

  • The kafka_compression_codec and kafka_compression_level settings can now be used to specify the compression for Kafka producers. #89073 (János Benjamin Antal).
  • Add kafka_consumer_reschedule_ms as a tunable Kafka table engine setting. Resolves #89204. #90112 (Jeremy Aguilon).

Keeper improvements

  • Add byte size limit for append request batch in Keeper. Limit is controlled with keeper_server.coordination_settings.max_requests_append_bytes_size. #90342 (Antonio Andelic).
  • Add a keeper-server-side check during handshake to reject clients when last_zxid_seen (provided by the client) > last_processed_zxid. #90016 (Miсhael Stetsyuk).
  • Use lower node limit for RemoveRecursive Keeper request during S3Queue cleanup. #90201 (Antonio Andelic).

Input/Output format improvements

  • Added support for UUID in Parquet when it is represented by FixedString(16) with the logical type UUID. #74484 (alekseev-maksim).
  • Support array of string as an input to the hasAnyTokens or hasAllTokens functions. #89124 (Elmi Ahmadov).
  • In Pretty format, named tuples are now displayed as Pretty JSON. This closes #65022. #91779 (Mostafa Mohamed Salah).
  • Add CapnProto message size limit. It can be changed with format_capn_proto_max_message_size. #91888 (Antonio Andelic).

Text index improvements

Other improvements

  • Fixed binary deserialization of Array and Map to use the max_binary_array_size setting instead of max_binary_string_size when validating size limits. #88744 (Raufs Dunamalijevs).
  • If the system memory is lower than 5GB, don't mlock the executable by default. #89751 (Alexey Milovidov).
  • Reduces memory usage during merges in system.metric_log table by setting min_bytes_for_wide_part and vertical_merge_algorithm_min_bytes_to_activate to 128MB. #89811 (filimonov).
  • Retry network errors when S3 library parses XML response. #90216 (Sema Checherinda).
  • Update warning messages when approaching guardrails limits: show current and throw values. #90438 (Nikita Fomichev).
  • Stream chunks in system.filesystem_cache table instead of creating a single chunk with all cache state. #90508 (Kseniia Sumarokova).
  • Entries in the vector similarity index cache are now removed when table parts are dropped or replaced by newer parts. #90750 (Shankar Iyer).
  • Avoid exposing the ClickHouse server version in HTTP error responses returned before authentication. #91003 (filimonov).
  • Added new settings apply_row_policy_after_final and apply_prewhere_after_final to allow applying row policies and PREWHERE conditions after FINAL processing. Fixes #90986. #91065 (Yarik Briukhovetskyi).
  • Support JSON type in tupleElement. Closes #81630. #91327 (Pavel Kruglov).
  • Support negative indexes for tuple element access (e.g. tuple.-1). #91665 (Amos Bird).
  • Allow implicit type conversion when casting Array to QBit. #91846 (Raufs Dunamalijevs).
  • Add a new column, elapsed_time_microseconds to system.blob_storage_log. #92322 (Alexey Milovidov).
  • Add a new setting database_shared_drop_table_delay_seconds that allows users to control the drop table delay in the Shared database. (Nikolay Degterinsky).
  • Lazy load encrypted keys for named collections. (Pablo Marcos).
  • Allow to disable clients cache per buffer for distributed cache. (Kseniia Sumarokova).
  • Add shared limit for distributed cache connections. (Kseniia Sumarokova).

Bug Fixes

Note

This section contains a selected subset of important bug fixes. For the complete list of all bug fixes in this release, please refer to the full changelog

Query execution fixes

Data type and JSON fixes

  • Fix reading subcolumns from a column with dot in the name in some cases. Resolves #81261, #82058, #88169. #87205 (Pavel Kruglov).
  • Fix reading mixed array of Floats and Bools in JSON. Previously inserting such data led to an exception. #88008 (Pavel Kruglov).
  • Fix cast from LowCardinality(Nullable(T)) to Dynamic. #86365 (Pavel Kruglov).
  • Fix possible logical error during reading of paths and their subcolumns in advanced JSON shared data serialization. Closes #89805. #89819 (Pavel Kruglov).
  • Fix possible stack overflow in data types binary deserialization. Closes #88710. #89822 (Pavel Kruglov).
  • Fix possible inconsistent state of shared data and dynamic paths in JSON that could lead to logical errors and unexpected results. #90816 (Pavel Kruglov).
  • Fix merging JSON columns in Summing/Aggregating/Coalescing MergeTree. #91151 (Pavel Kruglov).

MergeTree and storage fixes

  • Fixed several issues caused by early column removal in TTL. Resolves #88002. #88860 (Amos Bird).
  • Fix incorrect min(PK)/max(PK) result when PK is in reverse order. This fixes #83619. #88796 (Amos Bird).
  • Fixed incorrect sharding in JOIN optimization when the primary key is sorted in descending order. Resolves #88512. #88794 (Amos Bird).
  • Fix race condition in projection index reading path. Resolves #89497. #89762 (Peng Jian).
  • Fixed incorrect merge handling of TTL-emptied parts with non-empty projections when using deduplicate_merge_projection_mode='ignore'. Resolves #89430. #89458 (Amos Bird).
  • Fix TOO_MANY_MARKS error which could have happened after some ALTER queries for compact parts. #91980 (alesapin).

Parquet and format fixes

  • Fixed a segmentation fault in the Parquet reader when input_format_parquet_local_file_min_bytes_for_seek is set to 0. Resolves #78456. #88784 (Animesh).
  • In parquet writer, emit created_by string in correct format. #87735 (Michael Kolupaev).
  • Fix parquet writing not preserving original order when using single threaded writing with the native writer. #90126 (Arthur Passos).
  • Fix the ORC reader bug when reading string columns that are encoded with DICTIONARY_V2 and contain only NULL values. #91889 (Peng Jian).
  • Fixes an overflow while reading from ORC format for Date and DateTime64 types. Closes #70976. #91572 (Yarik Briukhovetskyi).

Iceberg and data lake fixes

  • Fix icebergS3Cluster protocol. Started supporting schema evolution, positional and equality deletes in iceberg cluster function. Resolves #88287. #88919 (Yang Jiang).
  • Fix JSON Exception in iceberg table with timestamp column when using glue catalog. Resolves #90210. #90209 (Alsu Giliazova).
  • Now ClickHouse will not use read-in-order optimization for iceberg if sort order is not specified in manifest files. Fixes #89178. #90304 (alesapin).

Function fixes

  • Fix bug in the function reverseUTF8. In previous versions, it mistakenly reversed the bytes of UTF-8 code points of length 4. This closes #88913. #88914 (Alexey Milovidov).
  • Fix phi-squared computation causing incorrect results in cramersV, cramersVBiasCorrected, theilsU, and contingency. #87831 (Nihal Z. Miaji).
  • Fix top_k to respect the threshold parameter when called with a single argument. Closes #88757. #88867 (Manuel).
  • Fix truncating arguments of countIf(*). Closes #89372. #89373 (Manuel).
  • Fix trim, ltrim, rtrim functions not working with two arguments. Closes #90170. #90305 (Nihal Z. Miaji).
  • Fix arrayFilter function not working when using empty array and isNull function. Closes #73849. #91105 (Nihal Z. Miaji).

Memory and crash fixes

  • Fix possible crash during remote query with ARRAY JOIN inside IN and enabled enable_lazy_columns_replication setting. Resolves #90361. #89997 (Pavel Kruglov).
  • Fixed a crash during the clean server shutdown due to wrong destruction order. Resolves #82420. #90076 (Nikita Mikhaylov).
  • Fix a crash in case if a state of an aggregate function contains a serialized value of a column of LowCardinality(String). #89550 (Pavel Kruglov).
  • Fix crash in StorageDistributed when parsing malformed shard directory names. #90243 (Aleksandr Musorin).
  • Fixed spurious memory limit errors when userspace page cache is enabled. #91361 (Michael Kolupaev).
  • Fix possible crash in aggregate functions after MEMORY_LIMIT_EXCEEDED. #92390 (Azat Khuzhin).
  • Improved memory tracking in hash joins result generation. #89560 (Azat Khuzhin).

Security and access fixes

  • Fix ACCESS_ENTITY_NOT_FOUND error when trying to execute clusterAllReplicas from a user with a non-existing role. Resolves #87670. #89068 (pufit).
  • Fix access validation for ALTER UPDATE queries when a remote table function is used with localhost as a target host. #90761 (pufit).
  • Fix wildcard grants check for partial revoke. #90922 (pufit).
  • Fix handling global grants with wildcard revokes. #90928 (pufit).

Replicated database fixes

  • After recovering, a Replicated database replica might get stuck for a long time printing messages like Failed to marked query-0004647339 as finished, it's fixed. #88671 (Alexander Tokmakov).
  • Fix use-after-free in Distributed due to race between shutdown and background INSERTs. Resolves #88640. #89136 (Azat Khuzhin).
  • Refreshable materialized view: fixed rare server crash if source table was fully dropped during a refresh. #89203 (Michael Kolupaev).

Keeper fixes

  • Fix reading of changelogs during Keeper startup in cases a changelog was not renamed properly during rotation. #89496 (Antonio Andelic).

Other notable fixes