Перейти к основному содержанию

Описание

pg_clickhouse — это расширение PostgreSQL, которое позволяет выполнять удалённые запросы к базам данных ClickHouse, в том числе через foreign data wrapper. Оно поддерживает PostgreSQL 13 и выше, а также ClickHouse 23 и выше.

Начало работы

Проще всего попробовать pg_clickhouse с помощью [Docker-образа], который представляет собой стандартный Docker-образ PostgreSQL с расширениями pg_clickhouse и re2:
См. руководство, чтобы узнать, как импортировать таблицы ClickHouse и делегировать выполнение запросов.

Использование

Политика версионирования

pg_clickhouse придерживается Semantic Versioning для своих публичных релизов.
  • Основная версия увеличивается при изменениях API
  • Дополнительная версия увеличивается при обратно совместимых изменениях SQL
  • Номер патча увеличивается при изменениях только в бинарном файле
После установки PostgreSQL отслеживает два варианта версии:
  • Версия библиотеки (определяемая PG_MODULE_MAGIC в PostgreSQL 18 и выше) включает полную семантическую версию, которая видна в выводе функции pgch_version() или функции Postgres pg_get_loaded_modules().
  • Версия расширения (определяемая в control-файле) включает только основную и дополнительную версии, которые видны в таблице pg_catalog.pg_extension, в выводе функции pg_available_extension_versions() и в \dx pg_clickhouse.
На практике это означает, что релиз, в котором увеличивается номер патча, например с v0.1.0 до v0.1.1, приносит пользу всем базам данных, в которых загружена v0.1, и не требует выполнения ALTER EXTENSION, чтобы воспользоваться обновлением. С другой стороны, релиз, в котором увеличивается дополнительная или основная версия, будет сопровождаться SQL-скриптами обновления, и все существующие базы данных, содержащие расширение, должны выполнить ALTER EXTENSION pg_clickhouse UPDATE, чтобы воспользоваться обновлением.

Справочник по 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. Батчи разделяются по границам строк. По умолчанию — 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

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 получит список всех table в указанной database (“demo” в примерах выше), получит определения столбцов для каждой из них и выполнит команды CREATE FOREIGN TABLE, чтобы создать внешние таблицы. Столбцы будут определены с использованием поддерживаемых типов данных и, если это удастся определить, параметров, поддерживаемых CREATE FOREIGN TABLE.
Сохранение регистра импортированных идентификаторовIMPORT FOREIGN SCHEMA применяет quote_identifier() к именам table и столбцов, которые импортирует, из-за чего идентификаторы с символами в верхнем регистре или пробелами заключаются в двойные кавычки. Поэтому такие имена table и столбцов в запросах PostgreSQL также должны быть заключены в двойные кавычки. Имена, состоящие только из строчных букв и не содержащие пробелов, заключать в кавычки не нужно.Например, для такой table в ClickHouse:
IMPORT FOREIGN SCHEMA создаёт такую внешнюю таблицу:
Поэтому в запросах нужно правильно использовать кавычки, например:
Чтобы создавать объекты с другими именами или именами только в нижнем регистре (и, следовательно, регистронезависимыми), используйте CREATE FOREIGN TABLE.

CREATE FOREIGN TABLE

Используйте CREATE FOREIGN TABLE для создания внешней таблицы, позволяющей запрашивать данные из базы данных ClickHouse:
Поддерживаются следующие опции таблицы:
  • database: Имя удалённой базы данных. По умолчанию используется база данных, заданная для внешнего сервера.
  • fetch_size: Примерный размер батча в байтах для потоковой передачи по HTTP. Переопределяет fetch_size на уровне сервера. По умолчанию — 50000000 (50 MB). Значение 0 отключает стриминг и буферизует ответ целиком.
  • table_name: Имя удалённой таблицы. По умолчанию используется имя, указанное для внешней таблицы.
  • engine: [движок таблицы], используемый таблицей ClickHouse. Для CollapsingMergeTree() и AggregatingMergeTree() pg_clickhouse автоматически применяет параметры к функциональным выражениям, выполняемым для таблицы.
Используйте тип данных, соответствующий удалённому типу данных ClickHouse для каждого столбца. Поддерживаются следующие опции столбцов:
  • column_name: Имя столбца на стороне ClickHouse, которое используется вместо имени атрибута PostgreSQL при генерации запросов и операций вставки. Это полезно для сопоставления имён столбцов PostgreSQL в нижнем регистре без кавычек со столбцами ClickHouse, чувствительными к регистру, например:
  • AggregateFunction: Имя агрегатной функции, применяемой к столбцу типа AggregateFunction Type. Сопоставьте тип данных с типом ClickHouse, передаваемым в функцию, и укажите имя агрегатной функции через соответствующую опцию столбца; pg_clickhouse автоматически добавит Merge к агрегатной функции, вычисляющей этот столбец.
  • SimpleAggregateFunction: Имя агрегатной функции, применяемой к столбцу типа SimpleAggregateFunction Type. Сопоставьте тип данных с типом ClickHouse, передаваемым в функцию, и укажите имя агрегатной функции через соответствующую опцию столбца.

ALTER FOREIGN TABLE

Используйте ALTER FOREIGN TABLE, чтобы изменить описание внешней таблицы:
Поддерживаемые параметры таблицы и столбца совпадают с параметрами для CREATE FOREIGN TABLE.

DROP FOREIGN TABLE

Чтобы удалить внешнюю таблицу, используйте DROP FOREIGN TABLE:
Эта команда завершится ошибкой, если существуют объекты, зависящие от внешней таблицы. Чтобы удалить и их, используйте предложение CASCADE:

Справочник по DML SQL

Приведённые ниже SQL-выражения DML могут использовать pg_clickhouse. В примерах ниже используются следующие таблицы ClickHouse:

EXPLAIN

Команда EXPLAIN работает как ожидается, но параметр VERBOSE приводит к выводу запроса ClickHouse “Remote SQL”:
Этот запрос передаётся в ClickHouse через узел плана “Foreign Scan” как удалённый SQL.

SELECT

Используйте оператор SELECT для выполнения запросов к таблицам pg_clickhouse, как и к любым другим таблицам:
pg_clickhouse старается по возможности максимально переносить выполнение запроса в ClickHouse, включая агрегатные функции. Используйте EXPLAIN, чтобы определить степень использования pushdown. Например, для приведённого выше запроса всё выполнение переносится в ClickHouse
pg_clickhouse также выполняет pushdown JOIN для таблиц, находящихся на одном и том же удалённом сервере:
JOIN с локальной таблицей без тщательной настройки приведёт к менее эффективным запросам. В этом примере мы создаём локальную копию таблицы nodes и выполняем JOIN с ней вместо удалённой таблицы:
В этом случае мы можем перенести большую часть агрегации в ClickHouse, выполнив группировку по node_id вместо локального столбца, а затем выполнить JOIN с таблицей lookup:
Узел “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:
Обратите внимание, что были отправлены полные значения дат, а не плейсхолдеры параметров. Так происходит для первых пяти запросов, как описано в [заметках о PREPARE]. При шестом выполнении отправляются ClickHouse [параметры запроса] в формате {param:type}: параметры:
Используйте DEALLOCATE, чтобы освободить подготовленный оператор:

INSERT

Используйте команду INSERT, чтобы вставить значения в удалённую таблицу ClickHouse:

COPY

Используйте команду COPY, чтобы выполнить вставку батча строк в удалённую таблицу ClickHouse:
⚠️ Ограничения Batch API В pg_clickhouse пока не реализована поддержка Batch 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 и/или для установки его параметров для определённых ролей:
Используйте команду 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: Ниже приведены дополнительные примечания и подробности.

BYTEA

ClickHouse не предоставляет эквивалента типа PostgreSQL BYTEA, однако позволяет хранить произвольные байты в типе String. В общем случае строки ClickHouse следует сопоставлять с типом PostgreSQL TEXT, но при работе с бинарными данными используйте тип BYTEA. Пример:
Этот последний запрос SELECT выведет:
Обратите внимание: если в столбцах ClickHouse есть нулевые байты, внешняя таблица, использующая столбцы TEXT, не будет выводить корректные значения:
Вывод:
Обратите внимание, что вторая и третья строки содержат усечённые значения. Это объясняется тем, что PostgreSQL использует строки, завершающиеся нулевым байтом, и не поддерживает нулевые байты внутри строк. Попытка вставить бинарные значения в столбцы TEXT завершится успешно и будет работать как ожидается:
Текстовые столбцы будут корректными:
Но если читать их как BYTEA, этого не произойдет:
Как правило, столбцы TEXT следует использовать только для закодированных строк, а столбцы BYTEA — только для двоичных данных; никогда не чередуйте их.

Справочник по Function и операторам

Функции

Эти функции служат интерфейсом для выполнения запросов к базе данных ClickHouse.

clickhouse_raw_query

Подключается к сервису ClickHouse через его HTTP-интерфейс, выполняет один запрос и отключается. Необязательный второй аргумент задает строку подключения, которая по умолчанию имеет вид host=localhost port=8123. Поддерживаются следующие параметры подключения:
  • host: Хост, к которому нужно подключиться; обязателен.
  • port: HTTP-порт, к которому нужно подключиться; по умолчанию 8123, если только host не является хостом ClickHouse Cloud, в этом случае по умолчанию используется 8443
  • dbname: Имя базы данных, к которой нужно подключиться.
  • username: Имя пользователя, от которого выполняется подключение; по умолчанию default
  • password: Пароль, используемый для аутентификации; по умолчанию пароль отсутствует
По умолчанию ни одна роль не имеет доступа EXECUTE к этой функции; рассмотрите возможность предоставления доступа GRANT только тем ролям, которым действительно требуется выполнять произвольные запросы ClickHouse, например выделенной роли администратора ClickHouse: Полезно для запросов, которые не возвращают записей, но запросы, которые все же возвращают значения, будут возвращены как одно текстовое значение:

Функции с pushdown

pg_clickhouse выполняет pushdown для части встроенных функций PostgreSQL, используемых в условных выражениях (в секциях HAVING и WHERE). Для них используются следующие эквиваленты в ClickHouse:

Операторы pushdown

  • Срез массива (arr[L:U]): arraySlice
  • @> (массив содержит): hasAll
  • <@ (массив содержится в): hasAll
  • && (массивы пересекаются): hasAny
  • ~ (совпадение с регулярным выражением): match
  • !~ (нет совпадения с регулярным выражением): match
  • ~* (регистронезависимое отсутствие совпадения с регулярным выражением): match
  • !~* (регистронезависимое отсутствие совпадения с регулярным выражением): match
  • ->> (извлечение элемента JSON/JSONB как текста): синтаксис подстолбцов
  • -> (извлечение JSON/JSONB): toJSONString + синтаксис подстолбцов

Пользовательские функции

Эти пользовательские функции, созданные pg_clickhouse, обеспечивают pushdown внешних запросов для некоторых функций ClickHouse, у которых нет аналогов в PostgreSQL. Если какую-либо из этих функций не удастся выполнить через pushdown, будет вызвано исключение.

Pushdown для расширений

pg_clickhouse распознает функции некоторых основных и сторонних расширений и передает их на pushdown к их эквивалентам в ClickHouse.

re2

Все функции re2 extension проталкиваются в ClickHouse в соотношении 1:1:

intarray

Одна функция intarray выполняется в ClickHouse:

fuzzystrmatch

В ClickHouse проталкиваются две функции fuzzystrmatch:

Приведения типов с pushdown

pg_clickhouse выполняет pushdown для приведений типов, таких как CAST(x AS bigint), если типы данных совместимы. Для несовместимых типов pushdown завершится ошибкой; если x в этом примере имеет тип ClickHouse UInt64, ClickHouse откажется приводить это значение. Чтобы выполнять pushdown приведений к несовместимым типам данных, pg_clickhouse предоставляет следующие функции. Они вызывают исключение в PostgreSQL, если pushdown не выполняется.

Агрегатные функции с pushdown

Для этих агрегатных функций PostgreSQL поддерживается pushdown в ClickHouse.

Пользовательские агрегаты

Эти пользовательские агрегатные функции, созданные в pg_clickhouse, обеспечивают pushdown внешних запросов для некоторых агрегатных функций ClickHouse, не имеющих эквивалентов в PostgreSQL. Если какую-либо из этих функций невозможно передать через pushdown, будет вызвано исключение.

Pushdown для агрегатных функций ordered set

Эти [агрегатные функции ordered set] сопоставляются с [параметрическими агрегатными функциями] ClickHouse путём передачи их непосредственного аргумента в качестве параметра, а выражений ORDER BY — в качестве аргументов. Например, следующий запрос PostgreSQL:
Преобразуется в следующий запрос к ClickHouse:
Обратите внимание, что нестандартные суффиксы ORDER BYDESC и NULLS FIRST — не поддерживаются и вызовут ошибку.

Pushdown оконных функций

Эти PostgreSQL [оконные функции] поддерживают pushdown в ClickHouse с секциями OVER (PARTITION BY ... ORDER BY ...), включая спецификации рамки окна, где это применимо. Функции ранжирования (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. К сожалению, такое поведение нарушает совместимость некоторых регулярных выражений в Postgres 24 и более ранних версиях.
  • Единственные флаги, которые поддерживаются обеими системами и поэтому могут использоваться при вычислении в ClickHouse:
    • i: регистронезависимый
    • m: многострочный режим:
    • s: позволяет . соответствовать \n
    • p: частичное сопоставление с учётом новой строки (обрабатывается так же, как 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, чтобы предотвратить передачу регулярных выражений Postgres через pushdown в ClickHouse, и используйте re2 extension, для которого pg_clickhouse поддерживает прямой pushdown совместимых с ClickHouse регулярных выражений RE2.

to_char()

PostgreSQL to_char() для timestamp и timestamp with time zone проталкивается в ClickHouse formatDateTime только в том случае, если аргумент format — это строковая константа, не равная NULL, и каждому ключевому слову PostgreSQL в ней соответствует побайтно идентичный эквивалент в ClickHouse. Если формат задаётся динамически (не Const) или содержит неподдерживаемое ключевое слово либо модификатор, вызов переключается на локальное вычисление в PostgreSQL — pushdown никогда не применяется при частичном переводе, поэтому вывод остаётся совместимым с PG. Формы to_char() с двумя аргументами для numeric, interval и других нетемпоральных типов никогда не проталкиваются; ClickHouse formatDateTime форматирует только значения даты и времени.

Преобразованные ключевые слова

Текст в кавычках и литералы

Текст, заключённый в "...", передаётся как есть; при этом любой символ % удваивается до %%, чтобы экранировать префикс спецификатора ClickHouse. Последовательность \" вне кавычек также передаётся как литеральный ". Внутри "..." обратная косая черта экранирует только "; другие последовательности с обратной косой чертой трактуются как литеральный текст.

Авторы

David E. Wheeler Авторские права (c) 2025-2026, ClickHouse
Последнее изменение 12 июня 2026 г.