Справочная документация по pg_clickhouse
Описание
pg_clickhouse — это расширение PostgreSQL, которое позволяет выполнять удалённые запросы к базам данных ClickHouse, включая [обёртку внешних данных]. Оно поддерживает PostgreSQL 13 и выше, а также ClickHouse 23 и выше.
Начало работы
Самый простой способ опробовать pg_clickhouse — воспользоваться Docker image, который представляет собой стандартный 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
Чтобы удалить 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. Значения по умолчанию следующие:- 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, чтобы импортировать в схему PostgreSQL все таблицы, определённые в базе данных ClickHouse, как внешние таблицы:
Используйте 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
В приведённых ниже DML-выражениях SQL может использоваться pg_clickhouse. Примеры основаны на следующих таблицах ClickHouse:
EXPLAIN
Команда EXPLAIN работает как и ожидается, но параметр VERBOSE вызывает
вывод запроса ClickHouse "Remote SQL":
Этот запрос передаётся в ClickHouse через узел плана "Foreign Scan" — в виде удалённого SQL-запроса.
SELECT
Используйте оператор SELECT, чтобы выполнять запросы к таблицам pg_clickhouse так же, как и к любым другим таблицам:
pg_clickhouse старается максимально переносить выполнение запроса в ClickHouse, включая агрегатные функции. Используйте EXPLAIN, чтобы определить степень pushdown. Например, для приведенного выше запроса все выполнение переносится в ClickHouse
pg_clickhouse также передаёт выполнение JOIN для таблиц с одного и того же удалённого сервера:
При JOIN с локальной таблицей без
тщательной настройки запросы будут менее эффективными. В этом примере мы создаем локальную копию
таблицы nodes и выполняем JOIN с ней вместо удаленной таблицы:
В этом случае мы можем передать 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, как обычно, выполняет агрегации на стороне ClickHouse, что видно в подробном выводе EXPLAIN:
Обратите внимание, что отправляются полные значения дат, а не плейсхолдеры параметров.
Так происходит для первых пяти запросов, как описано в PostgreSQL
[примечаниях о PREPARE]. При шестом выполнении ClickHouse отправляет
[параметры запроса] в стиле {param:type}:
parameters:
Используйте DEALLOCATE для освобождения подготовленного оператора:
INSERT
Используйте команду INSERT, чтобы вставить значения в удалённую таблицу ClickHouse:
COPY
Используйте команду COPY, чтобы вставить батч строк в удалённую таблицу ClickHouse:
⚠️ Ограничения Batch API
pg_clickhouse пока не поддерживает батч-API вставки PostgreSQL FDW. Поэтому COPY в настоящее время использует команды INSERT для вставки записей. Это будет исправлено в одном из следующих выпусков.
LOAD
Используйте LOAD для загрузки разделяемой библиотеки pg_clickhouse:
Обычно нет необходимости использовать LOAD, так как Postgres автоматически загрузит pg_clickhouse при первом использовании любой из его возможностей (функций, внешних таблиц и т. д.).
Единственный случай, когда может быть полезно LOAD pg_clickhouse, — это SET параметров pg_clickhouse перед выполнением запросов, которые от них зависят.
SET
Используйте SET для настройки пользовательских параметров конфигурации pg_clickhouse.
pg_clickhouse.session_settings
Параметр 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
pushdown функций и операторов регулярных выражений. По умолчанию он включён;
установите для этого параметра значение false, чтобы отключить такой pushdown:
См. раздел Регулярные выражения.
ALTER ROLE
Используйте команду SET в ALTER ROLE для предварительной загрузки pg_clickhouse
и/или SET его параметров для отдельных ролей:
Используйте команду RESET в ALTER ROLE, чтобы сбросить предварительную загрузку pg_clickhouse
и/или параметры:
Предварительная загрузка
Если pg_clickhouse нужен для каждого или почти каждого соединения с Postgres, рассмотрите возможность использовать [предварительную загрузку разделяемой библиотеки], чтобы он загружался автоматически:
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 max |
| 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 для этой функции; выдавайте
доступ только тем ролям, которым действительно нужно выполнять разовые запросы ClickHouse,
например, выделенной административной роли ClickHouse:
Полезно для запросов, которые не возвращают записей, но запросы, которые возвращают значения, будут возвращены как одно текстовое значение:
Функции pushdown
pg_clickhouse поддерживает pushdown для части встроенных функций PostgreSQL, используемых
в условных выражениях (в секциях HAVING и WHERE). Это подмножество соответствует
следующим эквивалентам в 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 с теми же именами.asin,acos,atanh,acoshне передаются в CH: 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: длина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: 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.
Операторы pushdown
- Срез массива (
arr[L:U]): arraySlice @>(массив содержит): hasAll<@(массив содержится в): hasAll&&(массивы пересекаются): hasAny~(совпадение с регулярным выражением): match!~(нет совпадения с регулярным выражением): match~*(регистронезависимое регулярное выражение без совпадения): match!~*(регистронезависимое регулярное выражение без совпадения): match->>(извлечение элемента JSON/JSONB в виде текста): sub-column syntax->(извлечение из JSON/JSONB): toJSONString + sub-column syntax
Пользовательские функции
Эти пользовательские функции, созданные pg_clickhouse, обеспечивают
pushdown внешних запросов при использовании некоторых функций ClickHouse,
для которых в PostgreSQL нет эквивалентов. Если какую-либо из этих функций
нельзя выполнить через pushdown, будет сгенерировано исключение.
Pushdown для расширений
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
В ClickHouse проталкиваются две функции fuzzystrmatch:
soundex: soundexlevenshtein(2-arg): editDistanceUTF8
Pushdown-приведения типов
pg_clickhouse выполняет pushdown приведений типов, таких как CAST(x AS bigint), для совместимых
типов данных. Для несовместимых типов pushdown завершится ошибкой; если x в этом
примере имеет тип ClickHouse UInt64, ClickHouse откажется приводить это значение.
Чтобы выполнять pushdown приведений к несовместимым типам данных, pg_clickhouse предоставляет следующие функции. Они вызывают исключение в PostgreSQL, если не были протолкнуты.
Агрегатные функции с Pushdown
Эти агрегатные функции PostgreSQL выполняются с pushdown в ClickHouse.
Пользовательские агрегатные функции
Эти пользовательские агрегатные функции, созданные в pg_clickhouse, обеспечивают
pushdown запросов к внешнему источнику для некоторых агрегатных функций ClickHouse,
не имеющих эквивалентов в PostgreSQL. Если какую-либо из этих функций не удаётся
передать через pushdown, будет вызвано исключение.
Pushdown для агрегатов ordered set
Эти агрегатные функции ordered set сопоставляются с [параметрическими агрегатными функциями] ClickHouse: прямой аргумент передаётся как параметр, а выражения ORDER BY — как аргументы. Например, следующий запрос PostgreSQL:
Соответствует следующему запросу к ClickHouse:
Обратите внимание: суффиксы ORDER BY, отличные от используемого по умолчанию, — DESC и NULLS FIRST —
не поддерживаются и приводят к ошибке.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Pushdown оконных функций
Эти [оконные функции] PostgreSQL поддерживают pushdown в 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)
Для функций ранжирования (row_number, rank, dense_rank, ntile, cume_dist,
percent_rank) при pushdown секция рамки окна опускается, поскольку ClickHouse
не поддерживает спецификации рамки окна для этих функций.
Примечания о совместимости
Регулярные выражения
Хотя pg_clickhouse выполняет pushdown регулярных выражений в эквивалентные выражения ClickHouse, когда pg_clickhouse.pushdown_regex имеет значение true (это значение по умолчанию), и старается обеспечить базовый уровень совместимости, следует учитывать различия между ними и то, как pg_clickhouse их обрабатывает.
-
PostgreSQL поддерживает POSIX Regular Expressions, а ClickHouse поддерживает RE2 Regular Expressions. Учитывайте различия в поведении: используйте RE2, когда регулярное выражение будет вычисляться в ClickHouse (например, в предложении
WHERE), и POSIX — когда оно будет вычисляться в Postgres (например, в предложенииSELECT). -
pg_clickhouse выполняет pushdown флагов [Regex flags] из Postgres, добавляя их в начало регулярного выражения ClickHouse внутри
(?). Например:Превращается в
Обратите внимание на добавление
-s; это приводит поведение в соответствие с регулярными выражениями Postgres за счёт отключенияs, который в ClickHouse включён по умолчанию. pg_clickhouse не будет добавлять-s, если флаги в вызове функции Postgres содержатs. К сожалению, такое поведение нарушает совместимость некоторых регулярных выражений в PostgreSQL 24 и более ранних версиях. -
Единственные флаги, которые поддерживаются и PostgreSQL, и ClickHouse и, следовательно, могут использоваться при вычислении в ClickHouse:
i: регистронезависимыйm: многострочный режим:s: позволяет.соответствовать\np: частичное сопоставление с учётом перевода строки (обрабатывается так же, какs)t: строгий синтаксис (по умолчанию, удаляется pg_clickhouse)
RE2 поддерживает только эти флаги; не используйте никакие другие Postgres flags
-
Любые другие флаги, переданные функциям регулярных выражений, приведут к тому, что функция не будет отправлена через pushdown.
-
Исключением является
regexp_replace(), которая также поддерживает флагg. Когда установленg, pg_clickhouse используетreplaceRegexpAll()вместоreplaceRegexpOne()и удаляет этот флаг перед добавлением остальных флагов в начало. -
Аргумент замены в Postgres
regexp_replace()поддерживает\&для ссылки на полное совпадение, тогда как в ClickHouse для полного совпадения используется\0. Обязательно используйте\0, когда функция отправляется через pushdown в ClickHouse.
Чтобы полностью избежать неоднозначности, рассмотрите возможность установки pg_clickhouse.pushdown_regex, чтобы предотвратить pushdown регулярных выражений Postgres в ClickHouse, и используйте re2 extension, для которого pg_clickhouse поддерживает direct pushdown совместимых с ClickHouse регулярных выражений RE2.
to_char()
PostgreSQL to_char() для timestamp и timestamp with time zone
проталкивается в ClickHouse formatDateTime только в том случае, если аргумент формата
представляет собой строковую константу, отличную от NULL, и каждому ключевому слову PostgreSQL
соответствует побайтно идентичный эквивалент в ClickHouse. Если формат динамический
(не Const) или содержит неподдерживаемое ключевое слово либо модификатор,
вызов переключается на локальное вычисление в PostgreSQL — частичный pushdown
никогда не применяется, поэтому вывод остаётся совместимым с PG.
Формы to_char() с двумя аргументами для numeric, interval и других
типов, отличных от timestamp, никогда не проталкиваются; 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. \" вне
кавычек также передаётся как литеральный ". Внутри "..." обратная косая черта
экранирует только "; другие последовательности с обратной косой чертой трактуются как литеральный текст.
Авторы
Авторские права
Авторские права (c) 2025-2026, ClickHouse