pg_clickhouse リファレンス資料
説明
pg_clickhouse は、[外部データラッパー] を含む、ClickHouse データベースに対するリモート クエリの実行を可能にする PostgreSQL の拡張機能です。PostgreSQL 13 以降と ClickHouse 23 以降をサポートしています。
はじめに
pg_clickhouse を試す最も簡単な方法は [Docker イメージ] を使うことです。これには、 pg_clickhouse と re2 拡張機能を含む標準の PostgreSQL Docker イメージが含まれています。
ClickHouseテーブルのインポートと クエリのプッシュダウンを始めるには、チュートリアルを参照してください。
使用方法
バージョニングポリシー
pg_clickhouse は、公開リリースにおいて Semantic Versioning に準拠しています。
- API の変更時にはメジャーバージョンを上げます
- 後方互換性のある SQL の変更時にはマイナーバージョンを上げます
- バイナリのみの変更時にはパッチバージョンを上げます
インストール後、PostgreSQL は 2 種類のバージョン情報を追跡します。
- ライブラリバージョン (PostgreSQL 18 以降では
PG_MODULE_MAGICで定義) は完全なセマンティックバージョンを含み、pgch_version()関数の出力または Postgres のpg_get_loaded_modules()関数で確認できます。 - 拡張機能バージョン (control file で定義) はメジャーバージョンとマイナーバージョンのみを含み、
pg_catalog.pg_extensionテーブル、pg_available_extension_versions()関数の出力、および\dx pg_clickhouseで確認できます。
実際には、これは、たとえば v0.1.0 から v0.1.1 のようにパッチバージョンのみが増えるリリースでは、v0.1 を読み込んでいるすべてのデータベースがそのままアップグレードの恩恵を受けられ、ALTER EXTENSION を実行する必要がないことを意味します。
一方、マイナーまたはメジャーバージョンが増えるリリースには SQL アップグレードスクリプトが付属するため、拡張機能を含む既存のすべてのデータベースで、アップグレードの恩恵を受けるには ALTER EXTENSION pg_clickhouse UPDATE を実行する必要があります。
DDL SQL リファレンス
以下の SQL DDL 式では、pg_clickhouse を使用します。
CREATE EXTENSION
データベースに pg_clickhouse を追加するには、CREATE EXTENSION を使用します。
特定のスキーマにインストールする場合は、WITH SCHEMA を使用します (推奨) :
ALTER EXTENSION
ALTER EXTENSION を使用して pg_clickhouse を変更します。例:
-
pg_clickhouse の新しいリリースをインストールした後は、
UPDATE句を使用します: -
SET SCHEMAを使用して、拡張機能を新しいスキーマへ移動します:
DROP EXTENSION
データベースから pg_clickhouse 拡張機能を削除するには、DROP EXTENSION を使用します。
このコマンドは、pg_clickhouse に依存するオブジェクトが存在すると失敗します。これらも削除するには、
CASCADE 句を使用します:
CREATE SERVER
CREATE SERVER を使用して、ClickHouse サーバーに接続する 外部サーバー を作成します。例:
サポートされているオプションは次のとおりです。
driver: 使用する ClickHouse 接続ドライバーです。"binary" または "http" のいずれかを指定します。必須です。dbname: 接続時に使用する ClickHouse データベースです。デフォルトは "default" です。fetch_size: HTTP ストリーミングのバイト単位のおおよそのバッチサイズです。バッチは 行境界で分割されます。デフォルトは50000000(50 MB) です。0を指定すると ストリーミングは無効になり、応答全体がバッファリングされます。外部テーブルではこの 値を上書きできます。host: ClickHouse サーバーのホスト名です。デフォルトは "localhost" です。port: ClickHouse サーバーへの接続に使用するポートです。デフォルト値は 次のとおりです。driverが "binary" で、hostが ClickHouse Cloud ホストの場合は 9440driverが "binary" で、hostが ClickHouse Cloud ホストでない場合は 9004driverが "http" で、hostが ClickHouse Cloud ホストの場合は 8443driverが "http" で、hostが ClickHouse Cloud ホストでない場合は 8123
ALTER SERVER
ALTER SERVER を使用して 外部サーバー を変更します。例:
CREATE SERVER と同じオプションを使用できます。
DROP SERVER
外部サーバーを削除するには、DROP SERVER を使用します:
このコマンドは、そのサーバーに依存する他のオブジェクトがある場合は失敗します。CASCADE を使用して、
それらの依存オブジェクトも削除します:
CREATE USER MAPPING
CREATE USER MAPPING を使用して、PostgreSQL ユーザーを ClickHouse ユーザーにマッピングします。たとえば、taxi_srv 外部サーバー 経由で接続する際に、現在の PostgreSQL ユーザーをリモートの ClickHouse ユーザーにマッピングするには、次のようにします。
サポートされているオプションは次のとおりです。
user: ClickHouse ユーザーの名前です。既定値は "default" です。password: ClickHouse ユーザーのパスワードです。
ALTER USER MAPPING
ユーザーマッピングの定義を変更するには、ALTER USER MAPPING を使用します。
オプションは CREATE USER MAPPING と同じです。
DROP USER MAPPING
ユーザーマッピングを削除するには、DROP USER MAPPING を使用します:
IMPORT FOREIGN SCHEMA
IMPORT FOREIGN SCHEMA を使用すると、ClickHouse データベースで定義されているすべてのテーブルを、外部テーブルとして PostgreSQL スキーマにインポートできます:
LIMIT TO を使用して、特定のテーブルのみにインポートを制限します。
EXCEPT を使用してテーブルを除外します:
pg_clickhouse は、指定した ClickHouse データベース (上記の例では "demo") 内のすべてのテーブルの一覧を取得し、各テーブルのカラム定義を取得したうえで、 外部テーブルを作成するための CREATE FOREIGN TABLE コマンドを実行します。 カラムは、サポートされているデータ 型 と、検出できる場合は CREATE FOREIGN TABLE でサポートされるオプションを使用して定義されます。
IMPORT FOREIGN SCHEMA は、インポートするテーブル名とカラム名に対して quote_identifier() を実行します。これにより、大文字や空白を含む識別子は二重引用符で囲まれます。
そのため、そのようなテーブル名やカラム名は PostgreSQL クエリ内で二重引用符で囲む必要があります。
すべて小文字で空白を含まない名前は、引用符で囲む必要はありません。
たとえば、次のような ClickHouse テーブルがあるとします。
IMPORT FOREIGN SCHEMA は、次の外部テーブルを作成します:
したがって、クエリ内では適切に引用符で囲む必要があります。たとえば、
別の名前、またはすべて小文字の名前 (つまり 大文字と小文字を区別しない名前) のオブジェクトを作成するには、CREATE FOREIGN TABLE を使用します。
CREATE FOREIGN TABLE
CREATE FOREIGN TABLE を使用して、ClickHouse データベース内のデータを クエリできる外部テーブルを作成します:
サポートされているテーブルオプションは次のとおりです。
database: リモートデータベースの名前です。デフォルトでは、外部サーバー に 定義されているデータベースが使用されます。fetch_size: HTTP ストリーミングにおける、おおよそのバッチサイズ (バイト単位) です。サーバーレベルのfetch_sizeを上書きします。デフォルトは50000000(50 MB) です。0を指定すると ストリーミングが無効になり、レスポンス全体がバッファされます。table_name: リモートテーブルの名前です。デフォルトでは、foreign table に 指定された名前が使用されます。engine: ClickHouse テーブルで使用する [テーブルエンジン] です。CollapsingMergeTree()およびAggregatingMergeTree()では、pg_clickhouse が テーブル上で実行される関数式に対してパラメータを自動的に適用します。
各カラムについて、リモートの ClickHouse における対応するデータ 型に適した データ型 を使用してください。サポートされているカラムオプションは次のとおりです。
-
column_name: ClickHouse 側のカラム名です。クエリや insert の デパース時には、PostgreSQL の attribute 名よりもこちらが優先して使用されます。 これは、引用符なしの小文字の PostgreSQL カラム名を、大文字と小文字を区別する ClickHouse のカラムに対応付ける場合に便利です。たとえば次のとおりです。 -
AggregateFunction: [AggregateFunction 型] カラムに適用される 集約関数の名前です。データ型は、その関数に渡す ClickHouse 型に対応付けます。 適切なカラムオプションで集約関数名を指定すると、pg_clickhouse はそのカラムを評価する 集約関数にMergeを自動的に付加します。 -
SimpleAggregateFunction: [SimpleAggregateFunction 型] カラムに適用される 集約関数の名前です。データ型は、その関数に渡す ClickHouse 型に対応付け、適切なカラムオプションで 集約関数名を指定してください。
ALTER FOREIGN TABLE
外部テーブルの定義を変更するには、ALTER FOREIGN TABLE を使用します。
サポートされるテーブルおよびカラムのオプションは、CREATE FOREIGN TABLE の場合と同じです。
DROP FOREIGN TABLE
外部テーブルを削除するには、DROP FOREIGN TABLE を使用します。
このコマンドは、外部テーブルに依存するオブジェクトがある場合は失敗します。
それらも削除するには、CASCADE 句を使用します。
DML SQL リファレンス
以下の SQL の DML 式では、pg_clickhouse を使用する場合があります。例では、 以下の ClickHouse テーブルを使用します。
EXPLAIN
EXPLAIN コマンドは想定どおりに動作しますが、VERBOSE オプションを指定すると、
ClickHouse の "Remote SQL" クエリが出力されます:
このクエリは、「Foreign Scan」プランノードを介して ClickHouse にプッシュダウンされ、 リモート SQL として実行されます。
SELECT
SELECTステートメントを使用すると、pg_clickhouse テーブルに対しても、他のテーブルと同様に クエリを実行できます。
pg_clickhouse は、集約関数を含め、可能な限りクエリ実行を ClickHouse に プッシュダウンします。プッシュダウンの範囲を確認するには、 EXPLAIN を使用します。たとえば、上記のクエリでは、実行はすべて ClickHouse にプッシュダウンされます
pg_clickhouse は、同じリモートサーバー上にあるテーブル同士の JOIN もプッシュダウンします:
ローカルテーブルとの結合では、適切に
チューニングしないと、非効率なクエリが生成されます。この例では、
nodes テーブルのローカルコピーを作成し、リモートテーブルではなく
これに結合します。
この場合、ローカルのカラムではなく node_id でグループ化することで、より多くの集約処理を ClickHouse 側にプッシュダウンし、その後でルックアップテーブルと join できます。
"Foreign Scan" ノードで node_id ごとの集約がプッシュダウンされるようになり、
Postgres に引き戻す必要がある行数は 1000 行 (全件) から、
各ノードにつき 1 行の合計 8 行まで削減されました。
PREPARE, EXECUTE, DEALLOCATE
v0.1.2以降、pg_clickhouse はパラメータ化クエリをサポートしており、これらは主に PREPARE コマンドで作成されます。
通常どおり EXECUTE を使用して、プリペアドステートメントを実行します。
パラメーター化された実行では、ClickHouse 25.8 より前のバージョンで、
http driver が DateTime のタイムゾーンを正しく変換できません。
この問題は、25.8 で[根本的なバグ]が[修正された]ことで解消されています。なお、PostgreSQL では
PREPARE を使用していなくても、パラメーター化されたクエリプランが使われることがあります。正確なタイムゾーン変換が必要なクエリで、
25.8 以降にアップグレードできない場合は、代わりに
binary driver を使用してください。
pg_clickhouse は、通常どおり、EXPLAIN の詳細出力に 示されているように、集計をプッシュダウンします。
完全な日付値が送信されており、パラメータのプレースホルダーではない点に注意してください。
これは、PostgreSQL の
[PREPARE に関する注記]で説明されているとおり、最初の 5 回のリクエストに当てはまります。6 回目の実行では、ClickHouse の
{param:type} 形式の[クエリパラメータ]を送信します。
parameters:
プリペアドステートメントの割り当てを解除するには、DEALLOCATE を使用します。
INSERT
リモートのClickHouseテーブルに値を挿入するには、INSERTコマンドを使用します。
COPY
リモートの ClickHouse テーブルに複数の行をまとめて挿入するには、COPY コマンドを使用します。
⚠️ Batch API の制限
pg_clickhouse では、PostgreSQL FDW のバッチ insert API のサポートがまだ実装されていません。そのため、現時点では COPY は INSERT 文を使用して レコードを挿入します。これは今後のリリースで改善される予定です。
LOAD
pg_clickhouse 共有ライブラリを読み込むには、LOAD を使用します:
通常、LOAD を使用する必要はありません。Postgres では、その機能 (関数、外部 テーブルなど) のいずれかを初めて使用した時点で、自動的に pg_clickhouse が読み込まれます。
LOAD pg_clickhouse が有用になる可能性があるのは、SET を使って、 それらに依存するクエリを実行する前に pg_clickhouse のパラメータを設定したい場合です。
SET
pg_clickhouse のカスタム設定パラメータを設定するには、SET を使用します。
pg_clickhouse.session_settings
pg_clickhouse.session_settings パラメータは、後続のクエリに適用する [ClickHouse
設定] を指定します。例:
デフォルトは join_use_nulls 1, group_by_use_nulls 1, final 1 です。空文字列に設定すると、
ClickHouse server の設定が使用されます。
構文は、1 つ以上のスペースで区切られた、キー/値のペアからなるカンマ区切りのリストです。キーは [ClickHouse 設定] に対応している必要があります。値に含まれるスペース、カンマ、バックスラッシュは、バックスラッシュでエスケープします。
あるいは、スペースやカンマをエスケープしなくて済むように、値を単一引用符で囲んでください。dollar quoting を使うと、二重引用符で囲む必要もなくなります。
可読性を重視し、多くの設定を行う必要がある場合は、複数行で 記述してください。例:
一部の設定は、pg_clickhouse 自体の動作に支障をきたす場合、無視されます。対象は次のとおりです。
date_time_output_format: HTTP ドライバーでは "iso" である必要がありますformat_tsv_null_representation: HTTP ドライバーではデフォルト値が必要ですoutput_format_tsv_crlf_end_of_line: HTTP ドライバーではデフォルト値が必要です
それ以外の設定については、pg_clickhouse は検証を行わず、すべてのクエリで そのまま ClickHouse に渡します。そのため、各 ClickHouse バージョンで利用可能な すべての設定をサポートします。
pg_clickhouse.session_settings を設定する前に、pg_clickhouse がロードされている必要があることに
注意してください。そのため、[共有ライブラリのプリロード] を使用するか、
拡張機能内のいずれかのオブジェクトを使って確実にロードされるようにしてください。
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex パラメータは、pg_clickhouse
が正規表現関数および演算子をプッシュダウンするかどうかを制御します。既定では有効です。
これらがプッシュダウンされないようにするには、このパラメータを false に設定します:
詳細については、正規表現を参照してください。
ALTER ROLE
ALTER ROLE's SET コマンドを使用して、pg_clickhouse をプリロードしたり、
特定のロールに対してそのパラメーターを SET したりできます。
ALTER ROLE の RESET コマンドを使用して、pg_clickhouse のプリロード
および/またはパラメーターをリセットします:
プリロード
ほぼすべて、またはすべての Postgres 接続で pg_clickhouse を使用する必要がある場合は、[共有ライブラリのプリロード]を使用して自動的に読み込むことを検討してください。
session_preload_libraries
PostgreSQL への新規接続ごとに共有ライブラリを読み込みます。
サーバーを再起動せずに更新を反映できるので便利です。再接続するだけで済みます。ALTER ROLE を使用して、特定のユーザーまたはロールに対して設定することもできます。
shared_preload_libraries
起動時に、共有ライブラリを PostgreSQL の親プロセスに読み込みます。
各セッションでのメモリ使用量とロードのオーバーヘッドを抑えるのに有用ですが、ライブラリの更新時には クラスターを再起動する必要があります。
データ型
pg_clickhouse では、以下の ClickHouse データ型を PostgreSQL のデータ 型にマッピングします。IMPORT FOREIGN SCHEMA で カラムをインポートする際は、PostgreSQL カラム型のうち最初の型が使用され ます。追加の型は、CREATE FOREIGN TABLE ステート メントで使用できます。
| ClickHouse | PostgreSQL | 備考 |
|---|---|---|
| Bool | boolean | |
| Date | date | |
| Date32 | date | |
| DateTime | timestamptz | |
| Decimal | numeric | |
| Float32 | real | |
| Float64 | double precision | |
| IPv4 | inet | |
| IPv6 | inet | |
| Int16 | smallint | |
| Int32 | integer | |
| Int64 | bigint | |
| Int8 | smallint | |
| JSON | jsonb, json | |
| String | text, bytea | |
| UInt16 | integer | |
| UInt32 | bigint | |
| UInt64 | bigint | BIGINT の最大値を超える値ではエラー |
| UInt8 | smallint | |
| UUID | uuid |
追加の注記と詳細は以下のとおりです。
BYTEA
ClickHouse は PostgreSQL の BYTEA 型に相当する型を提供していませんが、任意のバイト列を String 型に格納できます。一般的に、ClickHouse の文字列は PostgreSQL の TEXT にマップしますが、バイナリデータを扱う場合は BYTEA にマップしてください。例:
最後のSELECTクエリの出力は以下のとおりです:
ClickHouseのカラムにnulバイトが含まれている場合、TEXTカラムを使用する外部テーブルは正しい値を出力しません。
出力結果:
2行目と3行目には切り詰められた値が含まれていることに注意してください。これは、PostgreSQLがnul終端文字列に依存しており、文字列内のnulをサポートしていないためです。
バイナリ値を TEXT カラムに挿入しようとすると、成功し、期待どおりに動作します:
テキストのカラムは正しく表示されます:
ただし、BYTEA としては読み取れません:
関数と演算子のリファレンス
関数
これらの関数は、ClickHouseデータベースにクエリを実行するためのインターフェイスです。
clickhouse_raw_query
ClickHouse service の HTTP インターフェイス経由で接続し、単一の
クエリを実行して切断します。省略可能な 2 番目の引数には、既定で host=localhost port=8123 となる接続
文字列を指定します。サポートされている接続
パラメータは次のとおりです。
host: 接続先のホスト。必須です。port: 接続先の HTTP ポート。既定値は8123ですが、hostが ClickHouse Cloud ホストの場合、既定値は8443ですdbname: 接続先のデータベース名。username: 接続に使用するユーザー名。既定値はdefaultpassword: 認証に使用するパスワード。既定ではパスワードは設定されません
既定では、どのロールにもこの関数に対する EXECUTE 権限はありません。アドホックな ClickHouse
クエリを実行する正当な必要があるロール、たとえば専用の ClickHouse
管理者ロールにのみ、GRANT でアクセスを付与することを検討してください。
結果レコードを返さないクエリに便利ですが、値を返すクエリの結果は 単一のテキスト値として返されます。
プッシュダウン関数
pg_clickhouse は、条件式 (HAVING 句および WHERE 句) で使用される PostgreSQL の組み込み関数の一部を ClickHouse にプッシュダウンします。対応する ClickHouse の関数は次のとおりです。
abs: absfactorial: factorialmod(int2/int4/int8/numeric): 剰余pow&power(float8/numeric): powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi: ClickHouse math functions の同名の関数です。asin,acos,atanh,acoshはプッシュダウンされません。範囲外の入力に対しては、CH はNaNを返しますが、PG はエラーになります。date_part:date_part('day'): toDayOfMonthdate_part('doy'): toDayOfYeardate_part('dow'): toDayOfWeekdate_part('year'): toYeardate_part('month'): toMonthdate_part('hour'): toHourdate_part('minute'): toMinutedate_part('second'): toSeconddate_part('quarter'): toQuarterdate_part('isoyear'): toISOYeardate_part('week'): toISOYeardate_part('epoch'): toISOYear
date_trunc:date_trunc('week'): toMondaydate_trunc('second'): toStartOfSeconddate_trunc('minute'): toStartOfMinutedate_trunc('hour'): toStartOfHourdate_trunc('day'): toStartOfDaydate_trunc('month'): toStartOfMonthdate_trunc('quarter'): toStartOfQuarterdate_trunc('year'): toStartOfYear
extract(field FROM source):date_partと同じ対応関係date(timestamp)&date(timestamptz): toDate (CH のエイリアスdateとして逆解析)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: 長さarray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + 配列添字trim_array: arrayResizearray_fill: arrayWithConstantarray_reverse: arrayReversearray_shuffle: arrayShufflearray_sample: arrayRandomSamplearray_sort: arraySort / arrayReverseSortbtrim: trimBothltrim: ltrimrtrim: rtrimconcat_ws: concatWithSeparatorlower(text): lowerUTF8upper(text): upperUTF8substring(text, ...)&substr(text, ...): substringUTF8substring(bytea, ...)&substr(bytea, ...): substringlength(text): lengthUTF8length(bytea)&octet_length: lengthreverse(text): reverseUTF8reverse(bytea): reversestrpos: positionUTF8regexp_like: matchregexp_replace:gフラグが指定されている場合は replaceRegexpOne または replaceRegexpOneregexp_split_to_array: splitByRegexpmd5: MD5json_extract_path_text: サブカラムの構文json_extract_path: toJSONString + サブカラムの構文jsonb_extract_path_text: サブカラム構文jsonb_extract_path: toJSONString + サブカラムの構文bit_count(bytea): bitCountto_timestamp(float8): fromUnixTimestampto_char(timestamp[tz], fmt):fmtが、すべてのキーワードに対応する ClickHouse の同等表現を持つ文字列定数である場合は、formatDateTime です。サポートされるキーワードについては、互換性に関する注記の to_char() を参照してください。それ以外の場合、この関数は PostgreSQL 側でローカルに評価されます。statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now および toDate (toDate(now($session_timezone)))now,CURRENT_TIMESTAMP, &LOCALTIMESTAMP: now64 (now64(9, $session_timezone))CURRENT_TIMESTAMP(n)&LOCALTIMESTAMP(n): now64 (now64(n, $session_timezone))CURRENT_DATABASE: PostgreSQL の関数から値として渡されます。CURRENT_SCHEMA: PostgreSQL関数から渡される値。CURRENT_CATALOG: PostgreSQL の関数から渡される値。CURRENT_USER: PostgreSQL 関数から渡される値。USER: PostgreSQL関数から値として渡されます。CURRENT_ROLE: PostgreSQL関数から値として渡される。SESSION_USER: PostgreSQL 関数の値として渡されます。
プッシュダウン演算子
- Array のスライス (
arr[L:U]): arraySlice @>(配列が含む) : hasAll<@(配列に含まれる) : hasAll&&(配列が重複する) : hasAny~(正規表現に一致) : match!~(正規表現に一致しない) : match~*(大文字と小文字を区別しない正規表現に一致) : match!~*(大文字と小文字を区別しない正規表現に一致しない) : match->>(JSON/JSONB の要素をテキストとして抽出) : sub-column syntax->(JSON/JSONB を抽出) : toJSONString + sub-column syntax
カスタム関数
pg_clickhouse で作成されたこれらのカスタム関数は、PostgreSQL に対応する機能がない一部の ClickHouse 関数について、外部クエリの
プッシュダウンを実現します。これらの関数のいずれかを
プッシュダウンできない場合は、例外が発生します。
拡張機能のプッシュダウン
pg_clickhouse は、一部のコア拡張機能およびサードパーティ製拡張機能の関数を認識し、対応する ClickHouse の関数としてプッシュダウンします。
re2
すべての [re2 拡張機能] 関数は、ClickHouse に 1:1 でプッシュダウンされます。
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
ClickHouse にプッシュダウンされる intarray 関数は 1 つあります。
idx→ indexOf
fuzzystrmatch
次の 2 つの fuzzystrmatch 関数は ClickHouse にプッシュダウンされます。
soundex: soundexlevenshtein(2 引数) : editDistanceUTF8
キャストのプッシュダウン
pg_clickhouse は、CAST(x AS bigint) のようなキャストを、互換性のあるデータ型に対してプッシュダウンします。互換性のない型ではプッシュダウンに失敗します。たとえば、この例で x が ClickHouse の UInt64 の場合、ClickHouse はその値のキャストを拒否します。
互換性のないデータ型へのキャストをプッシュダウンするために、pg_clickhouse は 次の関数を提供しています。これらがプッシュダウンされなかった場合、PostgreSQL で例外が発生します。
プッシュダウン集約
これらの PostgreSQL 集約関数は ClickHouse にプッシュダウンされます。
カスタム集約
pg_clickhouse が作成するこれらのカスタム aggregate functions は、PostgreSQL に対応する関数がない一部の ClickHouse 集約関数について、外部クエリの プッシュダウン を提供します。これらの関数のいずれかを プッシュダウン できない場合は、例外を送出します。
順序付き集合集約のプッシュダウン
これらの[順序付き集合集約関数]は、直接引数をパラメータとして渡し、
ORDER BY 式を引数として渡すことで、ClickHouse のParametric
aggregate functionsに対応付けられます。たとえば、次の PostgreSQL クエリです。
これは次のClickHouseクエリに相当します:
デフォルト以外の ORDER BY 接尾辞である DESC と NULLS FIRST は
サポートされておらず、指定するとエラーになります。
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
プッシュダウンされるウィンドウ関数
以下の PostgreSQL の [ウィンドウ関数] は、該当する場合はフレーム指定も含めて、OVER (PARTITION BY ... ORDER BY ...) 句とともに ClickHouse にプッシュダウンされます。
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(OVER句を使用)
ランキング関数 (row_number, rank, dense_rank, ntile, cume_dist,
percent_rank) は、ClickHouse ではこれらの関数に対するフレーム指定が許可されていないため、プッシュダウン時にフレーム句を省略します。
互換性に関する注意点
正規表現
pg_clickhouse.pushdown_regex が true の場合 (デフォルト) 、pg_clickhouse は正規表現を ClickHouse の同等表現へ プッシュダウンし、基本的な互換性を確保しようとします。ただし、両者の違いと、 pg_clickhouse がそれらをどのように扱うかを理解しておいてください。
-
PostgreSQL は POSIX Regular Expressions をサポートし、ClickHouse は RE2 Regular Expressions をサポートします。動作の違いに注意して ください。正規表現が ClickHouse で評価される場合 (たとえば
WHERE句内) は RE2 を、Postgres で評価される場合 (たとえばSELECT句内) は POSIX を記述してください。 -
pg_clickhouse は、Postgres の [Regex flags] を ClickHouse の正規表現の先頭に
(?)内で付加してプッシュダウンします。たとえば:は次のようになります。
-sが含まれている点に注意してください。これは、ClickHouse でデフォルトで 有効になっているsを無効にし、Postgres の正規表現の動作に合わせるためです。 Postgres の関数呼び出しにsフラグが含まれている場合、pg_clickhouse は-sを付加しません。残念ながら、この動作により Postgres 24 以前では 一部の正規表現との互換性が失われます。 -
両方でサポートされており、そのため ClickHouse で評価される場合に使用できる フラグは、次のものだけです:
i: 大文字と小文字を区別しないm: 複数行モードs:.が\nに一致するp: 改行に部分的に敏感なマッチング (sと同様に扱われます)t: 厳密な構文 (デフォルト、pg_clickhouse によって削除されます)
RE2 がサポートするフラグはこれらだけです。Postgres flags のそれ以外の フラグは使用しないでください。
-
正規表現関数にそれ以外のフラグを渡すと、その関数はプッシュダウンされません。
-
例外は
regexp_replace()で、これにはgフラグも使えます。gが 設定されている場合、pg_clickhouse はreplaceRegexpOne()の代わりにreplaceRegexpAll()を使用し、他のフラグを先頭に付加する前にgを 取り除きます。 -
Postgres の
regexp_replace()の置換引数では、マッチ全体を参照するために\&を使用できますが、ClickHouse ではマッチ全体に\0を使用します。 関数が ClickHouse にプッシュダウンされる場合は、必ず\0を使用してください。
あいまいさを完全に避けるには、Postgres の正規表現が ClickHouse に プッシュダウンされないよう pg_clickhouse.pushdown_regex を設定し、 pg_clickhouse が ClickHouse 互換の RE2 正規表現の direct プッシュダウン をサポートしている [re2 拡張機能] の使用を 検討してください。
to_char()
timestamp および timestamp with time zone に対する PostgreSQL の to_char() は、フォーマット引数が非 NULL の文字列定数であり、かつ含まれるすべての PostgreSQL キーワードにバイト単位で完全一致する ClickHouse の対応語がある場合にのみ、ClickHouse の formatDateTime にプッシュダウンされます。フォーマットが動的な場合 (Const ではない場合) 、または未対応のキーワードや修飾子を含む場合、呼び出しは PostgreSQL でローカル評価にフォールバックします。部分的な変換でプッシュダウンが試みられることはないため、出力は PG 互換のまま維持されます。
numeric、interval、その他の非 timestamp 型に対する 2 引数形式の to_char() は、プッシュダウンされません。ClickHouse の formatDateTime でフォーマットできるのは、日付時刻値のみです。
対応するキーワード
| PostgreSQL | ClickHouse | 意味 |
|---|---|---|
YYYY, yyyy | %Y | 4 桁の年 |
YY, yy | %y | 2 桁の年 |
MM, mm | %m | ゼロ埋めされた月 (01–12) |
DD, dd | %d | ゼロ埋めされた日 (01–31) |
DDD, ddd | %j | ゼロ埋めされた年内通算日 (001–366) |
HH24, hh24 | %H | ゼロ埋めされた 24 時間表記の時 (00–23) |
HH, hh, HH12, hh12 | %I | ゼロ埋めされた 12 時間表記の時 (01–12) |
MI, mi | %i | ゼロ埋めされた分 (00–59) |
SS, ss | %S | ゼロ埋めされた秒 (00–59) |
Q, q | %Q | 四半期 (1–4) |
Mon | %b | 月名の省略形 (例: Oct) |
Dy | %a | 曜日名の省略形 (例: Mon) |
AM, PM | %p | 午前/午後インジケーター (常に大文字) |
引用符付きテキストとリテラル
"..." で囲まれたテキストはそのまま渡され、リテラルの % は
ClickHouse の指定子プレフィックスをエスケープするため %% に
重ねられます。引用符の外側にある \" も、リテラルの " として
そのまま渡されます。"..." の中では、バックスラッシュで
エスケープできるのは " のみです。その他のバックスラッシュ
シーケンスは、リテラルテキストとして扱われます。
著者
著作権
Copyright (c) 2025-2026, ClickHouse