# PRAGMA
## Определение
Переопределение настроек.
### Синтаксис
`PRAGMA x.y = "z";` или `PRAGMA x.y("z", "z2", "z3");`:
* `x` — (опционально) категория настройки.
* `y` — название настройки.
* `z` — (опционально для флагов) значение настройки. Допустимо использование следующих суффиксов:
* `Kb`, `Mb`, `Gb` — для объема информации.
* `sec`, `min`, `h`, `d` — для временных значений.
### Примеры
```yql
PRAGMA AutoCommit;
```
```yql
PRAGMA TablePathPrefix = "home/yql";
```
```yql
PRAGMA Warning("disable", "1101");
```
За некоторым исключением, значение настроек можно вернуть в состояние по умолчанию с помощью `PRAGMA my_pragma = default;`.
Полный список доступных настроек [см. в таблице ниже](#pragmas).
### Область действия {#pragmascope}
Если не указано иное, прагма влияет на все идущие следом выражения вплоть до конца модуля, в котором она встречается.
При необходимости и логической возможности допустимо менять значение настройки несколько раз в одном запросе, чтобы оно было разным на разных этапах выполнения.
Существуют также специальные scoped прагмы, область действия которых определяется по тем же правилам, что и область видимости [именованных выражений](expressions.md#named-nodes).
В отличие от scoped прагм, обычные прагмы могут использоваться только в глобальной области видимости (не внутри лямбда-функций, ACTION, SUBQUERY и т.п.).
## Глобальные {#pragmas}
### AutoCommit {#autocommit}
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Автоматически выполнять [COMMIT](select/index.md#commit) после каждого выражения.
### TablePathPrefix {#table-path-prefix}
| Тип значения | По умолчанию |
| --- | --- |
| Строка | — |
Добавить указанный префикс к путям таблиц внутри кластеров. Работает по принципу объединения путей в файловой системе: поддерживает ссылки на родительский каталог `..` и не требует добавления слеша справа. Например,
```yql
PRAGMA TablePathPrefix = "home/yql";
SELECT * FROM test;
```
Префикс не добавляется, если имя таблицы указано как абсолютный путь (начинается с /).
### UDF {#udf}
| Тип значения | По умолчанию | Статическая /
динамическая |
| --- | --- | --- |
| Строка | — | Статическая |
| Строка - имя префикса, добавляемого ко всем модулям | "" | Статическая |
Импорт всех UDF из указанной приложенной к запросу скомпилированной под Linux x64 разделяемой библиотеки (.so).
При указании префикса, он добавляется перед названием всех загруженных модулей, например, CustomPrefixIp::IsIPv4 вместо Ip::IsIPv4.
Указание префикса позволяет подгрузить одну и ту же UDF разных версий.
### UseTablePrefixForEach {#use-table-prefix-for-each}
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
`EACH` использует [TablePathPrefix](#table-path-prefix) для каждого элемента списка.
### Warning {#warning}
| Тип значения | По умолчанию |
| --- | --- |
| 1. Действие
2. Код предупреждения либо символ "*"| — |
Действие:
* `disable` — отключить;
* `error` — приравнять к ошибке;
* `default` — вернуть поведение по умолчанию.
Код предупреждения возвращается вместе с самим текстом (в веб-интерфейсе отображается справа).
Примеры:
`PRAGMA Warning("error", "*");`
`PRAGMA Warning("disable", "1101");`
`PRAGMA Warning("default", "4503");`
В данном случае все предупреждения будут считаться ошибками, за исключением предупреждение с кодом `1101`, которое будет отключено, и `4503`, которое будет обрабатываться по умолчанию (то есть останется предупреждением). Поскольку предупреждения могут добавляться в новых релизах YQL, следует с осторожностью пользоваться конструкцией `PRAGMA Warning("error", "*");` (как минимум покрывать такие запросы автотестами).
### Greetings {#greetings}
| Тип значения | По умолчанию |
| --- | --- |
| Текст | — |
Выдать указанный текст в качестве Info сообщения запроса.
Пример:
`PRAGMA Greetings("It's a good day!");`
### WarningMsg {#warningmsg}
| Тип значения | По умолчанию |
| --- | --- |
| Текст | — |
Выдать указанный текст в качестве Warning сообщения запроса.
Пример:
`PRAGMA WarningMsg("Attention!");`
### SimpleColumns {#simplecolumns}
`SimpleColumns` / `DisableSimpleColumns`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | true |
При использовании `SELECT foo.* FROM ... AS foo` убрать префикс `foo.` у имен результирующих колонок.
Работает в том числе и для [JOIN](join.md), но в этом случае имеет право упасть в случае конфликта имен (который можно разрешить с помощью [WITHOUT](select/without.md) и переименования колонок). Для JOIN в режиме SimpleColumns производится неявный Coalesce для ключевых колонок: запрос `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` в режиме SimpleColumns работает как `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`
### CoalesceJoinKeysOnQualifiedAll
`CoalesceJoinKeysOnQualifiedAll` / `DisableCoalesceJoinKeysOnQualifiedAll`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | true |
Управляет неявным Coalesce для ключевых колонок `JOIN` в режиме SimpleColumns. Если флаг установлен, то Coalesce ключевых колонок происходит при наличии хотя бы одного выражения вида `foo.*` или `*` в SELECT - например `SELECT a.* FROM T1 AS a JOIN T2 AS b USING(key)`. Если флаг сброшен, то Coalesce ключей JOIN происходит только при наличии '*' после `SELECT`
### StrictJoinKeyTypes
`StrictJoinKeyTypes` / `DisableStrictJoinKeyTypes`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Если флаг установлен, то [JOIN](join.md) будет требовать строгого совпадения типов ключей.
По умолчанию JOIN предварительно конвертирует ключи к общему типу, что может быть нежелательно с точки зрения производительности.
StrictJoinKeyTypes является [scoped](#pragmascope) настройкой.
### AnsiInForEmptyOrNullableItemsCollections
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Наличие этой прагмы приводит поведение оператора `IN` в соответствие со стандартом в случае наличия `NULL` в левой или правой части оператора `IN`. Также изменено поведение `IN` в случае, когда справа был Tuple с элементами разных типов. Примеры:
`1 IN (2, 3, NULL) = NULL (было Just(False))`
`NULL IN () = Just(False) (было NULL)`
`(1, null) IN ((2, 2), (3, 3)) = Just(False) (было NULL)`
Подробнее про поведение `IN` при наличии `NULL`ов в операндах можно почитать [здесь](expressions.md#in). Явным образом выбрать старое поведение можно указав прагму `DisableAnsiInForEmptyOrNullableItemsCollections`. Если никакой прагмы не задано, то выдается предупреждение и работает старый вариант.
### AnsiRankForNullableKeys
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Приводит поведение RANK/DENSE_RANK в соответствие со стандартом при наличии опциональных типов в ключах сортировки окна или в аргументе этих оконных функций. А именно:
* типом результата всегда является Uint64, а не Uint64?;
* null-ы в ключах считаются равными друг другу (текущая реализация возвращает NULL).
Явным образом выбрать старое поведению можно указав прагму `DisableAnsiRankForNullableKeys`. Если никакой прагмы не задано, то выдается предупреждение и работает старый вариант.
### AnsiCurrentRow
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Приводит неявное задание рамки окна при наличии ORDER BY в соответствие со стандартом.
Если AnsiCurrentRow не установлен, то окно `(ORDER BY key)` эквивалентно `(ORDER BY key ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)`.
Стандарт же требует, чтобы такое окно вело себя как `(ORDER BY key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)`.
Разница состоит в трактовке `CURRENT ROW`. В режиме `ROWS` `CURRENT ROW` трактуется буквально – текущая строка в партиции.
А в режиме `RANGE` конец рамки `CURRENT ROW` означает "последняя строка в партиции с ключом сортировки, равным текущей строке".
### OrderedColumns {#orderedcolumns}
`OrderedColumns` / `DisableOrderedColumns`
Выводить [порядок колонок](select/index.md#orderedcolumns) в SELECT/JOIN/UNION ALL и сохранять его при записи результатов. По умолчанию порядок колонок не определен.
### PositionalUnionAll {#positionalunionall}
Включить соответствующий стандарту поколоночный режим выполнения [UNION ALL](select/index.md#unionall). При этом автоматически включается
[упорядоченность колонок](#orderedcolumns).
### RegexUseRe2
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Использовать Re2 UDF вместо Pcre для выполнения SQL операторов `REGEX`,`MATCH`,`RLIKE`. Re2 UDF поддерживает корректную обработку Unicode-символов в отличие от используемой по умолчанию Pcre UDF.
### ClassicDivision
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | true |
В классическом варианте результат целочисленного деления остаётся целочисленным (по умолчанию).
Если отключить — результат всегда становится Double.
ClassicDivision является [scoped](#pragmascope) настройкой.
### CheckedOps
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
При включенном режиме если в результате выполнения агрегационных функций SUM/SUM_IF, бинарных операций `+`,`-`,`*`,`/`,`%` или унарной операции `-` над целыми числами происходит выход за границы целевого типа аргументов или результата, то возвращается `NULL`.
Если отключить - переполнение не проверяется.
Не влияет на операции с числами с плавающей точкой или `Decimal`.
CheckedOps является [scoped](#pragmascope) настройкой.
### UnicodeLiterals
`UnicodeLiterals`/`DisableUnicodeLiterals`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
При включенном режиме строковые литералы без суффиксов вида "foo"/'bar'/@@multiline@@ будут иметь тип `Utf8`, при выключенном - `String`.
UnicodeLiterals является [scoped](#pragmascope) настройкой.
### WarnUntypedStringLiterals
`WarnUntypedStringLiterals`/`DisableWarnUntypedStringLiterals`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
При включенном режиме для строковых литералов без суффиксов вида "foo"/'bar'/@@multiline@@ будет генерироваться предупреждение. Его можно подавить, если явно выбрать суффикс `s` для типа `String`, либо `u` для типа `Utf8`.
WarnUntypedStringLiterals является [scoped](#pragmascope) настройкой.
### AllowDotInAlias
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Разрешить использовать точку в именах результирующих колонок. По умолчанию отключено, т.к. дальнейшее использование таких колонок в JOIN полностью не реализовано.
### WarnUnnamedColumns
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Генерировать предупреждение если для безымянного выражения в `SELECT` было автоматически сгенерировано имя колонки (вида `column[0-9]+`).
### GroupByLimit
| Тип значения | По умолчанию |
| --- | --- |
| Положительное число | 32 |
Увеличение лимита на число группировок в [GROUP BY](group_by.md).
### GroupByCubeLimit
| Тип значения | По умолчанию |
| --- | --- |
| Положительное число | 5 |
Увеличение лимита на число размерностей [GROUP BY](group_by.md#rollup-cube-group-sets).
Использовать нужно аккуратно, так как вычислительная сложность запроса растет экспоненциально по отношению к числу размерностей.
## Yson
Управление поведением Yson UDF по умолчанию, подробнее см. в [документации по ней](../udf/list/yson.md) и в частности [Yson::Options](../udf/list/yson.md#ysonoptions).
### `yson.AutoConvert`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Автоматическое конвертация значений в требуемый тип данных во всех вызовах Yson UDF, в том числе и неявных.
### `yson.Strict`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | true |
Управление строгим режимом во всех вызовах Yson UDF, в том числе и неявных. Без значения или при значении `"true"` - включает строгий режим. Со значением `"false"` - отключает.
### `yson.DisableStrict`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Инвертированная версия `yson.Strict`. Без значения или при значении `"true"` - отключает строгий режим. Со значением `"false"` - включает.
## Работа с файлами
### File
| Тип значения | По умолчанию | Статическая /
динамическая |
| --- | --- | --- |
| Два или три строковых аргумента — алиас, URL и опциональное имя токена | — | Статическая |
Приложить файл к запросу по URL. Использовать приложенные файлы можно с помощью встроенных функций [FilePath и FileContent](../builtins/basic.md#filecontent).
При указании имени токена, его значение будет использоваться для обращения к целевой системе.
### FileOption
| Тип значения | По умолчанию | Статическая /
динамическая |
|-------------------------------------------------|--------------|--------------------------------|
| Три строковых аргумента — алиас, ключ, значение | — | Статическая |
Установить у указанного файла опцию по заданному ключу в заданное значение. Файл с этим алиасом уже должен быть объявлен
через [PRAGMA File](#file) или приложен к запросу.
### Folder
| Тип значения | По умолчанию | Статическая /
динамическая |
| --- | --- | --- |
| Два или три строковых аргумента — префикс, URL и опциональное имя токена | — | Статическая |
Приложить набор файлов к запросу по URL. Работает аналогично добавлению множества файлов через [PRAGMA File](#file) по прямым ссылкам на файлы с алиасами, полученными объединением префикса с именем файла через `/`.
При указании имени токена, его значение будет использоваться для обращения к целевой системе.
### Library
| Тип значения | По умолчанию | Статическая /
динамическая |
| --- | --- | --- |
| Один или два аргумента - имя файла и опциональный URL | — | Статическая |
Интерпретировать указанный приложенный файл как библиотеку, из которой можно делать [IMPORT](export_import.md). Тип синтаксиса библиотеки определяется по расширению файла:
* `.sql` для YQL диалекта SQL (рекомендуется);
* `.yql` для [s-expressions](/docs/s_expressions).
Пример с приложенным файлом к запросу:
```yql
PRAGMA library("a.sql");
IMPORT a SYMBOLS $x;
SELECT $x;
```
В случае указания URL библиотека скачивается с него, а не с предварительного приложенного файла, как в следующем примере:
```yql
PRAGMA library("a.sql","http://intranet.site/5618566/text");
IMPORT a SYMBOLS $x;
SELECT $x;
```
При этом можно использовать подстановку текстовых параметров в URL:
```yql
DECLARE $_ver AS STRING; -- "5618566"
PRAGMA library("a.sql","http://intranet.site/{$_ver}/text");
IMPORT a SYMBOLS $x;
SELECT $x;
```
### Package
| Тип значения | По умолчанию | Статическая /
динамическая |
| --- | --- | --- |
| Два или три аргумента - имя пакета, URL и опциональный токен | — | Статическая |
Приложить иерархический набор файлов к запросу по URL, интерпретируя их в качестве пакета с указанным именем - взаимосвязанного набора библиотек.
Имя пакета ожидается в формате ``project_name.package_name``; из библиотек пакета в дальнейшнем можно делать [IMPORT](export_import.md) с именем модуля вида ``pkg.project_name.package_name.maybe.nested.module.name``.
Пример для пакета с плоской иерархией, состоящего из двух библиотек - foo.sql и bar.sql:
```yql
PRAGMA package("project.package", "http://intranet.site/path/to/package");
IMPORT pkg.project.package.foo SYMBOLS $foo;
IMPORT pkg.project.package.bar SYMBOLS $bar;
SELECT $foo, $bar;
```
При этом можно использовать подстановку текстовых параметров в URL:
```yql
DECLARE $_path AS STRING; -- "path"
PRAGMA package("project.package","http://intranet.site/{$_path}/to/package");
IMPORT pkg.project.package.foo SYMBOLS $foo;
IMPORT pkg.project.package.bar SYMBOLS $bar;
SELECT $foo, $bar;
```
### OverrideLibrary
| Тип значения | По умолчанию | Статическая /
динамическая |
| --- | --- | --- |
| Один аргумент - имя файла | — | Статическая |
Интерпретировать указанный приложенный файл как библиотеку и перекрыть ей одну из библиотек пакета.
Имя файла ожидается в формате ``project_name/package_name/maybe/nested/module/name.EXTENSION``, поддерживаются аналогичные [PRAGMA Library](#library) расширения.
Пример:
```yql
PRAGMA package("project.package", "http://intranet.site/path/to/package");
PRAGMA override_library("project/package/maybe/nested/module/name.sql");
IMPORT pkg.project.package.foo SYMBOLS $foo;
SELECT $foo;
```
## Отладочные и служебные {#debug}
### `config.flags("ValidateUdf", "Lazy")`
| Тип значения | По умолчанию |
| --- | --- |
| Строка: None / Lazy / Greedy | None |
Валидация результатов UDF на соответствие объявленной сигнатуре. Greedy режим форсирует материализацию «ленивых» контейнеров, а Lazy — нет.
### `config.flags("Diagnostics")`
| Тип значения | По умолчанию |
| --- | --- |
| Флаг | false |
Получение диагностической информации от YQL в виде дополнительного результата запроса.