Справочная документация по pg_clickhouse
Описание
pg_clickhouse — это расширение PostgreSQL, позволяющее удалённо выполнять запросы к базам данных ClickHouse, включая реализацию [обёртки внешних данных (foreign data wrapper)]. Оно поддерживает PostgreSQL 13 и новее и ClickHouse 23 и новее.
Начало работы
Самый простой способ попробовать pg_clickhouse — использовать [образ Docker], который содержит стандартный образ PostgreSQL с расширениями pg_clickhouse и re2:
См. руководство, чтобы начать импортировать таблицы ClickHouse и проталкивать запросы.
Использование
Политика версионирования
pg_clickhouse следует [Семантическому версионированию] для своих публичных релизов.
- Старшая версия увеличивается при изменениях API
- Младшая версия увеличивается при обратно совместимых изменениях SQL
- Патч-версия увеличивается при изменениях только на уровне бинарных файлов
После установки PostgreSQL отслеживает два варианта номера версии:
- Версия библиотеки (определяется
PG_MODULE_MAGICв PostgreSQL 18 и выше) включает полную семантическую версию, видимую в выводе функцииpgch_version()или функции Postgrespg_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,
чтобы получить преимущества обновления.
Справочник по SQL DDL
В следующих 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. Используйте
предложение CASCADE, чтобы удалить и их:
CREATE SERVER
Используйте CREATE SERVER, чтобы создать внешний сервер для подключения к серверу ClickHouse. Пример:
Поддерживаемые параметры:
driver: драйвер подключения к ClickHouse, который следует использовать — либо "binary", либо "http". Обязательный.dbname: база данных ClickHouse, которая будет использоваться при подключении. По умолчанию "default".fetch_size: приблизительный размер пакета в байтах для HTTP-streaming. Пакеты разделяются по границам строк. По умолчанию50000000(50 МБ). Значение0отключает streaming и буферизует полный ответ. Внешние таблицы могут переопределить это значение.host: имя хоста сервера ClickHouse. По умолчанию "localhost".port: порт для подключения к серверу ClickHouse. Значения по умолчанию:- 9440, если
driver— "binary" иhostявляется хостом ClickHouse Cloud - 9004, если
driver— "binary" иhostне является хостом ClickHouse Cloud - 8443, если
driver— "http" иhostявляется хостом ClickHouse Cloud - 8123, если
driver— "http" иhostне является хостом ClickHouse Cloud
- 9440, если
ALTER SERVER
Используйте оператор ALTER SERVER, чтобы изменить внешний сервер. Пример:
Параметры те же, что и для CREATE SERVER.
DROP SERVER
Используйте DROP SERVER для удаления внешнего сервера:
Эта команда приведёт к ошибке, если от сервера зависят какие-либо другие объекты. Используйте CASCADE,
чтобы также удалить эти зависимости:
CREATE USER MAPPING
Используйте CREATE USER MAPPING, чтобы сопоставить пользователя PostgreSQL с пользователем ClickHouse. Например, чтобы сопоставить текущего пользователя PostgreSQL с удалённым пользователем ClickHouse при подключении к внешнему серверу taxi_srv:
Поддерживаемые параметры:
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, чтобы удалить и их:
Справочник по SQL DML
SQL-выражения DML, приведённые ниже, могут использовать pg_clickhouse. Примеры зависят от следующих таблиц ClickHouse:
EXPLAIN
Команда EXPLAIN работает как и ожидается, но опция VERBOSE приводит к тому, что выполняется запрос ClickHouse "Remote SQL":
Этот запрос пробрасывается в ClickHouse в виде удалённого SQL через плановый узел "Foreign Scan".
SELECT
Используйте оператор SELECT для выполнения запросов к таблицам pg_clickhouse аналогично любым другим таблицам:
pg_clickhouse работает таким образом, чтобы по возможности проталкивать выполнение запроса в ClickHouse, включая агрегатные функции. Используйте EXPLAIN, чтобы определить степень такого проталкивания. Для приведённого выше запроса, например, всё выполнение полностью проталкивается в ClickHouse.
pg_clickhouse также проталкивает выполнение операций JOIN к таблицам, расположенным на том же удалённом сервере:
Выполнение JOIN с локальной таблицей приводит к менее эффективным запросам без
тщательной настройки. В этом примере мы создаём локальную копию таблицы
nodes и выполняем соединение с ней вместо удалённой таблицы:
В этом случае мы можем переложить больше работы по агрегации на ClickHouse,
выполняя группировку по node_id вместо локального столбца, а затем
выполнить JOIN с таблицей соответствия:
Узел "Foreign Scan" теперь выполняет агрегацию по node_id на удалённой стороне, уменьшая
количество строк, которые нужно вернуть в Postgres, с 1000 (всех)
до всего лишь 8, по одной на каждый узел.
PREPARE, EXECUTE, DEALLOCATE
Начиная с версии v0.1.2, pg_clickhouse поддерживает параметризованные запросы, как правило создаваемые командой PREPARE:
Используйте EXECUTE как обычно, чтобы выполнить подготовленный запрос:
Параметризованное выполнение не позволяет http-драйверу
корректно преобразовывать часовые пояса для значений DateTime в версиях ClickHouse до 25.8,
когда [основная ошибка] была [исправлена]. Обратите внимание, что PostgreSQL иногда
использует параметризованный план запроса даже без PREPARE. Для любых запросов,
которым требуется точное преобразование часовых поясов и когда обновление до 25.8 или
более новой версии невозможно, вместо этого используйте бинарный драйвер.
pg_clickhouse, как и обычно, проталкивает агрегации на нижележащий уровень, что видно из подробного вывода EXPLAIN:
Обратите внимание, что отправлены полные значения дат, а не шаблоны параметров.
Это справедливо для первых пяти запросов, как описано в PostgreSQL
PREPARE notes. При шестом выполнении он отправляет в ClickHouse
параметры запроса в формате {param:type}:
параметры:
Используйте DEALLOCATE, чтобы освободить подготовленный запрос:
INSERT
Используйте команду INSERT, чтобы вставлять значения в удалённую таблицу ClickHouse:
COPY
Используйте команду COPY, чтобы вставить пакет строк в удалённую таблицу ClickHouse:
⚠️ Ограничения Batch API
В pg_clickhouse ещё не реализована поддержка PostgreSQL FDW Batch Insert API. Поэтому COPY в настоящее время использует команды INSERT для вставки записей. Это будет улучшено в одном из следующих релизов.
LOAD
Используйте LOAD, чтобы загрузить общую библиотеку pg_clickhouse:
Обычно нет необходимости использовать LOAD, так как Postgres автоматически загружает 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.
Синтаксис: список пар ключ/значение, разделённых запятыми; ключ и значение в паре разделяются одним или несколькими пробелами. Ключи должны соответствовать [настройкам 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 должен быть загружен до задания
pg_clickhouse.session_settings; либо используйте [предзагрузку общей библиотеки], либо
просто используйте один из объектов расширения, чтобы гарантировать его загрузку.
pg_clickhouse.pushdown_regex
Параметр pg_clickhouse.pushdown_regex управляет тем, передаёт ли pg_clickhouse
обработку функций и операторов регулярных выражений на нижележащий уровень. По умолчанию это включено;
установите для этого параметра значение false, чтобы отключить такую передачу:
Подробнее см. в разделе Регулярные выражения.
ALTER ROLE
Используйте команду SET оператора ALTER ROLE для предварительной загрузки pg_clickhouse
и/или настройки его параметров для определённых ролей:
Используйте команду RESET оператора ALTER ROLE, чтобы сбросить предзагрузку 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, не будет выводить правильные значения:
Вывод:
Обратите внимание, что вторая и третья строки содержат усечённые значения. Это связано с тем, что PostgreSQL использует строки, завершающиеся нулевым символом, и не поддерживает нулевые символы внутри строк.
Попытка вставить бинарные значения в столбцы TEXT завершится успешно и будет работать как ожидается:
Текстовые столбцы будут корректными:
Но при чтении их как BYTEA этого не произойдёт:
Справочник функций и операторов
Функции
Эти функции предоставляют интерфейс для выполнения запросов к базе данных ClickHouse.
clickhouse_raw_query
Подключается к серверу ClickHouse через его HTTP‑интерфейс, выполняет один
запрос и отключается. Необязательный второй аргумент задаёт строку
подключения, по умолчанию host=localhost port=8123. Поддерживаемые
параметры подключения:
host: Хост, к которому выполняется подключение; обязательный параметр.port: HTTP‑порт для подключения; по умолчанию8123, если толькоhostне является хостом ClickHouse Cloud, — в этом случае по умолчанию используется8443dbname: Имя базы данных, к которой выполняется подключение.username: Имя пользователя, под которым выполняется подключение; по умолчаниюdefaultpassword: Пароль, используемый для аутентификации; по умолчанию пароль не используется
По умолчанию ни одна роль не имеет права EXECUTE для этой функции; доступ
с помощью GRANT следует предоставлять только тем ролям, которым
действительно необходимо выполнять специальные запросы ClickHouse,
например выделенной административной роли ClickHouse:
Полезно для запросов, которые не возвращают записей; результаты запросов, которые возвращают значения, возвращаются в виде одного текстового значения:
Функции передачи
pg_clickhouse передаёт на выполнение в ClickHouse подмножество встроенных функций PostgreSQL, используемых
в условных выражениях (предложения HAVING и WHERE). Это подмножество сопоставляется
с эквивалентами 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 с теми же именами.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_partdate(timestamp)&date(timestamptz): toDate (при обратном разборе — как алиас CHdate)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 или replaceRegexpOne, если указан флагgregexp_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): formatDateTime когдаfmtявляется строковой константой, каждое ключевое слово в которой имеет точный эквивалент в 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, обеспечивают передачу удалённых запросов для отдельных функций ClickHouse, не имеющих эквивалентов в PostgreSQL. Если какую-либо из этих функций нельзя передать, будет возбуждено исключение.
Передача расширений
pg_clickhouse распознаёт функции из некоторых встроенных и сторонних расширений и передаёт их эквивалентам в ClickHouse.
re2
Все функции [расширения re2] напрямую передаются в ClickHouse один к одному:
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
Одна функция intarray передается на выполнение в ClickHouse:
idx→ indexOf
fuzzystrmatch
Две функции из fuzzystrmatch передаются на выполнение в ClickHouse:
soundex: soundexlevenshtein(2-arg): editDistanceUTF8
Передача приведений типов
pg_clickhouse проталкивает приведения типов, такие как CAST(x AS bigint), для совместимых
типов данных. Для несовместимых типов операция передачи завершится ошибкой; если x в этом
примере — ClickHouse UInt64, ClickHouse откажется выполнять такое приведение.
Для того чтобы выполнять приведения с передачей к несовместимым типам данных, pg_clickhouse предоставляет следующие функции. Они вызывают исключение в PostgreSQL, если приведение не было протолкнуто в ClickHouse.
Агрегаты с передачей
Эти агрегатные функции PostgreSQL выполняются в ClickHouse посредством передачи.
Пользовательские агрегаты
Эти пользовательские агрегатные функции, созданные pg_clickhouse, обеспечивают передачу удалённых запросов (foreign query pushdown) для отдельных агрегатных функций ClickHouse, не имеющих эквивалентов в PostgreSQL. Если какую-либо из этих функций невозможно передать, будет сгенерировано исключение.
Передача Ordered Set Aggregates
Эти ordered-set aggregate functions сопоставляются с Parametric aggregate functions в ClickHouse: их прямой аргумент передается как параметр, а выражения ORDER BY — как аргументы. Например, этот запрос PostgreSQL:
Соответствует следующему запросу ClickHouse:
Учтите, что явные суффиксы ORDER BY DESC и NULLS FIRST
не поддерживаются и приведут к ошибке.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Передача для оконных функций
Эти [оконные функции] PostgreSQL передаются на сторону ClickHouse с предложением OVER (PARTITION BY ... ORDER BY ...), включая спецификации фрейма там, где это
применимо.
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(с предложениемOVER)
При передаче в ClickHouse у функций ранжирования (row_number, rank, dense_rank, ntile, cume_dist,
percent_rank) предложение frame опускается, поскольку ClickHouse
не поддерживает спецификации фрейма для этих функций.
Примечания по совместимости
Регулярные выражения
Хотя pg_clickhouse передаёт регулярные выражения в эквиваленты ClickHouse, когда pg_clickhouse.pushdown_regex равно true (по умолчанию), и старается обеспечить базовый уровень совместимости, учитывайте различия между ними и то, как pg_clickhouse их обрабатывает.
-
PostgreSQL поддерживает [регулярные выражения POSIX], а ClickHouse — регулярные выражения RE2. Учитывайте различия в поведении: используйте RE2, когда регулярное выражение будет вычисляться в ClickHouse (например, в предложении
WHERE), и POSIX, когда оно будет вычисляться в Postgres (например, в предложенииSELECT). -
pg_clickhouse передаёт [флаги регулярных выражений] Postgres, добавляя их в начало регулярного выражения ClickHouse внутри
(?). Например:Превращается в
Обратите внимание на добавление
-s; это приводит поведение в соответствие с регулярными выражениями Postgres за счёт отключенияs, который в ClickHouse включён по умолчанию. pg_clickhouse не добавляет-s, если флаги в вызове функции Postgres включаютs. К сожалению, из-за этого нарушается совместимость некоторых регулярных выражений в Postgres 24 и более ранних версиях. -
Единственные флаги, которые поддерживаются обеими системами и поэтому могут использоваться при вычислении в ClickHouse:
i: без учёта регистраm: многострочный режим:s: позволяет.соответствовать\np: частичное сопоставление с учётом новой строки (обрабатывается так же, какs)t: строгий синтаксис (по умолчанию, удаляется pg_clickhouse)
RE2 поддерживает только эти флаги; не используйте никакие другие [флаги Postgres]
-
Любые другие флаги, переданные в функции регулярных выражений, приведут к тому, что функция не будет передана в ClickHouse.
-
Исключение —
regexp_replace(), которая также поддерживает флагg. Когда установленg, pg_clickhouse используетreplaceRegexpAll()вместоreplaceRegexpOne()и удаляет этот флаг перед добавлением остальных флагов в начало. -
Аргумент замены в Postgres
regexp_replace()поддерживает\&для ссылки на всё совпадение, тогда как в ClickHouse для всего совпадения используется\0. Обязательно используйте\0, когда функция передаётся в ClickHouse.
Чтобы полностью избежать неоднозначности, рассмотрите возможность настройки pg_clickhouse.pushdown_regex, чтобы предотвратить передачу регулярных выражений Postgres в ClickHouse, и используйте [расширение re2], для которого pg_clickhouse поддерживает прямую передачу регулярных выражений RE2, совместимых с ClickHouse.
to_char()
PostgreSQL to_char() для timestamp и timestamp with time zone
передаётся в ClickHouse formatDateTime только в том случае, если аргумент формата
является строковой константой не-NULL и для каждого ключевого слова PostgreSQL
существует побайтно идентичный эквивалент в ClickHouse. Если формат задаётся динамически
(не Const) или содержит неподдерживаемое ключевое слово либо модификатор, вызов
обрабатывается локально в PostgreSQL — частичный pushdown
никогда не используется, поэтому результат остаётся совместимым с PG.
Варианты to_char() с двумя аргументами для numeric, interval и других
типов, не относящихся к временным меткам, никогда не передаются; 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 | индикатор времени AM/PM, всегда в верхнем регистре |
Текст в кавычках и литералы
Текст в "..." передаётся как есть; при этом любой литеральный %
удваивается до %%, чтобы экранировать префикс спецификатора в ClickHouse. \" вне
кавычек также передаётся как литеральный ". Внутри "..." обратная косая черта
экранирует только "; остальные последовательности с обратной косой чертой трактуются как литеральный текст.
Автор
Авторские права
Copyright (c) 2025-2026, ClickHouse