Описание
Начало работы
Использование
Политика версионирования
- Основная версия увеличивается при изменениях 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, чтобы
применить обновление.
Справочник по DDL SQL
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 МБ).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 МБ).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:
Справочник по SQL DML
EXPLAIN
VERBOSE приводит к
выводу запроса ClickHouse “Remote SQL”:
SELECT
nodes и используем её в JOIN вместо удаленной таблицы:
node_id вместо локального столбца, а затем сделать JOIN
с таблицей соответствий:
node_id на стороне источника, сокращая
число строк, которые нужно передать обратно в Postgres, с 1000 (всех
их) до всего 8 — по одной на каждый узел.
PREPARE, EXECUTE, DEALLOCATE
{param:type}:
параметры:
INSERT
COPY
⚠️ Ограничения батч API В pg_clickhouse пока не реализована поддержка батч-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, чтобы отключить его:
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 только тем ролям, которым действительно нужно выполнять ad-hoc
запросы 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(2-arg): 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 (например, в
clause
WHERE), и POSIX, когда оно будет вычисляться в Postgres (например, в clauseSELECT). -
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)
- Любые другие флаги, переданные функциям регулярных выражений, приведут к тому, что функция не будет отправлена в ClickHouse.
-
Исключение —
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 только тогда, когда аргумент формата
представляет собой строковую константу, отличную от 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 | индикатор времени суток, всегда в верхнем регистре |
Текст в кавычках и литералы
"..." передаётся дословно, при этом любой символ %
удваивается до %%, чтобы экранировать префикс спецификатора ClickHouse. \" вне
кавычек также передаётся как литеральный ". Внутри "..." обратная косая черта
экранирует только "; остальные последовательности с обратной косой чертой рассматриваются как литеральный текст.
David E. Wheeler