後方互換性を持たない変更
クエリと構文の変更
- ウィンドウ関数
RANKおよびDENSE_RANKは、SQL standard に準拠し、引数を受け付けずにNUMBER_OF_ARGUMENTS_DOESNT_MATCHをスローするようになりました。従来はRANK(x) OVER (ORDER BY id)のようなクエリが引数を無視したまま暗黙的に受け入れられており、ユーザーの混乱を招く一因となっていました。従来の寛容な動作に戻すには、allow_rank_dense_rank_arguments = 1を設定してください。#104324 (groeneai)。
データ型の変更
icebergHashとicebergBucketは、Int128、UInt128、Int256、UInt256、Decimal256型の引数を明示的なエラーで拒否するようになりました。以前は、より大きな値を暗黙的に切り詰め、ハッシュ衝突を引き起こしていました。Iceberg の仕様では、ハッシュは 32/64 ビット整数および精度が最大 38 の Decimal に対してのみ定義されています。収まる値で以前の動作を維持するには、Int64またはDecimal128にキャストしてください。 #105866 (Algunenano).toUUID、toUUIDOrNull、toUUIDOrZero、toUUIDOrDefault、UUIDおよびNullable(UUID)へのCAST、UUIDへのaccurateCastOrNull、ならびにテキストから UUID をパースする入力フォーマット (Avro、MsgPack、JSONExtractなど) は、長さは正しいものの 16 進数以外の文字を含む文字列を拒否するようになりました。以前は、そのような入力は 16 進数字のルックアップテーブルの末尾を超えて参照することで、暗黙的に架空の UUID に変換されていました。今後はtoUUIDがCANNOT_PARSE_UUIDを throw し、Or*系のバリアントはNULL/ ゼロ UUID / 指定されたデフォルト値を返します。 #104370 (groeneai).Dynamic型とVariant型は、ウィンドウのPARTITION BY句でも検証されるようになりました。以前はallow_suspicious_types_in_group_byが無効な場合にチェックされていませんでした。DynamicまたはVariantカラムでウィンドウをパーティション化するクエリは、allow_suspicious_types_in_group_by = 1でない限り throw するようになりました。 #105450 (Avogar).
ストレージおよび索引に関する変更
- min/max 集約および minmax 索引で、ネストされた Dynamic/Variant を拒否するようになりました。以前は最上位レベルの Dynamic/Variant のみを検査していました。 #105468 (Avogar).
- サーバー設定
insert_deduplication_versionのデフォルトがcompatible_double_hashesからnew_unified_hashに変更されます。挿入の重複排除は、パーツ/パーティション単位ではなく、挿入ブロック全体 (挿入ごと) を対象に行われるようになりました。同じ挿入を再試行した場合は引き続き重複排除されますが、同一のパーツを生成する別々の挿入どうしは重複排除されなくなり、同じ行を異なる順序で挿入した場合も重複排除されなくなります。以前の動作に戻すには、insert_deduplication_version = compatible_double_hashesを設定してください。new_unified_hashでは、非同期 INSERT の重複排除も同期ウィンドウによって制御されます。有効化の有無 (replicated_deduplication_window) と保持期間 (replicated_deduplication_window_seconds、デフォルトは1時間) はどちらも同期設定に従うため、*_for_async_insertsはレガシーであり、old_separate_hashes/compatible_double_hashesにのみ適用されます。old_separate_hashesがデフォルトだったリリースから直接アップグレードするインスタンスは、関連する最長の重複排除ウィンドウが経過するまで (非同期 INSERT を使用する場合は、デフォルトで1週間のreplicated_deduplication_window_for_async_insertsを含む) 、まずcompatible_double_hashesを使用して実行してからnew_unified_hashを使用してください。compatible_double_hashesから切り替える非同期ワークロードでは、new_unified_hashが保持期間の長いasync_blocksID を確認しなくなるため、まずreplicated_deduplication_window[_seconds]を非同期ウィンドウまで拡大して非同期ウィンドウ全体にわたって実行するか、非同期 INSERT を停止するか、compatible_double_hashesを継続して使用してください。 #107886 (CheSema). - 区切り文字を含む needle を指定した
hasTokenが、BAD_ARGUMENTSを発生させずにテキスト索引経由で結果を返していた問題を修正しました。 #108189 (Ergus).
削除された機能
- 廃止された Arrow ベースの Parquet リーダーおよびライターは使用できなくなりました。代わりに常に native 実装が使用されます。旧実装を選択したり調整したりしていた次の設定は廃止され、無視されます:
input_format_parquet_use_native_reader_v3、output_format_parquet_use_custom_encoder、output_format_parquet_version、output_format_parquet_compliant_nested_types、output_format_parquet_unsupported_types_as_binary。Native writer は常に準拠したネストされた型を用いて Parquet V2.6+ で書き込み、サポートされていない型については生データのバイナリとして書き込む代わりにUNKNOWN_TYPEをスローします。#100949 (alexey-milovidov)。 - 廃止された
allow_experimental_query_deduplication設定と、それに伴うサポート対象外の実験的なクエリ重複排除の動作を削除しました。#99398 (devcrafter)。 ALTER TABLE ... REPLACE PARTITION ... FROM ...では、ログソーステーブルの指定されたパーティションにパーツがない場合、宛先パーティションのデータを暗黙的に削除しなくなりました。以前は、このようなリクエストにより宛先パーティションが削除され、代わりに何も書き込まれませんでした。現在はデフォルトでBAD_ARGUMENTSにより拒否されます。これは後方互換性を持たない変更です。これまで成功していた空のログソースからのREPLACE PARTITION(宛先を消去する操作) は、アップグレード後は例外をスローします。以前の暗黙的な消去動作に戻すには、新しい設定allow_replace_partition_from_empty_source = 1を設定するか (クエリごと、またはプロファイル内) 、compatibilityを26.5以下に設定してください。宛先データを明示的に削除するには、ALTER TABLE ... DROP PARTITION ...を使用してください。#104939 (groeneai)。- 実験的な KQL (Kusto) 関数
array_sort_ascおよびarray_sort_descと、それらの SQL バックエンドであるkql_array_sort_ascおよびkql_array_sort_descを削除しました。これらの関数は実験段階で、実装品質が低く、正確性やパーサーに関するバグの原因となっていました。これらの名前を使用するクエリは、現在UNKNOWN_FUNCTIONを返します。#108101 (groeneai)。
新機能
関数
prometheusQueryおよびprometheusQueryRangeテーブル関数で、PromQL のhistogram_quantile関数をサポートしました。これにより、leラベルで識別される従来の Prometheus ヒストグラムのバケットに対して分位点を計算できます。 #103477 (Yasumoto).- 中心ベース、完全包含、重複の包含モードをサポートする
h3PolygonToCellsWithContainment関数を追加しました。 #104455 (yousefQadry). formatReadableSize、formatReadableDecimalSize、formatReadableQuantity関数で、任意の精度引数を指定できるようになりました。これにより小数点以下の桁数を制御できます。デフォルトは 2 で、従来の動作を維持します。 #104648 (antoniofilipovic).argMinおよびargMaxの集約関数の別名として、min_byとmax_byを追加しました。 #105712 (itsjoeoui).
SQL とクエリ機能
formatReadableTimeDeltaが、MonthおよびYear以外の型のINTERVAL式を入力として受け付けるようになりました。#64315 (Beetelbrox).- PNG 出力フォーマットのサポートを追加し、クエリ結果を PNG 画像として直接レンダリングできるようになりました。#74691 (m7kss1).
- ワークロード向けのメモリ予約機能を導入しました。ワークロードスケジューリングのドキュメントを参照してください。#82414 (serxa).
IP_ADDRESSまたはFORWARDED_IP_ADDRESSをキーとするクォータ用に、IPV4_PREFIX_BITSおよびIPV6_PREFIX_BITSオプションを追加しました。これにより、クォータ制限を個々の完全な IP アドレスに適用する代わりに、IP サブネット単位で共有できます。#89270 (adityachopra29).ALTER TABLEクエリにADD ENUM VALUESを実装し、既存のすべての Enum 値を再指定せずに、既存の Enum 型へ新しい値を追加できるようにしました。#93830 (ilejn).- 読み取り用の
GeoJSON入力フォーマットを追加しました。#98124 (mneedham). - トークン化後のトークンを変換するポストプロセッサをテキスト索引に追加しました。#98939 (Ergus).
- ClickHouse Keeper の有効期限 (TTL) ノードに対するオプトインサポートを追加しました。TTL ノードは設定された存続期間の経過後に自動的に期限切れとなり、子ノードを持つことはできません。#100397 (scanhex12).
- 完全一致の
hasPhrase検索をサポートするため、テキスト索引にトークン位置の保存を追加しました。support_phrase_search索引引数とallow_experimental_text_index_phrase_searchMergeTree設定を有効にしてください。#103172 (ahmadov). - 関数
arrayTopKとarrayBottomKを追加しました。-arrayTopK(k, array)は K 個の最大要素を降順で返します -arrayBottomK(k, array)は K 個の最小要素を昇順で返します。#104563 (vitlibar). * LIKE '<pattern>'および* ILIKE '<pattern>'を使用して、名前パターンでカラムを選択できるようになりました。table.* LIKE '<pattern>'やtable.* ILIKE '<pattern>'などの修飾形式にも対応しています。LIKEはカラム名を大文字・小文字を区別して照合し、ILIKEは区別せずに照合します。#104569 (niyue).- 一連のスナップショット読み取りを使用する
MergeTreeテーブル向けの継続クエリを追加しました。#105114 (Michicosun). - スキーマ進化のサポートを向上させるため、
RowBinaryWithNamesAndTypesAndDefaultsフォーマットを追加しました。#105736 (mzitnik). - SQL から直接 Mapbox Vector Tiles を提供するための関数を追加しました。
MVTEncodeGeomはジオメトリを slippy-map タイルのピクセル空間に投影してクリップし、MVTEncodeはグループ内の投影済みジオメトリを単一レイヤータイルのバイナリバイト列に集約します。MVTBoundingBox/MVTBoundingBoxMercatorは、行をタイルに制限するためのタイルのバウンディングボックスを返します。Point、line、Polygon ジオメトリをサポートしています。PostGIS の別名であるST_AsMVTGeomおよびST_AsMVTとしても利用できます。#106107 (saarthak2002). LOCALTIMEおよびLOCALTIMESTAMP(SQL 標準 / PostgreSQL 構文) を追加しました。LOCALTIMESTAMPはnow()の別名で、DateTimeを返します。LOCALTIMEは現在の時刻をTime値として返します。#106139 (thomas-cabral).- 新たに
hostname_longest_common_prefixとhostname_longest_common_suffixの 2 つのload_balancing戦略を追加しました。これらは、イニシエーターのホスト名と最長の共通プレフィックス (それぞれ接尾辞) を持つレプリカを優先します。既存のnearest_hostnameおよびhostname_levenshtein_distance戦略では誤ったレプリカが選択される、数値セグメントの長さが可変なホスト名のプレフィックスまたは接尾辞にデータセンターがエンコードされている場合に有用です。#107360 (den-crane). - 新しい関数
quantizeBFloat16ToInt8およびdequantizeInt8ToBFloat16を追加しました。これは、埋め込みの部分を 256 レベルのガウス Lloyd-Max 量子化器を使用して 8 ビットに圧縮するスカラー codec です。ビット切り捨てにより Int4/Int2/binary codes を抽出できます。#108102 (alexey-milovidov).
テーブルエンジンとストレージ
設定と構成
- 浮動小数点数および
Decimal数値について、値が整数であってもテキストフォーマットでは常に小数点を出力する設定output_format_always_write_decimal_point_in_float_and_decimalを追加しました。たとえば、1ではなく1.を出力します。デフォルトでは無効です。 #62614 (qoega). - 新しい不変の
MergeTree設定allow_tuple_element_aggregationを追加しました。デフォルトでは無効です。有効にすると、SummingMergeTree、AggregatingMergeTree、CoalescingMergeTreeはTupleカラムを再帰的にフラット化し、マージ時に各リーフ要素を最上位カラムであるかのように個別に集約します。つまり、SummingMergeTreeは合計し、AggregatingMergeTreeは集約関数の状態をマージし、CoalescingMergeTreeは最後の非 NULL 値を保持します。この設定はテーブル作成時に指定する必要があり、対応していないエンジンでは暗黙的に無視されます。 #98039 (JingYanchao). - 浮動小数点数のテキスト出力における小数桁数を制御する設定
output_format_float_precisionを追加しました。 #99721 (phulv94). - MergeTree テーブル設定
materialize_projections_on_insertおよびmaterialize_projections_on_mergeを追加しました。materialize_projections_on_insert = 0の場合、INSERT 時に projection パーツの構築をスキップするため、多数の projection を持つテーブルの INSERT スループットが向上します。materialize_projections_on_merge = 1の場合、すべてのソースパーツに存在しない projection をマージ時に再構築するため、INSERT 時ではなくマージ中に projection を構築できます。マージでは引き続き、同じ projection セットを共有するパーツのみが結合されます。 #100993 (cwurm). - 新しい S3Queue 設定
after_processing_move_preserve_pathを追加しました。after_processing='move'およびafter_processing_move_prefixとともに有効にすると、処理済みオブジェクトはファイル名だけにフラット化されるのではなく、宛先プレフィックス配下にソースパス全体を保持したまま移動されます。 #105354 (asya-ch). - 指定したプレフィックスに一致するすべてのパスを照合するための HTTP ハンドラー構成要素
url_prefixおよびfull_url_prefixと、明示的なurl_regexp、full_url_regexp、headers_regexp要素を追加しました。従来の<url>regex:...</url>形式も引き続きサポートされます。 #107492 (vitlibar).
認証
- S3 のロールベースアクセス向けに、任意の
external_id認証情報を追加しました。#106941 (eliangidoni) 。 - 証明書ベース認証のオブザーバビリティを向上させるため、TLS クライアント証明書の情報 (subject、シリアル番号、issuer、有効期間) を
system.session_logテーブルに追加しました。#107679 (alexey-milovidov) 。
システムテーブル
system.iceberg_filesテーブルを追加しました。このテーブルでは、各テーブルの現在のスナップショットに含まれるデータファイルまたは削除ファイルごとに1行として、Iceberg テーブルのファイル単位のメタデータを参照できます。#104415 (asya-ch).- 仮想 (what-if) スキップ索引を追加しました。
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ...を使用してセッションスコープの仮想スキップ索引を定義し、EXPLAIN WHATIF SELECT ...を使用して、マテリアライズせずにスキップ率とコストを見積もれます。定義済みの索引は、新しいsystem.hypothetical_indexesテーブルで確認できます。#104608 (yariks5s). - すべてのテーブルの CHECK および ASSUME 制約に関する情報 (制約名、種類、式を含む) を提供する
system.constraintsテーブルを追加しました。#105337 (PedroTadim). - システムの共通コンポーネント (関数、テーブルエンジン、データ型、設定、フォーマットなど) の埋め込みリファレンスドキュメントを1つのテーブルに集約し、ドキュメントを Markdown としてレンダリングする新しいシステムテーブル
system.documentationを追加しました。#107463 (alexey-milovidov).
実験的機能
- inner join 向けの実験的な
dphyp結合順序変更アルゴリズムをquery_plan_optimize_join_order_algorithm設定の選択肢として追加しました。また、結合順序の探索に上限を設け、上限を超えた場合はチェーン内の次のアルゴリズムにフォールバックするquery_plan_optimize_join_order_max_searched_plans設定を追加しました。従来の上限なしの探索動作を維持するには、0に設定します。 #98798 (davenger). - テキスト索引に遅延ポスティングリスト適用モードを追加しました。
SET allow_experimental_text_index_lazy_apply = 1およびSET text_index_posting_list_apply_mode = 'lazy'で有効にすると、ポスティングリストは Roaring Bitmap として完全にマテリアライズされるのではなく、カーソルベースの方式で packed-block 粒度にオンデマンドでデコードされます。これにより、選択性の高いテキスト索引クエリのメモリ使用量と CPU 時間を削減できます。 #100035 (fastio). - オプションのプレフィックスを付けて、メイン HTTP ポートに prometheus ハンドラーをアタッチできるようにしました。 #104975 (JTCunning).
- 小さなスキップ索引サブストリームをパーツごとに単一の
skp_idx.packedアーカイブにまとめる実験的な MergeTree 設定packed_skip_index_max_bytesを追加しました。これにより、テーブルに多数のスキップ索引が定義されている場合の inode 枯渇を抑えます。書き込み時にサブストリームごとに判定され、シリアライゼーション後のサイズがしきい値未満のサブストリームはアーカイブに格納され、それ以上のものはスタンドアロンのskp_idx_<name>.idx2/.mrk2レイアウトのままとなります。1 つのパーツ内でレイアウトを混在させることもできます。全文索引はサポートされず、常にファイル単位で保存されます。デフォルトは 0 (パッキング無効) です。 #105321 (Algunenano). ABI BUFFERED_V1を使用する WebAssembly UDF のBuffersシリアライゼーションをサポートし、永続化される WASM UDF 関数設定としてwebassembly_udf_enable_fuelを追加しました。 #105574 (antonio2368).- マルチステージ分散クエリ実行: プランナーはクエリプランを scatter / broadcast / gather / shuffle exchange で接続されたステージに分割し、プランフラグメントをワーカーノードにディスパッチします。ステージ間のデータは TCP 経由でストリーミングされるか、共有オブジェクトストレージ内の一時ファイルを介して受け渡されます。この経路では、分散 shuffle、broadcast hash join、shuffle 集約、分散ソートがサポートされます。この機能は実験的で、デフォルトでは無効です。 #106020 (davenger).
- 実験的な分散クエリプランエンジン (
make_distributed_plan) では、ワーカーごとに異なるタスクディスパッチポートおよびストリーミング exchange ポートを使用できるようになりました。これは<remote_servers>内でレプリカごとにstateless_worker_portおよびstreaming_exchange_portを指定して設定します。未設定の場合は、従来のサーバーレベルのポート (stateless_worker_client.portおよびdistributed_query.streaming_exchange_port) が使用されます。これにより、1 台のホストで複数のワーカーを実行できます。 #107885 (davenger).
パフォーマンス改善
JOIN のパフォーマンス
- JOIN の後に選択性の高い LIMIT、TopN、または別の JOIN が続く場合、selector 索引とレプリケーション索引を遅延適用するようにしました。遅延 selector 索引を有効にするために必要な payload カラム数は、設定
query_plan_min_columns_for_join_lazy_indexingで制御します (0 は最適化が無効であることを意味します) 。この最適化を適用する LIMIT は、設定query_plan_max_limit_for_join_lazy_indexingで制御します。 #98883 (m-selmi). ASOF JOINでparallel_hash結合アルゴリズムを使用できるようにし、異なる等価キー値ごとにビルド処理を並列化しました。以前は、ASOF は無条件にparallel_hashの対象外でした。 #105375 (gregakinman).- ハッシュ結合の FixedHashMap を、probe 側の JOIN ランタイムフィルタとして共有します。ビルド側のハッシュテーブルが FixedHashMap である場合、または FixedHashMap に変換可能な場合は、ランタイムフィルタとしてパブリッシュされ、
BuildRuntimeFilterStepが通常設定するSet/BloomFilterを置き換えます。新しい設定enable_join_runtime_filter_shared_fixed_hash_table(デフォルトはtrue) で制御します。 #105640 (wudidapaopao). - DP JOIN の結合順序変更が、並列レプリカでも許可されるようになりました。 #105889 (nickitat).
- JOIN でランタイムフィルタ (デフォルトで有効な
enable_join_runtime_filters) を使用する場合のクエリプランを改善しました。結合順序変更のコストモデルが右部分木のWindowTransform(およびその他の行を保持するプランステップ) を考慮できるようになり、統計情報なしにフォールバックする代わりに、基となる行数とカラムごとの NDV を使用します。 #107229 (UnamedRus).
クエリ最適化
- 希少なトークンの処理を最適化し、マルチトークン検索におけるテキスト索引解析のパフォーマンスを改善しました。#98226 (CurtizJ).
- OpenSSL 3.x で行ごとに暗黙的に行われる OpenSSL プロバイダーのルックアップを回避し、
encrypt、decrypt、halfMD5関数のパフォーマンスを改善しました。#99105 (thevar1able). - 一時的なプロジェクションパーツ数とマージのオーバーヘッドを削減するため、
MATERIALIZE PROJECTION時にprojection.calculate()の前でソースブロックをまとめます。5,000 万行のテーブルで約 3.4 倍高速化されます。#100047 (amosbird). - Approximate Runtime Filters および Bloom Filter Indices のパフォーマンスを改善しました。#100201 (cv4g).
LIMIT BYのカラムがORDER BYのプレフィックスである場合、Sort中に各並列ソート済みストリーム内でLIMIT BYを実行することで、ORDER BY ... LIMIT BYクエリを高速化します。これにより、最終的なソートマージおよび後続のパイプラインステップを通過する行数が削減されます。この最適化は、新しい設定query_plan_push_limit_by_into_sort(デフォルトで有効) で制御されます。#104000 (nihalzp).- 単純な SELECT クエリのクエリごとのオーバーヘッド (パース、解析、プランニング) を削減しました。たとえば、単一の接続から実行する
SELECT count() FROM hitsは約 50% 高速化されます。#104513 (Algunenano). - 範囲チェック時に
rb_maxを繰り返し呼び出すことを回避し、UInt64以外のgroupBitmap状態に対するbitmapContainsのパフォーマンスを改善しました。#105960 (niyue). bloom_filter索引を持つLowCardinalityカラムの挿入パフォーマンスを改善しました。#106410 (EmeraldShift).QBitデータ型に対するL2DistanceTransposedおよびcosineDistanceTransposed関数のパフォーマンスを改善しました。#106701 (rienath).- 多数のカラムを持つテーブルに対するクエリのクエリ解析パフォーマンスを改善しました。不要な場合は、ソーステーブル式全体を含むカラムノードハッシュを計算しません。約 1,200 カラムのテーブルに対するネストされた
SELECT *サブクエリの解析は、現在約 50 倍高速です。#106957 (novikd). - BoringSSL から OpenSSL 3.x への移行 (24.4) で失われたパフォーマンスを回復し、
encrypt、decrypt、tryDecrypt、aes_encrypt_mysql、aes_decrypt_mysql関数のパフォーマンスを最大で 10 倍改善しました。#107339 (thevar1able). - 不要な文字列のマテリアライズを回避し、
Array(LowCardinality(String))に対するarrayElementと、キーまたは値がLowCardinality(String)のマップに対する map LIKE 関数の実行を改善しました。#107450 (EmeraldShift). DateTime64カラムをフィルタリングするクエリの CPU 使用率を削減し、スキップ索引の評価パフォーマンスを改善しました。#107707 (shankar-iyer).positionCaseInsensitiveUTF8、ILIKE、multiSearchAnyCaseInsensitiveUTF8を含む、大文字と小文字を区別しない部分文字列検索のパフォーマンスを改善しました。#107882 (Algunenano) 。- 予測テーブルで
VectorWithMemoryTrackingを使用するようになった際に発生した、ARM 上のFPC浮動小数点 codec のスループット約 16% のリグレッションを修正しました。#108182 (groeneai) 。 - 単一の論理削除
DELETEによってテーブル全体の query condition cache が無効化されるパフォーマンスリグレッションを修正しました。論理削除の対象になったことのあるテーブルに対して選択性の高いクエリを繰り返し実行すると、granule の pruning が行われなくなり、すべての mark を読み取るようになっていました。#112947 (fm4v) 。 - カラム STATISTICS から
col IN (...)の選択性を推定するコストに上限を設けました。これにより、単一クエリのプランニングに数百ミリ秒が追加される可能性がありました。推定器は、選択性の値を 1 つ得るためだけに Set を補完するcol IN (subquery)内のサブクエリを実行しなくなりました。代わりに、未構築の Set はスキップされます。新しいstatistics_max_set_size_for_exact_selectivity_estimation設定 (デフォルトは 10000) を超える Set では、Set のサイズとその境界 range から選択性が導出されるようになりました。#114389 (nickitat) 。
関数および集約のパフォーマンス
- 長い主キーおよび高カーディナリティの主キーに対する主キー索引解析を最適化しました。長い主キーでは、索引解析の実行時間は主キーの長さではなく、主にクエリのフィルタ (実際に使用するキーカラム) の複雑さに依存するようになりました。そのため、ソートキーを拡張しても、少数のカラムのみでフィルタするクエリの索引解析に対する追加オーバーヘッドはごくわずかです。高カーディナリティの主キーでは、ClickHouse はキーカラムの選択的なプレフィックスのみをメモリに保持し、末尾のカラムは読み込みません。索引解析はキー全体ではなく、このメモリ内のプレフィックスのみを対象に行われるようになりました。この最適化はデフォルトで有効で、新しい設定
use_lightweight_primary_key_index_analysisで無効にできます。 #91836 (nihalzp). - 大きな集約状態 (例:
groupArray) を持つ部分的な二段階集約結果のマージ時に、ピークメモリ使用量を削減しました。マージ完了まで各バケットの元の状態をすべて保持する代わりに、マージ中に段階的に解放します。 #102330 (yurifedoseev). - 高カーディナリティかつ均等に分散されたキー向けに、新しい
GROUP BY最適化を追加しました。グループ化キーのハッシュに基づいて行をスレッド間に分散するため、各スレッドはマージフェーズなしで、重複しないキーのサブセットを集約できます。有効にするにはenable_sharding_aggregator = 1を設定します。 #104233 (nihalzp). - すべてのストリームを1つにマージしてから制限を適用する代わりに、各パーティションのストリーム内で
LIMIT BYを並列実行することで、パーティション化されたMergeTreeテーブルのLIMIT BYクエリを高速化しました。これは、パーティション式がLIMIT BYカラムの決定論的関数であり、LIMIT BYのグループが2つのパーティションにまたがらない場合に適用されます。新しい設定allow_limit_by_partitions_independently(デフォルトで有効) で制御されます。 #105126 (nihalzp). <cols>がテーブルのソートキーのプレフィックスである場合、またはWHERE col = constによって先頭のカラムが固定されてプレフィックスとなる場合に、SELECT ... LIMIT N BY <cols>クエリを高速化しました。これを有効にすると、MergeTreeは主キー順にデータを読み取り、LIMIT BYはまずソート済みストリームごとに O(1) のメモリでストリーミングモードのフィルタリングを行い、データの大部分を除外します。続いて、絞り込まれたデータに対して通常のLIMIT BYを実行し、最終結果を取得します。新しい設定optimize_limit_by_in_order(デフォルトで有効) で制御されます。 #105135 (nihalzp).- 冗長なキー式を除去することで
LIMIT BYクエリを高速化しました。他のキーの決定論的関数であるキーは削除され (例:LIMIT 5 BY x, f(x)はLIMIT 5 BY xになります) 、キーの単射関数はその引数に置き換えられます (例:LIMIT 5 BY toString(x)はLIMIT 5 BY xになります) 。これにより、行ごとに評価する式の数が減り、評価コストも低減します。新しい設定optimize_limit_by_function_keysおよびoptimize_injective_functions_in_limit_by(どちらもデフォルトで有効) で制御されます。 #106818 (nihalzp). - 関数解決キャッシュから冗長なクエリツリーのハッシュを削除し、多数の関数呼び出しや深くネストした関数呼び出しを含むクエリの解析を高速化しました。 #107516 (novikd).
- 再帰 CTE の結果処理を並列化しました。大規模な
WITH RECURSIVEの結果に対するGROUP BYやその他の操作は、単一スレッドに制限されなくなりました。 #107694 (alexey-milovidov).
ストレージおよび I/O パフォーマンス
- 同じエンドポイントとバケットを使用する S3 クライアント間で cache を共有し、重複するリージョン検出を回避します。#96802 (zvonand).
- blob を並列にコピーすることで、オブジェクトストレージのコピー性能を改善しました。#105089 (asya-ch).
- file や s3 などのファイル系テーブル関数で One input format を使用する際に、ファイル内容を読み取らないようにしました。#105157 (niyue).
MergeTreeの主キーおよびスキップ索引で、ifNull(key = 0, 0)やcoalesce(key = 0, 0)のようにifNullまたはcoalesceで条件をラップしたフィルタに対して、グラニュールを枝刈りできるようになりました。このような述語は、NULLになる可能性のある比較を確定的なブール値に変換するためにクエリジェネレーターが生成することが多く、以前は索引解析で認識できなかったため、グラニュールをスキップできませんでした。これにより、既存のallow_key_condition_coalesce_rewrite設定 (デフォルトで有効) が拡張されます。#106272 (andyzzhao).BYTE_STREAM_SPLITでエンコードされた Parquet のFLOATおよびDOUBLEカラムのデコード性能を改善しました。#106376 (Algunenano).- 多数のアクセスエンティティ (行ポリシー、ロール、quota、設定プロファイル) が同時に変更された場合に、レプリケートされたアクセスストレージでログインやクエリ開始が長時間停止する問題を修正しました。エンティティごとの cache は、変更されたエンティティごとではなく通知バッチごとに一度だけ再計算されるようになり、アクセスロックを数分間保持する可能性があった二次的な処理を排除しました。#107672 (azat).
s3などのテーブル関数を介してオブジェクトストレージから多数の小さなファイルを読み取る際に、プリフェッチが停止して同期読み取りにフォールバックし、多数の小さなファイルに対するシングルスレッドまたは低 Concurrency の読み取りが大幅に遅くなるパフォーマンスリグレッションを修正しました。#108872 (fm4v).- オブジェクトストレージの読み取りがファイルシステムキャッシュ (
filesystem_cache_name) を経由する場合に、初回の小さなオブジェクトのプリフェッチを有効にしました。以前は、S3Queueの取り込みなどで多数の小さなファイルを読み取る際、ファイルシステムキャッシュが有効でも同期的なままでレイテンシーの影響を受けていました。#109478 (fm4v). - オンディスクサイズを考慮することで、
Mapサブカラムに対するPREWHERE最適化を改善しました。#110623 (Avogar). ReplacingMergeTreeでは、ORDER BYがなくても、FINAL、フィルタ、小さなLIMITを含むクエリに遅延マテリアライゼーションが適用されるようになりました。#110722 (KochetovNicolai).- 多数のパーティションにまたがる非同期挿入フラッシュ時の重複排除にかかる CPU 時間を削減しました。#111150 (valerypetrov).
- テーブルに
LowCardinalityカラムがある場合に、同じMergeTreeパーツに対して多数の独立した小規模読み取りを実行するクエリで発生する CPU リグレッションを修正しました。パーツに単一の共有 Dictionary があるかを判定するチェックは、以前は各読み取りタスクでパーツ全体のすべての mark を走査していましたが、現在は二分探索により同一 mark の各連続範囲を見つけます。index_granularityが小さいテーブルに対するこの形式のクエリは、26.6 以降、最大で数倍遅くなっていました。#116134 (groeneai).
メモリ最適化
Enumカラムを含むテーブルにおいて、Enum型のメタデータに使用するメモリを最大10分の1に削減しました。値から名前へのルックアップは同等以上の速度を維持する一方、パースおよびデシリアライゼーション時の名前から値へのルックアップは遅くなる場合があります。 #95668 (qoega).- バックアップエントリの書き込み時にファイル情報の内部リストをコピーしないようにすることで、
BACKUPのピークメモリ使用量を削減しました (数百万個のファイルを含むバックアップで特に効果があります) 。 #111162 (jkartseva).
改善
クエリと SQL
- クエリプランから未使用のカラムを削除する際、カラム名ではなく位置でカラムを識別するようにしました。これにより、カラム名が重複している場合でも未使用カラムを削除できます。 #100586 (antaljanosbenjamin).
- PostgreSQL / SQL 標準との互換性のため、
currentUser()の大文字・小文字を区別しないエイリアスとしてSESSION_USERを追加しました。 #106081 (takumihara). - PostgreSQL ワイヤプロトコル経由で実行されるクエリのキャンセル遅延を短縮しました。KILL QUERY は、chunk 全体がクライアントに送信されるまで待つのではなく、単一の chunk 内で出力のシリアライゼーションを中断するようになりました。 #106535 (rvasin).
- 定数引数を持つ lambda (例:
arrayMap(t -> t.2, ...)) を含む、serialize_query_plan = 1を指定した分散クエリで発生するILLEGAL_TYPE_OF_ARGUMENTエラーを修正しました。ActionsDAGのINPUTノードにある定数カラムが、クエリプランのシリアライゼーション中も保持されるようになりました。 #107124 (alexey-milovidov). - MySQL ワイヤプロトコル経由で実行されるクエリのキャンセル遅延を短縮しました。KILL QUERY は、chunk 全体がクライアントに送信されるまで待つのではなく、単一の chunk 内で出力のシリアライゼーションを中断するようになりました。 #107228 (rvasin).
関数
EXPLAIN SYNTAXの explain 出力で、演算子が一貫して関数呼び出し形式でフォーマットされるようになりました (例:1 + 2ではなくplus(1, 2)) 。#94681 (1abdelhalim).- PostgreSQL 形式の
expr OP SOME(array)/expr OP ALL(array)(右辺がサブクエリではない形式) がサポートされるようになりました。=/<>の場合はhas/NOT hasに、それ以外の比較演算子の場合はarrayExists/arrayAllのラムダ式に書き換えられます。anyは集約関数でもあるため、配列形式ではANYは使用できません。代わりにSOMEを使用してください。ANY/SOME/ALLのサブクエリ形式は、引き続きIN/NOT INに変換されます。#105129 (alexey-milovidov). - テキスト索引で関数
multiSearchAny、multiSearchAnyUTF8、multiMatchAnyがサポートされるようになりました。また、関数matchのテキスト索引解析が改善され、選択グループを含むパターンでより多くのグラニュールをスキップできるようになりました。#106279 (CurtizJ). - 関数
h3PolygonToCellsは、MultiPolygon内のすべての Polygon に対して配列サイズの上限を適用し、基盤となる H3 ライブラリの戻りコードを検証するようになりました。また、空の結果を暗黙的に返す代わりに、MultiLineString引数を拒否するようになりました。#106399 (Algunenano). - 集約関数
contingency、cramersV、cramersVBiasCorrected、theilsUの状態をデシリアライズする際に、保存されたカウントが整合性のある分割表を構成していることを検証し、そうでない場合はCORRUPTED_DATA例外をスローするようになりました。#107185 (nihalzp). - クエリプランオプティマイザのカーディナリティ推定を改善しました。決定論的な単一引数関数 (例:
toYear(date)) によって生成されるカラムは、統計情報がないままになるのではなく、引数の異なる値の数を上限として継承するようになりました。これにより、より正確な結合順序の変更が可能になります。#107757 (davenger).
テーブルエンジンとストレージ
- パーティションの割り当て後も短いポーリング間隔を使い続けていた Kafka テーブルエンジンのコンシューマーを修正し、設定された
kafka_poll_timeout_msに戻るようにしました。これにより、リバランス後の過剰な空ポーリング、小さなパーツの挿入、追加のマージオーバーヘッドを回避できます。 #100431 (sugaf1204). IcebergやDeltaLakeなどのデータレイクテーブルエンジンで、cache でラップされた S3 および Azure ディスクを使用できるようになりました。これにより、繰り返しの読み取りでファイルシステムキャッシュを利用できます。 #102017 (RinChanNOWWW).- 初回の PREWHERE 選択後に導入されたフィルタ (predicate pushdown、ランタイムフィルタ、または明示的な PREWHERE とプランナーが設定した WHERE) を、MergeTree 読み取りの上に別個の Filter ステップとして残すのではなく、2 回目のオプティマイザーパスで既存の PREWHERE にマージできるようにしました。 #105445 (yariks5s).
wait_for_part_commit_in_dependent_materialized_views設定を追加しました。有効にすると、ソースを再度結合する連鎖的な materialized view から、現在挿入中の行を参照できます。 #105943 (ahmadov).- タイムゾーンオフセットの時および分の部分を取得する PostgreSQL 互換の
EXTRACT(TIMEZONE_HOUR FROM dt)とEXTRACT(TIMEZONE_MINUTE FROM dt)、およびインターバルから値を抽出するEXTRACT(<unit> FROM INTERVAL n <unit>)/date_part('<unit>', INTERVAL n <unit>)を追加しました。 #106227 (vinayakj592). SYSTEM RESTART DISK <name>を実装しました。ディスクのインメモリメタデータを再読み込みし、そのディスク上にある readonly-replica テーブルのデータパーツを再スキャンします。これにより、共有plain_rewritableストレージ上のテーブルの readonly レプリカは、refresh_parts_intervalを待ったりサーバーを再起動したりせずに、別のサーバーによって書き込まれたデータをオンデマンドで確認できます。 #106645 (jrdi).- JSON advanced shared data に対する不要なマークファイルの読み込みをスキップします。 #107051 (Avogar).
MaterializedPostgreSQLデータベースエンジン用に、作成時に指定するmaterialized_postgresql_use_extended_date_and_time_types設定を追加しました。デフォルトでは (有効) 、PostgreSQL のdate/timestampカラムはDate32/DateTime64として推論されます。CREATE DATABASE時にこれを0に設定すると、より狭いDate/DateTime型が推論されます。この設定はMaterializedPostgreSQLテーブルエンジンには該当しません。 #107428 (alexey-milovidov).- MergeTree で、ブロックごとに異なる codec を使用する圧縮ストリームを読み取れるようになりました。これは Adaptive Codec Selection の読み取り側の前提条件です。 #108592 (rienath).
transform_null_in = 1でINセットにNULL値が含まれない場合、直接索引付けされたカラムに対するINpredicates でbloom_filterスキップ索引を使用します。以前はこのようなクエリでは索引がスキップされ、フルスキャンが必要でした。 #111329 (groeneai).
S3 とオブジェクトストレージ
- 例外を送出しない
isGranted経路 (checkAccessWithFilter) を含め、許可されたすべてのアクセスチェックで使用された権限をsystem.query_log.used_privilegesに記録するようになりました。以前は、例外を送出するエントリポイント (checkAccess/checkGrantOption) でチェックされた権限のみが記録されていたため、file/s3/azure/urlテーブル関数を使用するDESCRIBE、CREATE TABLE ASなどのクエリでは、READ ON FILE/READ ON S3/READ ON AZURE/READ ON URLが監査ログに記録されませんでした。アクセス制御の動作に変更はありません。 #104693 (alexbakharew). - 最終的な S3 マルチパートアップロードリクエストをタスクトラッカー経由で非同期に完了するようにし、finalize で直列に実行するのではなく、最後のパートのアップロードと並行して実行できるようにしました。 #105487 (asya-ch).
S3QueueおよびAzureQueueのpersistent_processing_node_ttl_seconds設定のデフォルト値を 1 時間から 6 時間に引き上げ、長時間実行される処理や再起動後の処理でバケットのロックが早期に失われることを防止しました。 #106838 (kssenii).s3_storage_class_name設定で、STANDARDおよびINTELLIGENT_TIERINGに加え、REDUCED_REDUNDANCY、STANDARD_IA、ONEZONE_IA、GLACIER_IR、EXPRESS_ONEZONEの値をサポートしました。 #107251 (adityaksolves).- オブジェクトストレージテーブル (例:
S3) の Hive パーティション化サンプルパスは、CREATE/ATTACH時ではなく、テーブルの初回使用時に解決されるようになりました。これにより、到達不能なエンドポイントがテーブルの作成やサーバーの起動を妨げることがなくなります。 #111842 (evillique).
設定と構成
- 互換性設定
file_like_engine_default_partition_strategyで、Hiveパーティション方式がデフォルトになりました。#86746 (kssenii). - テキスト索引のデフォルトパラメータを制御する4つの新しいMergeTreeテーブル設定
text_index_dictionary_block_size、text_index_dictionary_block_frontcoding_compression、text_index_posting_list_block_size、text_index_posting_list_codecを追加しました。これらの設定により、各索引定義でパラメータを指定することなく、テーブルレベルでテキスト索引の動作を調整できます。索引ごとに明示的に指定した引数は引き続き優先されます。#100626 (CurtizJ). output_format_pretty_grid_charsetがUTF-8の場合に、表形式のPrettyフォーマットのパディングをU+00A0NO-BREAK SPACE で描画する設定output_format_pretty_use_nbsp_for_paddingを追加しました。これにより、通常のスペースを折りたたむツールでも、コピーしたPretty出力の表の配置を維持できます。この設定はデフォルトで無効であり、ASCII文字セットの出力では通常のスペースが使用されます。#103559 (ashrithb).analyzer_compatibility_allow_non_aggregate_in_having設定で旧アナライザとの互換性をサポートしました。有効にすると、非集約条件はHAVINGからWHEREへ移動されます。#104232 (novikd).- ターゲットテーブルに
table_readonly = 1が設定されている場合でも、OPTIMIZE TABLE ... ON CLUSTERなどのDDLがハングしなくなりました。この設定では新たに専用エラーコードTABLE_IS_PERMANENTLY_READ_ONLYがスローされ、DDLWorkerはこれを再試行不可として扱います (ReplicatedMergeTreeのZooKeeperが一時的に切断された際に発生する一過性のTABLE_IS_READ_ONLYとは異なります) 。また、table_readonly設定は、作成時およびALTER MODIFY SETTING経由のいずれの場合も、ReplicatedMergeTreeに対して明示的に拒否されるようになりました。#105109 (alexey-milovidov). MergeTreeのソートキーにおける降順ソート (例:ORDER BY (time DESC, key)) が常にサポートされるようになり、廃止された実験的設定allow_experimental_reverse_keyは不要になりました。#106440 (nikitamikhaylov).- 既存の
CREATE QUOTA ... KEYED BY normalized_query_hashDDL構文に対応し、静的サーバー設定 (users.xml) で定義されたQUOTAでkeyed_by_normalized_query_hashをサポートしました。#107654 (alexey-milovidov). - 互換性設定は廃止された設定を適用しなくなったため、それらを変更済みとしてマークしたり、廃止された設定に関する警告を出したりしなくなりました。#107737 (UberDever).
- 設定
analyzer_compatibility_multiple_joins_qualify_column_names(デフォルトはfalse) を追加しました。有効にすると、クエリのFROM句に2つ以上のJOINが含まれる場合、アナライザによって生成される結果カラム名は旧アナライザの複数JOIN書き換えを模倣します。*から展開されたカラムには<alias-or-table>.<column>という名前が付けられ、SELECTリスト内のエイリアスなしカラム参照は記述どおりの名前を維持します。これにより、SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...)のように修飾名を参照する外側のクエリも、旧アナライザと同様に動作します。また、group_by_use_nullsをROLLUP、CUBE、またはGROUPING SETSと組み合わせた場合に、*から展開されたカラムの修飾済み結果カラム名がアナライザで失われ、結果カラム名が重複してそれらのカラムへの外側からの参照が壊れる問題も修正しました。#110746 (novikd). analyzer_compatibility_apply_final_to_all_joined_tables設定を追加しました。この設定により、JOIN の最も左のテーブルのFINAL修飾子が他の結合テーブルにも適用される従来の動作を復元できます。この設定は設定変更履歴に登録されているため、26.6 より前のバージョンとのcompatibilityでは従来のセマンティクスが自動的に復元されます。 #111589 (fm4v).- テキスト索引のオンディスクフォーマットのバージョン (
v0_initial、v1_with_codec、v2_with_positions) を制御する新しい MergeTree 設定text_index_versionを追加しました。ローリングアップグレード中またはダウングレード前には、古いサーバーでも読み取れるフォーマットで新しいサーバーがテキスト索引パーツを書き込み続けられるよう、古いバージョンに設定してください。互換性設定により自動的に調整されます。 #111803 (CurtizJ).
システムテーブルと監視
- DataLakeCatalog 経由でテーブルをクエリした際に、
system.query_logのused_storagesにストレージエンジン名を記録するようになりました。#100706 (melvynator). - プロジェクションのマージ進行状況を公開するため、
system.mergesにcurrent_projection、current_projection_progress、projections_completed、projections_remainingカラムを追加しました。#102611 (amosbird). - テーブルエンジンに埋め込みドキュメントが追加され、
system.table_enginesテーブルの新しいdescription、syntax、examples、introduced_in、relatedカラムを通じて参照できるようになりました。#106177 (alexey-milovidov). - データベースエンジンに埋め込みドキュメントが追加され、
system.database_enginesテーブルの新しいdescription、syntax、examples、introduced_in、relatedカラムを通じて参照できるようになりました。#106178 (alexey-milovidov). - データ型に埋め込みドキュメントが追加され、
system.data_type_familiesテーブルの新しいdescription、syntax、examples、introduced_in、relatedカラムを通じて参照できるようになりました。#106180 (alexey-milovidov). - 入出力フォーマットに埋め込みドキュメントが追加され、
system.formatsテーブルの新しいdescription、examples、introduced_in、relatedカラムを通じて参照できるようになりました。#106181 (alexey-milovidov). - 集約関数コンビネータに埋め込みドキュメントが追加され、
system.aggregate_function_combinatorsテーブルの新しいdescription、syntax、examples、introduced_in、relatedカラムを通じて参照できるようになりました。#106185 (alexey-milovidov). - 利用可能なデータスキッピングインデックスの型と埋め込みドキュメント (
description、syntax、examples、introduced_in、related) を一覧表示する新しいsystem.data_skipping_index_typesテーブルを追加しました。#106186 (alexey-milovidov). - 利用可能なディスクの型と埋め込みドキュメント (
description、syntax、examples、introduced_in、related) を一覧表示する新しいsystem.disk_typesテーブルを追加しました。#106187 (alexey-milovidov). - MergeTree ファミリーのテーブルに格納されたデータの合計非圧縮サイズを報告する非同期メトリクス
TotalUncompressedBytesOfMergeTreeTablesおよびTotalUncompressedBytesOfMergeTreeTablesSystemを追加しました。#106364 (alexey-milovidov). - サーバー全体のメモリ制限に達したタイミングを運用担当者が監視できるよう、
GlobalMemoryLimitExceededプロファイルイベントを追加しました。#106466 (sacheendra). - 子孫プロセスおよびアイドル状態のプールワーカーを含む、
executableおよびexecutable_poolユーザー定義関数の常駐メモリ (VmRSS) と実行中のプロセス数を報告する非同期メトリクスExecutableUserDefinedFunctionMemoryResidentBytesおよびExecutableUserDefinedFunctionProcessesを追加しました。#107300 (HanziJiang). - デフォルトで有効な
show_remote_databases_in_system_tablesを追加しました。これにより、ユーザーはsystem.tables、system.columns、system.completionsでMySQLおよびPostgreSQLデータベースを非表示にできます。show_data_lake_catalogs_in_system_tablesは引き続きDataLakeCatalogの表示のみを制御します。#104416 (pamarcos). #109082 (pamarcos).
ClickHouse Keeper
- Keeper を全体として約2倍高速化する各種変更 (バッチ処理の改善、リーダーへのメッセージ送信のパイプライン化、ログ追記のパイプライン化) 。#101757 (al13n321)。
- ウォッチに関する Keeper プロファイルイベント (サーバー側およびクライアント側) を追加。#105336 (scanhex12)。
- ローカルの ClickHouse Keeper スナップショットに関する情報を提供する、Keeper 専用の新しい
system.keeper_snapshotsテーブルを追加。#105571 (mstetsyuk)。 - ローカルの ClickHouse Keeper changelog (Raft ログ) ファイルに関する情報を提供する、Keeper 専用の新しい
system.keeper_changelogsテーブルを追加。#105617 (mstetsyuk)。 - Keeper 専用の
system.keeper_clusterテーブルを追加。現在の Keeper から見た各 Raft クラスター メンバーにつき1行を含みます。#105646 (mstetsyuk)。 KeeperMemoryStorageを使用して ClickHouse Keeper で受信したスナップショットを適用する際のピークメモリ使用量を削減。#105851 (antonio2368)。NuRaftの未コミットログエントリの admission 制限および append-entries の後方プローブのスロットリング用に、Keeper のcoordination_settingsを追加。#106108 (antonio2368)。
メモリ管理
- パーサーがステートメントの末尾を越えてバックトラックした際に、隣接するメモリのバイトが含まれる可能性があった構文エラーメッセージを修正しました。#105086 (groeneai) 。
- バックアップを開く際 (
RESTORE時、またはインクリメンタルBACKUPのベースとして) のメモリ使用量を削減しました。.backupメタデータは、インメモリの XML ドキュメントツリーに読み込むのではなく、ストリームとして解析されるようになりました。これにより、大規模なバックアップ、特にインクリメンタルバックアップで、数 GB に及ぶ DOM ツリーの割り当てを回避できます。#109107 (jkartseva) 。 BACKUPの完了時のピークメモリ使用量を削減しました。バックアップメタデータの書き込み時に、すべてのファイルの情報を一時ベクターにコピーしなくなりました。これにより、数百万ファイルのバックアップで一時的に数 GB を消費することがなくなります。情報はその場で反復処理されます。#109861 (jkartseva) 。
データフォーマット
- 8 ビット/16 ビット/32 ビット/64 ビット整数のバリアントに対応する Avro Fixed フィールドを挿入できるようになりました。#98139 (patrickpichler) 。
AvroConfluentフォーマットでは、最初のネットワーク障害で INSERT を中止するのではなく、一時的な障害 (トランスポートタイムアウト、接続拒否、DNS エラー、HTTP5xx/408/429) が発生した際に、Confluent スキーマレジストリ HTTP クライアントへのリクエストを指数バックオフで再試行するようになりました。新しい設定format_avro_schema_registry_max_retries(デフォルトは5) とformat_avro_schema_registry_retry_initial_backoff_ms(デフォルトは100) でこのポリシーを制御します。スキーマ検証エラー (HTTP409、形式が不正な Avro JSON) は引き続き致命的です。#106661 (groeneai) 。- Apache Arrow を介して返されるエラーについて、元の ClickHouse エラーコードを保持しました。#107267 (azat) 。
名前付きコレクションと Dictionary
mysqlテーブル関数、MySQLテーブルエンジン、MySQLデータベースエンジン、Dictionary のSOURCE(MYSQL)、および名前付きコレクションにenable_compression設定を追加しました。有効にすると、ClickHouse は接続を介して転送されるすべてのデータについて、MySQL プロトコルレベルの圧縮をネゴシエートします。#103229 (bernardlim).- 利用可能な Dictionary レイアウトと埋め込みドキュメント (
description、syntax、examples、introduced_in、related) を一覧表示するsystem.dictionary_layoutsテーブルを追加しました。#106182 (alexey-milovidov). - 利用可能な Dictionary ソースと埋め込みドキュメント (
description、syntax、examples、introduced_in、related) を一覧表示するsystem.dictionary_sourcesテーブルを追加しました。#106184 (alexey-milovidov). - 実際に使用される名前付きコレクションのストレージタイプを、
system.server_settingsのnamed_collections_storage.typeおよびgetServerSetting('named_collections_storage_type')で確認できるようになりました。#111806 (pamarcos).
その他の改善
- エラーメッセージ内のテーブル名候補を改善しました。同じ名前をそのまま提案しないようにし、候補にデータベース名を含めるようになりました (例: “Maybe you meant other_db.my_table?”) 。 #95116 (matt-metivier).
- FROM 句のないクエリで解決できない識別子に対するエラーメッセージを改善し、FROM 句の追加を提案するようにしました。 #101769 (Onyx2406).
- 主キーカラムで
INサブクエリを使用するPREWHEREにおいて、Granule pruning に主キーインデックスが使用されず、関連する granule だけでなくテーブル全体をスキャンしていた問題を修正しました。 #102570 (nikitamikhaylov). - リフレッシャブルmaterialized view は、
EXCHANGE TABLESでターゲットテーブルを置き換え、古いテーブルを削除した後もリフレッシュを継続するようになりました。以前は古いテーブルの UUID を保持していたため、UNKNOWN_TABLE例外によりリフレッシュが失敗することがありました。 #102724 (seva-potapov). enable_join_transitive_predicatesをデフォルトで有効化しました。 #103724 (davenger).- リフレッシャブルmaterialized view で
REFRESH DEPENDS ONをサポートし、時間ベースのスケジュールではなく、別の RMV のリフレッシュを契機にリフレッシュできるようになりました。 (REFRESH EVERY ... DEPENDS ONはすでに存在していましたが、このユースケースでは信頼性の高い利用ができませんでした。) CREATE MATERIALIZED VIEW のドキュメントを参照してください。 #104440 (al13n321). - 繰り返される processor チェーンを compact 化する
EXPLAIN PIPELINEオプションを追加しました。 #104662 (niyue). - Oracle、MySQL、Snowflake との互換性のため、
regexpExtractの大文字・小文字を区別しないエイリアスとしてREGEXP_SUBSTRを追加しました。 #105122 (alexey-milovidov). EXTRACT(unit FROM expr)の構文糖としてdate_part('unit', expr)を追加しました。標準の interval kind と PostgreSQL の拡張 (epoch、dow、doy、isodow、isoyear、century、decade、millennium) をすべてサポートしています。 #105127 (alexey-milovidov).QueryConditionCacheが、PREWHERE を部分的に通過する読み取りバッチ内でも、個別にフィルタリングされた granule を記録するようになりました。これにより、同じ condition を持つ後続のクエリで再読み取りされるマーク数を削減します。 #105335 (hanfei1991).- 数値 predicate 関数で BFloat16 をサポートしました。 #105391 (mohhddhassan).
- 数値の最小値・最大値、平均文字列長、該当する場合は NULL の数を格納する、コンパクトなカラムごとの統計情報である basic 統計情報をサポートしました。 #106048 (hanfei1991).
CREATE TABLEと同様に、ALTER TABLE ... ADD/MODIFY COLUMNで末尾に指定するNULL/NOT NULLmodifier をサポートしました。 #106150 (takumihara).- PREWHERE オプティマイザは、選択性を推定する前に同じカラムセットを参照する結合子をグループ化するようになりました。これにより、
a > 2500 AND a < 2502のような条件は、独立した 2 つの述語 (各約 50%) ではなく、結合された範囲 (選択性約 0.02%) としてまとめて評価されます。カラム STATISTICS が利用可能な場合、PREWHERE 条件をより正確な順序で評価できるようになります。 #106337 (hanfei1991). - スタックトレースが実際に空の場合、例外メッセージに “Stack trace (when copying this message, always include the lines below):” という前置きが出力されないようにしました。 #106524 (alexey-milovidov).
- 暗号化ディスク上の
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM)で、データをハードリンクする代わりにコピーしていた問題を修正しました。 #106731 (nikitamikhaylov). catalog_type = 'onelake'を使用するDataLakeCatalogデータベースで、デフォルトで OneLake Blob エンドポイント (.blob.fabric.microsoft.com) を使用してテーブルデータを読み取るように修正しました。以前の DFS エンドポイント (.dfs.fabric.microsoft.com) の動作を維持するには、onelake_use_blob_endpoint = falseを設定します。 #106843 (scanhex12).- 高いログレートでの非同期ロギングにおける CPU オーバーヘッドを削減しました。すべてのメッセージでログコンシューマーに通知するのではなく、キューが空から非空に遷移した場合にのみ通知します。 #107352 (nikitamikhaylov).
- MySQL ハンドシェイクにおける
auth_responseの長さの読み取りを修正しました。長さバイトが符号付きcharとして読み取られていたため、>= 128の場合に数 GB の値として解釈されていました。 #107384 (uwezkhan). MaterializedPostgreSQLは、精度が 76 を超える PostgreSQL のnumeric(p, 0)カラム (例: 256 ビット整数に使用されるnumeric(78, 0)) を、“Precision too big” エラーで失敗させる代わりに ClickHouse のInt256にマッピングするようになりました。Int256に収まらない値は、明確なエラーで拒否されます。 #107431 (alexey-milovidov).Nullable(Tuple(...))は Beta になりました。デフォルトでは無効で、使用するにはenable_nullable_tuple_type = 1を設定します。 #107754 (nihalzp).- 非同期 INSERT では、
trace/debugレベルでquery_idの完全なリストをログに記録しなくなりました。これは 26.2 以降、非同期 INSERT トラフィックが多いサービスでtext_logを肥大化させる可能性がありました。詳細な行は現在testレベルで出力されます。 #107852 (CheSema). - 無効化された優先度エントリを速やかに解放することで、ファイルシステムキャッシュのメタデータ使用量を削減しました。 #107903 (kssenii).
Arrayカラム上のbloom_filterスキップ索引は、すでにhasAny(column, set)およびhas(column, const)で使用されていたのと同様に、arrayJoin(column) IN (set)、arrayJoin(column) GLOBAL IN (set)、およびarrayJoin(column) = constでも使用されるようになりました。以前は、これらのarrayJoin ...形式ではフルスキャンにフォールバックしていました。 #109536 (groeneai).IS NOT DISTINCT FROMとIS TRUEで、=と同様にプライマリキーおよびminmax索引を使用してgranuleをプルーニングするようになりました。以前は、k IS NOT DISTINCT FROM 42と(k = 42) IS TRUEではすべてのgranuleがスキャンされていました。 #110006 (groeneai).
バグ修正
JOIN の修正
ARRAY JOINで内部的に使用されるnested関数がカラム型からLowCardinalityを取り除き、出力時にArray(LowCardinality(String))がArray(String)になる問題を修正しました。#98974 (Onyx2406).- 別のテーブルとカンマ結合 (クロス結合) した
RIGHT/LEFT JOIN(例:t1 RIGHT JOIN t2 ON t1.c = t2.c, t3) で、結合順序の再配置により一致しない行が暗黙的に削除される問題を修正しました。以前は、クエリは外部結合の結果ではなく内部結合の結果を返していました。#101684 (groeneai). - JOIN 内で集約を含む VIEW を使用するクエリの実行時に発生する可能性があった
LOGICAL_ERROR(“Port is not connected”、コード 49) を修正しました。#102574 (Ergus). - 新しいアナライザで
GLOBAL INおよびGLOBAL JOINクエリに対するmax_rows_to_transferとmax_bytes_to_transferが暗黙的に無視される問題を修正しました。マテリアライズされた外部テーブルが設定された上限を超えると、旧アナライザと同様に、これらの設定によりSET_SIZE_LIMIT_EXCEEDEDが発生するか、transfer_overflow_modeに応じて処理が中断されるようになりました。#104119 (groeneai). - 最適化によってルックアップカラムの順序が変更された場合に、右側が
MergeTreeテーブルであるjoin_algorithm = 'direct'を使用したJOINクエリで、誤った結果が返される、またはクエリが失敗する問題を修正しました。#104174 (groeneai). JOINの後にarrayJoinとORDER BY ... LIMITを組み合わせたクエリが、暗黙的にゼロ行を返す可能性があるバグを修正しました。arrayJoinは行数を変更する可能性があるため、持ち上げる式にarrayJoinが含まれる場合、関数評価をSortingStepより上に持ち上げるクエリプラン最適化は適用されなくなりました。#104558 (groeneai).ARRAY JOINと併用した場合に、一部のケースで負のLIMIT BYにより発生する論理エラーを修正しました。#105403 (nihalzp).- 新しい互換性設定
analyzer_compatibility_prefer_alias_over_subcolumnを追加しました (デフォルトでは無効) 。有効にすると、新しいアナライザは複数部分からなる識別子について、Tuple サブカラムまたはドット付きカラムとの一致よりもエイリアス接頭辞として解釈することを優先し、以前のインタープリタの動作を復元します。これにより、結合に対してSELECT *を使用する CTE/サブクエリ内の内部テーブルと同名のテーブルを結合するクエリで、アスタリスクによって名前変更されたカラム (例:b.id) が内部テーブルの識別子を外側のスコープに漏出させて発生するAMBIGUOUS_IDENTIFIERなどのエラーを回避します。#105491 (vdimir). - 外部結合と、その外部結合で NULL を提供する側を参照する後続の内部結合を組み合わせるクエリで、誤った結果が返される可能性がある問題を修正しました。結合順序の再配置により、内部結合の条件を外部結合の ON 句に取り込むプランが選択される可能性がありました。#105992 (vdimir).
- 旧アナライザとの互換性を向上しました。テーブルに
x.a Array, x.b Array, x Stringのようなカラムがある場合、ARRAY JOIN xでは配列を優先するようになりました。#106069 (KochetovNicolai). enable_parallel_replicas、query_plan_use_new_logical_join_step、およびquery_plan_optimize_join_order_algorithm = 'greedy'が有効な場合に、左側のMergeTreeテーブルが空のINNER JOINクエリで例外が発生する問題を修正しました。#106338 (KochetovNicolai).- JOIN グラフ内の 2 つのリレーションでカラム名が重複している場合に、並列レプリカで実行される JOIN で発生する可能性があった JOIN 順序オプティマイザの論理エラー (
Left and right columns have same names) を修正しました。#106418 (alexey-milovidov). - 一意の右側キー、混在する
ON条件、および小さいmax_joined_block_size_rowsを指定したLEFT JOINにおけるJoiningTransformのLOGICAL_ERROR(Invalid number of rows in Chunk) を修正しました。#106928 (groeneai). - JOIN キーに
Tuple、Array、またはMap内にネストされたVariantまたはDynamic型が含まれ、JOIN の右側に異なる値が 1 つだけある場合に、JOIN ランタイムフィルタで発生する例外 (LOGICAL_ERROR) を修正しました。#106931 (groeneai). Dynamicに対する JOIN によって構築されたDynamicカラムに対して関数を実行する際に発生するLOGICAL_ERROR(Expected the argument N to have X rows, but it has Y) を修正しました (例:RIGHT/FULL JOINで JOIN されない行や、JOIN に非相関化された相関EXISTSサブクエリ) 。#107095 (groeneai).JOIN ... USINGキーに対する修飾アスタリスク (t.*) が集約関数に渡され、外部 JOIN の反対側にNullableキーがある場合に発生するBad cast from type DB::IColumn const* to DB::ColumnNullable const*論理エラー例外を修正しました (join_use_nulls = 0) 。#107129 (groeneai).- 選言 (部分 predicate) のプッシュダウン最適化が、JOIN によって型が拡張された
USINGキーに対する条件をプッシュダウンする際に発生する論理エラー (Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) を修正しました。また、未知の識別子を参照する定数畳み込み可能なif/multiIf分岐を含むJOIN ... USINGクエリで識別子を解決する際に、アナライザで発生するサーバークラッシュ (セグメンテーションフォールト) も修正しました。#107407 (groeneai). - JSON カラムに対して誤った結果を生成する JOIN ランタイムフィルタを修正しました。#107663 (Avogar).
- 修飾アスタリスク (
t.*) がJOIN USINGキーを選択し、その JOIN がPASTE/CROSS/カンマ JOIN または外部ONJOIN の配下にネストされている場合に発生するBad cast from type DB::ColumnNullable to DB::ColumnVector<...>論理エラー例外を修正しました (join_use_nulls = 0) 。#108043 (groeneai). - 新しいアナライザで、JOIN 内の 1 つのテーブルに指定した FINAL (例:
FROM t1 FINAL JOIN t2) が他の結合先テーブルにも誤って適用され、そのようなクエリが遅くなる可能性があったバグを修正しました。#108979 (vdimir). analyzer_compatibility_join_using_top_level_identifier = 1を指定すると、JOIN ... USING内の識別子を、SELECT リスト内の部分式で定義されたエイリアスから解決できるようになりました (例:SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)) 。これは旧アナライザの動作と一致します。以前は最上位のプロジェクションエイリアスのみが考慮され、この設定を有効にしていても、このようなクエリはUNKNOWN_IDENTIFIER例外で失敗していました。一致するエイリアスがネストされている場合にも、この設定を提案するエラーヒントが表示されるようになりました。#110739 (novikd).- 右側のカラムに対する
WHEREフィルターによってクエリプランナーが結合をSEMIまたはANTIに書き換えられる場合に、Joinengine テーブルのANY結合で発生するINCOMPATIBLE_TYPE_OF_JOINエラーを修正しました。Joinengine テーブルでは strictness が固定で宣言されており変更できないため、このようなテーブルでは変換を行わないようになりました。#111362 (groeneai). - Dictionary への
JOINで、Dictionary キーがラップされていないにもかかわらず、結合キーにNullable、LowCardinality、またはLowCardinality(Nullable)を使用した場合に発生するTYPE_MISMATCH(“Key type for complex key … does not match”) を修正しました。direct-join Dictionary ルックアップでは、キーを Dictionary で宣言されたキー型に正規化するようになりました (dictGet/dictHasはすでにこの処理を行っています) 。また、NULLキーは一致しません。#111857 (groeneai). join_use_nulls = 1を指定し、JOIN ON条件をWHERE内で繰り返すクエリで発生するAMBIGUOUS_COLUMN_NAME(Block structure mismatch in (columns with identical name must have identical structure)) を修正しました。このようなクエリは失敗するのではなく、結果を返すようになりました。#112007 (groeneai).- キーにスパースシリアライゼーションを使用する direct Dictionary
JOINで、不正な結果が返される、または server が終了する問題を修正しました。#112327 (groeneai). - ハッシュ結合の単一の
LowCardinalityキーが 8 バイトを超える型 (UInt128、Int128、UInt256、Int256、およびそれらのNullableバリアント) である場合に、不正な結果が返される問題を修正しました。このような結合では、キー値が等しくない行が暗黙的に返されていました。#113230 (groeneai). - 反対側の定数カラムを含む
JOIN ON条件におけるパーツおよび granule pruning を修正しました。#113484 (vdimir). DirectKeyValueJoin(EmbeddedRocksDB、KeeperMap、Redis、または Dictionary などのキー・バリュー storage) が処理する JOIN の右側から選択した_tableや_databaseなどの virtual column で、不正な値が返される問題を修正しました。クエリは代わりに data column の内容を返すか、LOGICAL_ERRORで失敗していました。#113698 (groeneai).
クエリとアナライザの修正
- セミコロンの後がコメントで終わるクエリで、splitMultipartQuery が “Empty query” エラーをスローするバグを修正しました。 #85491 (yariks5s).
- DESCRIBE TABLE 内のサブクエリの後にあるエイリアスがパーサーで受け入れられず、構文エラーとなる問題を修正しました。 #100205 (yariks5s).
EXPLAIN INSERT INTO ... SELECT ... FORMAT ...において、FORMAT句がEXPLAINの出力に適用されず、INSERTによって消費される問題を修正しました。 #101772 (Onyx2406).- 同時に INSERT が実行されている場合に SELECT クエリが大幅に遅くなる問題を修正しました。以前は、ほとんどのスロットが使用されない場合でも、INSERT パイプラインがクエリ開始時に
max_threadsまでの CPU スロットを予約し、同時実行中の SELECT を圧迫していました。CPU スロットの割り当ては需要駆動型になり、パイプラインは並列化可能な処理を実際にプッシュする際にのみスロットをリクエストします。これは同時実行制御と、ワークロード用のプリエンプティブ CPU スケジューラの両方に適用されます。新しいサーバー設定concurrent_threads_lazy_allocation(デフォルトはtrue) はロールバック手段として使用できます。 #102928 (seva-potapov). EmbeddedRocksDBテーブルに対するALTER TABLE ... MODIFY SETTINGで、サーバーがクエリを拒否した場合でも無効な設定値がテーブルのメタデータファイルに永続化されるバグを修正しました。次回のサーバー再起動時には、テーブルのアタッチがCANNOT_PARSE_BOOL(または同様の構文解析エラー) で失敗し、ロードの失敗が致命的となるデータベースではサーバーが起動を拒否していました。無効な設定値は、メタデータが書き込まれる前に拒否されるようになりました。 #103417 (groeneai).HTTPインターフェイスおよびINSERT SELECT FROM inputにおけるinput_format_max_block_wait_msを使用したストリーミングINSERTを修正し、リクエストの完了前に部分的な入力ブロックがフラッシュされるようにしました。 #104534 (alexey-milovidov).- 式と
WHENの値の両方がNULLの場合に、CASE式が一致するTHENではなくELSE分岐を返す問題を修正しました。 #105556 (Algunenano). MATERIALIZED VIEW定義でWASMSQL UDF を使用できない問題を修正しました。 #106161 (niyue).- 古いアナライザで、SELECT リスト内の ORDER BY カラムにエイリアスが付いている場合に
INTERPOLATE ()がINVALID_WITH_FILL_EXPRESSIONをスローする問題を修正しました。 #106252 (yakov-olkhovskiy). - 関数
base58Encode、base58Decode、tryBase58Decodeが、大きな入力に対してmax_execution_timeとクエリのキャンセルに従うようになり、非常に長時間実行される代わりに 10 KB を超える入力を拒否するようになりました。この上限は新しい設定function_base58_max_input_size(0で無効化) で設定できます。 #106428 (alexey-milovidov). f(const)が NaN と評価される場合、たとえば負の定数を使用したORDER BY sqrt(c0)で、ORDER BY f(c0)を持つテーブルに対するWHERE c0 = constが行を返さない問題を修正しました。主キー解析がすべてのグラニュールを誤ってプルーニングし、後続のクエリのクエリ条件キャッシュを汚染していました。 #106507 (groeneai).- 暗黙的な
_minmax_count_projection、明示的な集約プロジェクション、または通常のプロジェクションを持つテーブルに対するSELECT c, count() FROM t WHERE c GROUP BY cで誤った結果が返される問題を修正しました。以前は、すべてのグループが定数キーと合計行数を持つ1行に集約されていました。#106590 (groeneai). EXPLAIN ... INSERT ... SELECT ... FORMAT ...のEXPLAIN出力に対して、SETTINGSがFORMATに先行する場合や出力フォーマットがValuesの場合にも、FORMATが適用されるようにしました。#106686 (alexey-milovidov).- 再利用されたスレッドローカルのリクエストオブジェクトに以前のリクエストの失敗状態が残ることで、実際にはワークロードリソースへのアクセスが許可されているクエリで、まれに誤って
RESOURCE_ACCESS_DENIEDエラー (“Scheduler queue with resource request is about to be destructed”) が発生する問題を修正しました。#106690 (alexey-milovidov). - 16進または8進エスケープを含む正規表現で、
match、extract、extractAll、countMatchesが誤った結果を返す問題を修正しました。#106709 (ofeliacode). - PostgreSQL ワイヤプロトコルパーサーで、長さフィールドが4未満のメッセージにより
size - 4がラップアラウンドし、過大なresize/ignoreが実行される整数アンダーフローを修正しました。#107485 (uwezkhan). enable_analyzer = 1(デフォルト) では、別のデータベースにのみ存在するテーブルを修飾なしの名前でクエリした場合に、適切なテーブルが提案されるようになりました。たとえば、SELECT * FROM functionsはMaybe you meant system.functions?を報告します。以前は、新しいアナライザではヒントのないUnknown table expression identifierエラーが発生していましたが、古いアナライザではすでに有用な提案が表示されていました。#107550 (groeneai).- ワーカーのステータスチェックで次回のチェックを再スケジュールできなかった場合 (たとえば、シャットダウン時の
CANNOT_SCHEDULE_TASKやMEMORY_LIMIT_EXCEEDED) 、分散プランクエリ (make_distributed_plan = 1) の終了処理中にサーバーが中止される (std::terminate、シグナル6) 問題を修正しました。クエリは正常に失敗し、サーバーは稼働を継続します。#107575 (groeneai). - 共通の部分式を共有する
ALIASカラムを選択する分散クエリで、誤った結果が返される問題を修正しました。カラムがずれ、値が誤ったカラムに返される可能性がありました。#107675 (vdimir). CODECまたはエンジン宣言内の引数なしウィンドウ関数 (例:CODEC(cume_dist() OVER (...))) で発生するInconsistent AST formatting論理エラーを修正しました。このような関数では括弧が保持されるようになり、クエリがフォーマット/解析の往復変換を通過できるようになりました。#107806 (alexey-milovidov).getClientHTTPHeaderが非決定論的として正しく扱われるようになったため、その結果がクエリ結果 cache によって誤って再利用されなくなりました。#108029 (alexey-milovidov).- クエリ条件 cache (デフォルトでもある設定
use_query_condition_cache = 1) とともにSELECT [...] SAMPLE [...]を使用した際に、誤った結果が返される問題を修正しました。#108488 (groeneai). enable_identifier_resolve_cacheが有効 (デフォルト) の場合に、複合述語にGROUP BYで別名を付けて再度参照すると発生するNOT_FOUND_COLUMN_IN_BLOCKを修正しました。optimize_and_compare_chainの最適化はべき等ではなく、共有された解決済みノードに重複する推移的連言句が蓄積されていました。 #108553 (groeneai).Distributedテーブルに対するサブクエリが同じ式に展開される 2 つ以上のALIASカラム (例:a1 String ALIAS toString(x), a2 String ALIAS toString(x)) を読み取り、その結果を外側のクエリで使用する場合 (例:SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2)) に発生するNUMBER_OF_COLUMNS_DOESNT_MATCHエラーを修正しました。 #108725 (groeneai).- 別のカラムにインライン別名を定義して参照する
DEFAULTまたはMATERIALIZED式がある場合に、ALTER TABLE ... DROP COLUMNで発生するUNKNOWN_IDENTIFIERエラーを修正しました。 #109374 (alexey-milovidov). - クエリが
name/databaseカラムのみを読み取る場合に、データベース単位の権限を持つユーザーのデータベースをsystem.tablesが暗黙的にスキップする問題を修正しました。導入バージョン: 26.2。 #109723 (samay-sharma). - アナライザが有効な場合に、ビューに保存されたクエリ内で CTE 名 (
cte_name.column) で修飾されたカラムに対して発生するUNKNOWN_IDENTIFIERエラーを修正しました。 #111386 (novikd). FINALクエリがSELECTリストに含まれないソートキーのカラムでフィルタリングし、そのフィルターがPREWHEREに移動された場合 (例:optimize_move_to_prewhere_if_final = 1を指定したSELECT s FROM t FINAL WHERE k GROUP BY s) に発生するNOT_FOUND_COLUMN_IN_BLOCKを修正しました。 #111721 (groeneai).enable_analyzer = 0がサーバーのデフォルトである場合に、再帰 CTE を持つビューでWITH RECURSIVE is not supported with the old analyzerによりサーバーの起動およびATTACHが失敗する問題を修正しました。 #112784 (evillique).accurateCastOrDefaultにおけるクエリ設定および NULL の処理の伝播を修正しました。 #114912 (alexey-milovidov).system.query_thread_logのread_rows、read_bytes、written_rows、written_bytesが、記録されたクエリの値ではなくスレッドの存続期間中の累計値を報告する問題を修正しました。特に、クエリを開始したHTTPHandlerスレッドを含む、長期間存続するプール済みスレッドの行が影響を受けていました。 #115596 (groeneai).
MergeTree およびストレージの修正
tryN接尾辞が付いたデタッチされたパーツを削除できるようになりました。#58957 (antaljanosbenjamin).- 並列レプリカで実行する際、ネストされたサブクエリ内に重複するプロジェクション別名 (例:
SELECT *, day + 365 AS day) があるクエリで発生するMULTIPLE_EXPRESSIONS_FOR_ALIAS例外を修正しました。#80310 (alexey-milovidov). - テーブルレベルの
default_compression_codec設定が明示的に構成されている場合に、MergeTreeパーツで誤った圧縮コーデックが選択される問題を修正しました。挿入時、マージ時、およびプロジェクション用に書き込まれるパーツで、テーブルレベルの設定ではなくサーバー全体のデフォルトコーデックが使用されていました (完全に削除する mutation により生成される空のパーツも対象です) 。#101784 (Onyx2406). - 並列レプリカと
parallel_replicas_local_plan = 0を使用して、PREWHERE/WHERE/HAVING/QUALIFY内のプロジェクション別名を参照するクエリ (例:SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) 、または重複するカラム名を持つ自己結合に対するSELECT *を実行した際に、リモートレプリカで発生するMULTIPLE_EXPRESSIONS_FOR_ALIASエラーを修正しました。#103806 (groeneai). ALTER TABLE ... DROP PARTITION ID 'patch-...'の後にDETACH/ATTACH TABLEを実行するとパッチパートが壊れる問題を修正しました。以前は、空のカバリングパートがpartition.datおよびsource_parts.datなしで書き込まれていたため、次回のアタッチまたはサーバー再起動後にsystem.detached_partsにbroken-on-start_patch-...エントリが生成されていました。#104353 (groeneai).ALTER TABLE ... RENAME COLUMNがOPTIMIZE TABLE ... FINALまたは別のバックグラウンドマージと同時に実行された場合、データがデフォルト値で暗黙的に置き換えられる問題を修正しました。#104822 (groeneai).enable_materialized_cteを使用するクエリで発生するLOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materializedの2つのケースを修正しました。(1) 別のマテリアライズド CTE に対するIN (subquery)でフィルタリングされる再利用済みのマテリアライズド CTE、(2) ネストした IN サブクエリを介して MergeTree 主キーにアクセスするWHERE ... IN (...)フィルター内と直接の両方で参照されるマテリアライズド CTE です。バグはプラン最適化中に発生していたため、同じクエリに対するEXPLAINも影響を受けていました。#105041 (novikd).skip_cache_on_disk_failure = 1の場合、FileCacheがディスク上に cache ディレクトリを作成できなくても、クエリの実行が継続されるようになりました。クエリを失敗させる代わりに、エラーがログに記録されます。#105250 (Diskein).ALTER TABLE <memory_table> APPLY PATCHESおよびALTER TABLE <memory_table> APPLY DELETED MASKで発生する論理エラー例外Mutation of Memory table produced incomplete outputを修正しました。Memoryテーブルはパッチパートも削除マスクも持たないため、両方のコマンドは正しく no-op として扱われるようになりました。#105286 (groeneai).distributed_group_by_no_merge=1を使用したDistributed上のMerge上のMergeで発生するCANNOT_CONVERT_TYPEを修正しました。#105330 (azat).- 複数の異なる値をすでに検出した状態をマージする際に、
singleValueOrNullMergeがNULLではなく具体的な値を返す問題を修正しました。#105734 (fallintoplace). - コレクション名が空、または NUL バイトを含む場合に、
mongodbテーブル関数、MongoDB ストレージ、および MongoDB Dictionary ソースでクラッシュする問題を修正しました。#105776 (Algunenano). - 明示的に指定した
SummingMergeTreeおよびCoalescingMergeTreeのcolumns_to_sumカラムに対して、ALTER TABLE ... CLEAR COLUMNが拒否される問題を修正しました。#105785 (antonio2368). - データベース名をクエリパラメータで指定したパラメーター化ビューの作成時に、
UNKNOWN_DATABASEエラーが発生する問題を修正しました。#105799 (groeneai). - analyzer 使用時に
Mergeテーブルで順序どおりに読み取る最適化を復元しました。#105867 (KochetovNicolai). - カタログ経由でアクセスする Iceberg テーブルでの
UPDATEおよびDELETEミューテーションを修正しました。対象行がない場合に繰り返し実行した更新および削除も含まれます。#106111 (scanhex12). - 述語がその上位で適用された
Mergeテーブルまたはmergeテーブル関数を介してDistributedテーブルをクエリした場合に、optimize_skip_unused_shardsが適用されず (また、force_optimize_skip_unused_shardsが誤って失敗する) 問題を修正しました。#106250 (KochetovNicolai). - ミューテーション (
DELETE/UPDATE) の述語に、別のサブクエリ内にネストされたデフォルトテーブル式を読み取るIN/EXISTSサブクエリが含まれる場合に発生する論理エラーColumn identifier ... is already registeredを修正しました。#106414 (alexey-milovidov). read_in_order_use_virtual_row_per_block = 1と小さいmax_block_sizeを使用してワイドパーツを逆順に読み取る際、ORDER BY ... DESCクエリで断続的に不正な結果が返される問題を修正しました。#106429 (vdimir).cache/directレイアウトと単一の文字列 (複合) キーでSTORAGE_TYPE 'simple'を使用する Redis Dictionary で発生するBad cast exceptionを修正しました。このような Dictionary は動作するようになり、simpleストレージ上の複合キーでは明確なエラーが報告されます。#106501 (vdimir).APPLY PATCHES、APPLY DELETED MASK、MATERIALIZE STATISTICS、MATERIALIZE INDEX、MATERIALIZE PROJECTION、REWRITE PARTSを含む、Memoryエンジン上の行データに影響しないALTER TABLE <memory_table>コマンドによって発生する例外Mutation of Memory table produced incomplete outputを修正しました。Memoryテーブルはこれらの構造を保持しないため、これらのコマンドは no-op として扱われるようになりました。#106621 (groeneai).MergeTreeテーブルに、粒度がゼロでディスク上の marks ファイルが空でないスキップ索引パーツがある場合に、Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0)によりサーバーが起動に失敗する問題を修正しました。#106675 (groeneai).- UNION 内のテーブルが空の場合に、UNION を含むビューへ並列レプリカが適用されない問題を修正しました。#106900 (devcrafter).
- 挿入ブロックが完全に重複排除され、競合するパーツの重複排除ノードがすでに削除されていた場合 (たとえば、同時実行された
DROP PARTITIONによる削除) 、ReplicatedMergeTreeテーブルへの同期挿入中に発生する可能性があった論理エラー例外conflicted_part_name.has_value()を修正しました。#107026 (groeneai). enable_filesystem_query_cache_limit = 1で作成されたファイルシステムキャッシュディスク経由でMergeTreeテーブルを読み取る際に発生する、まれなLOGICAL_ERROR“Attempt to release query context that does not exist” と、それに伴うサーバークラッシュを修正しました。#107028 (groeneai).- 空のパーツを
plain_rewritableディスクへ移動する際に発生するサーバークラッシュを修正しました (たとえば、remove_empty_parts = 0により保持されている空のパーツに対してALTER TABLE ... MOVE PARTITION ... TO DISKを実行した場合) 。#107040 (groeneai). adaptive_write_buffer_initial_sizeに極端に大きな値が設定されている場合に、MergeTreeテーブルへのINSERT時に発生するLogical error: Too large size passed to allocator例外を修正しました。アダプティブ書き込みバッファの初期サイズは、バッファの最大サイズに制限されるようになりました。#107104 (groeneai).- コメント変更と
MODIFY SETTING/RESET SETTINGが混在するALTER TABLE ... ON CLUSTERバッチ (たとえば、MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) がリーダーレプリカにのみ適用され、他のレプリカとの不整合を引き起こす問題を修正しました。また、位置指定またはカラムごとのSETTINGSを伴うMODIFY COLUMN ... COMMENTがローカルのコメントのみのメタデータ変更として誤分類され、カラムの並べ替えがレプリケーションメタデータに反映されず、レプリカの再起動時にINCOMPATIBLE_COLUMNSを引き起こす可能性がある問題も修正しました。#107142 (groeneai). group_by_use_nulls設定を有効にしてgrouping関数を使用するクエリで発生するArgument ... of GROUPING function is not a part of GROUP BY clauseエラーを修正しました。#107206 (KochetovNicolai).- 非レプリケーションの
MergeTreeテーブルでレガシー並列レプリカが有効な場合の論理更新UPDATEクエリを修正しました。#107246 (groeneai). - SYSTEM SYNC DATABASE REPLICA … STRICT で発生する可能性がある論理エラー例外を修正し、STRICT 修飾子がデータベースレプリカに実際に適用されるようにしました。#107344 (PedroTadim).
- スカラーサブクエリに同じテーブルを読み取るネストされたサブクエリが含まれる場合に、並列レプリカで発生する可能性がある
Logical error: 'Duplicate announcement received for replica number N'を修正しました。#107381 (groeneai). - 未適用の論理更新
UPDATEパッチが残っているパーティションに対してREPLACE PARTITION、MOVE PARTITION、DETACH PARTITION、またはDETACH PARTを実行した場合に、プレーン (非レプリケーション) のMergeTreeで発生するサイレントなデータ損失を修正しました。これらの操作は、コミット済みの更新を黙って元に戻すのではなく、ReplicatedMergeTreeと同様にALTER TABLE ... APPLY PATCHESを案内してコマンドを拒否するようになりました。#107386 (groeneai). - PostgreSQL のデータベース名またはテーブル名に大文字が含まれる場合に、
MaterializedPostgreSQLが変更のレプリケーションを停止する問題を修正しました (pgoutputコンシューマーが、大文字小文字を保持する publication と一致しない、引用符なしで小文字化された publication 名を要求していました) 。#107423 (alexey-milovidov). optimize_if_transform_strings_to_enum = 1の場合に、文字列リテラルに対する最適化済みのif/transform式が Distributed テーブルまたは並列レプリカにおけるGROUP BYあるいはORDER BYのキーとなると発生するTHERE_IS_NO_COLUMNエラーを修正しました。 #107455 (groeneai).CREATE TABLE ... CLONE AS、ATTACH PARTITION ... FROM、またはMOVE PARTITION ... TO TABLEにより、プレーンなMergeTreeからReplacingMergeTree、SummingMergeTree、またはAggregatingMergeTreeへパーツを取り込んだ後に、SELECT ... FINALおよびOPTIMIZE TABLE ... FINALが重複行を返す問題を修正しました。ソースと宛先のエンジンが異なる場合、取り込んだパーツのマージレベルを 0 にリセットするようになり、次回のマージ時に宛先側で重複除去されます。 #107481 (groeneai).- ReplicatedMergeTree でクォーラムを待機中のクエリキャンセルをより適切に追跡するようになりました。 #107513 (nickitat).
- rapidjson ライブラリ (
prettyPrintJSON、JSONMergePatch、および rapidjson JSON パーサー) が使用するメモリをメモリトラッカーに計上するようにし、異常な入力を無制限にメモリ割り当てするのではなくMEMORY_LIMIT_EXCEEDEDで拒否するようにしました。 #107555 (Algunenano). Dynamicカラムを持つテーブルの mutation によって生成されたMergeTreeパーツをマージまたは読み取る際に発生する可能性があったLogical error: Stream ... variant_discr ... is not foundを修正しました。 #107562 (alexey-milovidov).optimize_prewhere_after_pushdownが有効な場合に、明示的なPREWHEREとWHEREの両方を指定してfile()、url()、またはオブジェクトストレージのログソースをクエリすると発生するLOGICAL_ERROR(updateFormatPrewhereInfo called more than once) を修正しました。 #107568 (groeneai).Replicatedデータベース内のTimeSeriesテーブルに関わるRENAME TABLE、RENAME DATABASE、またはCREATE OR REPLACE TABLEで発生する可能性があったサーバー例外 (Digest does not match論理エラー) を修正しました。TimeSeriesテーブルのリネームがサポートされるようになりました。 #107583 (groeneai).Replicatedデータベース内のTimeSeriesテーブルに対するDROP TABLEを修正しました。以前は内部テーブルが残り、バックグラウンドの削除タスクが永遠に再試行されていました (DROP TABLE ... SYNCはハングしていました) 。 #107604 (groeneai).- 複製パーツ取得プロトコルにおいて、悪意のあるレプリカがパーツディレクトリ外にファイルを書き込める可能性があった 2 件のパストラバーサル問題を修正しました。 #107606 (antonio2368).
- プレーンな
MergeTreeテーブルでのALTER TABLE ... REPLACE PARTITIONにより、サーバー再起動後に置換されたパーツが復活し、テーブルが置換後の行と古い行の両方を返していた問題を修正しました。 #107623 (groeneai). TOターゲットテーブルが view のSELECTで生成されるEnumよりも広いEnumのカラムを宣言している materialized view への insert 時に発生するLOGICAL_ERROR(“Block structure mismatch … betweenConvertingTransformandRemovingReplicatedColumnsTransform”) を修正しました。有効なEnumの拡張を、直接のINSERT ... SELECTと同様に materialized view の insert パスでも適用するようになりました。 #107648 (groeneai).- 同一の式に展開される複数の
ALIASカラムを持つDistributedテーブル (または並列レプリカ使用時) へのクエリで、それらをORDER BY/GROUP BY/HAVINGとともに参照した際に発生するNUMBER_OF_COLUMNS_DOESNT_MATCHエラーを修正しました。 #107913 (yakov-olkhovskiy). - 読み取り専用テーブルのデータパーツの更新中に一時的なエラーが発生しても、バックグラウンド更新タスクが恒久的に停止しなくなりました。 #108034 (alexey-milovidov).
index_granularity_bytesがAggregateFunctionの状態カラムでも考慮されるようになりました。以前は、この種のカラム (たとえば、AggregatingMergeTreeテーブルや集約プロジェクションのuniqExact状態) ではグラニュールのバイト上限が無視され、設定上限を大幅に超えるグラニュールが生成されることで、読み取り増幅とクエリ時のメモリ使用量が増加していました。 #108297 (groeneai).- 稼働中のレプリカ数が過半数未満の場合に、
insert_quorum = 'auto'が挿入を事前に拒否しない問題を修正しました。このような挿入は、ローカルパーツへの書き込み後にUNKNOWN_STATUS_OF_INSERTでタイムアウトするのではなく、直ちにTOO_FEW_LIVE_REPLICASで失敗するようになりました。 #108800 (gagandhakrey). - 重複排除を伴う非同期挿入で、
optimize_on_insertにより挿入ブロックが空になった場合 (たとえば、SummingMergeTreeで行の合計がゼロになる場合) にサーバーがクラッシュする問題を修正しました。 #109229 (Diskein). - マージが
ALTER TABLE ... RENAME COLUMNと同時に実行された場合、またはカラムの値が論理更新UPDATEによるものだけである場合に、デフォルト式のないカラムのデータが失われる問題を修正しました。このカラムがマージ済みパーツから削除され、読み出したすべての値が NULL になる可能性がありました。 #109356 (groeneai). GROUPING SETS、ROLLUP、またはCUBEと並行してuniqExactの集約状態をマージする際に、まれにサーバーが終了する問題を修正しました。 #109389 (groeneai).- ロールアップマージが無期限に再スケジュールされる問題を修正しました。 #109410 (Michicosun).
- マテリアライズド仮想カラムまたは永続仮想カラムを持つテーブルに対する
GROUP BYミューテーションの問題を修正しました。 #109532 (Michicosun). - 新たに挿入された (レベル 0 の) パーツを持つテーブルで、
add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_columnによって作成された暗黙の minmax 索引に対してALTER TABLE ... MATERIALIZE INDEXを実行した際に発生するUNKNOWN_IDENTIFIER: Missing columns: '_block_offset'エラーを修正しました。失敗する代わりに、これらのパーツに対して索引が構築されるようになりました。 #110236 (groeneai). - 読み取り専用のオブジェクトストレージレプリカ (
read_only = trueが設定されたディスク) がrefresh_parts_intervalを通じて新しいパーツを検出しない問題、およびそのようなディスクでtable_disk = trueが “table_disk is not supported for non-ObjectStorage disks” として拒否される問題を修正しました。 #110460 (jkartseva). - 式で IN 演算子を使用する (別の ALIAS カラムを介する場合を含む) ALIAS カラムを持つテーブルで、ALTER TABLE … DROP COLUMN、ALTER TABLE … DELETE/UPDATE ミューテーション、および論理削除の際に発生する LOGICAL_ERROR (“No set is registered for key”) を修正しました。 #111039 (PedroTadim).
- クエリ実行時に MergeTree プロジェクションで行ポリシーが適用されない問題を修正しました。 #112329 (yariks5s).
- 直接 I/O を使用する
encryptedディスク上のCompactパーツの読み取り時に発生し、マージがsystem.replication_queueで停止する原因となっていたReadBufferFromEncryptedFile: Wrong file position論理エラーを修正しました。 #112943 (alexey-milovidov). mergeテーブル関数およびMergeテーブルエンジンを介して内部データベース_temporary_and_external_tablesを読み取れる問題を修正しました。この問題により、あるセッションが他のセッションや他のユーザーの一時テーブルを読み取ることができ、古いアナライザパスでは例外も発生していました。現在はデータベース正規表現でこのデータベースがスキップされ、直接アクセスと同様に明示的な指定も拒否されます。 #113224 (alexey-milovidov).- スカラーサブクエリを含む行ポリシーが、
Mergeテーブルを介してテーブルを読み取った後は一度しか評価されず、以降ずっと再利用される問題を修正しました。解析済みのポリシー条件はキャッシュされ、すべてのクエリで共有されますが、Merge経由の読み取りによってキャッシュされた式がインプレースで書き換えられ、同じポリシーを使用する同時実行クエリ間でデータ競合も発生していました。 #113563 (alexey-milovidov). - カスタムキーの並列レプリカを持つ
Distributedテーブルを含むMergeテーブルの読み取り時に発生するCANNOT_CONVERT_TYPEエラーを修正しました。 #113742 (alexey-milovidov). - 子テーブルが
INを含むALIASカラムを宣言し、そのカラムのデフォルト値が子テーブル間で異なるMergeテーブルを介した読み取り時に発生するLogical error: No set is registered for key ...を修正しました。 #113757 (groeneai). - mergeTreeIndex テーブル関数により、ソーステーブルの SELECT 行ポリシーで非表示となる行の主キーおよび minmax 索引値が公開される行ポリシーのバイパスを修正しました。現在、行ポリシーを持つテーブルに対する mergeTreeIndex の読み取りは拒否されます。 #115304 (yariks5s).
データ型およびシリアライゼーションの修正
LowCardinality数値型を使用した際にARRAY JOINで発生する例外を修正しました。 #91784 (Ergus).data_type_default_nullable = 1の場合に、Replicatedデータベース内またはON CLUSTER経由でテーブルを作成すると、NOT NULLカラムが暗黙的にNullableとして作成される問題を修正しました。 #97572 (xiaohuanlin).- ビューが
integerカラムをBoolカラムにマッピングしている場合に、query_plan_enable_optimizations = 0を指定したMaterializedViewクエリが誤った行数を返す問題を修正しました。 #100692 (Maximus5). - デフォルト以外のシリアライゼーションを持つカラムの mutation 後に、part メタデータに不整合が生じる問題を修正しました。 #102817 (korowa).
Nullable(Tuple(...))カラムから抽出されたサブカラムを読み取る際のNULL伝播を修正しました。たとえば、tup Nullable(Tuple(s Nullable(String)))の場合、SELECT tup.sは外側のタプルがNULLの行で、不要な値ではなく正しくNULLを返すようになりました。これは、NULLを表現できるすべての要素型、すなわちNullable、Dynamic、Variant、LowCardinality(Nullable(...))を対象としています。 #102942 (nihalzp).recursiveRemoveLowCardinalityがカスタムジオメトリ型名 (例:LineStringとRing、MultiLineStringとPolygon) を消去し、ジオメトリ型を誤って解釈する問題を修正しました。 #103041 (jh0x).- Dictionary に値が存在しない
Nullableキーカラムを使用して呼び出した場合に、dictGetOrNullがSELECTprojection 内の他のカラムを暗黙的にNULLで上書きする問題を修正しました。この関数は入力とエイリアス化された null map をその場で変更していましたが、現在は変更前に結果カラムをディープクローンします。 #104327 (groeneai). optimize_skip_unused_shards_rewrite_inが有効な場合に、分片キーに空のINタプルを含む分散クエリで発生する例外を修正しました。 #104966 (alexey-milovidov).Float64リテラルとの比較を含む、Float32カラムに対する count-min 統計のPREWHERE選択性推定を修正しました。 #105047 (hanfei1991).quantileExactWeightedInterpolated、quantileDD、またはquantilePrometheusHistogramの aggregate state を、対応する複数形のquantilesXxxMergeとマージする際 (およびその逆) に発生するILLEGAL_TYPE_OF_ARGUMENTを修正しました。これら 3 つの quantile ファミリーの単数形と複数形のバリアントは同じ内部 aggregate state を共有していますが、内部名マッピングテーブルに記載されていなかったため、関数間での state マージおよびこれらのファミリーに対する関数融合最適化が拒否されていました。 #105189 (groeneai).- 結果が
Dateの範囲外となるDate32およびDateTime64引数に対するtoStartOfWeek、toLastDayOfWeek、toMonday、toStartOfMonth、toLastDayOfMonth、toStartOfQuarter、toStartOfYearの誤った結果を修正しました。任意の日付にオーバーフローするのではなく、1970-01-01より前の結果は1970-01-01に、2149-06-06より後の結果は2149-06-06にクランプされるようになりました。また、範囲外の値を含むDate32またはDateTime64キーに対するWHERE句でこれらの関数を使用した際に、パーツおよびグラニュールが誤って除外されることで不正なクエリ結果が返される問題も修正しました。 #105244 (yariks5s). - 第1引数が、すべての選択肢が第2引数の型と互換性のない
Variantの配列であり、variant_throw_on_type_mismatchが無効な場合に発生するarrayRemoveの論理エラーを修正しました。比較を “決して等しくない” として扱い、サーバー側のassertTypeEqualityエラーを発生させる代わりに、配列を変更せずに返すようになりました。 #105248 (groeneai). - Dynamic に対する
toFloat64/toUInt32/toStringなどがcast_keep_nullableを無視する問題を修正しました。 #105467 (Avogar). - Nullable 引数とともに
GROUP BY ... WITH ROLLUP、WITH CUBE、またはWITH TOTALSを使用した場合に、uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(およびuniqに対する類似の combinator チェーン) で発生するサーバーの segfault を修正しました。 #105470 (groeneai). - 負の (エポック以前の)
DateTime64値に対してtoStartOfMillisecondおよびtoStartOfMicrosecondがほぼ1秒ずれた結果を返す問題を修正し、INT64_MIN付近のDateTime64入力に対するtoStartOfSecond、toStartOfMillisecond、toStartOfMicrosecondのUndefinedBehaviorSanitizerによる符号付き整数オーバーフローも修正しました。 #105482 (groeneai). JSONのsingleValueOrNull状態をデシリアライズする際にサーバーが終了する問題を修正しました。 #105535 (Avogar).- JSON の共有データへの挿入時に
input_format_try_infer_datetimesが無視される問題を修正しました。 #105544 (Avogar). JSONExtractおよびテキストのデシリアライゼーションで、範囲外の値に対してDateTimeがラップアラウンドする問題を修正しました。 #105551 (Avogar).- 同じ VALUES 句内でサイズの異なるタプルを String カラムに挿入した際のクラッシュを修正しました。 #105582 (Avogar).
- NULL 値を含むタイムゾーンを持つ DateTime から toString への変換で発生する NOT_IMPLEMENTED エラーを修正しました。 #105587 (yariks5s).
- Native 入力で不正な flattened
Dynamicカラムを検証する処理を追加しました。 #105666 (Avogar). - 結果型が
Variantで、第2または第3ブランチがInt64に収まるUInt64リテラルに対する定数条件のifであるif式について、クエリプランニング中に発生するLOGICAL_ERROR(Unexpected return type from if) を修正しました。 #105680 (groeneai). - 集計状態のシリアル化時 (例: 並列レプリカ、バイナリ状態フォーマッタ経由の
sumMapState、外部集計) に、Nested(... Nullable(Decimal(P, S)))カラムに対するsumMapおよびsumMapWithOverflowで発生するBad get: has Decimal32, requested Decimal128を修正しました。 #105816 (groeneai). ALTER MODIFY COLUMN ... LowCardinality(...)ミューテーションより前にキューに登録されたオンザフライUPDATE/DELETEミューテーションが保留されているテーブルでapply_mutations_on_fly = 1を使用した際に発生する、Expected ColumnLowCardinality, got String/Bad cast from type DB::ColumnString to DB::ColumnLowCardinalityエラーを修正しました。 #105847 (Algunenano).- 新しいアナライザで、
IN Array(...)フィルターを使用する分散クエリで発生するCannot find columnエラーを修正しました。 #105894 (KochetovNicolai). - ある
ALTERによってカラムが同時に削除されている間に、STATISTICSを持つカラムをNullableに変更するとサーバーが終了する問題を修正しました。 #105917 (groeneai). RowBinaryWithNamesAndTypesの型デコード時 (input_format_binary_decode_types_in_binary_format = 1) に範囲外のIntervalKindバイトを拒否し、無効な kind を持つDataTypeIntervalの構築によって後続のハッシュパスで未定義動作が発生する可能性がある代わりに、明確なINCORRECT_DATAエラーを返すようにしました。 #106261 (groeneai).- Nullable(JSON) で、‘null’ サブカラムを null-map ではなく JSON path として読み取るようにしました。 #106295 (Avogar).
- すべての配列が空で、キーが定数ではないカラムをハッシュ化する際に
sipHash64Keyed、sipHash128Keyed、sipHash128ReferenceKeyedで発生する範囲外読み取りを修正しました。 #106355 (Algunenano). - 第 2 引数が非定数タプルである
INの第 1 引数で、スカラーサブクエリを使用できなかった問題を修正しました。 #106610 (yariks5s). LowCardinality(DateTime)カラムをテキストフォーマット (CSV、TSV、JSONEachRow など) にシリアル化する際にsession_timezoneが無視される問題を修正しました。以前は、サーバー上でLowCardinality(DateTime)カラムが最初に書き込まれた後、このカラムを書き込む以降のすべてのクエリで、session_timezoneに関係なく、最初に検出されたタイムゾーンの現地時刻文字列が表示されていました。 #106634 (groeneai).- 条件が定数の
Nullable(Nothing)値である場合にifおよびmultiIfでサーバーが終了する問題を修正しました。 #106678 (groeneai). sumMap/-Mapコンビネータが、SimpleAggregateFunction(sum, T)やBoolなどのカスタム名付き数値値型をILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summedで拒否し、以前は動作していた集計を壊すようにした変更を元に戻しました。 #106729 (fm4v).- キーカラムが
LowCardinalityで、述語定数がLowCardinality(Nullable(...))の場合に、MinMax統計によるパーツの枝刈り中に発生するBad cast例外を修正しました。 #106793 (groeneai). - 非 ASCII の入力バイトを含む場合に
parseDateTimeで発生する論理エラーを修正しました。 #106856 (Avogar). - 集約関数の引数を Nullable 型にキャストする必要がある場合に、
optimize_rewrite_aggregate_function_with_if最適化を伴う分散クエリで発生するTHERE_IS_NO_COLUMN例外を修正しました。 #106908 (yakov-olkhovskiy). - 重みの Array に大きな整数値が含まれる場合に
arrayLevenshteinDistanceWeightedおよびarraySimilarityで発生する符号付き整数オーバーフロー (未定義動作) を修正しました。整数の重みに対する重み付き距離はより大きな整数型で累積されるようになったため、大きな整数の重みでもオーバーフローせず、正確さが維持されます。 #106934 (groeneai). - ローカルストレージの順序がグローバル順序と異なる
Mapバリアントを持つVariantカラムを含むソート済みブロックのマージ時に発生するクラッシュ (Source column is not Map/SIGSEGV) を修正しました。 #107011 (groeneai). - 遅延マテリアライゼーションによってソートカラムより前に別のカラムが配置された場合に、
ORDER BY <numeric column> ... LIMIT nクエリで発生するTYPE_MISMATCHエラー (“Cannot convert string … to type …”) を修正しました。上位 K のしきい値は正しいソートカラムから読み取られるようになりました。 #107060 (groeneai). - 異なる型のカラム間で解放済みのカラム名を再利用する複合
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a(「スワップ」) を修正しました。マテリアライズされた part に誤ったカラム型が記録されていたため、後続のSELECTがConversion between numeric types and IPv6 is not supportedで失敗するか、debug build では part の読み込み時に中断していました。 #107064 (groeneai). - 境界値の Array に
NaNが含まれる場合のroundDown関数の非決定論的な結果を修正しました。同じ入力値でも、バッチ内の周囲の行に応じて有限の境界値またはNaNが返されることがありました。NaNの境界値は無視されるようになり、結果は有限の境界値のみに依存します。 #107065 (groeneai). - 補間された分位点が小数で範囲内にある場合に、
DateおよびDateTime引数に対してquantileTDigestとquantileTDigestWeightedがDECIMAL_OVERFLOWをスローする問題を修正しました (たとえば、すべての値が型に収まる場合のquantileTDigestWeighted(date, weight)) 。小数の結果はquantilesTDigestWeightedと一致するよう結果型に切り捨てられるようになり、実際に範囲外の値では引き続きエラーが発生します。 #107066 (groeneai). Enum8/Enum16型定義で範囲外の整数値が暗黙的に切り捨てられる問題を修正しました。Enum8('a' = 200)は、暗黙的にEnum8('a' = -56)を作成するのではなく、ARGUMENT_OUT_OF_BOUNDをスローするようになりました。 #107081 (groeneai).- 複数の行が先頭カラムで同順位となる場合に、
Nullableカラムでソートする複数カラムのORDER BY ... LIMITクエリで発生する誤った行順序 (および debug build でのLOGICAL_ERROR“Rows are not sorted with permutation”) を修正しました。 #107094 (groeneai). ALTER TABLE ... ADD COLUMN後、または未完了のALTER TABLE ... CLEAR COLUMNミューテーションがオンザフライで適用された後など、デフォルト値で埋められたArray(Tuple(...))カラムの読み取り時に発生するLogical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple'を修正しました。#107232 (groeneai).CREATE TABLE時に、TTL 式でのAggregateFunctionカラムのサポートされていない使用 (例:TTL toDateTime(state)) を拒否するようにし、後の TTL 実行時にILLEGAL_TYPE_OF_ARGUMENTで失敗する問題を修正しました。これには、Variantの代替型やDynamic値に含まれる状態も含まれます。finalizeAggregationなど、状態を認識する有効なコンシューマーは引き続き許可されます。#107366 (Ria-K912).Decimalのサイズ引数を指定したarrayResizeを修正しました。サイズは未スケーリングの内部表現ではなく実際の値として解釈されるようになりました (例:arrayResize([1, 2, 3], 1.5::Decimal(2, 1))は 1 要素を返します) 。#107389 (alexey-milovidov).ALTER MODIFY COLUMN ... LowCardinality(...)ミューテーションの前に、対象カラムが先行するオンザフライUPDATEの関数入力としても読み取られる、保留中のオンザフライUPDATEがあるテーブルでapply_mutations_on_fly = 1を使用した場合に発生するLOGICAL_ERROR: Unexpected return type from materialize(および類似の型不一致エラー) を修正しました。#107475 (groeneai).- Arrow/ORC データを
LowCardinality(Nullable(...))カラムに挿入する際に、NULL 値が暗黙的に空文字列へ変換される問題を修正しました。これは 26.5 で導入されたリグレッションです。#107532 (Ergus). make_distributed_plan = 1を含むクエリが、両側に共通の型がない関数でラップされたキーで結合する場合に発生するLOGICAL_ERROR(“Input nodes size mismatch in dag”) を修正しました (例: 右側のキーがUInt64であるON intDiv(-1, t1.key) = t2.key) 。#107701 (groeneai).- サーバー設定
insert_deduplication_version = new_unified_hash使用時に、StringおよびArrayカラムに対する挿入の重複排除で誤ったハッシュが計算される問題を修正しました。重複排除ハッシュが挿入ブロック内の行’の位置に依存していたため、同一の挿入でも重複排除に失敗する可能性がありました。#107915 (CheSema). LowCardinality引数を使用してDynamicキーを持つMapを検索する際に、hasでサーバーが終了する問題を修正しました。#107956 (groeneai).PREWHEREとともに使用されるMapサブカラムのパフォーマンスリグレッションを修正しました。#107988 (Avogar).accurateCastOrNullまたはaccurateCastOrDefaultを使用して、Tuple内にネストされたDynamicまたはVariantカラムを非Nullable要素型にキャストする際の論理エラーを修正しました。#108061 (alexey-milovidov).- スパースに格納されたカラムに対し、
LIKEクエリが直接読み取りのフォールバックパス経由でtextインデックスを読み取る際に発生するBad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>論理エラー例外を修正しました。#108068 (groeneai). - 非定数または false の条件を指定した
ALTER UPDATE col = ... WHERE <cond>の後にALTER MODIFY COLUMN col <new type>を実行した場合、apply_mutations_on_fly = 1でカラムを読み取る際に発生するLOGICAL_ERROR(“Unexpected return type from if”) を修正しました。#108128 (groeneai). Int64の範囲の限界に近い極端なDateTime64値に対して、hourおよびminute単位でdateDiffを使用した際に発生するsigned integer overflow(未定義動作) を修正しました。#108229 (groeneai).Array(Dynamic)またはArray(Variant)をaccurateCastOrNullでQBitにキャストする際に発生するサーバー例外 (IColumn::insertFromのLogical error) を修正しました。例:accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)')。#108288 (groeneai).- タイムゾーンを指定した
parseDateTimeBestEffortが、toString(Nullable(DateTime64))の NULL 行で CANNOT_PARSE_DATETIME を送出する問題を修正しました。#108310 (yariks5s). max_parser_depthを大きな値に設定した場合に、[[[ ... ]]]やarray(array( ... ))などの深くネストした式によって発生するサーバークラッシュ (スタックオーバーフロー) を修正しました。#108493 (Algunenano).- プロジェクションの作成後に
ALTER TABLE ... ADD COLUMN ... DEFAULTで追加されたカラムを読み取る際、SELECT *プロジェクションがそのDEFAULT値 (例:-1) ではなくカラム型のデフォルト値 (例:0) を返す問題を修正しました。基となるテーブルからの読み取りはすでに正しく、プロジェクションの再構築前に影響を受けたのはプロジェクションが処理した読み取りだけでした。#108569 (tiandiwonder). LowCardinality(FixedString)(またはLowCardinality(Nullable(FixedString))) のキーカラムがキー内で関数によってラップされている場合、パーティションおよび主キーのプルーニングが暗黙的に無効になる問題を修正しました。たとえば、PARTITION BY sipHash64(k) % NとWHERE k = 'literal'の場合です。このようなクエリでは、パーティションをプルーニングせず、すべてのパーティションをスキャンしていました。#108777 (groeneai).- これに依存する比較操作を修正するため、バケット化された Map シリアライゼーションで元のキー順序を保持します。#109178 (Avogar).
Arrow、ArrowStream、Avro形式、およびレガシーのORC、Parquetリーダーにおいて、null 許容の struct カラムに対するスキーマ推論が、許可されていないNullable(Tuple)型 (allow_experimental_nullable_tuple_typeが無効) を返す問題を修正しました。DESCRIBEはCREATE TABLEが拒否する型を返していたため、推定したスキーマを使用したテーブルの作成またはデータの挿入は、Nullable Tuple type is not allowedエラーで失敗していました。#109185 (nihalzp).- サーバーがインラインデータ自体を解析する場合 (
send_table_structure_on_insert_with_inline_data = 0) 、インラインのVALUESデータを含むINSERT INTO TABLE FUNCTION(例:remote(...)またはfile(...)) でカラムのDEFAULT値が適用されないバグを修正しました。DEFAULTを持つ非Nullableカラムに明示的にNULLを挿入すると、宣言されたデフォルト値ではなく0になっていました。現在は通常のテーブルINSERTおよび HTTP protocol と同様に動作します。#109258 (groeneai). groupArrayLastMergeのセグメンテーション違反を修正しました。集計関数の状態のデシリアライゼーションが検証されるようになり、破損した状態による範囲外アクセスが発生しなくなりました。 #109485 (mstetsyuk).- デシリアライゼーション時に破損した集計関数の状態を拒否することで、
largestTriangleThreeBuckets集計関数のセグメンテーション違反を修正しました。 #109492 (mstetsyuk). - 要求された ClickHouse 型が
Nullableでラップされている場合 (例:Nullable(Tuple(...))) に、null 非許容のTupleを含む Parquet カラムを読み取れず、以前はTYPE_MISMATCHで失敗していた問題を修正しました。 #109615 (groeneai). - Parquet v3 ネイティブリーダーで、物理的に null 許容の struct カラム (Parquet の OPTIONAL group) を
Nullable(Tuple(...))として読み取れるようになりました。以前はTYPE_MISMATCHが発生していました。 #109898 (groeneai). - 深くネストした
Array/Tuple/Map/Objectリテラルのコピーまたは破棄時に発生するサーバークラッシュ (ネイティブスタックオーバーフロー) を修正しました。たとえば、max_parser_depthを引き上げた状態で、非常に深くネストしたリテラルを含むクエリを実行した場合に発生していました。 #110393 (Algunenano). - metadata-only の
ALTER MODIFY COLUMN TによりNullable(T)に変更されたカラムで、optimize_functions_to_subcolumns使用時にIS NULL/IS NOT NULL/count()の結果が誤る問題を修正しました。変換前に書き込まれたパートでは、.nullサブカラムが物理的に存在する親カラムから導出されず、ストレージ型のデフォルト値 (NULL) で埋められていたため、既存の非 null 行が誤って NULL と報告されていました。 #110584 (groeneai). LowCardinalityのキーカラムが、LowCardinalityを再導入するネストしたCASTチェーンでラップされている場合 (例:WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5') に、主キーの索引解析中に発生するLOGICAL_ERROR(“Bad cast from ColumnString to ColumnLowCardinality”) を修正しました。debug および sanitizer ビルドではサーバーが中断され、リリースビルドではクエリが失敗していました。 #111050 (groeneai).- Apache Arrow Java 19.0.0 未満 (Apache Spark に同梱) で生成された、ネストした
ArrayまたはMapカラムが空のArrowおよびArrowStreamデータの読み取りを修正しました。以前は、offsets バッファが小さすぎることに関するINCORRECT_DATAエラーで拒否されていました。 #111101 (Algunenano). Tuple、Array、Map、Nullable、Variantなどのコンテナカラム内にネストされた、互換性のある集計状態カラム (例:quantileStateおよびquantilesState(0.9)) に対する集合演算で発生する、論理エラーBlock structure mismatch(debug および sanitizer ビルド) およびIllegal types of argumentsエラーを修正しました。 #111191 (alexey-milovidov).- ネイティブプロトコル経由で受信した破損した replicated-index データの検証を追加しました。 #112331 (Avogar).
INSERTが、パーティション化されたターゲットテーブルへの書き込み前に行数を変更する materialized view を経由する場合に、挿入の重複排除中に発生する範囲外読み取りを修正しました。 #112649 (CheSema).- 物理型が宣言精度に対応する型よりも広い
ParquetDECIMALカラム (例: 物理INT64として保存されたDECIMAL(9, 2)) を読み取る際の範囲外書き込みを修正しました。このようなファイルは有効なParquetであり、他のライターでも生成されますが、リーダーは宣言精度に基づいて宛先カラムのサイズを決定する一方、デコーダーは物理幅で書き込んでいたため、メモリが破損していました。このようなファイルの読み取り時に値が宣言精度に収まらない場合は、破損したデータを返す代わりにDECIMAL_OVERFLOWが発生するようになりました。また、物理型と同等以上の幅を持つ型ヒントを指定すれば、損失なく読み取れるようになりました。 #113046 (groeneai). PARTITION BY (a)、ORDER BY (b)、INDEX ix (b * c) TYPE minmax、PROJECTION p (SELECT (b) ...)、CONSTRAINT c CHECK (a > 0)、TTL (d + INTERVAL 10 YEAR)、DEFAULT (a + 1)など、冗長な括弧を含む定義で記述されたテーブルにおいて、ATTACH PARTITION FROM、REPLACE PARTITION、MOVE PARTITION TO TABLE、およびReplicatedMergeTreeレプリカの追加が、Tables have different ...、METADATA_MISMATCH、またはINCOMPATIBLE_COLUMNSにより失敗する問題を修正しました。 #114188 (alexey-milovidov).http_response_headersまたはadditional_table_filtersを含む設定プロファイルなど、Map値を持つ設定を含むアクセスエンティティが、ClickHouse で再読み込みできない形式で保存され、再起動後に恒久的に読み込めなくなるバグを修正しました。 #114620 (groeneai).- 空の
Stringや数値のゼロなど、要素型のデフォルト値と等しい定数LowCardinalityの検索値に対して、has、indexOf、countEqual、mapContainsKey、mapContainsValue、およびMapの添字演算が “not found” を返す問題を修正しました。 #114624 (groeneai). DISTINCT、QUALIFY、ウィンドウ関数、またはプロジェクション内のarrayJoinを含むクエリに対して、単純なGROUP BY ... LIMIT最適化 (設定optimize_trivial_group_by_limit_query) が誤った結果を返す問題を修正しました。これらは集約後にグループを消費またはフィルタリングするため、集約をLIMIT + OFFSET個のキーに制限すると、行数が不足したり誤った値が返されたりする可能性がありました。この最適化は、このようなクエリには適用されなくなりました。 #114695 (alexey-milovidov).- デフォルトの
optimize_trivial_count_query = 1で、SELECT count(arrayJoin(arr))が誤った結果を返す問題を修正しました。配列要素数ではなく保存されている行数が返され、file()およびurl()ではクエリが0を返していました。 #115227 (groeneai). Nullableカラムに対するuniqExact(tuple(x))など、NULL 許容性を隠す単射関数でラップされた引数に対して、uniq、uniqExact、uniqHLL12、uniqThetaが誤った結果を返す問題を修正しました。optimize_injective_functions_inside_uniq最適化によりラップ関数が削除された結果、NULL 行がカウントされずにスキップされていました。 #115466 (vdimir).- 同等の主キーが冗長な外側の括弧の有無だけで異なる場合に、KeeperMap リーダーが共有メタデータを受け入れられるようにしました。 #115642 (skuznetsov-clickhouse).
テキスト索引とスキップ索引の修正
- 複数の
minmaxスキップ索引とuse_skip_indexes_for_disjunctions = 1を持つMergeTreeテーブルで、ネストしたcoalesce/ifNull比較 (例:WHERE coalesce(a, b, coalesce(c, d), e) = const) を含むクエリによってサーバーが異常終了する問題を修正しました。<op>(coalesce(...), const)のスキップ索引への書き換えが内部の coalesce 引数にも再帰的に適用されるようになり、インデックスごとのKeyConditionRPN が、選言追跡コードが想定するテンプレートの RPN と一致するようになりました。#103929 (groeneai). - 25.8 で作成され、別の
ALTER TABLE ... ADD COLUMNで追加されたカラムに対するスキップ索引を含むパーツに対してALTER TABLE ... MATERIALIZE INDEXを実行した際に発生するNOT_FOUND_COLUMN_IN_BLOCKを修正しました。強制再計算時に、ミューテーションがパーツ上の既存のすべてのスキップ索引およびプロジェクションで必要なすべてのカラムを正しく読み取るようになりました。#105039 (groeneai). use_query_condition_cache = 1(デフォルト) の場合にSELECTクエリで発生する、サイレントな過少カウントを修正しました。ブルームフィルタースキップ索引を持つカラムに対するPREWHERE pk_prefix = X WHERE non_pk IN (...)形式のクエリが、pk_prefix = X述語のQueryConditionCacheを不正な状態にしていたため、その後の通常のSELECT count() ... WHERE pk_prefix = Xが誤って過少カウントされた結果を返していました。すべての 26.x リリースが影響を受けます。#105686 (groeneai).- ベクトル検索クエリでベクトル索引に加えて
minmaxなどの別のスキップ索引を使用し、use_skip_indexes_on_data_read = 1が設定されている場合に発生する例外を修正しました。#106473 (shankar-iyer). - 空のマージ済みパーツのテキスト索引で発生する “Too many marks” を修正しました。#106867 (azat).
query_plan_optimize_lazy_finalが有効な状態で、ReplacingMergeTreeテーブルに対してFINALとテキスト索引のフィルターを使用してクエリを実行すると誤った結果になる問題を修正しました。遅延FINAL最適化で、テキスト索引からのダイレクトリードを再現しない読み取りステップが構築されていたため、フィルターによって一致するすべての行が除外されていました。#106894 (Ergus).LowCardinalityメンバーを含むVariant定数を、キー式が非単調な決定論的関数であるキーカラム (たとえばsipHash64(col)上のminmaxスキップ索引) と比較した際に発生するLOGICAL ERROR(Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) を修正しました。#107111 (groeneai).use_skip_indexes_for_top_k最適化が有効で、ソートカラムにminmaxスキップ索引を持つパーツから論理削除によって行が削除されている場合に、ORDER BY <col> LIMIT nが誤った (多くの場合は空の) 結果を返す問題を修正しました。この最適化では、論理削除されたパーツの古い minmax を、実際の上位行を保持するパーツより上位にランク付けしなくなりました。#107320 (groeneai).- Set スキップ索引が LowCardinality カラム上のグラニュールを枝刈りできない問題を修正しました。#107868 (thevar1able).
use_skip_indexes_on_data_read設定は、compatibility設定により 26.1 より前のデフォルト値 (false) に戻せるようになりました。これにより、データ読み取りパスによってminmax/set/bloom_filterスキップ索引のマーク範囲の枝刈りが妨げられるパフォーマンスリグレッションを回避できます。#108330 (egor-click).- 部分的にマテリアライズされた複数のテキスト索引からの直接読み取りを修正しました。 #108607 (CurtizJ).
- アナライザを使用して
Distributedエンジンテーブル経由でテーブルをクエリした際、mapValues(map)またはmapKeys(map)に定義されたテキスト索引が暗黙的に使用されない問題を修正しました。この索引はローカルテーブルおよびcluster()/remote()経由では使用されていましたが、Distributedエンジンテーブル経由のクエリではスキップされていました (force_data_skipping_indicesを使用するとINDEX_NOT_USEDで失敗) 。 #109188 (groeneai). - 必須の索引引数を省略した場合に
CREATE HYPOTHETICAL INDEX ... TYPE set(およびngrambf_v1/tokenbf_v1) でサーバーがクラッシュする問題を修正しました。このようなステートメントは明確なエラーで拒否されるようになりました。 #109294 (groeneai). - テキスト索引が存在する場合に、空の検索対象を指定した関数
has、mapContainsKey、mapContainsValueが誤った結果を返す問題を修正しました。 #110246 (rschu1ze). - マージ対象のパーツのいずれかが空の場合 (たとえば、パーツ内のすべての行を削除するmutationの後) 、テキスト索引を含むパーツのマージ時に発生する
ATTEMPT_TO_READ_AFTER_EOFエラーを修正しました。 #112490 (CurtizJ). WHERE句に多数のドットを含む大きな文字列定数があり、テーブルにbloom_filter、tokenbf_v1、ngrambf_v1、またはtextスキップ索引がある場合に、クエリプラン最適化が停止する問題を修正しました。フィルターカラム名とJSONAllPaths(...)の索引カラムを照合する際に、名前をドットで分割するすべてのパターンが列挙されるため、スキップ索引条件の構築が定数の長さに対して二次時間になっていました。 #113289 (groeneai).- 行ポリシーがクエリの唯一のフィルターであり、ソートカラムに
minmaxスキップ索引がある場合に、ORDER BY ... LIMITが要求された行数より少ない行、場合によっては0行を返す問題を修正しました。トップK最適化により、行ポリシーが適用される前に読み取り範囲が絞り込まれていました。 #114073 (alexey-milovidov).
データレイクに関する修正
- 外部ツール (例: Spark) によってフォーマットバージョンがアップグレードされた Iceberg テーブルの読み取り時に発生する論理エラー例外を修正しました。 #100407 (alexey-milovidov).
- PREWHERE 最適化を有効にした ORC データファイルを含む Iceberg テーブルの読み取り時に発生する例外 (
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') を修正しました。 #101206 (groeneai). - 同時実行される
Icebergメタデータ更新やDeltaLakeテーブルに対するmerge読み取りなど、固定されたdatalake_table_stateがない状態で読み取りパイプラインに到達する可能性があるパスを介してIcebergまたはDeltaLakeデータレイクテーブルを読み取る際に発生するLOGICAL_ERROR例外を修正しました。 #102033 (groeneai). - 非同期メタデータ読み込み中に通常のデータベース内で
Icebergエンジンテーブルを読み込む際、DataLakeConfiguration::getCatalogから断続的に発生するLogical error: 'Database <name> not found'を修正しました。 #103775 (groeneai). show_data_lake_catalogs_in_system_tablesを有効にした DataLake カタログデータベースで、INSERT または DDL 文が存在しないテーブルを参照した際に発生する過剰なカタログ/S3 メタデータ読み取りを修正しました。スペルミスの候補を提示する処理でカタログ全体のテーブルごとの Iceberg メタデータが読み込まれていたため、大規模なカタログではメモリを使い果たす可能性がありました。 #104124 (il9ue).- Parquet ファイルの読み取り時に
read_bytes(およびsystem.query_log、進行状況バーなどに表示される派生バイト/秒) が過大になる問題を修正しました。以前の実装では、各チャンクで行グループの合計圧縮サイズを報告していたため、N 個のカラムのうち K 個を読み取るとN / K倍に過大計上されていました。現在は、選択したカラムのみで合計されます。また、以前はデータファイルサイズを報告していなかった Iceberg テーブルのファイルレベルの進行状況追跡も修正しました。 #105413 (groeneai). iceberg_use_version_hint = 1を指定せずに別の書き込み元 (icebergLocal/icebergS3テーブル関数など) がテーブルを更新した後、これを指定して Iceberg テーブルを読み取ると誤った結果が返る問題を修正しました。ファイルが存在する場合はすべての書き込み元でversion-hint.textが同期されるようになったため、ヒントを使用する後続の読み取り元は最新のスナップショットを参照します。 #105682 (groeneai).- Iceberg への書き込みで、
Nullable(T)パーティションカラム内の NULL 値が保持されるようになりました。以前は、ClickHouse が書き込んだ NULL は、Spark または他の Iceberg 読み取り元で読み戻すと内部型のデフォルト値 (intの場合は0) として表示されていました。 #105862 (groeneai). - 1 つの削除ファイルが複数のデータファイルを参照し、複数の削除ファイルが同じデータファイルに適用される場合に、
Icebergv2 の merge-on-read 位置削除で誤った行が返される問題を修正しました。削除エントリは参照先のファイルパスでフィルタリングされるようになりました。 #105888 (groeneai). DETACH+ATTACHサイクルまたはサーバー再起動後にIcebergLocalテーブルエンジンが読み取り専用となり、以降のすべてのINSERTがLocal object storage Local is readonly. (READONLY)で失敗する問題を修正しました。 #106016 (groeneai).- オブジェクトメタデータにブロブ ETag が含まれていないため、Azure Blob Storage (例: Azure 上の Delta Lake テーブル) でファイルシステムキャッシュが暗黙的に無効化される問題を修正しました。 #106091 (thewisenerd).
- Delta Lake テーブルで、設定済みのストレージ場所の外部にあるオブジェクトにメタデータ経由でアクセスできないよう、パス検証を追加しました。#106115 (scanhex12).
- Iceberg パーティションプルーニングで、アナライザーがスカラーサブクエリの結果をソース型と変換先の型が一致する内部的な
_CAST(Const, 'TargetType')でラップするWHERE partition_col = (SELECT ... FROM ...)フィルターを正しく処理するようになりました。以前は、このようなフィルターによりパーティションプルーニングが無効化され、フルテーブルスキャンが実行されていました。#106204 (groeneai). - テーブルを含む
IcebergREST カタログが誤って空であると報告される問題を修正しました。#106301 (LefterisXefteris). - Parquet V3 ネイティブリーダー使用時に、
SELECTリストに含まれないカラムに対するIS NOT NULLを含む複合WHERE句で Iceberg または S3 テーブルをクエリすると発生するNOT_FOUND_COLUMN_IN_BLOCK例外を修正しました。#106443 (tiandiwonder). _fileまたは_pathフィルターを使用して Iceberg テーブルから読み取る際に、進行状況が過大に報告される問題を修正しました。以前は、フィルタリングの有無にかかわらず、total_bytes_to_readの進行状況にマニフェスト内のすべてのファイルが含まれていました。#106491 (PedroTadim).- 書き込みブロックのカラム名が最新スキーマのフィールド ID と一致しない
Icebergテーブルへの挿入時に発生するサーバー例外 (std::out_of_range論理エラー) を修正しました (例: 同時実行中のライターがiceberg_metadata_staleness_msウィンドウ内でカラム名を変更した場合) 。サーバーを停止させる代わりに、挿入は明確なクエリエラーで失敗するようになりました。#107279 (groeneai). - MsgPack、BSON、ORC、Parquet、JSON、DeltaLake、Iceberg、Paimon 形式で深くネストされたスキーマまたは値を読み取る際に発生する可能性があるサーバースタックオーバーフロー (クラッシュ) を修正しました。このように深くネストされた入力は、例外として拒否されるようになりました。#107341 (Algunenano).
- メタデータバージョン間で既存の
schema-idを異なるスキーマに再バインドするメタデータを持つ Iceberg テーブルの読み取り時に発生するクラッシュ (デバッグビルドでのLOGICAL_ERROR) と、結果が誤っていても通知されないバグ (リリースビルド) を修正しました。このようなメタデータはICEBERG_SPECIFICATION_VIOLATIONで拒否されるようになりました。#107370 (groeneai). - Parquet データファイルに予約済みの行系統カラム (
_row_idなど) を含む Iceberg v3 テーブルの読み取りを修正しました。ネイティブ Parquet リーダーは、テーブルスキーマに含まれない予約済みフィールド ID に対してICEBERG_SPECIFICATION_VIOLATIONを発生させなくなりました。#107377 (gregakinman). - ファイルが同時に置き換えられている間にローカルディスクのオブジェクトストレージディレクトリ (例:
localディスク上の Iceberg テーブル) を一覧表示すると発生する、不必要なfilesystem error: in last_write_time: No such file or directory例外を修正しました。同時に削除されたエントリは、一覧表示を中断するのではなく、一覧から除外されるようになりました。#107432 (groeneai). - Azure 経由で Delta Lake テーブルを読み取る際に発生する ‘Account must be specified error’ を修正しました。#107620 (SmitaRKulkarni).
- equality delete file を含む Iceberg テーブルの読み取り時にクラッシュする問題を修正しました。equality delete file 内のカラムが Nullable で、テーブルスキーマでは非 Nullable である場合 (またはその逆) 、delete file から読み取った値が未検証のキャスト (カラム型の混同) を介して異なる型のカラムに挿入され、カラムが破損して server がクラッシュしていました。 #109551 (mstetsyuk).
- decimal (またはその他のパラメータ化された Primitive) 型がメタデータファイルごとに異なる空白でシリアル化されている Iceberg テーブルの読み取り時に、誤って
ICEBERG_SPECIFICATION_VIOLATIONerror が発生する問題を修正しました。たとえば、テーブルメタデータではdecimal(20,0)、manifest ではdecimal(20, 0)となっている場合です。このような仕様上同等の型文字列は、現在は空白を無視して比較されます。 #109676 (groeneai). - default sort order が引用符で囲む必要があるカラム (例:
@timestamp) を参照する Iceberg テーブルの読み取りを修正しました。このようなテーブルは、生成される StorageORDER BYがエスケープされていないカラム名から構築され、SYNTAX_ERRORでパースに失敗するため読み取れませんでした。 #110233 (groeneai). - Nullable の
ARRAYまたはMAPカラムを含む Paimon テーブルの読み取りを修正しました。このようなテーブルは、schema mapper が複合型をNullableでラップしていましたが、ClickHouse ではこれが禁止されているため、まったく読み取れませんでした。その結果、DESCとSELECTの両方がNested type Array(Nullable(Int32)) cannot be inside Nullable typeで失敗していました。Nullable の複合カラムは、現在では非Nullableの複合型にマッピングされ、NULL値は空の値として読み取られます。 #113450 (groeneai). - テーブルファイルの書き込み前に Iceberg ネームスペースをカタログに登録するようにしました (SeaweedFS で必要) 。 #114285 (azat).
S3/Azure/オブジェクトストレージの修正
- 並列レプリカを有効にしたクエリで
url、s3などのテーブル関数を使用した際に発生する「Distributed task iterator is not initialized」例外を修正しました。 #100146 (alexey-milovidov). - プランナーが
recursive_withフラグを設定したもののWITH式を含まないSELECTを生成した場合に、クラスターテーブル関数 (s3Cluster、urlCluster、fileCluster、…) で発生する可能性があるサーバーのセグメンテーションフォールトを修正しました。 #105433 (groeneai). IN (subquery)述語に対するParquetおよびORCのフィルタープッシュダウンを修正し、file、url、s3、およびオブジェクトストレージからの読み取りで、行グループ、ページ、ブルームフィルターのプルーニングが機能するようにしました。 #105863 (arsenmuk).- リスト取得から読み取りまでの間にリモート S3 オブジェクトがより短い内容で上書きされた場合に、キャッシュの事前ダウンロード中に発生する
LOGICAL_ERROR例外を修正しました。 #106375 (fm4v). s3テーブル関数が小文字の位置依存partition_strategy(例:hive) を暗黙的に無視する問題を修正しました。 #107297 (jkartseva).compatibility = '26.6'を設定した場合 (これによりhiveパーティション方式が暗黙的に有効化されます) に、BAD_ARGUMENTSを発生させるべきところでS3およびオブジェクトストレージのテーブルパス内の{_partition_id}を暗黙的に受け入れてしまうリグレッションを修正しました。 #107437 (LefterisXefteris).- キー・バリュー引数が重複している場合 (例:
s3('http://...', format = 'CSV', format = 'TSV')) に、s3およびその他のオブジェクトストレージテーブル関数がBAD_ARGUMENTSではなくLOGICAL_ERRORをスローする問題を修正しました。 #107670 (groeneai). s3/gcsテーブル関数の位置依存形式と名前付きシークレット引数形式を混在させた不正なクエリ (例:s3('url', 'a', 'b', secret_access_key = 'c')) をフォーマットする際に発生するサーバー例外 (Logical error: 'index >= result.start') を修正しました。 #107818 (groeneai).- URL スコープの
<s3>エンドポイントブロックが最上位の<s3>のデフォルト設定より優先されるよう、S3 設定の優先順位を修正しました。 #109251 (bharatnc). - Azure サービスから返される
411 Length Requiredエラーを修正しました。Poco ベースの Azure HTTP トランスポートでは、ヘッダーを自ら設定しない SDK クライアント (例: Azure Key Vault) に対し、リクエストボディからContent-Lengthを設定するようになりました。 #110299 (thevar1able).
S3Queue の修正
- バッチに処理不能なファイルが含まれ、かつバッチを処理中として設定する Keeper リクエストが同時に失敗した場合に、
enable_hash_ring_filtering = 1を有効にしたS3Queue/AzureQueueで発生するサーバークラッシュ (範囲外アクセス) を修正しました。#108977 (groeneai)。 SHOW CREATE、system.query_log、サーバーログ、EXPLAINの出力における認証情報の漏洩を修正しました。すべてのS3ロケーター形式で、任意の引数位置にあるsession_tokenおよび Google ADC シークレット、extra_credentials/headersの値、重複したシークレットキーや式で構築されたシークレットキー、無効な位置依存形式 (フェイルクローズ) 、S3 URL に埋め込まれた認証情報がマスクされるようになりました。これには、明示的 URL および名前付きコレクションのs3/s3Clusterテーブル関数、S3 をバックエンドとするテーブルエンジン (S3、GCS、データレイクエンジン、S3Queue) 、S3データベースエンジン、BACKUP ... TO S3、Backupデータベースエンジンが含まれます。さらに、式で構築された (SQL UDF からインライン化されたものを含む)encrypt/decrypt/HMAC のシークレット引数は、プロジェクション名、EXPLAIN QUERY TREE、EXPLAIN actionsで非表示になるようになりました。#109768 (Algunenano)。- 永続的な処理ノードを使用する
S3Queue/AzureQueueの順序付きモードを修正しました。ストリーミング中にバケットロックが更新されるようになったため、有効期限 (TTL) のクリーンアップ (persistent_processing_node_ttl_seconds) によって稼働中のプロセッサのロックが削除されなくなりました。それでもロックの所有権が失われた場合は検出・報告され (論理エラーおよびObjectStorageQueueBucketLockLostOwnershipプロファイルイベント) 、ストリーミングは新しいファイルイテレータで復旧します。#110292 (kssenii)。
セキュリティとアクセス制御に関する修正
- HTTP またはネイティブプロトコル経由で
ENGINE句を指定せずにCREATE TABLE ... TO INNER UUID '...'を送信した場合に、CREATE TABLE権限を持つ任意のユーザーが引き起こせるサーバークラッシュ (SIGSEGV) を修正しました。同じバグによりクライアントもクラッシュしていました。パーサーは null ポインタを参照解除する代わりに、適切なBAD_ARGUMENTSエラーを報告するようになりました。#105579 (groeneai). allow_experimental_delta_kernel_rsを有効にして DeltaLake テーブルをクエリする際、無効なバイトを含む認証情報またはオプションが指定されている場合に発生するサーバークラッシュを修正しました (Rust FFI がextern "C"境界をまたいでパニックしていました) 。#106109 (Algunenano).- Arrow IPC フォーマットリーダー (
ArrowColumnToCHColumn) における複数のヒープ領域外読み取りを修正しました。不正な Arrow ファイルでは、バッファに含まれる行数より多い行数を宣言したり、list/struct/map の子要素の長さを親要素と不整合にしたり、単調増加でないリストオフセットを指定したり、子要素の有効性ビットマップを切り詰めたりすることで、ヒープ割り当ての末尾を越えた読み取りが発生する可能性がありました。これはfile()、format()、テーブル関数、または ArrowFlight 入力を介して、SELECT権限を持つ任意のユーザーが引き起こせます。現在は、生ポインタへのアクセス前にすべてのデータ、オフセット、view-struct、有効性ビットマップのバッファを検証し、list/struct/map の形状とオフセットの整合性を確認します。#106395 (Algunenano). system.query_logのused_privilegesおよびmissing_privilegesカラムに、別のユーザー、データベース、またはセッションによる無関係な先行クエリから漏洩した権限文字列が含まれる可能性があったバグを修正しました。#106425 (alexey-milovidov).- 展開される HTML エンティティ
≫⃒または≪⃒を含む文字列をデコードする際のdecodeHTMLComponentにおけるヒープバッファオーバーフロー (サーバークラッシュ) を修正しました。これは単一のSELECTを実行できる任意のユーザーが引き起こせます。#106741 (Algunenano). - オンザフライ mutation (
apply_mutations_on_fly) または patch parts によってPREWHEREより前に行がフィルタリングされた場合に、query condition cache が原因で誤ったクエリ結果が返される問題を修正しました。apply_mutations_on_fly = 1で読み取るクエリが cache を汚染し、後続のapply_mutations_on_fly = 0で同じ predicate を使用するクエリが、本来読み取るべきマークをスキップして少なすぎる行を返す可能性がありました。同じ修正は、PREWHEREより前のフィルターとして追加される行レベルのセキュリティポリシーにも対応しています。制限的な行ポリシーの下で実行されたクエリが、そのポリシーなしで同じ predicate を使用する後続のクエリに対して cache を汚染する可能性がありました。#107145 (groeneai). - 範囲外のイベント型を持つ細工された集約関数の状態を終了処理する際に発生する、
windowFunnelのヒープバッファオーバーフロー (サーバークラッシュ) を修正しました。これは単一のSELECTを実行できる任意のユーザーが引き起こせます。#107412 (uwezkhan). - 非同期挿入のフラッシュパス (
async_insert = 1) で、currentUser()、user()、SESSION_USER、およびauthenticatedUser()が空文字列と評価される問題を修正しました。これにより、これらの関数を参照するDEFAULT/MATERIALIZEDカラム式および materialized view が影響を受け、挿入ユーザー名ではなく空文字列が暗黙的に保存されていました。#107541 (groeneai). - 同じユーザーまたはロールに複数の quota が割り当てられている場合、非決定論的に選ばれた 1 つの quota だけが適用されるのではなく、すべての quota がまとめて適用されるようになりました (いずれかを超過するとクエリは拒否されます) 。
SHOW QUOTAおよびsystem.quota_usageには、現在のユーザーに適用されているすべての quota が表示されるようになりました。#107664 (alexey-milovidov). SYSTEM RESET DDL WORKERの実行に、新しいSYSTEM RESET DDL WORKER権限が必要になりました。以前は、認証済みのすべてのユーザー (readonlyユーザーを含む) がこれを実行でき、DDL worker の状態を繰り返しリセットしてON CLUSTERDDL をブロックできました。#108460 (groeneai).ssl_certificateによるユーザー識別を修正し、単一の*ワイルドカードが名前のコンポーネント1つだけに厳密に一致するようにしました (RFC 6125 6.4.3) 。以前は、CNまたはDNS:SAN サブジェクト内のワイルドカード (例:*.corp.example.com) がevil.deep.corp.example.comのような複数ラベルの名前にも一致していたため、より深いサブドメイン用の証明書の所有者がワイルドカードユーザーとして認証できました。URI:SAN の照合は変更されていません。 #108472 (groeneai).- MySQL wire protocol コマンド
COM_FIELD_LIST(mysql_list_fields) およびCOM_INIT_DB(USE database) に、それぞれの SQL 相当機能 (SHOW COLUMNS/DESCRIBEおよびUSE) と同じアクセス制御が適用されるようになりました。以前は、ユーザーが一部のカラムにしか権限を持たないテーブルのカラム名を取得でき、SHOW DATABASES権限なしで現在のデータベースを切り替えることができました。 #108508 (groeneai). http_forbid_headersを大文字と小文字を区別せずに照合するようにしました。HTTP header 名は大文字と小文字を区別しないため、Authorizationを禁止すると、authorization、AUTHORIZATION、その他の大文字・小文字の違いもブロックされるようになりました。設定済みのheader_regexpパターンも、明示的な(?i)フラグを指定しなくても大文字と小文字を区別せずに照合されるようになりました。 #108509 (groeneai).DESCRIBE loop('db', 'table')およびDESCRIBE loop(<inner table function>)がSHOW COLUMNS/ ソースへのアクセスチェックをバイパスし、権限のないユーザーがテーブルのカラムスキーマを読み取れるメタデータ漏えいを修正しました。 #108624 (groeneai).- 旧バージョン (25.12以前) で不正な
auth_headerを指定して作成されたDataLakeCatalogデータベースが、26.2以降へのアップグレード後にアタッチできず、server が起動できなくなる問題を修正しました。auth_headerはCREATE時にのみ検証されるようになり、ATTACH時には起動中ではなく初回使用時にカタログが遅延構築されるため、設定不備または到達不能なカタログデータベースが1つあっても server の起動をブロックしなくなりました。 #108674 (groeneai). - RabbitMQ 接続を悪意のある過大な AMQP フレームに対して強化し、
remote_url_allow_hostsチェックをrabbitmq_addressに一貫して適用するようにしました。 #112479 (kssenii). - カラムリストなしの
CREATE TABLE ... ENGINE = Distributed(...)により、作成ユーザーに閲覧が許可されていないローカルテーブルの構造が公開されるケースを修正しました。CREATEではローカルserver 自身が実行するため、構造はユーザー自身のコンテキストで推論されるようになり、Remoteengine と同様にターゲットテーブルに対するSHOW COLUMNSが必要になります。DDL queue (ON CLUSTER、またはReplicatedデータベース内) から再実行されるCREATEは対象外です。 #113220 (groeneai). - カラムリストを指定しない
CREATE TABLE ... ENGINE = Buffer(...)により、作成ユーザーに閲覧権限のない宛先テーブルの構造が明らかになる可能性があった問題を修正しました。ローカルサーバーが自身で実行するCREATEでは、構造がユーザー自身のコンテキストで推論されるようになったため、宛先に対するSHOW COLUMNS権限が必要になりました。これはすでにMergeおよびRemoteでも必要です。DDL キューから再実行されるCREATE(ON CLUSTERまたはReplicatedデータベース内) は対象外です。 #113372 (groeneai). - authentication 前に読み取られる PostgreSQL ワイヤプロトコルの起動メッセージのサイズに上限を設定しました。 #115708 (alexey-milovidov).
バックアップと復元に関する修正
- 循環依存関係のあるテーブルを含むバックアップの
RESTORE中にサーバーが異常終了する問題を修正しました。#103824 (thevar1able). S3ディスクおよびオブジェクトストレージで、マルチパートアップロードにより書き込まれたオブジェクトの S3 ストレージクラス (s3_storage_class/s3_storage_class_name) が無視され、大きなオブジェクトがデフォルトのSTANDARDクラスで作成される問題を修正しました。ディスク、オブジェクトストレージ、バックアップでは、オプション名としてs3_storage_classとs3_storage_class_nameのどちらも使用できるようになりました。#106214 (alexey-milovidov).SYSTEM RELOAD CONFIGによってエンドポイントごとの Azure Blob Storage 設定 (use_native_copyなど) が破棄され、サーバーを再起動するまでディスクの設定がBACKUP/RESTOREで無視される問題を修正しました。#106357 (jkartseva).- バックアップを開始したレプリカ上で materialized view がまだ実体化されていない Replicated または Shared データベースで、リフレッシャブルmaterialized view の REPLACE ターゲットを収集すると、バックアップが FILE_DOESNT_EXIST で失敗する問題を修正しました。#106411 (jkartseva).
- 従来形式の
azure_blob_storageディスクで、Azure BACKUP/RESTORE がエンドポイント設定を無視する問題を修正しました。#106784 (jkartseva). AzureBlobStorageへのBACKUPを修正しました。バックアップ内のデータファイルをコピーすると、宛先オブジェクトがバックアップディレクトリ外に書き込まれていました。S3宛先でのバックアップオブジェクトの存在確認では、プレフィックスの一覧取得ではなく完全一致のHeadObjectリクエストを使用するようになり、類似したプレフィックスを持つキーの誤一致を防ぎます。#107153 (pamarcos).- インクリメンタルバックアップでは、
.backupメタデータファイルの<base_backup>ロケーターにS3認証情報を保存しなくなりました。use_same_s3_credentials_for_base_backup = 1を指定して作成されたバックアップ、またはこのバックアップロケーターと一致する明示的なベースバックアップ認証情報を使用して作成されたバックアップには、シークレットを含まないマーカーが保存され、復元時に追加設定なしで復元できます。異なる明示的なベースバックアップ認証情報または追加のベース認証引数を使用して作成されたバックアップでは、それらをbase_backup設定としてRESTOREに渡してください。埋め込み認証情報を含む古いバージョンで作成されたバックアップも引き続き復元できます。#107357 (pamarcos). ReplicatedMergeTreeテーブルのRESTOREを修正し、バックアップ内の内容が重複したパーツが暗黙的に重複排除されず保持されるようにしました。#107652 (pamarcos).- 明示的な
partition_strategyが指定されていないファイル系エンジン (S3、AzureBlobStorage、URLなど) のパスに{_partition_id}プレースホルダーが含まれる場合は、file_like_engine_default_partition_strategyに関係なく、再びwildcard戦略が適用されるようになりました。これにより、BAD_ARGUMENTS(“Partition strategy hive can not be used with a ‘_partition_id’ wildcard in the path”) で失敗するようになっていた 26.6 より前の DDL との後方互換性が回復します。#111279 (fm4v).
ClickHouse Keeper の修正
- 書き込み失敗後の
Keeperスナップショットのクリーンアップを修正しました。部分スナップショットが安全に削除され、latest_snapshot_metaを進めることなく失敗した書き込みを再試行できるようになりました。 #105779 (antonio2368). - 新しいリクエストディスパッチャの応答キューが応答スレッドの起動前に満杯になることで発生していた、フォロワーのキャッチアップ中の
Keeper障害を修正しました。 #106049 (antonio2368). nuraft_max_log_gap_in_stream設定が非デフォルト値に設定されている場合に、Keeper が起動時に停止することがある問題を修正しました (デフォルトは 0、つまり append_entries リクエストのパイプライン化は無効です) 。 #106220 (al13n321).- Keeper の内部 Raft TLS が
openSSL.client.verificationMode設定に従うようになりました。以前は、この設定にかかわらず Keeper 間の Raft 通信ではピア証明書の検証が常に有効だったため、noneは暗黙的に無視されていました。現在は、noneを指定すると Raft ピア証明書の検証が明示的に無効になり、設定がない場合は従来どおり安全なデフォルト動作が維持されます。noneを明示的に設定している構成では、アップグレード後、設定どおり Raft ピア証明書の検証が行われなくなります。 #106726 (antonio2368). - 設定の再読み込み時に ZooKeeper セッションが不要に再作成される問題を修正しました。 #107096 (azat).
last_snapshot(およびmntrのzk_latest_snapshot_size) で報告されるスナップショットメタデータが、古いスナップショットや重複したスナップショットのインストール後に後退することがあった ClickHouse Keeper のバグを修正しました。この問題により、同じインデックスのローカルスナップショットが、ピアへのストリーミング中または S3 へのアップロード中の登録済みスナップショットファイルをその場で上書きする可能性もありました。 #107321 (antonio2368).- ZooKeeper 接続が不適切なタイミングで失われた場合に、リフレッシャブルmaterialized view が停止する問題を修正しました。 #108234 (al13n321).
- パーティションとしてクエリパラメータを使用する mutation を修正しました (
ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}) 。置換後のパーティション値が、再度パースできない形式で mutation エントリにシリアライズされていたため、テーブルの読み込みに失敗していました (レプリケートテーブルではすべてのレプリカで発生) 。現在は、mutation command を ZooKeeper またはディスクに書き込む前に、再度パース可能かどうかも検証されます。これにより、同様の不一致が発生した場合はテーブルを壊すのではなくALTERクエリが失敗します。 #111518 (al13n321). system.zookeeper_infoのデータのパース中に発生する数値オーバーフローを修正しました。 #111629 (kssenii).
クラッシュおよび安定性の修正
- 新しいアナライザで、定数カラムとともに DISTINCT および ORDER BY を使用して LIMIT BY を使用した際に発生する NOT_FOUND_COLUMN_IN_BLOCK 例外を修正しました。#93195 (ashrithb).
- Hive Metastore との通信時に発生する TTransportException エラーを処理するため、自動再試行機構と再接続ロジックを追加し、HiveCatalog 接続の安定性を改善しました。#98471 (otselnik).
- short-circuit 関数 (
if、multiIf、and、orなど) のアナライザ時の定数畳み込みを修正し、静的に到達不能な分岐で分析時に例外が発生しないようにしました。たとえば、WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n))は、ゼロ除算エラーで失敗する代わりに、正しく0を返すようになりました。#103157 (fastio). - 自身の状態を返す集約関数に対して
runningAccumulateを呼び出した際に発生するサーバーの異常終了を修正しました。#105085 (antaljanosbenjamin). getServerSettingを修正し、system.server_settingsの報告内容と一致するように、実行時に変更可能なサーバー設定 (max_server_memory_usage、mark_cache_size、max_concurrent_queries、スレッドプールサイズなど) の現在有効な値を返すようにしました。#105172 (alexey-milovidov).- アナライザを有効にして
ORDER BY ... WITH FILL INTERPOLATEとLIMIT N BYを組み合わせた際に発生するNOT_FOUND_COLUMN_IN_BLOCK例外を修正しました。#105481 (yakov-olkhovskiy). - 本体が相関サブクエリである
MATERIALIZEDCTE をINの右辺として使用した際に発生するサーバー例外 (Trying to execute PLACEHOLDER action論理エラー) を修正しました。このような CTE は分析時に拒否されるようになり、CTE をFROMで直接参照した場合に同じパターンがすでに拒否される動作との一貫性を確保しました。#105518 (groeneai). variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=falseが関数実行中の例外を捕捉しない問題を修正しました。#105543 (Avogar).- TTL 式がサブカラムを参照する際に発生する NOT_FOUND_COLUMN_IN_BLOCK 例外を修正しました。#105578 (Avogar).
- PostgreSQL テーブル関数、PostgreSQL table engine、または PostgreSQL ソースを持つ Dictionary を介して PostgreSQL から読み取るクエリがキャンセルされ (たとえば KILL QUERY により) 、リモート PostgreSQL クエリのキャンセルに失敗した場合に発生する可能性があったサーバークラッシュを修正しました。#105949 (rorylshanks).
- クエリ内で送信される文字列リテラルが大きすぎることによって発生する可能性があったクラッシュを修正しました。#105996 (nickitat).
ORDER BYでソートプレフィックスを使用し、use_with_fill_by_sorting_prefixを有効にしている場合に、空のINTERPOLATE ()を使用すると発生するINVALID_WITH_FILL_EXPRESSION例外を修正しました。ソートプレフィックスのカラムは、明示的に名前を指定したINTERPOLATE (col)の動作と一致するよう、暗黙的な補間対象から正しく除外されるようになりました。#106001 (yakov-olkhovskiy).RowBinary入力またはクエリパラメータからの不正なAggregateFunction(uniqTheta, ...)状態が、サーバーを終了させる代わりにCORRUPTED_DATAとして拒否されるようになりました。#106260 (groeneai).- 制約に基づく最適化 (
optimize_using_constraints) を相関サブクエリとともに使用した場合に発生するクラッシュと、NOT_FOUND_COLUMN_IN_BLOCKエラーが発生する可能性を修正しました。#106349 (Algunenano). - 同じ式に展開される 2 つ以上の ALIAS カラム (例: いずれも
toString(x)として定義) を持つDistributedテーブルをORDER BY句付きでクエリする場合、または同じ式を ALIAS カラム参照と SELECT リスト内で直接指定する場合に発生するNUMBER_OF_COLUMNS_DOESNT_MATCH例外を修正しました。#106404 (yakov-olkhovskiy). - テーブル関数の引数内で
multiIfにアスタリスクを渡すクエリ (例:numbers(multiIf(*, ...), 2)) で発生するLOGICAL_ERROR“カラムではない要素の名前を取得しようとしました:ExpressionList” を修正しました。解決できないマッチャーを含むクエリは、UNSUPPORTED_METHODで拒否されるようになりました。#106647 (groeneai). - ディレクトリ一覧で無制限の再帰を引き起こす不適切な
fileglob パターンを拒否するようになりました。最大再帰深度 1000 が適用され、これを超えるクエリはスタックオーバーフローでサーバーを停止させる代わりにTOO_DEEP_RECURSIONを返します。#106676 (groeneai). - テーブル関数
inputがクエリ内の複数箇所から参照される非 MATERIALIZED CTE でラップされている場合に発生する'Trying to read from input() twice.'例外を修正しました。クエリはプランニング時に明確なINVALID_USAGE_OF_INPUTエラーで拒否されるようになりました。inputは一度しか読み取れないクライアントストリームであり、クエリプラン内の単一のソースからのみ使用できます。#106682 (groeneai). - パース中に例外 (例: MEMORY_LIMIT_EXCEEDED) が発生した際のカラム不整合 (後に LOGICAL_ERROR につながる問題) を修正しました。#106802 (azat).
input_format_allow_errors_num > 0を指定して切り詰められた Protobuf データを読み取る際のサーバークラッシュ (SIGSEGV) を修正しました。#106905 (atsarevskiy).- RocksDB ハンドルが解放された
EmbeddedRocksDBテーブルに対してTRUNCATEまたはDROPを実行した際のサーバークラッシュ (null ポインターの逆参照) を修正しました。たとえば、以前のTRUNCATEによってデータディレクトリが空になったread_onlyテーブルが該当します。#106940 (groeneai). - 非常に大きな
max_streams_for_files_processing_in_cluster_functions設定でurlClusterなどの*Clusterテーブル関数から読み取る際に発生する例外 (LOGICAL_ERRORとして報告されるstd::length_error) を修正しました。ストリーム数は妥当な値に制限されるようになりました。#106946 (groeneai). - 分散クエリがシャードに送信される直前にキャンセルされた場合にサーバーが終了する問題を修正しました。#106950 (groeneai).
- 同一のソーステーブルに対する 2 つの materialized view が同じターゲットテーブルに書き込み、そのターゲットを依存ビューが読み取る場合に、
materialized_views_squash_parallel_insertsを有効にしてINSERTを実行すると発生するサーバー例外 (論理エラーthis->visited_views == right->visited_views) を修正しました。 #107027 (groeneai). - 書き込みスキーマに一致しないカラム (たとえば、サブカラムにフラット化される
Nestedカラムや、明示的なカラムサブセットを指定したテーブル関数) を含む Delta Lake テーブルへの挿入時に発生するLOGICAL_ERROR例外を修正しました。このような挿入は、代わりにユーザー向けのINCOMPATIBLE_COLUMNSエラーで失敗するようになりました。 #107058 (groeneai). - 修飾付きアスタリスクマッチャー (たとえば
x.*) が再帰項内で名前によって再帰 CTE を参照した場合に発生するLOGICAL_ERROR(“Table expression … data must be initialized”) を修正しました。このようなマッチャーは、その位置での修飾付きカラム (x.a) や修飾なしマッチャー (*) と同様に、再帰テーブルのカラムを展開するようになりました。 #107144 (groeneai). - リフレッシャブルmaterialized view に、修飾なしの名前が一時テーブルまたは CTE 名と一致する
REFRESH ... DEPENDS ON <name>依存関係がある場合、再起動時にサーバーがクラッシュループに陥る可能性があるLOGICAL_ERROR(“Unexpected exception in refresh scheduling”) を修正しました。 #107156 (groeneai). toStringやconcatなどの関数を、単一の非 NULL バリアントと NULL を含むVariantまたはDynamicカラムに適用し、関数が入力カラムをそのまま返す場合に発生するLOGICAL_ERROR(Variant N (T) has size X, but expected Y) を修正しました。 #107374 (groeneai).use_strict_insert_block_limitsが有効な場合に、Aliasテーブルへの非同期INSERTで発生するLOGICAL_ERROR(block.rows() == getRows()) を修正しました。 #107400 (groeneai).- キー式 (
ORDER BY、PRIMARY KEY、PARTITION BY、またはスキップINDEX) に、右辺がテーブルであるIN演算子 (例:ORDER BY (x IN some_table)) が含まれる場合に発生するサーバー例外 (Logical error: Not-ready Set is passed as the second argument for function 'in') を修正しました。このようなキー式は、テーブル作成時に拒否されるようになりました。 #107424 (groeneai). - DISTINCT キーのセットの初期化中に割り当てに失敗した場合 (たとえば、メモリ制限に達した場合) に発生する可能性があった、
DISTINCT処理中のまれなサーバークラッシュを修正しました。 #107467 (groeneai). - 次の操作の前にキャッシュされた認証情報を更新することで、一時的な S3 認証情報の期限切れ後に
DeltaLake操作が失敗する問題を修正しました。STS の assume-role 認証情報も、認証失敗後に更新されます。 #107480 (ahmadov). PARTITION BYキーを持つテーブルのクエリ時に、より大きな式に含まれるIN/NOT INサブクエリ (たとえばWHERE (c0 IN (SELECT ...)) != 0) がある場合に発生するNot-ready Set is passed as the second argument for function 'in'(LOGICAL_ERROR) を修正しました。 #107515 (groeneai).log_formatted_queries = 1で分散クエリプランをローカル実行した場合 (make_distributed_plan+distributed_plan_execute_locally) に発生する可能性があったクラッシュ (null ポインタのデリファレンス) を修正しました。 #107570 (groeneai).enable_analyzer = 0でクエリを実行中に、ターゲットがDistributedテーブルである materialized view を読み取るとサーバーがクラッシュする問題を修正しました。 #107653 (groeneai).input_format_allow_errors_num > 0を指定して Protobuf データを読み取る際、同じブロック内で有効なメッセージの後に不正な (スキップ可能な) メッセージがある場合に発生するサーバークラッシュ (SIGSEGV) を修正しました。 #107739 (atsarevskiy).- リモートテーブル構造の推論中にブリッジが応答しなくなった場合に、
odbcおよびjdbctable function が数分間ハングし、クエリのキャンセル (KILL QUERY、max_execution_time) を無視する問題を修正しました。 #107809 (alexey-milovidov). remote()/remoteSecure()に渡される named collection のdatabase/dbオーバーライドが定数のデータベース名でない場合 (例:remote(nc, database = (SELECT 1))) に発生する可能性があったクラッシュ (null ポインタのデリファレンス) を修正しました。クラッシュする代わりに、クエリは明確なエラーで失敗するようになりました。 #108271 (groeneai)._distanceカラムを SELECT する vector search クエリで、LOGICAL_ERRORで失敗する代わりに適切なエラーが返されるようになりました。 #108423 (rschu1ze).quantileTDigest系の集約関数の状態カラムをGROUP BYキーとして使用し、複数のスレッドで同時にシリアライズした場合に発生する可能性があったクラッシュ (heap-buffer-overflow) を修正しました。 #110263 (groeneai).- 逆順 (降順) のソートキー (
ORDER BY (g, r DESC)) を持つテーブルでの主キー索引解析における誤ったプルーニングを修正しました。先行キーのカラムの変化と、その後に続く降順キーのカラムにまたがる粒度が誤ってプルーニングされ、一致する行が除外される可能性がありました。 #111059 (nihalzp). INSERTが、ターゲットがAliasで内部クエリが行数を変更する依存 materialized view を通過し、エイリアス経由で到達可能な重複排除テーブルが存在する場合に発生する論理エラーblock.rows() == getRows()(リリースビルドにおける範囲外読み取りおよび挿入の重複排除の不具合) を修正しました。 #111103 (alexey-milovidov).String値を含む不正な集約関数の状態をデシリアライズする際に、範囲外メモリアクセスによって発生するセグメンテーションフォールトを修正しました。このような状態は検証のうえ拒否され、セグメンテーションフォールトが発生しないようになりました。 #111606 (mstetsyuk).- bloom filter メタデータに不整合がある Parquet file を読み取る際のクラッシュを修正しました。このようなファイルでは、本来より少ない行が警告なく返される可能性もありました。 #112498 (tiandiwonder).
Fileengine またはfiletable function へのINSERTで、Avroなど追記をサポートしないフォーマットを使用して空でないファイルに追記した際に発生するsegfaultおよびサイレントなデータ破損を修正しました。ファイルディスクリプタまたはパーティション化されたパス経由の書き込みでは既存のチェックが回避されていたため、フォーマットプレフィックスが抑制され、既存のバイト列の後に2つ目のヘッダーが書き込まれ、ファイルが読み取れなくなっていました。このようなINSERTは、通常のパスの場合と同様に、CANNOT_APPEND_TO_FILEで拒否されるようになりました。#112839 (groeneai).- リフレッシャブルmaterialized viewがリフレッシュクエリの計画中にブロックされた場合に、
DROP TABLEおよびSYSTEM STOP VIEWがハングする問題を修正しました。#113188 (evillique). - 非同期挿入キューのエントリのデッドラインが同一の場合に、まれにserverが終了する問題を修正しました。#113363 (mstetsyuk).
- 読み取りバッファを所有するinput formatを介してParquetを読み取る際に発生するヒープメモリ破損を修正しました。たとえば、
SOURCE(FILE(... format 'Parquet'))を使用するDictionaryです。バックグラウンドのprefetchおよびデコードタスクが、パイプラインによるバッファ解放後もそのバッファを介して読み書きする可能性があり、serverが異常終了するおそれがありました。#114668 (groeneai). - 名前が内部tableの名前より辞書式順序で前に来る
TimeSeriestable (たとえば-tsという名前のtable) をdropする場合や、ENGINE = TimeSeriesで宣言されたmaterialized viewをdropする場合にハングする問題を修正しました。drop処理がDDLガードで自己デッドロックし、KILL QUERYでキャンセルできませんでした。#114953 (groeneai).
その他のバグ修正
- 関数
like、ilike、notLike、notILike、matchが、非定数の needle を指定した定数の haystack (例:'foo' LIKE pattern_column) をサポートするようになりました。従来はILLEGAL_COLUMNがスローされていました。 #100479 (Onyx2406). - 通常のプロジェクションを持つテーブルに対する VIEW から選択する際に発生する
NOT_FOUND_COLUMN_IN_BLOCKエラーを修正しました。 #101218 (amosbird). max_bytes_per_second、max_cpusなどのワークロード設定で、負の Float64 値 (例:-100.5) を拒否するようになりました。従来は負の整数値のみが検証されていたため、負の浮動小数点値により壊れた scheduler ノードが暗黙的に作成されていました。 #101842 (groeneai).- オブジェクトストレージからの読み取りが、クエリのキャンセルに速やかに応答するようになりました。 #103016 (SmitaRKulkarni).
max_insert_block_size_bytesが0(デフォルト) の場合に、INSERTの解析時にinput_format_max_block_size_bytesが暗黙的に無視される問題を修正しました。この設定により、行入力フォーマットで生成されるブロックのサイズが正しく制限されるようになりました。 #103068 (Fgrtue).- 末尾のヌルバイトを誤って除去していたため、ClickHouse が無効な GSSAPI トークンを生成することがある問題を修正しました。 #103114 (EmeraldShift).
- EXPLAIN SYNTAX がパラメーター化ビューを展開するようになりました。 #103263 (jrdi).
INSERT INTO FUNCTION hdfs(...)を介して HDFS に Parquet (および ORC、Arrow などのトレーラーを持つフォーマット) を書き込む際に発生するデータ破損を修正しました。26.1 以降、WriteBufferFromHDFSはfinalize()時に作業用バッファをフラッシュしていなかったため、Parquet のPAR1フッターを含め、すべてのファイルの末尾最大DBMS_DEFAULT_BUFFER_SIZEバイトが暗黙的に失われていました。このようなファイルを読み取ると、Not a Parquet file (wrong magic bytes at the end of file)が返されていました。 #103268 (groeneai).- 結合サイズ制限 (
max_rows_in_join/max_bytes_in_join) をjoin_overflow_mode = 'break'とともに設定した場合に、相関サブクエリで誤った結果や論理エラーが発生する可能性がある問題を修正しました。相関サブクエリの評価用に内部で作成される結合は、これらのユーザー設定の制限を無視するようになったため、早期に停止して行を破棄することがなくなりました。 #103322 (groeneai). - 集約プロジェクションに異なる
IN (...)条件を持つ複数のsumIf集約が含まれる場合に、誤った結果が返されたりプロジェクションが使用されなかったりする問題を修正しました。 #104765 (Ergus). deltaSumTimestampが、ゼロをまたぐ符号付き整数型に対して誤った結果を返す問題を修正しました。 #104830 (thevar1able).- メタデータファイルが破損しているか読み込めない、アタッチ直後の
Iceberg、DeltaLake、またはHudiテーブルに対するDELETE FROMで発生するLogical error: 'Metadata is not initialized'を修正しました。代わりに通常のユーザー向け例外が報告され、サーバーは稼働を継続します。 #104917 (groeneai). - ストレージ句 (
ORDER BY、PARTITION BY、PRIMARY KEY、SAMPLE BY、TTL、UNIQUE KEY、またはエンジンのSETTINGS) をENGINEなしで指定するATTACH TABLE name <clauses>;クエリでは、保存済みの定義を使用してテーブルを再アタッチし、ユーザー指定の句を破棄する代わりに、BAD_ARGUMENTSがスローされるようになりました。クエリレベルのセッションSETTINGS(log_commentなど) は引き続き適用されます。保存済みのメタデータで再アタッチするにはATTACH TABLE t;を使用し、設定を変更するにはATTACH後にALTER TABLE t MODIFY SETTING ...を使用してください。 #105068 (groeneai). - バイナリまたは文字列カラムに破損した中間オフセットを含むArrowまたはArrowStreamファイルの読み取り時に発生するヒープバッファオーバーフロー、および地理タグ付きArrowカラムの読み取り時に発生するヌルポインタ逆参照を修正しました。 #105449 (Algunenano).
ALTER後に圧縮されたMemoryテーブルからDynamicサブカラムを読み取る際にサーバーが終了する問題を修正しました。 #105464 (Avogar).WithNamesフォーマットのスキーマキャッシュキーにskip_first_linesを含めるようにしました。 #105469 (Avogar).- 小規模でソートされていない入力に対して
histogramが誤った結果を生成する問題を修正しました。 #105548 (Avogar). optimize_trivial_insert_selectが有効な場合に、テーブル関数で挿入先テーブルを使用する際の問題を修正しました。 #105555 (Avogar).estimateCompressionRatioウィンドウ関数で、行間で蓄積データが失われる問題を修正しました。 #105581 (Avogar).- Hiveパーティション値の抽出で
cast_string_to_date_time_mode設定が考慮されるようになり、デフォルトでパーティションキー内のタイムゾーン接尾辞 (例:+0000、+00:00、Z) を含むISO 8601タイムスタンプを受け入れるようになりました。 #105584 (alexey-milovidov). - 不正な形式の行の後における
Template入力フォーマットのエラー復旧を修正しました。 #105735 (niyue). - ハンドラー引数が単一のスペースで区切られるよう
SYSTEM INSTRUMENT ADDのフォーマットを修正し、値が3つ以上ある、または最小値が最大値を超える範囲を指定する無効なSLEEPインストルメンテーション引数リストを拒否するようにしました。 #105984 (pamarcos). - Boolパーティションキーに対するALTER TABLEパーティション操作が暗黙的に失敗する問題を修正しました。 #106004 (Avogar).
- デフォルト値を持つ型付きJSONパスに対する
JSONExtractRawおよびJSONHasの問題を修正しました。 #106005 (Avogar). - データレイク構成において、空のベースパスに誤った
/プレフィックスが付く問題を修正しました。 #106013 (thewisenerd). - 部分的な
SHOW DICTIONARIESの権限取り消し時にsystem.dictionariesが0行を返す問題を修正しました。 #106105 (Avogar). (c0 / -42)やintDiv(c0, -42)などの単調減少関数を含むORDER BYを持つテーブルに対するクエリで、誤った結果が返される問題を修正しました。基になる列に対する述語 (例:c0 < 0) によって一致する行を含む granule が誤ってプルーニングされ、結果が欠落することがありました。 #106136 (nihalzp).- 挿入時に不正な形式の
DDSketch集約状態を検証するようにしました。 #106236 (yariks5s). - 失敗した
SLRUのダウングレード後に発生する filesystem-cache の整合性の問題を修正し、エントリがエビクション状態のまま残ることを防止しました。また、System/Data分割 cache のリサイズと空き領域のクリーンアップも修正し、制限値をアトミックに更新して両方の cache セグメントから領域を回収できるようにしました。 #106286 (kssenii). - 仮数のシフトが 1 ビットずれていたことに起因する、非正規
Float16値からFloat32値への誤った変換を修正しました (例: Numpy の.npyファイルから読み取る場合) 。 #106343 (jh0x). regexpExtract(haystack, pattern)を修正し、capturing group のない pattern ではINDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGEをスローするのではなく、マッチ全体を返すようにしました。 #106374 (groeneai).NaNまたは無限大の点座標を含む source data から Polygon 辞書を構築する際に発生する論理エラーを修正しました。このような座標は、明確なエラーとともに拒否されるようになりました。 #106423 (alexey-milovidov).- HTTP Dictionary で、named collections を通じて request headers を指定できるようになりました。 #106459 (ZelvaMan).
- 不正な形式の
Avroenum 値を検証し、範囲外のメモリアクセスや server の終了を引き起こす代わりに、例外として拒否するようにしました。 #106476 (mstetsyuk). - 同順位の判定時に、
LIMIT WITH TIESおよび小数指定のLIMIT WITH TIESがORDER BY ... COLLATEの照合順序を考慮しない問題を修正しました。照合順序上は等しい行 (例: 数値照合順序における'1'と'01') がバイト単位で比較されていたため、一部の同順位行が結果から誤って除外されていました。 #106539 (nihalzp). - 入力が照合順序 (
ORDER BY ... COLLATE) でソートされている場合に、順序付きDISTINCTおよび順序付きLIMIT BYの最適化 (負のLIMIT BYを含む) が誤った結果を返す問題を修正しました。照合順序上は等しい行 (例: 大文字・小文字を区別しない照合順序における'a'と'A') は照合キーで並べ替えられ、値としては隣接しないため、collator を使用する場合は順序付き最適化をスキップするようにしました。 #106564 (nihalzp). - NATS consumer のシャットダウン中に発生し、server が終了する可能性があった競合状態を修正しました。 #106692 (mstetsyuk).
- 信頼できない入力から到達可能な format reader における、複数のメモリ安全性およびリソース枯渇の問題を修正しました。これには、native Parquet リーダーの
DataPageV2における definition/repetition level の長さ処理時のヒープ範囲外読み取り、深くネストされたスキーマを持つ Parquet files でのスタックオーバーフロー、GeoParquet WKB/WKT geometry および Avro の文字列/バイト列の解析時にmax_memory_usageを無視する割り当てが含まれます。 #106739 (Algunenano). - HTTPS クライアントに対して
keeper_server.http_control.secure_portが平文 HTTP レスポンスを返していた問題を修正しました。セキュアポートで HTTPS が正しく提供されるようになりました。#106822 (linjiayu1025-collab). SHOW CREATE ROW POLICYが、他のキーワードと異なりrestrictive/permissiveを大文字ではなく小文字で出力していた問題を修正しました。#106865 (valerypetrov).- パーティションキーに
LowCardinality(Nullable(...))カラムを含むテーブルで、パーツを再読み込みするたびに (server の再起動、DETACH、またはATTACH) 、パーツが破損としてマークされデタッチされていた問題を修正しました。26.5 以降、このようなカラムの最小値と最大値がNULLの場合、パーツごとの minmax 索引ファイルが書き込まれなくなっていましたが、パーツ整合性チェックでは引き続きそのファイルが必要とされていました。影響を受けるバージョンで書き込まれたパーツには minmax 索引ファイルがないため、引き続き手動で再アタッチする必要があります。#106945 (PedroTadim). - 非同期挿入フラッシュ (
AsyncInsertFlush) クエリにおいて、system.processors_profile_logおよびsystem.query_logのelapsed_usが常にゼロとなり、read_rows/read_bytesが過少計上されていた問題を修正しました。#106982 (cwurm). UNION/INTERSECT/EXCEPTの一方のブランチがSparseシリアル化されたカラムを読み取り、もう一方のブランチが同じカラムを完全なカラムとして読み取った場合 (たとえば materialized view へのプッシュ時) に発生していた、Block structure mismatch in UnionStep stream論理エラー (debug/sanitizer ビルドでは server が異常終了し、release ビルドではCode: 49) を修正しました。#107041 (groeneai).optimize_read_in_orderおよびread_in_order_use_virtual_rowを有効にしたUNION ALLに対するORDER BYクエリで、行の順序が不正になる問題を修正しました。#107053 (vdimir).SHOW ROW POLICIESまたはSHOW MASKING POLICIESの後にFORMAT、SETTINGS、またはINTO OUTFILE句が続く場合に構文エラーとなる問題を修正しました (例:SHOW ROW POLICIES FORMAT TabSeparated) 。#107061 (groeneai).- カスタムのトリム文字セットが 16 文字を超える場合に
trimLeft、trimRight、trimBoth(およびエイリアスのltrim、rtrim、trim) がTOO_LARGE_STRING_SIZEをスローしていた問題を修正しました。任意の長さのトリムセットが再びサポートされるようになりました。#107071 (fm4v). quantileExactExclusive、quantilesExactExclusive、quantileExactInclusive、quantilesExactInclusiveで、大きな範囲にまたがるInt64入力に対して誤った結果を生成する可能性があった符号付き整数オーバーフローを修正しました。#107154 (groeneai).- 設定の再読み込み時に起動スクリプトが再実行されなくなり、一度限りの起動アクションが再度実行されることを防止します。#107187 (mstetsyuk).
max_streams_for_union_step設定によりユニオンパイプラインが縮小された場合に、optimize_read_in_orderを有効にしたUNION ALLに対するORDER BYの結果順序が不正になる問題を修正しました。プランがソート済みの UNION 出力ストリームに依存する場合は、縮小をスキップするようになりました。#107208 (vdimir).- server の終了処理の後半でプロキシ設定を解決する際に、null ポインタを逆参照する可能性があった問題を修正しました。#107231 (PedroTadim).
ORDER BY ... WITH FILLで、補完対象カラムより前の ORDER BY カラムにCOLLATE照合順序が指定されている場合に余分な行が生成される問題を修正しました。行はその照合順序を使用してソートプレフィックスごとにグループ化されるようになり、ソート順と一致します。#107365 (groeneai) 。- 非有限の浮動小数点値 (
nanやinfなど) がprometheusQuery/prometheusQueryRangeテーブル関数のタイムスタンプ/期間引数として渡された場合の未定義動作を修正しました。このような引数では、不正なタイムスタンプが生成される代わりにBAD_ARGUMENTSが発生するようになりました。#107417 (groeneai) 。 NULLペイロード値を保持する集約関数 (*_respect_nullsファミリー:anyRespectNulls、first_value_respect_nulls、anyLast_respect_nulls、last_value_respect_nulls) に対するoptimize_rewrite_aggregate_function_with_if最適化で誤った結果が返される問題を修正しました。このような関数では、この最適化によってf(if(cond, x, NULL))が-If形式に書き換えられなくなりました。#107430 (groeneai) 。- ORC 入力内の不正な境界値に対する検証を追加しました。#107580 (al13n321) 。
- MySQL プロトコルポートにおける、認証不要でメモリ枯渇を引き起こすサービス拒否攻撃を修正しました。#107599 (tiandiwonder) 。
MySQL Connector/J8.2.0以降 (9.xを含む) で MySQL インターフェイスを使用できない問題を修正しました。OKパケットのinfoフィールドは MySQL サーバーと同様に長さエンコードされるようになり、JDBC driverが接続できるようになりました。#107693 (alexey-milovidov) 。UNION/INTERSECT/EXCEPTの兄弟ブランチがWHERE述語のみ異なり、一方のブランチの述語が定数畳み込みによってConstカラムになった場合に発生していた、Block structure mismatch in UnionStep stream論理エラー (デバッグ/サニタイザービルドではサーバーが異常終了し、リリースビルドではCode: 49) を修正しました。#107719 (groeneai) 。- Apache Arrow Java 19.0.0より前 (Apache Sparkを含む) で生成された空の
StringまたはBinaryカラムを持つArrowおよびArrowStreamデータの読み取り時に、INCORRECT_DATAが発生しなくなりました。#107764 (Algunenano) 。 Variant判別子が存在しないバリアントを参照する不正な Native ブロックは、安全に拒否されるようになりました。#107991 (uwezkhan) 。- 複数スレッドで
Dynamicカラムを読み取る際のパフォーマンスリグレッションを修正しました。#107997 (Avogar) 。 - 非推奨のデータレイク設定
storage_catalog_urlがカタログガードによって正しく拒否されるようになりました (以前はstorage_catalog_typeとstorage_aws_access_key_idのみがチェックされていました) 。また、エラーメッセージにはすべての非推奨設定が一覧表示されます。#108040 (alexey-milovidov) 。 ArrowFlightテーブル関数/エンジンが、オプションのdatasetキーを省略した名前付きコレクションをNo such key 'dataset'エラーで拒否する問題を修正しました。#108041 (alexey-milovidov) 。- シークレットと認証情報が、ログに記録されたビュー SQL に公開されるのではなく、
system.query_views_log.view_queryでマスクされるようになりました。#108214 (Fidelaggio)。 - JSON の型付きパスで
type_json_allow_duplicated_key_with_literal_and_nested_objectが機能しない問題を修正しました。#108218 (Avogar)。 - 入力文字列が 32768 バイトを超え、文字セットを検出できない場合に、
detectCharsetおよびdetectLanguageUnknown関数で未定義動作 (memcpyに null ポインターが渡される) が発生する問題を修正しました。#108250 (groeneai)。 - 遅延マテリアライゼーションとともに WHERE 句で
_part_starting_offset/_part_offset仮想カラムを使用するクエリで発生するNOT_FOUND_COLUMN_IN_BLOCKエラーを修正しました。#108287 (vdimir)。 format_display_secrets_in_show_and_selectが無効 (デフォルト) の場合、EXPLAIN actions、EXPLAIN header、およびEXPLAIN PIPELINEの出力で、encrypt、decrypt、HMACなどの関数のシークレット引数を非表示にしました。#108386 (Algunenano)。CREATE OR REPLACEは、そのTOターゲットが同じリフレッシャブルmaterialized view にすでに所有されている場合でも成功するようになりました。別のビューに所有されているターゲットは引き続き拒否されます。#108392 (evillique)。file()および Dictionary ソースと同様に、catboostEvaluateのモデルパスをuser_filesディレクトリに制限しました。以前は、この関数は制約チェックなしで任意のファイルシステムパスを受け入れていたため、user_files外のファイルの存在確認や読み取りをトリガーできました。モデルは現在、user_files内に配置する必要があります。#108463 (groeneai)。CREATE OR REPLACE MATERIALIZED VIEW ... POPULATEにより、新しいビューがソーステーブルをサブスクライブしないままとなり、置換後に insert されたすべての行が暗黙的に失われる問題を修正しました。#108728 (alexey-milovidov)。GROUPING SETS、ROLLUP、またはCUBEとmax_threads > 1を使用してuniqExact集約状態をマージする際に発生するセグメンテーションフォールトを修正しました。#108928 (Algunenano)。- 互換性設定の引き上げ時に発生する可能性がある論理エラー “Unexpected substream … for column …” を修正しました。#109496 (Avogar)。
getClientHTTPHeader関数は、RFC 9110 に従い、ヘッダー名を大文字小文字を区別せずに扱うようになりました。特に、authorizationヘッダーは大文字小文字にかかわらずフィルタリングされるようになりました。#109791 (Felixoid)。- 非同期 INSERT と重複排除 (
async_insert=1、async_insert_deduplicate=1) で発生するサイレントデータ損失を修正しました。異なるinsert_deduplication_token値を持つ複数の async-insert エントリが、互いに異なるパーティションに書き込む 1 回の flush に統合された場合、各トークンは、自身の行が書き込まれたパーティションだけでなく、flush が処理したすべてのパーティションの重複排除ログに登録されていました。その後、書き込み先ではなかったパーティションでこれらのトークンのいずれかを再利用して insert を行うと、サイレントに重複排除されていました。トークンは現在、実際にその行が書き込まれたパーティションに対してのみ登録されます。#111049 (groeneai)。 - 非同期 Native フォーマットの INSERT を修正し、
ALTER ... MODIFY COLUMN後に非互換となったバッファ済みエントリが 1 件あっても、バッチ全体が失敗しないようにしました。 #111108 (Felixoid). - 別種のオブジェクトで Dictionary を
CREATE OR REPLACEする際の問題を修正しました。置換がすでにコミットされた後にCANNOT_DETACH_DICTIONARY_AS_TABLEで失敗し、孤立した_tmp_replace_*テーブルが残ることがありました。 #111142 (evillique). - 証明書検証を有効にした TLS ハンドシェイク中に発生するピア証明書のメモリリークを修正しました。 #111425 (thevar1able).
- フィルター分割最適化 (
query_plan_split_filter) が、フィルター対象のカラム名が入力カラム名と同じWHEREで実行された場合に発生する可能性があった論理エラーBlock structure mismatch in IntersectOrExceptStep stream: different number of columnsを修正しました。この最適化により内部カラム__split_filterがブランチ出力ヘッダーに残り、INTERSECTやUNIONなどの集合演算における兄弟ブランチとの不一致が生じていました。 #111930 (groeneai). - 夏時間を採用するタイムゾーンで、
Time、Time64、またはDateTime値に対してtoStringを使用するフィルターやORDER BY式で不正な結果が返る問題を修正しました。また、テーブルのソートキーのプレフィックスに対するORDER BYと、StringからNullable(String)への変換における順序読み取り最適化を復元しました。 #113291 (vdimir). kafka_num_consumersが CPU コア数に基づく上限を超えている場合のKafkaテーブルのATTACHを修正しました。 #113390 (evillique).- 不正なクエリ結果を防ぐため、projection 使用時は分散索引解析を無効化しました。 #115132 (azat).
- 行を空の結果に整形する際に、不正な結果または論理エラーを引き起こす可能性があった関数
formatRowNoNewlineのバグを修正しました。 #115669 (alexey-milovidov). - 長さが 8 の倍数ではないバイナリ文字列リテラルの結果や、圧縮ブロックに本体がない場合の LZ4 展開処理で、初期化されていないメモリを返さないようにしました。 #115704 (alexey-milovidov).
- 異なるオブジェクト値が誤って重複排除されるのを防ぐため、重複排除ハッシュにオブジェクトパスを含めました。 #115866 (Felixoid).