pg_clickhouse リファレンスドキュメント
説明
pg_clickhouse は、foreign data wrapper を含む ClickHouse データベース上でのリモートでのクエリ実行を可能にする PostgreSQL 拡張機能です。PostgreSQL 13 以降および ClickHouse 23 以降に対応しています。
はじめに
pg_clickhouse を試してみる最も簡単な方法は Docker image を利用することです。これは、 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 ファイルで定義) はメジャーおよびマイナーのみを含み、
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
CREATE EXTENSION を使用して、pg_clickhouse をデータベースに追加できます。
WITH SCHEMA を使用して特定のスキーマにインストールします(推奨):
ALTER EXTENSION
ALTER EXTENSION を使用して pg_clickhouse 拡張機能を変更します。例:
-
新バージョンの pg_clickhouse をインストールした後、
UPDATE句を使用します: -
SET SCHEMAを使用して、拡張機能を新しいスキーマに移動します:
DROP EXTENSION
DROP EXTENSION を使用して、データベースから拡張機能 pg_clickhouse を削除します。
このコマンドは、pg_clickhouse に依存するオブジェクトが 1 つでも存在すると失敗します。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: リモートテーブルの名前です。デフォルトでは、外部テーブルに 指定された名前が使用されます。engine: ClickHouse テーブルで使用される[テーブルエンジン]です。CollapsingMergeTree()およびAggregatingMergeTree()の場合、pg_clickhouse は テーブル上で実行される関数式にパラメータを自動的に適用します。
各カラムについて、リモート側の ClickHouse データ型に適したデータ型を使用してください。 サポートされているカラムオプションは次のとおりです。
-
column_name: ClickHouse 側のカラム名です。クエリや挿入をデパースする際に、 PostgreSQL の属性名より優先して使用されます。引用符なしの小文字の PostgreSQL カラム名を、 大文字と小文字を区別する ClickHouse のカラムにマッピングする場合に便利です。たとえば次のとおりです。 -
AggregateFunction: AggregateFunction Type カラムに適用される集約関数の名前です。 データ型をその関数に渡される ClickHouse の型にマッピングし、適切なカラムオプションで 集約関数名を指定すると、pg_clickhouse はそのカラムを評価する集約関数に 自動的にMergeを付加します。 -
SimpleAggregateFunction: SimpleAggregateFunction Type カラムに適用される 集約関数の名前です。データ型をその関数に渡される 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」プランノードを介してリモート SQL が ClickHouse にプッシュダウンされます。
SELECT
SELECT ステートメントを使用して、pg_clickhouse テーブルに対しても他のテーブルと同様にクエリを実行できます。
pg_clickhouse は、集約関数を含め、可能な限り多くのクエリ実行を ClickHouse 側にプッシュダウンするように動作します。EXPLAIN を使用して、どの程度プッシュダウンされているかを確認してください。たとえば上記のクエリでは、実行はすべて ClickHouse 側にプッシュダウンされます。
pg_clickhouse は、同じリモートサーバー上にあるテーブルに対する JOIN もプッシュダウンできます。
ローカルテーブルとの結合は、慎重にチューニングしないと非効率なクエリを生成します。この例では、nodes テーブルのローカルコピーを作成し、リモートテーブルではなくそのローカルテーブルと結合します。
この場合は、ローカルのカラムではなく node_id でグループ化することで、集約処理のより多くの部分を ClickHouse 側に押し込み、その後でルックアップテーブルと結合できます。
"Foreign Scan" ノードは node_id ごとに集約をプッシュダウンするようになり、
Postgres 側に取り込む必要がある行数は 1000 行(すべて)からわずか 8 行(各ノードにつき 1 行)に減少します。
PREPARE、EXECUTE、DEALLOCATE
v0.1.2 以降、pg_clickhouse はパラメータ化されたクエリをサポートしており、主に PREPARE コマンドによって作成されます。
準備済みステートメントを実行するには、通常どおり EXECUTE を使用してください。
パラメータ化された実行を行うと、underlying bug が fixed された 25.8 より前の ClickHouse バージョンでは、http driver が DateTime のタイムゾーンを正しく変換できなくなります。PostgreSQL は、PREPARE を使用していない場合でも、パラメータ化されたクエリプランを使用することがある点に注意してください。正確なタイムゾーン変換が必要なクエリで、かつ 25.8 以降へのアップグレードが選択肢にない場合は、代わりに binary driver を使用してください。
pg_clickhouse は、集約処理を通常どおりプッシュダウンし、その様子は EXPLAIN の verbose 出力から確認できます。
ここでは、パラメータプレースホルダではなく、完全な日付値そのものが送信されている点に注意してください。
これは、PostgreSQL の PREPARE notes で説明されているとおり、最初の 5 回のリクエストについて当てはまります。6 回目の実行時には、ClickHouse には
{param:type} 形式の [クエリパラメータ] を送信します:
パラメータ:
準備済みステートメントを解放するには DEALLOCATE を使用します。
INSERT
INSERT コマンドを使用して、リモートの ClickHouse テーブルに値を挿入します。
COPY
COPY コマンドを使用して、リモートの ClickHouse テーブルに複数行を一括挿入します。
⚠️ バッチ API の制限事項
pg_clickhouse では、PostgreSQL FDW のバッチ挿入 API はまだサポートされていません。 そのため、現在 COPY はレコードを挿入するために INSERT 文を使用しています。 この制限は今後のリリースで改善される予定です。
LOAD
LOAD を使用して pg_clickhouse の共有ライブラリを読み込みます。
通常、LOAD を使用する必要はありません。Postgres は、pg_clickhouse のいずれかの機能(関数、外部テーブルなど)が初めて使用されたときに、自動的に pg_clickhouse をロードします。
LOAD を使って pg_clickhouse をロードすることが有用になる唯一のケースは、それに依存するクエリを実行する前に、SET を用いて pg_clickhouse のパラメータを設定したい場合です。
SET
SET を使用して、pg_clickhouse のカスタム構成パラメータを設定します。
pg_clickhouse.session_settings
このパラメータによって、後続のクエリに適用される [ClickHouse 設定] が構成されます。例:
デフォルトは join_use_nulls 1, group_by_use_nulls 1, final 1 です。空文字列に設定すると、ClickHouse サーバー側の設定にフォールバックします。
構文は、キーと値のペアをカンマ区切りで並べたリストで、ペア同士は 1 つ以上のスペースで区切ります。キーは ClickHouse settings に対応する必要があります。値中のスペース、カンマ、バックスラッシュは、バックスラッシュでエスケープします。
または、スペースやカンマをエスケープせずに済むよう、値をシングルクォートで囲みます。ダブルクォートを二重に記述する必要を避けるために、dollar quoting の使用を検討してください。
可読性を重視し、多くの設定を行う必要がある場合は、例えば次のように複数行に分けて記述します。
pg_clickhouse 自身の動作を妨げる場合には、一部の設定は無視されます。 対象となる設定は次のとおりです:
date_time_output_format: HTTP ドライバでは「iso」である必要がありますformat_tsv_null_representation: HTTP ドライバではデフォルト値である必要がありますoutput_format_tsv_crlf_end_of_lineHTTP ドライバではデフォルト値である必要があります
それ以外の場合、pg_clickhouse は設定を検証せず、クエリごとにそれらをそのまま ClickHouse に渡します。 したがって、ClickHouse の各バージョンで利用可能なすべての設定をサポートします。
pg_clickhouse は pg_clickhouse.session_settings を設定する前にロードされている必要があることに注意してください。shared library preloading を利用するか、
拡張機能内のいずれかのオブジェクトを単純に使用して、ロードされるようにしてください。
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex パラメータは、pg_clickhouse
が正規表現関数および演算子をプッシュダウンするかどうかを制御します。デフォルトではプッシュダウンされます。
プッシュダウンしないようにするには、このパラメータを false に設定します:
詳しくは、正規表現を参照してください。
ALTER ROLE
ALTER ROLE の 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 のカラムにヌルバイトが含まれている場合、TEXT カラムを使用する外部テーブルは正しい値を出力しないことに注意してください。
出力結果:
2行目と3行目には切り詰められた値が含まれていることに注意してください。これは、PostgreSQLがNUL終端文字列に依存しており、文字列内のNULをサポートしていないためです。
バイナリ値を TEXT カラムに挿入しようとすると、成功し、期待どおりに動作します:
テキストのカラムは正しく表示されます:
しかし、それらを BYTEA として読み取った場合は、以下のようにはなりません:
関数と演算子のリファレンス
関数
これらの関数は、ClickHouse データベースに対してクエリを実行するためのインターフェースを提供します。
clickhouse_raw_query
HTTP インターフェイス経由で ClickHouse サービスに接続し、単一の
クエリを実行してから切断します。省略可能な第 2 引数には接続文字列を指定でき、
指定しない場合は host=localhost port=8123 がデフォルトになります。サポートされている接続パラメータは次のとおりです。
host: 接続先ホスト。必須。port: 接続先の HTTP ポート。hostが ClickHouse Cloud のホストでない場合のデフォルトは8123、ClickHouse Cloud のホストである場合のデフォルトは8443dbname: 接続するデータベース名。username: 接続に使用するユーザー名。デフォルトはdefaultpassword: 認証に使用するパスワード。デフォルトはパスワードなし
デフォルトでは、どのロールにもこの関数に対する EXECUTE 権限は付与されていません。たとえば専用の ClickHouse 管理者ロールなど、アドホックな ClickHouse
クエリを実行する正当な必要があるロールにのみ、GRANT によってアクセス権を付与することを検討してください。
レコードを返さないクエリに有用ですが、値を返すクエリの場合は、 結果は 1 つのテキスト値として返されます:
プッシュダウン関数
pg_clickhouse は、条件 (HAVING 句および WHERE 句) で使用される
PostgreSQL 組み込み関数の一部を ClickHouse にプッシュダウンします。その一部は、次のとおり
ClickHouse の対応する関数にマッピングされます:
abs: absfactorial: factorialmod(int2/int4/int8/numeric): modulopow&power(float8/numeric): powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi: 同名の ClickHouse math functions。asin,acos,atanh,acoshはプッシュダウンされません: PG では範囲外の入力に対してエラーになりますが、CH ではNaNが返されます。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 の aliasdateとしてデパースされます)array_position: indexOfarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovearray_length&cardinality: lengtharray_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: 通常は replaceRegexpOne、gフラグが指定されている場合は replaceRegexpAllregexp_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): formatDateTimefmtが文字列定数であり、そのすべてのキーワードに対応する ClickHouse の同等機能が存在する場合。サポートされているキーワードについては、 互換性に関する注記の 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 関数の値として渡されます。
プッシュダウン演算子
- 配列スライス (
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
次の intarray 関数 1 つが ClickHouse にプッシュダウンされます:
idx→ indexOf
fuzzystrmatch
fuzzystrmatch の 2 つの関数は ClickHouse にプッシュダウンされます:
soundex: soundexlevenshtein(2-arg): editDistanceUTF8
キャストのプッシュダウン
pg_clickhouse は、互換性のあるデータ型に対しては CAST(x AS bigint) のような
キャストをプッシュダウンします。互換性のない型に対してはプッシュダウンは失敗します。
この例で x が ClickHouse の UInt64 の場合、ClickHouse は値のキャストを拒否します。
互換性のないデータ型へのキャストをプッシュダウンするために、pg_clickhouse は 次の関数を提供します。これらがプッシュダウンされない場合、PostgreSQL 側で例外が送出されます。
プッシュダウン集約
これらの PostgreSQL の集約関数は ClickHouse にプッシュダウンされます。
カスタム集約関数
pg_clickhouse によって作成されるこれらのカスタム集約関数は、PostgreSQL に同等の機能が存在しない特定の ClickHouse 集約関数に対して、外部クエリプッシュダウンを提供します。これらの関数のいずれかをプッシュダウンできない場合には、例外をスローします。
プッシュダウン順序付き Set 集約
これらの ordered-set aggregate functions は、direct argument をパラメータとして渡し、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を使用してください。
曖昧さを完全になくしたい場合は、 pg_clickhouse.pushdown_regex を設定して Postgres の正規表現が ClickHouse にプッシュダウンされないようにし、 ClickHouse 互換の RE2 正規表現に対して pg_clickhouse が direct pushdown をサポートしている re2 extension の使用を検討してください。
to_char()
timestamp および timestamp with time zone に対する PostgreSQL の to_char() は、format 引数が非 NULL の文字列定数であり、かつ含まれる PostgreSQL キーワードのすべてに、ClickHouse 側でバイト単位で完全一致する対応語がある場合にのみ、ClickHouse の formatDateTime にプッシュダウンされます。format が動的な場合 (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
Copyright (c) 2025-2026, ClickHouse