> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Табличная функция `eval` вычисляет константное выражение в строку запроса и выполняет получившийся запрос `SELECT`.

# eval

Табличная функция `eval` вычисляет свой аргумент в строку запроса, а затем выполняет её как один запрос `SELECT`.

Эта табличная функция является экспериментальной и по умолчанию отключена. Чтобы включить её, используйте настройку `allow_experimental_eval_table_function`:

```sql theme={null}
SET allow_experimental_eval_table_function = 1;
```

Для этого также нужен анализатор ([`enable_analyzer`](/docs/ru/reference/settings/session-settings#allow_experimental_analyzer), который по умолчанию включен).

<div id="syntax">
  ## Синтаксис
</div>

```sql theme={null}
eval(expression)
eval(SELECT ...)
```

<div id="arguments">
  ## Аргументы
</div>

* `expression` — Константное выражение, возвращающее строку запроса. Допускаются параметры запроса и скалярные подзапросы.
* `SELECT ...` — Запрос `SELECT`, возвращающий строку запроса. Эта форма представляет собой синтаксический сахар для скалярного подзапроса: `eval(SELECT ...)` эквивалентно `eval((SELECT ...))`, поэтому запрос должен возвращать ровно одну строку и один столбец.

Значение выражения должно иметь один из следующих типов:

* `String`
* `Nullable(String)`
* `LowCardinality(String)`
* `LowCardinality(Nullable(String))`

Если значение равно `NULL`, `eval` генерирует исключение.

<div id="returned-value">
  ## Возвращаемое значение
</div>

Возвращает результат сгенерированного запроса `SELECT` в виде таблицы.

Схема выходных данных определяется при анализе табличной функции `eval`, поэтому внешние запросы могут ссылаться на реальные имена столбцов и типы сгенерированного запроса.

<div id="examples">
  ## Примеры
</div>

Вычислите константное выражение:

```sql theme={null}
SELECT * FROM eval('SEL' || 'ECT 1 AS x');
```

Результат:

```text theme={null}
┌─x─┐
│ 1 │
└───┘
```

Используйте параметр запроса:

```sql theme={null}
SET param_q = 'SELECT 2 AS y';
SELECT * FROM eval({q:String});
```

Результат:

```text theme={null}
┌─y─┐
│ 2 │
└───┘
```

Выполняет входной `SELECT`-запрос и возвращает текст запроса:

```sql theme={null}
SELECT * FROM eval(SELECT 'SELECT 3 AS z');
```

Результат:

```text theme={null}
┌─z─┐
│ 3 │
└───┘
```

Используйте созданную схему во внешнем запросе:

```sql theme={null}
SELECT x + 1 FROM eval('SELECT 4 AS x');
```

Результат:

```text theme={null}
┌─plus(x, 1)─┐
│          5 │
└────────────┘
```

<div id="restrictions">
  ## Ограничения
</div>

* `eval` работает только с анализатором запросов (`enable_analyzer = 1`).
* Сгенерированный запрос должен представлять собой один запрос `SELECT` без предложений вывода, таких как `INTO OUTFILE` или `FORMAT`. `eval` не выполняет несколько операторов.
* Сгенерированный запрос должен быть самодостаточным: он обрабатывается в собственной области видимости и не может ссылаться на псевдонимы `WITH` или столбцы внешнего запроса.
* Сгенерированный запрос не может повторно использовать табличную функцию `eval`.
* `eval` нельзя использовать в качестве аргумента другой табличной функции, например `remote('host', eval(...))`. Чтобы выполнить сгенерированный запрос на удалённом сервере, оберните его в `view`: `remote('host', view(SELECT * FROM eval(...)))`.
* Аргумент вычисляется один раз при анализе запроса, а не отдельно для каждой строки или блока.
* Во внешнем журнале запросов записывается исходный запрос, содержащий `eval`; сгенерированный запрос `SELECT` не записывается как отдельный пользовательский запрос.

<div id="related">
  ## См. также
</div>

* [табличная функция `view`](/docs/ru/reference/functions/table-functions/view)
* настройка `allow_experimental_eval_table_function`
