Skip to main content

概要

説明

chdb_hook モジュールは PostgreSQL の COPY コマンドにフックし、 ローカルファイル、AWS S3 bucket、Google Cloud ストレージ などを対象として、 [chDB がサポートするデータフォーマット][formats] のいずれかで chDB によるデータのコピー (TO / FROM) を行えるようにします。 さらに CREATE TABLE にもフックするため、テーブルはこれらと同じターゲットから カラムを導出し、行を読み込むことができます。

ロード

以下のいずれかの方法で、super user として chdb_hook をロードします。ユースケースに最も適した方法を選んでください:
  • LOAD コマンドによる明示的なロード。session が続く間のみ有効です:
    ClickHouse Cloud の SQL Console は現時点では LOAD 'chdb_hook' コマンドに対応していませんが、psql やその他の database connection 経由であれば実行できます。 そうでない場合は、サポート担当者に連絡して Postgres service の configuration に追加してもらってください。追加後は SQL Console でも使用できるようになります。
  • すべての sessions を対象とする場合は、postgresql.conf で [session_preload_libraries] SETTING を指定します:
    または ALTER SYSTEM を使用します:
    この SETTING は ALTER DATABASE を使って database 単位で設定することもできます:
    また、ALTER ROLE を使って特定のユーザーやグループに対して設定することもできます:
  • [shared_preload_libraries] SETTING により server 起動時にロードする方法。すべての sessions と databases から常に利用できるようになります:
chdb_hook をロードすると、pg_read_server_files または pg_write_server_files ロールに属するユーザーが、Postgres server 上のファイルや cloud storage との間でデータを COPY できるようになる点に注意してください。

COPY のオーバーロード

ロード時に、chdb_hook は Postgres の COPY コマンドにフックし、 ローカルファイル、AWS S3 バケット、Google Cloud ストレージ などにある [chDB がサポートするデータフォーマット][formats] のいずれかに対して、TO でデータを書き出したり FROM で読み込んだりできるようにします。たとえば S3 上の CSV ファイルから テーブルを読み込むには、テーブルを作成してから s3:// URL を指定して COPY を呼び出します:

Privileges

chdb_hook の COPY には、置き換え対象の COPY と同じ権限が必要です。 すなわち、COPY TO の場合は relation またはコピー対象のすべてのカラムに対する SELECT、 COPY FROM の場合は INSERT です。file:// URL は server 上のファイルを読み書きするため、 pg_read_server_files または pg_write_server_files のメンバーであることも必要です。 COPY FROM には read-write の transaction が必要です。

URL スキーム

chdb_hook は、次のいずれかのスキームを使用する URL COPY ターゲットに対してのみ実行されます。

URL フォーマット

URL のフォーマットは、ターゲットによって異なります。

File

Postgres サーバー上の絶対パスである必要があります。相対パスを指定した場合はエラーになります。Postgres ユーザーは、用途に応じて pg_read_server_files または pg_write_server_files ロールのメンバーである必要があります。また、Postgres のシステムユーザーには、用途に応じて対象ファイルへの読み取りまたは書き込みアクセス権が必要です。COPY TO の場合、パスが存在しなければ chdb_hook が不足している親ディレクトリを作成しますが、そのためにはファイルシステム上の権限が必要です。例:

HTTP

パブリックな cloud ストレージ上のものを含め、通常の HTTP URL であれば利用できます。COPY TO の場合、 chdb_hook はその URL に対してデータを POST しようとします。例:

S3

S3 URL は S3 URI の形式で指定することもできます
または、オブジェクト URL の形式:

GCS

GCS の URL は、パブリック URL の形式を取ります。
または、chdb_hook が Public な URL に変換する Cloud ストレージ URI を指定します:

Azure Blob Storage

サブドメインにアカウント名を指定した blob.windows.net の URL を使用します:
または、別の host name を使用することもできます:

Azure ABFS

ABFS URL は次のフォーマットである必要があります:

HDFS URL

HDFS URL には、一般的な HTTP 形式の URL を使用でき、ポートは任意で指定できます:

パスのワイルドカード

COPY FROM コマンドの URL パスにはグロブを含めることができます。ファイルは接尾辞やプレフィックスだけでなく、パスパターン全体に一致する必要があります。例外が1つあり、パスが既存のディレクトリを指していてグロブを使用していない場合は、そのディレクトリ内のすべてのファイルを選択するために * が暗黙的にパスへ追加されます。 サポートされているワイルドカードは次のとおりです。
  • *: / を除く任意の文字に任意個数一致します (空文字列を含む) 。
  • ?: 任意の1文字に一致します。
  • {groucho,harpo,chico}: 文字列 “groucho”、“harpo”、“chico” のいずれかに置き換えます。これらの文字列には / を含めることができます。
  • {N..M}: >= N かつ <= M の任意の数値に一致します。
  • **: ディレクトリ内のすべてのファイルに再帰的に一致します。
たとえば、以下のファイルのデータを1つのコマンドで読み込むとします。 この場合、{some,another}_prefix で2つのディレクトリ名に、some_file_{1..3}.csv' でファイルに一致させます。次のように記述します。

オプション

chdb_hook の COPY コマンドは、次のオプションをサポートします。

format:

読み取りまたは書き込みに使用するフォーマット。chDB が提供する [formats] のいずれかを指定する必要があり、TSV、CSV、Parquet、Iceberg、JSON などが利用できます。省略するか auto に設定した場合は、chDB が URL 末尾のファイル名の拡張子からフォーマットを判別します。

structure

行を表す chDB のデータ構造です。カラム名と ClickHouse データ型、および修飾子のリストで構成されます。省略した場合、chdb_hook は Postgres のデータ型を、おおむね適切な ClickHouse の型にマッピングします。詳細は Postgres から chDB へ を参照してください。auto を指定した場合、chDB が型の推論を試みます。 例:

access_key と access_secret

リクエストを認証するために使用する、AWS アカウントユーザーの長期認証情報です。
  • S3: AWS の [access key ID と access secret]。多くの場合、環境変数 AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY で指定します
  • GCS: GCP の HMACキーとシークレット
  • Azure: Azure ストレージアカウント名と access key

session_token

access_key および access_secret と併用する AWS のセッショントークンで、多くの場合は環境変数 AWS_SESSION_TOKEN で定義されます。S3 の URL の場合にのみ使用されます。

compression

ファイルの圧縮フォーマット。ファイル名から圧縮方式を推論できない場合に使用します。サポートされる値:
  • auto (デフォルト)
  • none
  • gzip または gz
  • brotli または br
  • xz または LZMA
  • zstd または zst
  • lz4
  • bz2
  • snappy

timeout

リクエストのタイムアウト (ミリ秒) 。HTTP、S3、GCS、Azure の URL に適用されます。 デフォルトは 30000 (30秒) です。

encoding_check

chDB の String 値および JSON 値を変換する際に、database encoding で無効となる文字の扱い方を定義します。次のいずれかを指定します。
  • fail (デフォルト) : エラーを発生させます
  • remove: 無効なバイトを削除します
  • replace: UTF-8 エンコーディングの場合は、無効なバイトを Unicode の置換文字 (�) に置き換えます。その他のエンコーディングでは remove と同じ動作になります
  • truncate: 最初に現れた無効なバイトの位置でテキストを切り詰めます

デバッグ

エラー発生時、chdb_hook の COPY コマンドは、実行を試みた chDB クエリをエラーコンテキストに含めます:
chdb_hook は、SQL インジェクションの脆弱性を防ぎ、認証情報などの機密データがログに記録されるリスクを最小化するため、クエリパラメータに {name:Type} 形式のプレースホルダーを使用します。 ただし、問題をデバッグするためにこれらのパラメータの内容を確認する必要がある場合は、Postgres の [log_min_messages] GUC を一時的に DEBUG1 以上に設定してください。これにより、chdb_hook はクエリとパラメータを Postgres のログ (クライアントには送信されません) に出力し、次のように表示されます:
[log_min_messages] をデバッグレベルに設定したままにするのは、1回の デバッグセッションの範囲にとどめてください。認証情報などの機密情報が ログに記録されるのを防ぐためであり、また PostgreSQL 自体もデバッグ情報を 出力するため、ログがすぐに肥大化してしまうからです。

CREATE TABLE のオーバーロード

chdb_hook は CREATE TABLE にもフックするため、テーブルは URL からカラムを導出し、行を読み込むことができます。 URL から導出した structure でテーブルを作成するには、structure_from オプションに URL を渡し、カラムリストを空のままにします (注意: この公開データファイルには 4,100 万行が含まれています) :
copy_from を使用して、カラムだけでなく行も読み込みます:
copy_from は、ステートメント自身がカラムを 1 つも指定していない場合にのみカラムを推論します。カラムリスト、INHERITS 句、OF 型、パーティションは、いずれもカラムを定義するため、その場合 copy_from は次の項目のみをコピーします:
copy_from がカラムを推論する場合、DESCRIBE が返すソースのスキーマを使用します。 そのため、Map、Tuple、Nested の値はテキスト型の Array カラムとして読み込まれ、 これらのカラムからは元の ClickHouse の型を識別できません。 どちらのオプションも COPY と同じ URL スキーム とオプションをサポートしており、認証情報、フォーマット、圧縮、タイムアウト、さらには明示的な structure まで、すべてそのまま利用できます。Postgres 側では、残った storage parameters がそのまま保持されます:
structure_from と copy_from はいずれも IF NOT EXISTS と併用できません。既存のリレーションを読み込むには COPY を使用してください。

制限事項

Postgres と chDB の間でのいくつかの既知の問題およびデータ型の挙動の違いにより、chdb_hook には以下の制限があります:
  • コピーを実行するロールに適用される row-level security policies が設定された relation は COPY できません。Postgres はこうした policies を適用する際に COPY TO をクエリへ書き換えますが、chdb_hook はこれをサポートしていません。
  • WHERE 句を指定して URL から COPY FROM することはできません。
  • chDB には NULL の Array が存在しないため、COPY TO は NULL を空の Array ([]) として格納します。
  • chDB は lseg、path、polygon に相当するものを Array として表現します。そのため、これらの型の NULL 値も COPY TO では空の Array ([]) になります。
  • ClickHouse には NULL の Array が存在しないため、COPY TO は NULL を空の Array ([]) として格納します。
  • ClickHouse は lseg、path、polygon に相当するものを Array として表現します。そのため、これらの型の NULL 値も COPY TO では空の Array ([]) になります。
  • 指定した structure でカラムが Nullable として定義されていない場合、NULL 値はそのデフォルト値として出力されます。この変換を避けるため、structure では nullable columns を必ず明示的に定義してください。
  • 最後の点が最初の点と一致する開いた path は、閉じた path として出力されます。
  • Protobuf の repeated field には null が存在しないため、Array 内の NULL 値は省略されます。
  • chDB の JSON type は JSON オブジェクトのみをサポートします。json および jsonb のデフォルトの String マッピングを JSON で上書きするのは、すべての値が JSON オブジェクトである場合に限ってください。(ClickHouse/ClickHouse#68428)
  • chDB の JSON type は null を無視するため、NULL 値を持つオブジェクトのキーは出力時に省略されます。json および jsonb のデフォルトの String マッピングを JSON で上書きするのは、オブジェクトの値が null でない場合、またはその欠落が許容できる場合に限ってください。(ClickHouse/ClickHouse#68428)
  • JSON、JSONCompact、JSONColumnsWithMetadata フォーマットは常に UTF-8 を検証するため、bytea 値は 置換文字 を含んだ形で出力されます。
  • COPY FROM は、空文字列またはゼロを含む Protobuf の Nullable フィールドを NULL として読み取ります。(chdb-io/chdb-core#152)
  • Parquet への COPY TO は、Nullable Tuple 自身の null マップから NULL を削除します。(ClickHouse/ClickHouse#112427)
  • Parquet、Arrow、ArrowStream、ORC、Avro、Protobuf、ProtobufList、MsgPack、BSONEachRow の各フォーマットには、Postgres の time や chDB の Time64 に対応する型がありません。値を保持するには、明示的な structure で time カラムを String として設定してください。
  • Protobuf 出力では timestamp 値が秒単位に切り捨てられます。
  • Protobuf 出力は 1970-01-01 より前の日付をサポートしません。値を保持するには、明示的な structure で time カラムを String として設定してください。(ClickHouse/ClickHouse#111860)

データ型

COPY は relation の Postgres 型を chDB の型にマッピングし、 CREATE TABLE は URL の chDB 型を Postgres の型に マッピングします。

Postgres から chDB へ

明示的な structure オプションが指定されていない場合、chdb_hook は Postgres の型を、それに相当する適切な chDB の型にマッピングします。これらがユースケースに 合わない場合は、structure を指定し、生成された型を必要な型で オーバーライドしてください。 name、varchar、char、bit、timetz、money、enum など、 この表にない型は String にマッピングされます。 配列型は、マッピング後の要素型による Array にマッピングされます。ClickHouse は NULL 許容性をカラム単位で制約するのに対し、Postgres は配列単位で制約するため、要素は 常に Nullable になります。 Map、Tuple、Nested に直接マッピングされる Postgres の型はありませんが、 structure またはソースファイルでこれらを指定することはできます。Tuple は、タプルのフィールドごとに 1 要素を持つ text[] として読み込むことも、フィールドの型を保持するために対応する 複合型 として読み込むこともできます。Map または Nested は、キー・バリューのペアまたはネストされたタプルごとに 1 つの内部配列を持つ text[][] として読み込むことも、対応する 複合型 の配列として 読み込むこともできます。例については 手動の型 マッピング を参照してください。

Timestamp 変換

プレーンテキストフォーマット (TSV、CSV など) では、COPY hook は現在の datestyle 設定に関係なく、DateTime および DateTime64 の値を ISO-8601 形式 (YYYY-MM-DDThh:mm:ssZ) で出力します。これにより、値をインポートする側が異なる time zone を使用していても、timestamptz の値は一貫して保たれます。structure の出力で Datetime64(3, 'America/Los_Angeles') のような別の型を指定しても、出力のオフセットには影響せず、精度のみが変わります。 Timestamp TZ の例: また COPY hook は、timestamp の値を session time zone から UTC へ変換し、その time zone を基準として出力されるようにします。新しいシステムに読み込まれた際には、そのシステムのローカル time zone に変換されます。したがって、time zone が異なれば値も異なりますが、time zone の差分を考慮すれば同一の時点を表します。 timezone 設定が timestamp 2026-08-28T12:00:00 に与える影響の例:

chDB から Postgres へ

既存のテーブルでは、値は宣言されたカラム型に変換されます。 それ以外のスカラー型には、可能な場合は PostgreSQL の明示的なキャストが使用され、 配列の要素は宣言された要素型に変換されます。サポートされていない 変換や範囲外の値はエラーになります。 chDB の Interval 型を smallint、integer、または bigint にマッピングすると、 その単位での数値として読み書きできます。例えば、IntervalDay の値 3 は 整数 3 にマッピングされます。IntervalNanosecond を bigint にマッピングすると ナノ秒の精度が保持されますが、interval にマッピングするとマイクロ秒に切り捨てられます。 chdb_hook は、DESCRIBE が返す ClickHouse の型をもとにテーブルを作成する際、 以下のデフォルトの Postgres 型を使用します。追加の読み取り先の型は、 明示的に宣言されたカラムに適用され、PostgreSQL の明示的なキャストでは対応できない変換も含まれます。 空欄のセルでも、それらのキャストは引き続き使用できます。これらの型は読み取り時のものであり、 書き込みには別の変換ルールが適用されます。 入力互換の型は、PostgreSQL の入力関数を使って文字列を読み取れます。 複合型では、フィールドが同じ順序で対応している必要があります。タプルを配列として読み取るには、各フィールドが配列の要素型に変換できる必要があります。また、フィールド自体が配列であってはなりません。 配列として読み取る場合、Map はキー・バリューのペアごとに 1 行、Nested はネストされた行ごとに 1 行を使用します。タプルを box として読み取るには 2 つの点を、circle の場合は点と半径を、line の場合は 3 つの係数を指定してください。 この表に記載されていない chDB の型は、Variant、Dynamic、AggregateFunction を含めすべてエラーを送出します。これらをテキストとして読み取るには、String にマッピングする structure を使用してください。 Postgres が扱える範囲は、これらの型のいくつかにおいて chDB より狭くなっています。そのため、24 時間を超える Time や Time64、および Postgres の日付範囲外の Date32 については、コピー時にエラーが送出されます。

手動での型マッピング

カラムの推論では、enum には text が、Tuple、Map、 Nested の値にはテキストの配列が使用されます。フィールドの型を保持したり、enum の値を制限したりするには、 PostgreSQL の enum 型および複合型を作成し、それらの型を使ってカラムを宣言してください。 chDB の型は structure で指定できます。また、structure 'auto' を使用すると、 Postgres のテーブルではなくソースデータから型を推論できます。たとえば、 次の型を使用すると、イベントのステータス、座標、ラベル、 ネストされた項目を読み込めます。
複合フィールドは、互換性のある PostgreSQL の型を使用し、chDB のフィールド順に宣言してください。Map の値については、キーフィールドを宣言し、その後に値フィールドを宣言します。各 Tuple は 1 つの複合値に、各 Map のペアまたは Nested の行は複合配列の 1 つの要素になります。 chDB は、明示的な structure 内の Nested を、フィールドごとに 1 つの Array カラムへ分割します。ネストされた行を単一の複合配列カラムとして読み取るには、上記のように Array(Tuple(...)) を使用してください。型情報を含む chDB のソースフォーマットであれば、structure 'auto' を使用することもできます。

テキストエンコーディング

chDB は String、FixedString、Enum、JSON をバイト列として読み取るため、エンコーディングは保証されません。これらのカラムを text やその他の非バイナリ型へコピーする際には、バイト列がデータベースのエンコーディングに適合するかが検証され、表現できないデータに対してはエラーが送出されます:
いずれのエンコーディングも NUL を拒否します。Postgres は text に NUL を格納できないためです。 chDB が書き込んだままのバイト列を保持するには bytea にコピーしてください。これらの型に対しては CREATE TABLE が text を導出するため、次のように名前を付けてください:
FixedString(N) は、短い値を NUL バイトで埋めます。text にコピーすると 末尾の NUL は削除されますが、bytea では N バイトすべてが保持されます。

設定

chdb_hook.max_memory

chDB クエリで使用するメモリの上限を定義します。chDB の max_memory_usage 設定に反映されます。superuser 権限が必要です。メガバイト数を表す integer、または次のいずれかのメモリ単位を指定してください。
  • B (バイト)
  • kB (キロバイト)
  • MB (メガバイト)
  • GB (ギガバイト)
  • TB (テラバイト)
デフォルトは 0 で、この場合メモリは制限されません。

chdb_hook.max_threads

chDB クエリのクエリ処理スレッド数の上限で、chDB の max_threads 設定を指定するために使用します。superuser 権限が必要です。デフォルトは 0 で、この場合は chDB が値を決定します。 大規模な COPY を実行する前に chdb_hook.max_threads を設定することを強く推奨します。これにより、chDB が PostgreSQL を犠牲にして CPU を使い切ってしまうのを防げます。

chdb_hook.max_parsing_threads

並列パースをサポートする入力フォーマットのデータを chDB がパースする際に使用できるスレッドの最大数で、chDB の max_parsing_threads 設定に使用されます。superuser 権限が必要です。デフォルトは 0 で、この場合は chDB が値を決定します。 大量のデータを COPY する前に chdb_hook.max_parsing_threads を設定し、chDB が PostgreSQL を犠牲にして CPU 使用率を使い切ってしまうことを防ぐことを推奨します。

Versioning Policy

chdb_hook は、公開リリースにおいて Semantic Versioning に準拠しています。
  • major version は API の変更時にインクリメントされます
  • minor version は後方互換性のある SQL の変更時にインクリメントされます
  • patch バージョンは binary のみの変更時にインクリメントされます
インストール後は、PostgreSQL のバージョンを Postgres 18 の pg_get_loaded_modules() 関数で確認できます。

著者

Copyright (c) 2026, ClickHouse