Описание
Начало работы
Использование
Политика версионирования
- Основная версия увеличивается при изменениях API
- Дополнительная версия увеличивается при обратно совместимых изменениях SQL
- Номер патча увеличивается при изменениях только в бинарном файле
- Версия библиотеки (определяемая
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
CREATE EXTENSION
WITH SCHEMA, чтобы установить расширение в определённую схему (рекомендуется):
ALTER EXTENSION
-
После установки нового релиза pg_clickhouse используйте предложение
UPDATE: -
Используйте
SET SCHEMA, чтобы переместить расширение в новую схему:
DROP EXTENSION
CASCADE, чтобы удалить и их:
CREATE SERVER
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
DROP SERVER
CASCADE, чтобы
также удалить эти зависимости:
CREATE USER MAPPING
taxi_srv:
user: Имя пользователя ClickHouse. По умолчанию — “default”.password: Пароль пользователя ClickHouse.
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO, чтобы импортировать только указанные таблицы:
EXCEPT, чтобы исключить таблицы:
CREATE FOREIGN TABLE
database: Имя удалённой базы данных. По умолчанию используется база данных, заданная для внешнего сервера.fetch_size: Примерный размер батча в байтах для потоковой передачи по HTTP. Переопределяетfetch_sizeна уровне сервера. По умолчанию —50000000(50 MB). Значение0отключает стриминг и буферизует ответ целиком.table_name: Имя удалённой таблицы. По умолчанию используется имя, указанное для внешней таблицы.engine: [движок таблицы], используемый таблицей ClickHouse. ДляCollapsingMergeTree()иAggregatingMergeTree()pg_clickhouse автоматически применяет параметры к функциональным выражениям, выполняемым для таблицы.
-
column_name: Имя столбца на стороне ClickHouse, которое используется вместо имени атрибута PostgreSQL при генерации запросов и операций вставки. Это полезно для сопоставления имён столбцов PostgreSQL в нижнем регистре без кавычек со столбцами ClickHouse, чувствительными к регистру, например: -
AggregateFunction: Имя агрегатной функции, применяемой к столбцу типа AggregateFunction Type. Сопоставьте тип данных с типом ClickHouse, передаваемым в функцию, и укажите имя агрегатной функции через соответствующую опцию столбца; pg_clickhouse автоматически добавитMergeк агрегатной функции, вычисляющей этот столбец. -
SimpleAggregateFunction: Имя агрегатной функции, применяемой к столбцу типа SimpleAggregateFunction Type. Сопоставьте тип данных с типом ClickHouse, передаваемым в функцию, и укажите имя агрегатной функции через соответствующую опцию столбца.
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE:
Справочник по DML SQL
EXPLAIN
VERBOSE приводит к выводу запроса ClickHouse “Remote SQL”:
SELECT
nodes и выполняем JOIN с ней вместо удалённой таблицы:
node_id вместо локального столбца, а затем выполнить JOIN
с таблицей lookup:
node_id, сокращая
число строк, которые нужно вернуть в Postgres, с 1000 (то есть
всех) до всего 8 — по одной на каждый узел.
PREPARE, EXECUTE, DEALLOCATE
{param:type}:
параметры:
INSERT
COPY
⚠️ Ограничения Batch API В pg_clickhouse пока не реализована поддержка Batch API вставки PostgreSQL FDW. Поэтому COPY сейчас использует операторы INSERT для вставки записей. Это будет исправлено в одном из будущих релизов.
LOAD
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings задаёт [настройки ClickHouse],
которые будут применяться к последующим запросам. Пример:
join_use_nulls 1, group_by_use_nulls 1, final 1. Установите это значение в
пустую строку, чтобы использовать настройки сервера ClickHouse.
date_time_output_format: HTTP-драйвер требует, чтобы значение было “iso”format_tsv_null_representation: HTTP-драйвер требует значение по умолчаниюoutput_format_tsv_crlf_end_of_lineHTTP-драйвер требует значение по умолчанию
pg_clickhouse.session_settings; для этого либо используйте [предварительную загрузку разделяемой библиотеки], либо
просто воспользуйтесь одним из объектов в расширении, чтобы гарантировать его загрузку.
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex определяет, будет ли pg_clickhouse
выполнять pushdown функций и операторов регулярных выражений. По умолчанию это включено;
установите для этого параметра значение false, чтобы отключить pushdown для них:
ALTER ROLE
SET оператора ALTER ROLE для предварительной загрузки pg_clickhouse
и/или для установки его параметров для определённых ролей:
RESET оператора ALTER ROLE, чтобы сбросить предварительную загрузку pg_clickhouse
и/или его параметры:
Предварительная загрузка
session_preload_libraries
Типы данных
| 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
SELECT выведет:
Справочник по Function и операторам
Функции
clickhouse_raw_query
host=localhost port=8123. Поддерживаются следующие параметры подключения:
host: Хост, к которому нужно подключиться; обязателен.port: HTTP-порт, к которому нужно подключиться; по умолчанию8123, если толькоhostне является хостом ClickHouse Cloud, в этом случае по умолчанию используется8443dbname: Имя базы данных, к которой нужно подключиться.username: Имя пользователя, от которого выполняется подключение; по умолчаниюdefaultpassword: Пароль, используемый для аутентификации; по умолчанию пароль отсутствует
EXECUTE к этой функции; рассмотрите возможность
предоставления доступа GRANT только тем ролям, которым действительно требуется выполнять
произвольные запросы 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,acoshpushdown не применяется: 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 как текста): синтаксис подстолбцов->(извлечение JSON/JSONB): toJSONString + синтаксис подстолбцов
Пользовательские функции
pg_clickhouse, обеспечивают
pushdown внешних запросов для некоторых функций ClickHouse, у которых нет
аналогов в PostgreSQL. Если какую-либо из этих функций не удастся
выполнить через pushdown, будет вызвано исключение.
Pushdown для расширений
re2
re2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(с двумя аргументами): editDistanceUTF8
Приведения типов с pushdown
CAST(x AS bigint), если
типы данных совместимы. Для несовместимых типов pushdown завершится ошибкой; если x в этом
примере имеет тип ClickHouse UInt64, ClickHouse откажется приводить это значение.
Чтобы выполнять pushdown приведений к несовместимым типам данных, pg_clickhouse предоставляет
следующие функции. Они вызывают исключение в PostgreSQL, если pushdown не выполняется.
Агрегатные функции с pushdown
Пользовательские агрегаты
pg_clickhouse, обеспечивают pushdown внешних
запросов для некоторых агрегатных функций ClickHouse, не имеющих эквивалентов в PostgreSQL. Если
какую-либо из этих функций невозможно передать через pushdown, будет вызвано исключение.
Pushdown для агрегатных функций ordered set
ORDER BY — в качестве аргументов. Например, следующий запрос PostgreSQL:
ORDER BY — DESC и NULLS FIRST —
не поддерживаются и вызовут ошибку.
percentile_cont(double): quantilequantile(double): quantilequantileExact(double): quantileExact
Pushdown оконных функций
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
не принимает спецификации рамки окна для этих функций.
Примечания по совместимости
Регулярные выражения
-
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. К сожалению, такое поведение нарушает совместимость некоторых регулярных выражений в Postgres 24 и более ранних версиях. -
Единственные флаги, которые поддерживаются обеими системами и поэтому могут использоваться при вычислении в
ClickHouse:
i: регистронезависимыйm: многострочный режим:s: позволяет.соответствовать\np: частичное сопоставление с учётом новой строки (обрабатывается так же, какs)t: строгий синтаксис (по умолчанию, удаляется pg_clickhouse)
- Любые другие флаги, переданные функциям регулярных выражений, приведут к тому, что функция не будет передана через pushdown.
-
Исключение —
regexp_replace(), которая также поддерживает флагg. Когда установленg, pg_clickhouse используетreplaceRegexpAll()вместоreplaceRegexpOne()и удаляет этот флаг перед добавлением остальных флагов в начало. -
Аргумент замены в Postgres
regexp_replace()поддерживает\&для ссылки на всё совпадение, тогда как в ClickHouse для всего совпадения используется\0. Обязательно используйте\0, когда функция передаётся через pushdown в ClickHouse.
to_char()
to_char() для timestamp и timestamp with time zone
проталкивается в ClickHouse formatDateTime только в том случае, если аргумент format
— это строковая константа, не равная 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. Последовательность \" вне
кавычек также передаётся как литеральный ". Внутри "..." обратная косая черта
экранирует только "; другие последовательности с обратной косой чертой трактуются как литеральный текст.
David E. Wheeler