Табличная функция eval вычисляет свой аргумент в строку запроса, а затем выполняет её как один SELECT-запрос.
Эта табличная функция является экспериментальной и по умолчанию отключена. Чтобы включить её, используйте настройку allow_experimental_eval_table_function:
SET allow_experimental_eval_table_function = 1;Для этого также нужен анализатор (enable_analyzer, который по умолчанию включен).
Синтаксис
eval(expression)
eval(SELECT ...)Аргументы
expression— Константное выражение, возвращающее строку запроса. Допускаются параметры запроса и скалярные подзапросы.SELECT ...— ЗапросSELECT, возвращающий строку запроса. Эта форма представляет собой синтаксический сахар для скалярного подзапроса:eval(SELECT ...)эквивалентноeval((SELECT ...)), поэтому запрос должен возвращать ровно одну строку и один столбец.
Значение выражения должно иметь один из следующих типов:
StringNullable(String)LowCardinality(String)LowCardinality(Nullable(String))
Если значение равно NULL, eval генерирует исключение.
Возвращаемое значение
Возвращает результат сгенерированного запроса SELECT в виде таблицы.
Схема выходных данных определяется при анализе табличной функции eval, поэтому внешние запросы могут ссылаться на реальные имена столбцов и типы сгенерированного запроса.
Примеры
Вычислите константное выражение:
SELECT * FROM eval('SEL' || 'ECT 1 AS x');Результат:
┌─x─┐
│ 1 │
└───┘Используйте параметр запроса:
SET param_q = 'SELECT 2 AS y';
SELECT * FROM eval({q:String});Результат:
┌─y─┐
│ 2 │
└───┘Выполняет входной SELECT-запрос и возвращает текст запроса:
SELECT * FROM eval(SELECT 'SELECT 3 AS z');Результат:
┌─z─┐
│ 3 │
└───┘Используйте созданную схему во внешнем запросе:
SELECT x + 1 FROM eval('SELECT 4 AS x');Результат:
┌─plus(x, 1)─┐
│ 5 │
└────────────┘Ограничения
evalработает только с анализатором запросов (enable_analyzer = 1).- Сгенерированный запрос должен представлять собой один запрос
SELECTбез предложений вывода, таких какINTO OUTFILEилиFORMAT.evalне выполняет несколько операторов. - Сгенерированный запрос должен быть самодостаточным: он обрабатывается в собственной области видимости и не может ссылаться на псевдонимы
WITHили столбцы внешнего запроса. - Сгенерированный запрос не может повторно использовать табличную функцию
eval. evalнельзя использовать в качестве аргумента другой табличной функции, напримерremote('host', eval(...)). Чтобы выполнить сгенерированный запрос на удалённом сервере, оберните его вview:remote('host', view(SELECT * FROM eval(...))).- Аргумент вычисляется один раз при анализе запроса, а не отдельно для каждой строки или блока.
- Во внешнем журнале запросов записывается исходный запрос, содержащий
eval; сгенерированный запросSELECTне записывается как отдельный пользовательский запрос.
- табличная функция
view - настройка
allow_experimental_eval_table_function