docs/changelogs/v25.12.1.649-stable.md
String to Nullable(String), we will not do mutation to the data. but for uniq aggregate function, it use different data strucuture: 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 fix is add a flag to record if it is a nullable column during serialization. The format of statisticis has changed, the server will crash if we have statistics with old format. This PR https://github.com/ClickHouse/ClickHouse/pull/90904 will fix the crash, and throw exception when the existing statisticis uses lagecy format. To avoid exception, we should run ALTER TABLE [db.]table MATERIALIZE STATISTICS ALL to regenerate the statistics` to fix it. #90311 (Han Fei).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).check_query_single_value_result from true to false. This causes CHECK TABLE to return detailed per-part results instead of an aggregated result (1 = okay, 0 = errors found). Compared to the previous behavior, this is likely more aligned with what the user wants. #91009 (Robert Schulze).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. For those cases send DDLs to the old replica until the cluster is upgraded completely. #91429 (Raúl Marín).receive_timeout. Previously, timeouts would return exit code 0 (success), making it difficult for scripts and automation to detect timeout failures. #91432 (Sav).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).enable_positional_arguments_for_projections setting to enable a safe ClickHouse cluster upgrade when positional arguments are present in the projections. #92007 (Dmitry Novik).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).--no-server-client-version-message or false. #87784 (Larry Snizek).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).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. #89886 (Max Justus Spransy).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).ORDER BY in CREATE operation for iceberg + sorting in INSERT. Resolves #89916. #90141 (Konstantin Vedernikov).HMAC(algorithm, message, key) sql function as a part of #73900 and #38775. #90837 (Mikhail f. Shiryaev).has() function to use primary key and data skipping indexes when first argument is constant array. Closes #90980. #91023 (Nihal Z. Miaji).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).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).automatic_parallel_replicas_mode. During normal single-node execution, ClickHouse collects statistics that will later be considered during the planning stage. If statistics suggest that parallel replicas are likely to be beneficial, ClickHouse will automatically execute the given query with parallel replicas. The set of supported queries is currently fairly limited. #87541 (Nikita Taranov).insert select from s3cluster() queries for parallel distributed execution. this change allows using where, which was possible before. #84611 (Igor Nikonov).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. (issue #75228). #87781 (Shankar Iyer).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. Improved usage of the text index for columns of Map data type. #88550 (Anton Popov).ANTI JOINs. Also, refactor the runtime filters implementation to reduce lock contention. #89710 (Dmitry Novik).query_plan_read_in_order_through_join. Support virtual row while reading optimization (see setting read_in_order_use_virtual_row) for LEFT/INNER JOINs. #89815 (Vladimir Cherkasov).ORDER BY...LIMIT N queries by using skip index and dynamic threshold filter to significantly reduce rows processed. #89835 (Shankar Iyer).minmax indexes (millions of granules) are present. #90428 (Shankar Iyer).query_plan_optimize_join_order_algorithm='dpsize,greedy' means that DPsize is tried first with fallback to greedy. #91002 (Alexander Gololobov).TOO_MANY_PARTS errors. #91163 (Mikhail Artemenko)._path filter values, which allows to avoid S3 listing operations. Controlled by the s3_path_filter_limit setting. #91165 (Eduard Karacharov).IN. It also supports a tuple as a second argument. #77906 (Yarik Briukhovetskyi).INSERT into ALIAS columns (columns that simply refers to a physical column without any expression). Closes #80060. #84154 (Shaurya Mohan).dependencies and missing_dependencies columns to system.kafka_consumers to report materialized view target tables for Kafka tables. Added KafkaMVNotReady counter. #85346 (Ilya Golshtein).aggregate_function_input_format to improve INSERT queries into tables with AggregateFunction columns, allowing insertion of data as serialized state, raw values, or arrays. #88088 (Punith Nandyappa Subashchandra).PSI_*_* async metrics collection. #88557 (MikhailBurdukov).query_plan_optimize_join_order_limit is changed to 10. #89312 (Alexey Milovidov).allow_statistics_optimize by default, so the JOINs optimizer will use column statistics. #89332 (Alexey Milovidov).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).enable_time_time64_type is now enabled by default. #89345 (Yarik Briukhovetskyi).plain-rewritable disk has its own implementation and layout. Let's not base it on top of regular plain disks. #89807 (Mikhail Artemenko).system.metric_log table (enabled by default) by setting min_bytes_for_wide_part and vertical_merge_algorithm_min_bytes_to_activate to 128MB. #89811 (filimonov).last_error_time, last_error_message, last_error_query_id and last_error_trace to system.error_log table. #89879 (Narasimha Pakeer).last_zxid_seen (provided by the client) > last_processed_zxid. This prevents stale reads when clients reconnect to lagging replicas. #90016 (Miсhael Stetsyuk).kafka_consumer_reschedule_ms as a tunable Kafka table engine setting in order to adjust how long consumers sleep for new data. Resolves #89204. #90112 (Jeremy Aguilon).check_query_single_value_result from true to false. This causes CHECK TABLE to return detailed per-part results instead of an aggregated result (1 = okay, 0 = errors found). Compared to the previous behavior, this is likely more aligned with what the user wants. #90150 (Robert Schulze).parts_in_progress_names to system.mutations to improve diagnostics. #90155 (Shaohua Wang).~/.config/clickhouse/config.xml) in addition to the legacy ~/.clickhouse-client/ location. Resolves #89882. #90306 (Wujun Jiang).keeper_server.coordination_settings.max_requests_append_bytes_size. #90342 (Antonio Andelic).deltaLake table function with settings delta_lake_snapshot_start_version, delta_lake_snapshot_end_version. The CDF (Change Data Feed, a feature that lets you automatically capture and query row-level data changes—such as inserts, updates, and deletes—between versions of a Delta table) is enabled in DeltaLake via delta.enableChangeDataFeed. The columns provided along with the data are _change_type, _commit_version, _commit_timestamp. #90431 (Kseniia Sumarokova).system.filesystem_cache table instead of creating a single chunk with all cache state. Reading filesystem cache state can take a long time for large caches and consume a lot of memory, so streaming it is indispensable for large deployments. #90508 (Kseniia Sumarokova).ALTER TABLE [db.]table MATERIALIZE STATISTICS ALL to regenerate the statistics` to fix it. #90904 (Han Fei).HTTP_CONNECTION_LIMIT_REACHED exception would be thrown when hard_limit for the http clients connection is reached. It is set as 20000 for the disk connections. #91016 (Sema Checherinda).apply_row_policy_after_final that allows the query to apply row policy only after final, which will make the behavior for ReplacingMergeTree with row policies more correct. Fixes #90986. #91065 (Yarik Briukhovetskyi).system.background_schedule_pool{,_log} to improve introspection of background jobs. #91157 (Azat Khuzhin).Ctrl+/ (or Cmd+/ on Mac), making it easier to temporarily disable parts of your query while testing. #91160 (Samuel K.).FailedInitialQuery and FailedInitialSelectQuery. #91172 (RinChanNOW).merge_tree_use_prefixes_deserialization_thread_pool setting instead of unconditionally using the thread pool. #91208 (Raufs Dunamalijevs).commit_on_select (to define whether processed data needs to be committed and whether to apply after_processing action). The default value is false, fix check for attached mv during select. #91450 (Kseniia Sumarokova).EXPLAIN or CREATE TABLE AS SELECT queries. #91599 (Pervakov Grigorii).DB::Exception: apache::thrift::transport::TTransportException: MaxMessageSize reached. #91737 (Arthur Passos).ORDER BY ALL is easy. Right now the logic here actually is broken. We try to deduplicate, but in the most cases it just does not see duplicates among the blocks because the select returns different data. #91830 (Sema Checherinda).Array to QBit. Integer and float arrays can now be inserted directly into QBit columns without explicit type casts. #91846 (Raufs Dunamalijevs).format_capn_proto_max_message_size. #91888 (Antonio Andelic).MarkCacheHits/MarkCacheMisses was updated for merges as well, this PR will revert this behavior back). #91910 (Azat Khuzhin).client_info.interface being set to TCP for local connections. #91933 (Konstantin Bogdanov).metadata_location not specified in Glue metadata. #91994 (Andrey Zvonov).refresh_certificates_task_interval parameter in ACME client configuration now expects a value in seconds. #92211 (Konstantin Bogdanov).system.part_log for system.*_log. #92217 (Azat Khuzhin).elapsed_time_microseconds to system.blob_storage_log. #92322 (Alexey Milovidov).DNSResolver before use to respect custom settings. Fixes #76296. #81302 (Zhigao Hong).UNION. Fixes #88180. #88350 (Sema Checherinda).JOIN optimization when the primary key is sorted in descending order. Resolves #88512. #88794 (Amos Bird).Bad get error that happened during Set index analysis in case the predicate contained NULL constant. Fixes #84856 and #82974. #89429 (Nikolai Kochetov).Cannot add subcolumn X.Y: column with this name already exists. Resolves #89599. #89602 (Azat Khuzhin).theilsU and contingency functions that caused incorrect results. #89760 (Nihal Z. Miaji).ARRAY JOIN inside IN and enabled enable_lazy_columns_replication setting. Resolves #90361. #89997 (Pavel Kruglov).analyzer_compatibility_join_using_top_level_identifier with multiple joins. #90010 (Vladimir Cherkasov).kafka_handle_error_mode = 'dead_letter_queue' and the table system.dead_letter_queue is not configured the server may have crashed. This behaviour is fixed. Resolves #87573. #90064 (Nikita Mikhaylov).Column with Array type is not represented by ColumnArray column: Replicated during insertion with usage of ARRAY JOIN and enabled enable_lazy_columns_replication setting. #90066 (Pavel Kruglov).numbers system table when big step size is used. Closes #83398. #90123 (Nihal Z. Miaji).All hive partitioning columns must be present in the schema during upgrade). #90202 (Kseniia Sumarokova).nan/inf WITH FILL query. Resolves #69261. #90255 (Konstantin Bogdanov).CANNOT_READ_ALL_DATA error. Resolves #90264. #90302 (Pavel Kruglov).SELECT CAST(CAST(now(), 'Time'), 'Time64') was producing incorrect result. Closes #88349. #90324 (Yarik Briukhovetskyi).multicluster_root_path to prevent delays and missing ZooKeeper updates. #90341 (RinChanNOW).L2DistanceTransposed that caused crashes when the precision argument exceeded valid range. Closes #90401. #90405 (Raufs Dunamalijevs).arrayUnion with Array(Dynamic) argument. Resolves #90270. #90409 (Pavel Kruglov).KeyValuePairExtractor caused data corruption or crashes during concurrent file reads. #90474 (Paresh Joshi).L2DistanceTransposed when using array reference vectors (which default to Array(Float64)) with QBit columns of non-Float64 element types (Float32, BFloat16). The function now automatically casts the reference vector to match the QBit's element type. Resolves #89976. #90485 (Raufs Dunamalijevs).toDateTimeOrNull of a negative argument returns NULL. #90490 (Yarik Briukhovetskyi).LowCardinality(Bool/Date32) in Arrow format. Resolves #83883. #90505 (Pavel Kruglov).IPv4StringToNumOrDefault) returning garbage for some invalid inputs. Resolves #90544. Resolves #87583. #90545 (Michael Kolupaev).equals function. Closes #88142. #90557 (Nihal Z. Miaji).test_ssh/test.py::test_paramiko_password. #90612 (Govind R Nair).concatWithSeparator function when using const non-string column. Closes #90596. #90655 (Nihal Z. Miaji).INTO OUTFILE. Resolves #90207. #90656 (Azat Khuzhin).allow_statistics_optimize=1. Resolves #90626. #90664 (Azat Khuzhin).LIMIT BY with GROUP BY to produce correct NOT_AN_AGGREGATE error instead of NOT_FOUND_COLUMN_IN_BLOCK when LIMIT BY uses columns not in GROUP BY. Closes #89713. #90665 (xiaohuanlin).LowCardinality columns in partition keys. Closes #89412. #90666 (xiaohuanlin).shardNum()) could incorrectly use query condition cache. #90692 (Eduard Karacharov).INVALID_JOIN_ON_EXPRESSION error. Close #90698. #90719 (Vladimir Cherkasov).ALTER UPDATE queries when a remote table function is used with localhost as a target host. #90761 (pufit).display_secrets_in_show_and_select and format_display_secrets_in_show_and_select. #90765 (Pablo Marcos).enable_shared_storage_snapshot_in_query (leads to memory leaks). #90770 (Azat Khuzhin).serialize_string_in_memory_with_zero_byte. #90880 (Antonio Andelic).finish=true flag was sent. This was possible due to a logical race condition within MergeTreeReadPoolParallelReplicas, although it was very unlikely to occur. #90921 (Nikita Taranov).SummingMergeTree aggregation for Nested LowCardinality columns. #90927 (Ivan Babrou).CREATE USER. #90928 (pufit).write_marks_for_substreams_in_compact_parts. #91014 (Pavel Kruglov).arrayFilter function not working when using empty array and isNull function. Closes #73849. #91105 (Nihal Z. Miaji).ARRAY JOIN when one of the table columns is empty tuple column. Closes #90801. #91123 (Nihal Z. Miaji).A hive partitioned file can't contain only partition columns. #91403 (Kseniia Sumarokova).dictGetDescendants caused by NULL when dictionary type has Hierarchy support but no column is HIERARCHICAL. Closes #92026. Closes #92121. #91420 (Nihal Z. Miaji).IN function when lambda and non-const tuple arguments are used. Closes #91379. #91446 (Nihal Z. Miaji).QBit type failing with query parameters like SET param_q=[1,2,3,4]; SELECT {q:QBit(Float32,4)}. #91488 (Raufs Dunamalijevs).librdkafka. #91521 (János Benjamin Antal).remote function. Closes #90568. #91524 (Nihal Z. Miaji).L2DistanceTransposed returning incorrect results when using non-constant reference vectors (e.g., from a table). #91517. #91593 (Raufs Dunamalijevs).LOGICAL_ERROR during a dispatch stage. Closes #91173. #91598 (Yarik Briukhovetskyi).Plain metadata does not have the concept of directories. #91646 (Tuan Pham Anh).delta_lake_snapshot_version which could give incorrect result when used with table engine (not table function) and value -1 (disabled) after snapshot version was used before that. Closes #87676. #91818 (Kseniia Sumarokova).join_use_nulls and multiple joins along with cross join. #91853 (Vladimir Cherkasov).Directory '{}' does not exist (LOGICAL_ERROR) when creating backups on plain-rewritable disks. #91935 (Julia Kartseva).ALTER queries for compact parts. #91980 (alesapin).readWKT, readWKB, which were in the wrong style in the previous versions. #92094 (Alexey Milovidov).midpoint function. Closes #91816. #92102 (Nihal Z. Miaji).enable_shared_storage_snapshot_in_query = 1 by properly scoping storage metadata and snapshot caches to query execution. This addresses the issue discovered in #90770 and re-enables enable_shared_storage_snapshot_in_query by default. #92118 (Amos Bird).system.view_refreshes failing with error No macro 'replica' in config. #92203 (Michael Kolupaev).ddlworker::markreplicasactive, if there is no active host found, and the remote_servers has some host_ids, we print a warning log instead of throwing an exception. #92223 (Tuan Pham Anh).IN, NOT IN with parentheses. Fixes #85075. #92225 (Mikhail f. Shiryaev).max_compress_block_size set to 0 could lead to a crash. #92237 (Antonio Andelic).Nothing type in caseWithExpression function arguments . Closes #85354. #92351 (Nihal Z. Miaji).clang-21 in CI. #87074 (Konstantin Bogdanov).master (0.11.3). This resolves CVE-2025-5318. #90362 (Govind R Nair).xray/xray_interface.h header when XRay is disabled. #91452 (Konstantin Bogdanov).ENABLE_AZURE_BLOB_STORAGE is OFF. #91543 (zoomxi).use-after-free issue in ConverterJSON for Parquet Format in ASAN build. #91833 (Alexey Bakharew).chcache and sccache as rust wrapper. #92404 (Mikhail f. Shiryaev).check_query_single_value_result"'. #90815 (Alexander Tokmakov).system.metric_log settings to use less RAM for merges"'. #91388 (Nikita Fomichev).peak_threads_usage in system.processes (like in system.query_log). #90459 (Azat Khuzhin).__init__.py files in integration tests. #90558 (Miсhael Stetsyuk).query_plan_optimize_join_order_limit change to 25.12. #90661 (Alexey Milovidov).column_structure option to explain query. #90752 (János Benjamin Antal).03457_query_cache_log_comment. #90776 (Robert Schulze).LowCardinality columns. #90779 (Anton Popov).tryConvertAnyJoinToSemiOrAntiJoin. #90829 (János Benjamin Antal).03657_gby_overflow_any_sparse for parallel replicas. #90858 (zoomxi).no- build flags in targeted check. #90905 (Nikita Fomichev).CHANGELOG. #90949 (Mikhail Artemenko).dictGetKeys function. #91092 (Nihal Z. Miaji).use-after-free after the underlying buffer rellocation in ForkWriteBuffer. #91229 (Mikhail Artemenko).InverseDictionaryLookupPass. #91460 (Nihal Z. Miaji).test_storage_iceberg_with_spark/test_cluster_table_function.py::test_cluster_table_function_split_by_row_groups. #91468 (Andrey Zvonov).02177_issue_31009. #91470 (Elmi Ahmadov).stream_like_engine_allow_direct_select explicitly warning about possible select behavior on queue engines. #91471 (Sema Checherinda).plain-rewritable transactions. This is the only metadata storage that requires visibility of changes over the operations prefix to resolve remote paths of uncommitted directories and create files under them. #91520 (Mikhail Artemenko).h3PolygonToCells with constant columns. #91586 (Anton Popov).Field when calling toString, which could result in slow code and unintended results. Closes #76797. #91627 (Alexey Milovidov).00411_long_accurate_number_comparison_int. #91629 (Alexey Milovidov).ulimit -n setting was recently changed in the integration tests runner, and this fd leak started to become visible. #91750 (Mikhail Artemenko).finalise will be called on MergeMutateSelectedEntry, which will unlock parts for the next merge. Here we need to reset tmp storage before this unlock will be processed - in intenal taks cancel. #91792 (Mikhail Artemenko).00632_get_sample_block_cache. #91828 (Robert Schulze).optimize_skip_unused_shards optimization for Distributed engine that may lead to Serialization is not implemented for data type Set due to wrong types. #91923 (Azat Khuzhin).showCertificate. #92028 (Konstantin Bogdanov).timeSeriesTagsGroupToTags(). Closes #91905. #92053 (Vitaly Baranov).WriteBufferFromHTTPServerResponse::onProgress() for async restore started via HTTP protocol. #92103 (Vitaly Baranov).rand with rand_r in grpc_core::BdpEstimator(). Closes #89406. #92104 (Vitaly Baranov).test_storage_nats. #92140 (Alexey Milovidov).01782_field_oom (arm_asan, targeted) flakiness. #92158 (Raufs Dunamalijevs).parameter field to in-source function documentation. #92291 (Robert Schulze).blob_storage_log from S3. #92320 (Alexey Milovidov)./praktika for docker containers to have static paths regardless of the outer paths. It allows the use of a read-only sccache endpoint for quick local builds. #92358 (Mikhail f. Shiryaev).rpm and tgz for a while, as well as used to test only amd packages. #92387 (Mikhail f. Shiryaev).git config for shared repo. #92452 (Mikhail f. Shiryaev).