releases.shpreview
ClickHouse/ClickHouse Changelog

ClickHouse Changelog

Mon
Wed
Fri
JunJulAugSepOctNovDecJanFebMarAprMay
Less
More
Releases3Avg0/wkVersionsv26.3 to v26.5
v26.5
Backward Incompatible Changes
  • Changed defaults of date_time_input_format and cast_string_to_date_time_mode from basic to best_effort. Set to basic or compatibility to restore old parsing behavior.
  • Tuple element name null is now forbidden due to conflicts with Nullable subcolumn names.
  • Added settings dynamic_disk_allow_from_env, dynamic_disk_allow_from_zk, dynamic_disk_allow_include that disallow these operations by default in dynamic disks.
  • Removed obsolete Arrow-based Parquet reader/writer; native implementation is used instead.
  • SHOW CREATE TABLE t now prefers temporary tables when both exist; DESCRIBE TEMPORARY TABLE syntax is now supported.
  • Reduced default http_max_fields from 1,000,000 to 1,000 and http_max_field_name_size from 128 KB to 4 KB to limit pre-authentication memory usage.
  • Added histograms nested column to system.metric_log; deprecates system.histogram_metric_log table.
  • CAST to DateTime or DateTime64 without explicit timezone now preserves source timezone.
  • Removed kql table function; use SET dialect = 'kusto' instead.
  • Window functions RANK and DENSE_RANK now reject arguments per SQL standard.
New Features
  • Added max_bytes_ratio_before_external_join setting (default 0.5) for hash join spill-to-disk threshold as fraction of available memory.
  • Added filesystem table function to represent directory structure as queryable table.
  • Allow passing bare function names to higher-order functions like arrayMap, arrayFilter.
  • Added send_table_structure_on_insert_with_inline_data setting and --inline-insert-data client option.
  • Added tokenizeQuery and highlightQuery functions for SQL query tokenization and syntax highlighting.
  • Added url_base setting to resolve relative URLs in url table function and URL table engine.
  • Support negative values in LIMIT BY clause to select rows from end of each group.
  • Support tuple and array output in json_value function.
  • Added kafka_autodetect_client_rack parameter to discover Availability Zone and propagate as client rack.
  • Added Read event type to system.blob_storage_log for tracking object storage reads.
  • Users can now see ZooKeeper watches via new system.zookeeper_watches table.
  • Added Shards profile event counting shards in distributed queries.
  • WASM UDFs can be declared DETERMINISTIC for constant folding.
  • Added parallel_replicas_prefer_local_replica setting to control replica selection.
  • Added socket buffer size settings: {disk,storage,http}_connections_{rcvbuf,sndbuf}.
  • Support CREATE OR REPLACE MATERIALIZED VIEW with atomic swap semantics.
  • Added S3 histogram metrics s3_read_request_duration_microseconds and s3_read_request_bytes.
  • Added Paimon, PaimonS3, PaimonAzure, PaimonHDFS, PaimonLocal table engines with incremental read support.
  • Added Kafka kafka_map_virtual_columns_on_write setting to map virtual columns on insert.
  • Added SYSTEM PAUSE VIEW and SYSTEM PAUSE VIEWS for refreshable materialized views.
  • Added regexpPosition function (PostgreSQL-compatible aliases regexpInstr, regexp_instr) for regex match position.
  • New functions isPrime and isProbablePrime for primality checks.
  • clear and /clear now clear the terminal in CLI tools.
  • Allow file table function to accept Array(String) of paths.
  • Added deterministic and higher_order columns to system.functions.
  • Added optional encoding variant parameter to bech32Encode and raw decode mode to bech32Decode.
  • Can now write data in AvroConfluent format with output_format_avro_confluent_subject setting.
  • Added prettyPrintJSON function to format JSON strings into human-readable form.
  • Added STRING_AGG as case-insensitive alias of groupConcat.
  • Individual subquery results can be cached independently with use_query_cache per subquery.
  • Added lexer-based syntax highlighting to web UI query editor.
Experimental Features
  • Added experimental web terminal interface at /webterminal with interactive clickhouse-client over WebSocket.
  • Kafka2 engine now supports direct SELECT queries and kafka_commit_on_select setting.
  • WASM UDFs support more numeric type coercions.
  • Support LIKE function in DELETE FROM system.webassembly_modules.
  • Support geo types for Iceberg.
  • Add prepared statements functionality to ArrowFlight SQL server.
  • Improved KQL parser robustness.
Performance Improvements
  • Reuse Parquet footer metadata cache for local files.
  • Push ORDER BY ... LIMIT n through LEFT/RIGHT joins when applicable.
  • Enable use_top_k_dynamic_filtering and use_skip_indexes_for_top_k by default.
  • Use jemalloc oversize-arena feature to reduce page faults.
  • Limit simultaneously active streams in UNION ALL to reduce peak memory.
  • Optimize userspace page cache; cold reads through object storage page cache now coalesce consecutive misses into single HTTP request.
  • Speed up index analysis with type casting and function application.
  • Speed up queries on Merge tables with many underlying tables.
  • Remove vtable from settings, reducing Settings copy size by ~28x.
  • Added max_threads_min_free_memory_per_thread and max_insert_threads_min_free_memory_per_thread settings for automatic parallelism reduction.
  • Reduce memory usage on low-memory systems (<4 GiB).
  • Added OptimizeTrivialGroupByLimitPass for trivial GROUP BY queries.
  • Granule-level implicit min-max index for _part_offset and _block_number virtual columns.
  • Precompute per-row hashes for prealloc_serialized aggregation methods.
  • Query condition cache for Iceberg tables.
  • Optimize cramersV and related functions with window functions.
  • Rewrite tupleElement(dictGet(...), N) optimization.
  • Enable buffering for sorting steps in distributed queries.
  • Performance improvements for partial_merge JOIN.
  • Reduced memory over-allocation in partial_merge JOIN.
  • Optimize memory tracker sampling.
  • Reduce memory allocation during S3 multipart uploads.
  • Add software prefetch in hash join probe phase.
  • Optimize MemoryTracker layout improving performance by ~25%.
  • Rewrite coalesce(a, b, ...) <op> const predicates for better index pruning.
  • Significantly improved Iceberg catalog query performance with large JSON metadata.
  • Avoid index uncompressed cache overhead when disabled.
  • Fix excessive granule reading in ORDER BY ... LIMIT with non-selective filters.
  • Fixed missing hash table sizes cache reuse after JOIN reordering.
  • Fsync of part files now performed in parallel, speeding up insert finalization by ~22%.
  • Vectorize string search helpers on AArch64 using NEON.
  • Restore I/O savings for aliased complex columns.
  • Reduced lock contention on asynchronous remote-FS read path.
  • Slightly better query plan for projections in-order scan.
  • Extend projection optimization to handle cases where projection's sorting key removes sorting step.
  • Allow json.path[] syntax sugar on typed JSON paths.
  • Optimize json.path[N].nested.path expansion.
  • Optimize SHOW TABLES access checks.
  • Remove redundant per-table access check in system.tables fast path.
  • Enable JIT compilation on macOS.
  • Skip row policy deferral after FINAL when deterministic and depends only on sorting-key columns.
  • Support hasAny and hasAll as text index filter predicates.
  • Route long-lived MergeTree heap state to dedicated jemalloc arena.
  • Improve ZooKeeper client timeout handling under heavy load with progress-based timeout.
  • Move per-event trace flags into separate array with lazy allocation.
  • Add compareTrackAt for ColumnDecimal.
  • Added SIMD implementation of MD5 (AVX2/AVX512) for parallel hashing.
Improvements
  • Improved --help output for all ClickHouse applications with better formatting and subcommand listing.
  • Changed default input_format_column_name_matching_mode from match_case to auto for case-insensitive fallback.
  • Added STDDEV alias of stddevSamp.
  • Added array_to_string alias of arrayStringConcat.
  • Added unnest alias of arrayJoin.
  • Progress bar in clickhouse-client now shows temporary disk data usage.
  • Added system.predicate_statistics_log for predicate filter selectivity sampling.
  • Allow skipping local shard with missing table when skip_unavailable_shards enabled.
  • Added startup warnings for Linux mdraid array issues.
  • WASM UDFs now appear in system.functions with correct metadata.
  • generate_series table function supports negative step values.
  • Fixed context expiration in functions used in deferred execution paths.
  • Fixed spurious cache limit violations.
  • Auto-detect region for S3 Express endpoints.
  • Support field IDs for Iceberg data files.
  • Left panel in web UI scrolls independently and stays visible.
  • Allow opening Play UI in new tab via Ctrl/Cmd/Shift+click.
  • New metrics for projection primary key and index granularity memory usage.
  • Apply network bandwidth limits to remote filesystem operations.
  • Improved backup resilience for Refreshable Materialized Views.
  • Consistent database listing in system.databases regardless of catalog settings.
  • Aligned concurrent_threads_soft_limit_ratio_to_cores default in code with config.
  • Improved sanitizer robustness in parser and string functions.
  • Improved monotonicity inference for divide(0, x) and intDiv(0, x).
  • Replaced HTTPConnectionPool async metrics with bucket-based histogram.
  • Socket buffer settings now reported as changeable without restart.
  • Added symbol resolution support in flameGraph.
  • CLI client supports <rainbow_parentheses>false</rainbow_parentheses> config.
  • Fixed MultiVolnitsky UTF-8 case-insensitive search.
  • Implemented sched_getcpu via rseq TLS in glibc-compatibility musl.
  • Replicated refreshable materialized views no longer refresh twice on ZK reconnection.
  • Allow Distributed tables without explicit column list to validate sharding keys.
  • Fixed REST catalog with Azure abfss paths.
  • Honor role_arn and role_session_name in Keeper S3 snapshot client.
  • Fixed memory leak in MATERIALIZED CTEs.
  • Fixed exception in lowerUTF8/upperUTF8 with large non-ASCII datasets.
  • Hardened MergeTree column-statistics loading against transient I/O failures.
  • INSERT INTO ... SELECT FROM input(...) no longer requires CREATE TEMPORARY TABLE grant.
  • Added concurrent_part_removal_threshold_for_remote_disk setting (default 16).
  • New setting defer_partition_pruning_after_final for opt-out of 26.3 behavior.
  • Fixed intExp2 returning wrong results for out-of-range inputs.
  • Fixed shell argument quoting in clickhouse install and clickhouse git-import.
  • Alias table engine is now non-experimental.
  • Added --queries-format option to clickhouse-benchmark.
  • Tuple element-wise operators are now variadic.
  • Added /processors-profile web UI for pipeline visualization.
  • Setting query_plan_use_logical_join_step is now obsolete.
  • Pre-filled user input removed from web UI pages.
  • Decoupled ORC reader offset-based read from use_prefetch.
  • Downloaded CSV files now use .csv extension.
  • More input validation for BigLake catalog.
Bug Fixes
  • Fixed inconsistent expression formatting with parenthesis tracking.
  • Fixed accurate comparison between Decimal and Float types.
  • Allow positional arguments in distributed queries.
  • Fixed assertion failure when dropping/recreating materialized views and view dependencies.
  • Fixed server abort when creating table with duplicate UUID.
  • Fixed skip index usage on data read with patch parts from lightweight updates.
  • Fixed "Not-ready Set" exception with IN subqueries moved to PREWHERE.
  • Fixed "Cannot find column" error combining ADD and RENAME COLUMN.
  • Fixed views with mixed set operations returning wrong results after detach/attach.
  • Fixed PLACEHOLDER action exception in stress testing.
  • Fixed logical error with Iceberg Date partitions.
  • Fixed skip index incompatibility after column type modification.
  • Fixed credential leak in query logs.
  • Fixed DROP TABLE on Kafka tables potentially hanging indefinitely.
  • Fixed runtime lookup for source table engines and database source grants.
  • Fixed server crash with ALIAS column containing correlated subqueries.
  • Fixed server crash with correlated subqueries and CONSTRAINT ASSUME.
  • Fixed exception with JSON dynamic fields as GROUP BY key.
  • Fixed workload IO scheduling bypass for S3/object-storage writes.
  • Fixed Protobuf/ProtobufList schema cache collision.
  • Fixed heap-buffer-overflow in Rust CXX bridge.
  • Fixed FunctionVariantAdaptor exception handling.
  • Fixed TRUNCATE ALL TABLES with views.
  • Fixed optimize_rewrite_array_exists_to_has type compatibility and re-enabled.
  • Fixed S3 settings priority for storage configuration.
  • Fixed sparse serialization losing negative zero sign.
  • Fixed WKT geometry parser MULTILINESTRING corruption and malformed string handling.
  • Fixed GROUPING SETS on distributed single-shard tables.
  • Fixed LOGICAL_ERROR column identifier already registered.
  • Fixed LOGICAL_ERROR with additional_result_filter on UNION/EXCEPT.
  • Fixed server crash with * APPLY on aggregate functions with grouping.
  • Fixed infinite loop with CSV/TSV skip first lines exceeding file lines.
v26.4

Backward Incompatible Changes

  • The IN operator now uses exact value semantics for Bool type: only 0 and 1 values in the set match Bool values. Previously, numeric values greater than 255 in the IN set were incorrectly clamped to true.
  • The H3 library has been updated to v4, which improves the precision of length, area, and other metric calculations. This change is backward incompatible because the new results differ from previous ones.
  • Disallows using SELECT as a bareword identifier in a WITH expression list element.
  • The merge table will now handle virtuals differently: if the underlying table contains _table or _database, these columns will be read from storage; otherwise, they will be filled after the read step.
  • The IN operator now rejects lossy Decimal conversions inside composite types (Tuple, Array, Map).
  • Reduced default http_max_fields from 1,000,000 to 1,000 and http_max_field_name_size from 128 KB to 4 KB to limit pre-authentication memory usage by HTTP connections.

New Features

  • Automatic spilling to hash and parallel hash joins by converting them to grace hash join when memory limit is reached.
  • Arrow Flight SQL support.
  • Incremental read support for Paimon table engines with Keeper-backed snapshot progress tracking.
  • The stem function is now non-experimental.
  • New behavior of max_insert_block_size_rows and related settings under compatibility setting use_strict_insert_block_limits.
  • Function arrayAutocorrelation(arr [, max_lag]) for computing normalized autocorrelation of numeric arrays.
  • SQL function obfuscateQuery for query obfuscation.
  • Support for Map and JSON/Object types as dictionary attributes.
  • New MergeTree settings replicated_fetches_min_part_level and replicated_fetches_min_part_level_timeout_seconds to reduce replication overhead.
  • MergeTree skip index support for JSON columns using JSONAllPaths.
  • The printf function now supports non-constant format strings.
  • New projection index commit_order that reorganizes data in insertion order.
  • Function highlight that wraps search terms in HTML tags.
  • Quotas by normalized query hash to protect public ClickHouse services.
  • Support for NATURAL JOIN syntax.
  • Support SET TIME ZONE 'tz' as alias for SET session_timezone.
  • Parameterized queries in the Web UI with input fields for parameter values.
  • SQL standard VALUES clause as a table expression.
  • PostgreSQL-compatible units for EXTRACT operator: EPOCH, DOW, DOY, ISODOW, ISOYEAR, WEEK, CENTURY, DECADE, MILLENNIUM.
  • SQL-standard compound interval literals with TO range qualifiers.
  • Asynchronous metrics for kernel TCP receive and transmit buffer memory.
  • Jemalloc profiling web UI for ClickHouse Keeper.
  • Command SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'.
  • Function JSONAllValues returning all values from JSON columns as Array(String).
  • Setting input_format_column_name_matching_mode for different case sensitivities in input formats.
  • watch command in clickhouse-keeper-client.
  • getChildrenRecursive (ListRecursive) request to ClickHouse Keeper.
  • Function arrayTranspose for transposing two-dimensional arrays.
  • Auto statistics defaults: auto_statistics_types mergetree defaults to 'minmax, uniq'; materialize_statistics_on_insert defaults to false.
  • Setting prefer_dependency_replica for materialized view dependency chains.
  • Function hasPhrase (alias matchPhrase) for phrase search.
  • Histogram metrics s3_read_request_duration_microseconds and s3_read_request_bytes.
  • Date and Date32 values can now be added to Time and Time64 values using the + operator.
  • Text index is now GA and stays enabled regardless of the compatibility setting.

Experimental Features

  • ALTER TABLE ... EXECUTE remove_orphan_files for Iceberg tables.
  • Setting query_plan_optimize_join_order_randomize for randomizing join reordering statistics.
  • AI function support: aiGenerate, aiClassify, aiExtract, aiTranslate for calling OpenAI and Anthropic endpoints.
  • System table system.histogram_metric_log for periodically snapshotting histogram metrics.

Performance Improvements

  • ClickHouse can now prune entire data parts based on min/max statistics.
  • Reduced lock contention during readonly operations on ReplicatedMergeTree tables.
  • Respect optimize_read_in_order when reading projections.
  • Improvements in Hash Join and Concurrent Hash Join.
  • Optimize DISTINCT by disabling LowCardinality optimization when input is almost distinct.
  • Performance optimization for LIKE queries using text indices.
  • Vectorized math functions accelerated on AArch64 and FreeBSD/Darwin.
  • Primary key pruning for regexp alternations over literals with common prefixes.
  • Generalized ORDER BY ... LIMIT top-k dynamic filtering for Nullable, String, COLLATE types.
  • Faster hash join on Int32 and Int64 keys with small range.
  • Faster discontinuous queries for LowCardinality columns.
  • Faster var*Stable and stddev*Stable functions for Float64 columns.
  • Optimized base58 encode/decode operations.
  • Binary size reduction and instruction cache utilization via linker optimizations.
  • Fixed negative scaling for short queries with aggregation.
  • Improved performance with parallel replicas.
  • Prefetching support for remote file reads.
  • Avoided unnecessary String .size subcolumn computation.
  • Less jittery progress bar in clickhouse-client.
  • MemoryWorker support in clickhouse-local for userspace page cache.
  • LIMIT clause push-down optimization for UNION ALL.
  • JIT compilation for String and FixedString column comparisons in ORDER BY.
  • Virtual row boundary information emission for improved merge reprioritization.
  • Faster Float-to-String conversion using extended itoa and zmij library.
  • Faster Int128/UInt128 to string conversion.
  • Avoided redundant threads in uniqExact parallel merge; batch parallel merge support.
  • Better parallelization of simple views with parallel replicas.
  • Parallel replicas support over simple views including UNION ALL views.
  • Optimized reading in order with IN filters in full_sorting_merge.
  • Cached sampling settings to optimize allocations/deallocations.
  • Fixed INSERT performance regression with deduplicate_insert = 'enable'.
  • Reduced profiled lock overhead.
  • AVX2 and ARM NEON support for arrayDotProduct.
  • Improved INSERT VALUES performance for Map, Array, Tuple types.
  • Fixed excessive RabbitMQ table engine CPU usage.
  • JOIN order optimizer now infers transitive equi-join predicates.
  • TRUNCATE DATABASE TABLES LIKE optimization with parallel merge cancellation.
  • Monotonicity support for multiply in primary key pruning.
  • Cache dictionaries no longer take exclusive lock in hasKeys.
  • Inlined VIEW subqueries for more optimizations.
  • Optimized cache loading on server startup.
  • Lazy column materialization for ReplacingMergeTree with FINAL.
  • Re-enabled optimize_rewrite_array_exists_to_has optimization with compatibility fixes.

Improvements

  • Improved EXPLAIN PLAN output with better formatting and join information.
  • Added MergeTree setting share_nested_offsets for independent nested column handling.
  • Multiple authentication methods in users.xml/yaml configuration.
  • Auto reload Raft inter-node connections using TLS.
  • Extended cast_keep_nullable to work with Dynamic/JSON types.
  • Reduced memory footprint from internal ISerialization objects via object pool.
  • Support for password and identity fields in keeper-client XML config.
  • Improved Iceberg writes for unity catalog.
  • Setting finalize_projection_parts_synchronously for synchronous projection finalization.
  • Added projections_duration_ms column to system.part_log.
  • Improved query cancellation via KILL QUERY and clickhouse-client Ctrl+C.
  • Replaced hardcoded source_table_engines with runtime lookup.
  • Setting for type mismatch behavior in Variant and Dynamic.
  • Improved Iceberg and Spark compatibility with consistent path handling.
  • Fixed race condition in IPartitionStrategy::cached_result.
  • ClickHouse Interval datatypes can now be written in Arrow Format.
  • Native support for UUID data types in Arrow and Parquet formats.
  • Support for 7z archives on object storage.
  • ProfileEvents for object storage introspection.
  • Fixed merge table function with non-present columns.
  • Included commit time in mutation execution time metric.
  • Write-ahead log for blob objects pending removal.
  • Disabled AI SQL generation in embedded client for security.
  • Changed Iceberg insert interface with deprecated settings.
  • Tabs rendered as 4 spaces in clickhouse-client.
  • Avoid scanning remote data lake catalog for table hints when disabled.
  • Applied distributed_index_analysis_min_indexes_bytes_to_activate after partition pruning.
  • Fixed Parquet bloom filter push-down assertion with empty IN/NOT IN clauses.
  • MinMax column statistics now store values as Field with type name serialization.
  • Updated cppkafka with Consumer close deadlock fix.
  • Iceberg file object information now includes row count and size from manifest.
  • Configuration parameter use_separate_cache_arena for cache memory arena separation.
  • Native support for Arrow StringView and BinaryView data types.
  • Hot-reloaded Keeper settings: max_requests_batch_size, max_requests_batch_bytes_size, etc.
  • Incremented profile events MemoryAllocatedWithoutCheck in release build.
  • Cgroupv2 memory tracking excludes slab_reclaimable.
  • use_partition_pruning = 0 disables MinMax index pruning and count optimization.
  • pretty=1 in EXPLAIN prints expressions in human readable format.
  • accurateCastOrNull and accurateCastOrDefault support Tuple target types.
  • Fixed chart duplication in Play UI theme switching.
  • Updated chdig tool to newer versions with perfetto UI and other improvements.
  • Trailing comma support in WITH clause before SELECT.
  • Setting compress_per_column_in_compact_parts for compressed block organization.
  • Improved Play UI with better table info balloon and engine-specific icons.
  • Support for Nullable(Tuple) in Arrow, ArrowStream, ORC, Parquet formats.
  • TOTALS row displayed as table footer in web UI.
  • Multi-query mode in web UI with parallel SELECT execution.
  • Fixed column resize in web UI result table.
  • Limit on jemalloc profile flushes per time interval.
  • Keeper settings hot-reload: nuraft_streaming_mode, nuraft_max_log_gap_in_stream.
  • CGroupMemoryUsedWithoutPageCache async metric.
  • Parser-level syntactic sugar for SQL standard OVERLAY function.
  • Column alias INDEX_LENGTH in information_schema.tables.
  • information_schema.tables now ignores inactive table parts.
  • ngrams function now rejects invalid ngram lengths.
  • FIPS-specific test filtering and improvements.
  • Expandable cells in Web UI with three-line height limit.
  • Option to force virtual/path style for S3 endpoints.
  • restore_replace_external_engines_to_null now skips external engine databases.
  • Text index analysis support for hasPhrase function.
  • STATISTICS treated as read-only in ColumnDependency.
  • system.asynchronous_metric_log creation in keeper-as-server mode.
  • Configuration option default_system_log_flush_policy.skip_alias_columns.
  • Auto statistics disabled for system tables.
  • array tokenizer support for LIKE optimization.
  • MemoryAllocatedWithoutCheck sent in release builds.
  • Per-thread untracked_memory exposed in system.stack_trace.

Bug Fixes

  • Fixed Block structure mismatch in stream error from Lazy materialization.
  • Fixed logical error with data masking policy query on CLUSTER.
  • Fixed bug when using Unity catalog on GCS.
  • DataLakeCatalog respects server's http_forbid_headers configuration.
  • Fixed N+1 HeadObject calls for S3 brace-expansion globs.
  • Validate setting changes in create queries.
  • Fixed ALTER TABLE UPDATE/DELETE with MATERIALIZED columns depending on EPHEMERAL columns.
  • Credentials in JDBC, ODBC, NATS connection strings are now masked.
  • Fixed parseDateTimeBestEffort incorrectly parsing words with month prefixes.
  • Fixed ignoring TABLE_UUID_MISMATCH for non-analyzer.
  • Fixed explicit settings ignored when matched server default with compatibility setting.
  • Fixed numbers with leading zeros in hive partitioning causing errors.
  • Fixed heap-use-after-free when table dropped concurrently with read query.
  • Fixed Keeper read request stuck when unrelated session closed at wrong moment.
  • Validate column structure before applying patches.
  • Fixed vertical merge assertion with Dynamic columns and SYSTEM STOP/START MERGES.
  • Fixed incorrect partition pruning for toWeek() function.
  • Fixed exception in functions with ColumnReplicated from JOIN.
  • Fixed CLEAR COLUMN not rebuilding projections and materialized columns.
  • Fixed exception in ConditionSelectivityEstimator with scalar query parameters and statistics.
  • Fixed parts with unknown projections marked as lost forever.
v26.3
Backward Incompatible Changes
  • Data type serialization: Propagate data types serialization versions to nested data types. String serialization version with_size_stream now applies to String types inside Array/Map/Variant/JSON/etc. Controlled by propagate_types_serialization_versions_to_nested_types (enabled by default). Upgrade is safe, but downgrade is not — data written by 26.3 in columns with nested types will be unreadable in older versions.
  • Skip index type: Removed the hypothesis skip index type. Creating tables with INDEX ... TYPE hypothesis now produces an error.
  • Function removal: Removed experimental detectProgrammingLanguage function.
  • NOT operator precedence: Fixed to match SQL standard. NOT now binds looser than IS NULL, BETWEEN, LIKE, and arithmetic operators. Queries relying on previous non-standard behavior may change results.
  • Skip index filenames: Fixed skip index files not respecting replace_long_file_name_to_hash setting. Long-named indices are now hashed like column files. Backward compatible for upgrades, but downgrading may cause long-named indices to be ignored.
  • Async insert default: Async insert is now enabled by default. Batching all small inserts by default. Can be disabled at config, session, query, or table level. Set compatibility=<version less than 26.2> for previous behavior.
  • MySQL datatype mapping: Changed default mysql_datatypes_support_level to decimal,datetime64,date2Date32, enabling proper mapping of MySQL DATE/DECIMAL/DATETIME to Date32/Decimal/DateTime64. Previously MySQL DATE mapped to Date (cannot represent dates before 1970-01-01).
  • UDF stderr handling: Changed default stderr_reaction from throw to log_last for executable UDFs. UDFs writing warnings to stderr no longer fail when exit code is 0.
  • Metadata changes: Fixed normal projections metadata so multi-column sorting keys are properly recognized.
  • Index function API: mergeTreeAnalyzeIndexes{,UUID} now accepts array of part names instead of regexp for improved performance (experimental).
New Features
  • Bucketed Map serialization: Added bucketed serialization for Map columns in MergeTree with map_serialization_version = 'with_buckets'. Keys split into hash-based buckets, providing 2-49x speedup for single-key lookups. New settings: map_serialization_version, max_buckets_in_map, map_buckets_strategy, map_buckets_coefficient, map_buckets_min_avg_size.
  • Materialized CTE: Support evaluating CTEs only once and storing results in temporary tables.
  • SQL-standard functions: Allow certain functions like NOW without parentheses for compatibility.
  • naturalSortKey function: Added naturalSortKey(s) function.
  • JSON input for JSONExtract: Support native JSON/Object input for JSONExtract functions.
  • Nullable query parameters: If a query parameter has Nullable type and is not specified, assume value is NULL.
  • ZooKeeper auxiliary support: Support auxiliary ZooKeeper for Replicated database.
  • JSON has function: Support has function for JSON type to check path existence.
  • mergeTreeTextIndex function: New table function to read data directly from a text index for introspection.
  • table_readonly setting: Add MergeTree setting to mark tables as read-only.
  • Partition pruning settings: New use_partition_pruning setting and use_partition_key alias to disable partition pruning.
  • Iceberg EXECUTE expire_snapshots: Support ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>') for Iceberg tables.
  • HTTP handlers per port: Allow each type=http entry in <protocols> to specify custom <handlers> key for different routing rules per port.
  • EXPLAIN improvements: Add pretty=1 option for tree-style indented output and compact=1 to collapse Expression steps.
  • Access control: New restore_access_entities_with_current_grants setting for restored users/roles in backups.
  • Unicode functions: Added caseFoldUTF8, removeDiacriticsUTF8, and normalizeUTF8NFKCCasefold functions.
  • asciiCJK tokenizer: New tokenizer for full-text indexes and tokens function using Unicode word boundary rules.
  • Unavailable shards limits: New max_skip_unavailable_shards_num and max_skip_unavailable_shards_ratio settings to limit silent shard skipping.
  • SOME keyword: Added SOME keyword for subquery expressions (identical to ANY).
  • FixedString output formatting: New output_format_trim_fixed_string setting to strip trailing null bytes.
  • Parenthesized table joins: Support parenthesized table join expressions in FROM clause.
  • toDaysInMonth function: Returns number of days in the month of specified date.
Experimental Features
  • WebAssembly UDFs: Experimental support for WebAssembly-based user-defined functions with Wasmtime backend.
  • External SQL dialects: Support for external SQL dialects using polyglot library.
  • ALP codec: Floating-point compression codec (without ALP_rd fallback).
  • Lazy JSON type hints: Experimental lazy type hints for JSON columns. ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName) completes as metadata-only operation without rewriting data.
  • YTsaurus parallel reads: Enable parallel reads from YTsaurus table engine.
Performance Improvements
  • Object storage reads: Improved data lake reading performance by resizing pipeline to number of processing threads, providing ~40x improvements on multi-core machines.
  • Parallel replicas logic: Clarified relationship between enable_parallel_replicas and automatic_parallel_replicas_mode. Queries use parallel replicas if enable_parallel_replicas > 0. automatic_parallel_replicas_mode=1 uses statistics-based decision; mode=0 uses parallel replicas for all supported queries.
  • Enhanced partition pruning: Allow partition pruning when predicate contains comparison operators and partition key is wrapped in deterministic function chain (e.g., cityHash64(x) % 5 > 2, toYYYYMM(x) < 2026).
  • Fixed sumCount aggregate function unable to read older serialized states after introduction of Nullable(Tuple)
  • Fixed exception in tuple comparison involving Nothing type with GROUPING SETS and ORDER BY
  • Fixed non-deterministic uncompressed_hash computation for Compact MergeTree parts with multiple compression codecs
  • Fixed logical error during INSERT SELECT with JSON and buckets in shared data
  • Fixed MEMORY_LIMIT_EXCEEDED being reported as CORRUPTED_DATA during SummingMergeTree and CoalescingMergeTree merges
  • Fixed "Context has expired" exception for correlated subqueries with table functions like url()
  • Fixed exceptions and incorrect behavior in optimize_syntax_fuse_functions with aggregate projections and Date types
  • Fixed replaceRegexpOne to extract query rewrite producing wrong results; fixed exception with GROUP BY ... WITH CUBE and group_by_use_nulls=1
  • Fixed DROP DATABASE hanging indefinitely with database_atomic_wait_for_drop_and_detach_synchronously
  • Fixed KILL QUERY unable to terminate queries stuck in WITH FILL, dictionary loading, or ALTER DELETE
  • Fixed security issue: loop table function bypassed row policies and column-level grants
  • Fixed incorrect partition pruning with pre-epoch DateTime64 and toDate() function
  • Fixed hasPartitionId returning incorrect results with multiple partitions
  • Fixed possible crashes reading empty granules in advanced shared data in JSON
  • Fixed Cannot schedule a file error on INSERT into Distributed due to race between DROP and INSERT
  • Fixed server crash in mapContainsKey/mapContainsKeyLike with tokenbf_v1 skip index
  • Fixed LOGICAL_ERROR with LowCardinality inside compound types in various functions
  • Fixed LOGICAL_ERROR in MergingAggregatedTransform with ARRAY JOIN and merge() over Distributed tables
  • Fixed server crash caused by uncaught exception in HTTP connection pool destructor
  • Fixed incorrect result with grace_hash algorithm and non-equi joins
  • Fixed performance inefficiency in DeltaLake metadata scanning
  • Fixed data race in ZooKeeper client between sendThread and receiveThread
  • Fixed bug preventing CTE with distributed insert selects
  • Fixed exception from CachedOnDiskReadBufferFromFile::readBigAt
  • Fixed LOGICAL_ERROR in Alias engine with materialized columns
  • Fixed Keeper data loss after restart with Azure Blob Storage
  • Fixed JIT miscompilation of sign function for integer types wider than Int8
  • Fixed DUPLICATE_COLUMN exception and silent NULLs reading Delta Lake tables with name mode column mapping
  • Fixed mutation after lightweight update and secondary indices
  • Fixed incorrect result of FINAL queries mixing primary and non-primary key skip indexes
  • Enforced READ ON FILE checks for scalar file() and DESCRIBE TABLE file()
  • Fixed crash with glob pattern in file() when directory contains dangling symlinks
  • Fixed segfault in query plan optimization converting outer join to inner join with arrayJoin
  • Fixed ProtobufList format not working with Kafka engine
  • Fixed logical error with analyzer_compatibility_join_using_top_level_identifier and ARRAY JOIN
  • Set Watch component for watch responses in aggregated_zookeeper_log
  • Fixed partition pruning with FINAL deduplication when partition key not covered by sorting key
  • Fixed logical error in kql_array_sort_asc/kql_array_sort_desc with constant array arguments
  • Fixed out-of-bounds access in ColumnConst::getExtremes with extremes = 1
  • Fixed potential deadlock with concurrent MOVE PARTITION operations
  • HTTP server now returns error message in response body for 400 Bad Request
  • Fixed wrong results with distributed index analysis and query condition cache
  • Fixed LOGICAL_ERROR in MergeTreeSetIndex with toDate conversion on key columns
  • Fixed LOGICAL_ERROR with RIGHT JOIN wrapped in CROSS JOIN in legacy join code path
  • Fixed segfaults and OOM from corrupted DDSketch deserialization in quantilesDD
  • Fixed LOGICAL_ERROR with correlated columns in lambda functions like arrayMap
  • Fixed logical error in caseWithExpression with materialize(NULL) or Nullable(Nothing) arguments
  • Fixed bad cast exception when filtering _table virtual column in merge table function
  • Fixed sporadic deduplication failure with inconsistent cleanup ordering in ZooKeeper
  • Fixed exception with ORDER BY ... WITH FILL used together with LIMIT BY
  • Fixed silent data corruption inserting Parquet/Arrow Date into Enum column
  • Fixed exception reading Arrow file with Array column into table with Nested column
  • Fixed MATERIALIZE INDEX and MATERIALIZE PROJECTION mutations getting stuck
  • Fixed exception reading from Nullable(Tuple(...)) with colliding element names
  • Fixed exception when joining Merge table wrapping Distributed table

Multiple bug fixes including:

Parquet and Data Format Fixes:

  • Fixed incorrect Parquet Bool to FixedString conversion in native V3 reader
  • Fixed HTTP Basic Auth to accept base64 credentials without padding

Query Execution Fixes:

  • Fixed incorrect partition pruning with Nullable partition key columns
  • Fixed rare exception in pipeline executor during query cancellation
  • Fixed 'Column identifier is already registered' exception with count_distinct_optimization and QUALIFY
  • Fixed exception with IN/NOT IN using LowCardinality column arguments
  • Fixed 'Pipeline stuck' exception in full_sorting_merge joins
  • Fixed LOGICAL_ERROR with TTL merging and aggregate projections
  • Fixed logical error with CROSS JOIN and INNER JOIN USING
  • Fixed null pointer dereference in dictGetOrDefault with Nullable keys
  • Fixed exception in DISTINCT queries with aggregate projections and LowCardinality
  • Fixed LOGICAL_ERROR with arrayJoin in filter expression with OUTER JOIN
  • Fixed logical error with parallel replicas and optimize_aggregation_in_order
  • Fixed pipeline deadlock with sort_overflow_mode and window functions
  • Fixed column rollback in Buffer engine during exception handling

Type System and Comparison Fixes:

  • Fixed bad cast exception in null-safe comparison with Dynamic/Variant and NULL
  • Fixed IS DISTINCT FROM with Dynamic/Variant vs NULL returning incorrect results

Index and Optimization Fixes:

  • Fixed tryGetColumnDescription to filter subcolumns by parent column kind
  • Fixed text index usage with other skip indexes
  • Fixed distributed index analysis with expressions in primary key
  • Fixed S3 requests being incorrectly retried on non-retryable errors
  • Fixed set skip index usefulness detection with OR predicates

ClickHouse Keeper Fixes:

  • Fixed Keeper disconnecting Java ZooKeeper clients after addWatch request
  • Fixed zk_followers and zk_synced_followers metrics not decreasing
  • Fixed Keeper's secure raft port ignoring cipherList and dhParamsFile configuration
  • Fixed misleading Keeper log messages about operation timing
  • Fixed Keeper TCP connections preventing graceful server shutdown

Join and Filter Fixes:

  • Fixed LOGICAL_ERROR with PREWHERE and IN subquery on MergeTree tables
  • Fixed exception 'Sorting column wasn't found in ActionsDAG' with query_plan_convert_join_to_in
  • Fixed BAD_GET exception with non-boolean expression in WHERE and SELECT with JOIN
  • Fixed LOGICAL_ERROR with read_in_order_through_join and parallel replicas

Data Type and Function Fixes:

  • Fixed MongoDB dictionary source failing with named collections
  • Fixed LOGICAL_ERROR when Identifier is empty after parameter substitution
  • Fixed exception with input table function as argument of remote
  • Fixed outdated data parts resurrection from incorrect cleanup
  • Fixed exception in LogicalExpressionOptimizerPass with Variant return type
  • Fixed parseDateTimeBestEffort incorrectly parsing month/weekday prefixes
  • Fixed UNKNOWN_IDENTIFIER with merge() table function over tables with different JSON parameters
  • Fixed optimize_skip_unused_shards with Distributed storage in Views
  • Fixed tuple subcolumn access by name for external tables
  • Fixed reverseUTF8 exception on invalid UTF-8 input
  • Fixed LOGICAL_ERROR with FINAL, PREWHERE, constant WHERE and column-independent aggregates

Configuration and System Fixes:

  • Fixed system.trace_log entries for dictionary auto-reloads having non-empty query IDs
  • Fixed crash from null pointer dereference in system tables iteration
  • Fixed SYSTEM START REPLICATED VIEW not waking up refresh task
  • Fixed 'Inconsistent table names' exception with view() containing JOINs
  • Fixed adjusting RLIMIT_SIGPENDING via pending_signals

Security Fix:

  • Fixed RBAC bypass allowing users to DESCRIBE any table via remote/cluster functions without SHOW_COLUMNS privilege

Performance Fixes:

  • Fixed unexpected result with read_in_order_use_virtual_row and monotonic functions
  • Fixed JIT expression compilation bugs preventing optimization passes

TTL and Transactions:

  • Fixed LOGICAL_ERROR in renameAndCommitEmptyParts with concurrent TRUNCATE TABLE and OPTIMIZE TABLE
  • Fixed decimal overflow when partition pruning with DateTime64

Add information about deferred filters as a separate item to EXPLAIN query output. Enable type_json_allow_duplicated_key_with_literal_and_nested_object by default to avoid errors about duplicated keys during JSON parsing. Keeper improvement: find_super_nodes command is more reliable when finding multiple super nodes by forbidding traversal of their children. Initial completion support for clickhouse-keeper-client. Flush async logging buffers in case of crash. Enable the impersonate feature by default (see EXECUTE AS target_user). Improve canceling queries with SQLite, MongoDB and MySQL table engines by KILL QUERY and cancel query (Ctrl+C). Add server setting jemalloc_profiler_sampling_rate to control jemalloc profiling. Support weights in concurrent bounded queue implementation. Add sslmode to allowed keys for PostgreSQL dictionary sources to support SSL connections. Show clear "no such file" error when passing non-existent file paths. Text indexes can now be built on Nullable and Array(Nullable) columns. Avoid dropping named collections that are dependencies of dictionary sources. Enable grace_hash join algorithm for queries with totals. Cancel background merges early in DROP DATABASE. Remove NetlinkMetricsProvider and use procfs exclusively for per-thread taskstats metric collection. Refactor Iceberg manifest file handling to fix caching issues. Optimize PREWHERE decisions for expressions like toDate(time). Add MaxAllocatedEphemeralLockSequentialNumber metric for ZooKeeper. Add new profile event KeeperRequestTotalWithSubrequests for better Keeper workload visibility. SYSTEM RELOAD DICTIONARIES now reloads dictionaries in topological order. Restart statistics cache after changing MergeTree settings. Only "alive" replicas participate in distributed index analysis. Add setting access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users. Cap automatic parallel replicas heuristic to actual node count. Implement hedged requests and asynchronous reading for distributed index analysis. Deserialization of binary AggregateFunction states now requires consuming full input. Make TRUNCATE DATABASE respond to query cancellation. Improve keeper-bench with request pipelining and better stats. Support SAMPLE clause in distributed index analysis. Show chart title in dashboard even with empty results. Cap column lists in analyzer error messages to 10 entries. Return column stats from sub-queries with joins. Mark ZooKeeper session as expired immediately on finalization. Use more math functions from LLVM-libc. Reduce memory usage in system.jemalloc_profile_text. Add is_subrequest column to system.aggregated_zookeeper_log. Allow ALTER TABLE MODIFY COLUMN x TTL without specifying column type. Skip stale Keeper requests for disconnected sessions. Support text index on mapValues(map) with IN operator. Shell-like completion support in clickhouse keeper-client. Prevent Keeper mntr command from getting stuck. Reduce lock contention in Keeper dispatcher. Tolerate missing padding at the end of parquet file blocks. Fix how Alias table targets are saved as DDL dependencies. Fix wrong result or exception during reading subcolumns of ALIAS columns. Fix missing column in JOIN with non-standard identifier alias. Fix crashes in Kusto dialect functions with empty arguments. Forbid mounting local_object_storage outside user_files_path in clickhouse-client. Fix logical race in DeltaLake table engine on snapshot version change. Fix logical error on attaching a part in MergeTree with chained renames. Fix explicit settings being silently ignored when sent with compatibility. Fix client reporting NETWORK_ERROR instead of actual parsing error in INSERT with parallel parsing.

Performance Improvements:

  • Allow read-in-order optimization and primary-key pruning with Nullable CAST target types for monotonic conversions
  • Allow index pruning and filter pushdown when comparing integral columns with float literals
  • Added SLRU cache for Parquet metadata to improve read performance
  • Support swapping sides of ANTI, SEMI and FULL joins based on optimizer statistics
  • Optimized granules skipping for pointInPolygon and fixed index analysis issues
  • Improved levenshteinDistance function performance
  • Optimized batch decimal type conversions by avoiding per-element function calls
  • Iceberg tables now support asynchronous metadata prefetching and cached metadata usage
  • S3Queue ordered mode uses ListObjectsV2 StartAfter to reduce ListObjects calls
  • Lowered memory usage for inserts deduplication in sync mode
  • Use arch-specific cache line size instead of hardcoded 64-byte value
  • Optimized text index dictionary reading and analysis
  • Sped up LZ4 decompression of 16 byte blocks in ARM
  • Refactored tokenization to high-performance interface with SIMD support
  • Improved text index analysis for queries with combined conditions
  • Improved performance of queries with constant expressions generating large arrays/maps
  • Fixed key condition analysis for DateTime64 primary keys compared with integer constants
  • Setting optimize_syntax_fuse_functions enabled by default
  • Optimized avgWeighted aggregate function with local accumulators (~27% improvement for Nullable inputs)
  • Improved performance and reduced memory usage for parallel window functions and arrayFold workloads
  • Improved sorted merges performance
  • Optimized INTERSECT ALL and EXCEPT ALL
  • Added read_in_order_use_virtual_row optimization support for reverse-order reads
  • Reduced cache contention in RIGHT and FULL JOINs
  • Optimized PrefetchingHelper::calcPrefetchLookAhead with integer arithmetic
  • Reduced Keeper memory consumption by replacing absl::flat_hash_set with CompactChildrenSet (KeeperMemNode reduced from 144 to 128 bytes)

Feature Improvements:

  • Aggregate projections now correctly supported in views
  • Support OUTER to INNER join conversion optimization with join_use_nulls
  • Improved subcolumns reading with correct sizes calculation
  • Separate jemalloc arenas for mark, uncompressed and page caches to avoid memory fragmentation
  • Tables with DELETE TTL rules can now use vertical merge algorithm
  • Apply data skipping indexes during distributed index analysis
  • Secondary index marks prewarmed when prewarm_mark_cache setting enabled
  • Reduced locking during access control
  • Compound AND conditions in row policies and PREWHERE now decomposed for sorting-key atoms extraction
  • Reduced lock contention in MergeTreeBackgroundExecutor
  • Fixed excessive memory usage (~514 MiB) during format auto-detection for non-Arrow data
  • Parse GeoParquet files with different Geo types in same column
  • Introduced tokensForLikePattern SQL function for LIKE pattern tokenization
  • Added {_schema_hash} placeholder for S3 table engine
  • SymbolIndex, addressToSymbol, system.symbols, buildId now work on macOS
  • system.stack_trace table now works on macOS
  • Added per-server LDAP config option <follow_referrals> to control referral chasing
  • Track data skipping indices used in query execution via skip_indices column in query_log
  • ACCESS_DENIED hints no longer reveal column names unless user can show all required columns
  • Added dedicated cleanup thread for MergeTree to prevent cleanup delays
  • Reload cluster config if IPs of local server's hostname changed
  • Allow optimize_aggregators_of_group_by_keys to correctly optimize in GROUPING SETS queries
  • Keeper-bench: report errors in metrics and generate JSON metrics file
  • Added ROLE clause to CREATE USER
  • Internal_replication settings can now be set for Replicated database clusters
  • New setting allow_nullable_tuple_in_extracted_subcolumns controls Tuple subcolumns behavior
Last Checked
8h ago
Tracking since Mar 26, 2026