Skip to main content
Позволяет выполнять запросы к данным, хранящимся в базе данных SQLite.

Синтаксис

Аргументы

Возвращаемое значение

  • Объект таблица с теми же столбцами, что и в исходной таблице SQLite.

Передача запроса вместо имени таблицы

Вместо имени таблицы вторым аргументом можно указать SELECT-запрос, который передаётся в SQLite без изменений. Структура результирующей таблицы выводится из результата запроса. SQLite сообщает объявленный тип только для столбца результата, который непосредственно является столбцом таблицы; для выражения, литерала или агрегата тип не сообщается. Объявленный тип, который сопоставляется с String (см. сопоставление типов), используется как есть. Тип столбца без объявленного типа определяется по классу хранения его значения в первой строке результата запроса: значение INTEGER даёт Int64, значение REAL — Float64, а любое другое значение (TEXT, BLOB, NULL), как и пустой результат, — String. Объявленный числовой тип также проверяется по этой первой строке, поскольку SQLite сообщает объявленный тип и для составного SELECT: тип берётся из одной из ветвей, а строки поступают из всех. Этот тип сохраняется, если класс хранения значения ему соответствует (INTEGER для целочисленного типа, INTEGER или REAL для типа с плавающей запятой), а также если значение равно NULL или результат пуст: ни в том, ни в другом случае нет информации о типе, которая могла бы противоречить объявленному типу. В противном случае тип столбца определяется по классу хранения, как для столбца без объявленного типа. Таким образом, выведенный тип может только расширяться, но никогда не сужаться. Для вывода типа такого столбца запрос запускается в SQLite. Первая строка не показательна для остальных: SQLite может возвращать в каждой строке разный класс хранения (например, CASE WHEN id = 1 THEN 1 ELSE 1.5 END), поэтому чтение на основе запроса работает в режиме fail-closed для каждого столбца, читаемого через числовой тип, а не только для столбцов без объявленного типа. Если класс хранения значения не соответствует этому типу или значение не может быть в нём точно представлено (ячейка INTEGER со значением 300 в столбце UInt8, ячейка REAL со значением 16777217 в столбце Float32), чтение завершается ошибкой, а не выполняется неявное преобразование. Чтобы прочитать столбец со значениями разных классов хранения, объявите его как String или приведите к тексту в запросе SQLite. Каждый выведенный столбец имеет тип Nullable. Запрос можно записать как подзапрос или обернуть в функцию query:
Передача запроса поддерживается начиная с версии 26.7. Перед отправкой в SQLite ClickHouse оборачивает запрос в SELECT ... FROM (<query>), поэтому запрос не должен заканчиваться точкой с запятой. Такая таблица доступна только для чтения: выполнять в неё INSERT нельзя. Тот же синтаксис поддерживается движком таблиц SQLite.
Форма подзапроса (SELECT ...) разбирается ClickHouse и повторно сериализуется перед отправкой в SQLite. Поэтому она должна быть корректным ClickHouse SQL. Чтобы передать синтаксис, специфичный для SQLite, который ClickHouse не разбирает, используйте форму query('...'), текст которой отправляется в SQLite дословно.Любые внешние WHERE, LIMIT, агрегация и т. п. из окружающего запроса к ClickHouse не переносятся в переданный запрос — они применяются в ClickHouse после получения полного результата запроса. Чтобы ограничить данные, считываемые из SQLite, поместите фильтр внутрь переданного запроса. При external_table_strict_query = 1 внешний фильтр по столбцам табличной функции отклоняется с исключением вместо локального применения, поскольку его нельзя перенести в переданный запрос. Проверка охватывает предикат верхнего уровня WHERE и каждую конъюнкцию верхнего уровня AND. PREWHERE по столбцам этой таблицы не относится к данному параметру: этот движок таблицы не поддерживает PREWHERE, и такой запрос отклоняется с ILLEGAL_PREWHERE независимо от параметра. Проверка выполняется только там, где фильтр вообще может быть перенесён: когда эта таблица является единственной таблицей запроса, находится с любой стороны INNER JOIN или на сохраняющей стороне внешнего JOIN (левой стороне LEFT JOIN, правой стороне RIGHT JOIN). На несохраняющей стороне LEFT/RIGHT JOIN и с любой стороны FULL JOIN ничего не переносится и не проверяется, поэтому фильтр по столбцам этой таблицы применяется локально после JOIN даже в строгом режиме. Там, где выполняется проверка, предикат, ссылающийся на другие таблицы, присоединённые в окружающем запросе, не переносится и исключается из проверки независимо от того, ссылается ли он только на присоединённую сторону или смешивает её с этой таблицей в одном выражении, отличном от AND (например, OR); такой предикат сохраняет обычную точку вычисления в ClickHouse (WHERE после JOIN, PREWHERE перед ним) и не отклоняется.

Пример

Query
Response