Ключи совместимости с SQL-стандартом и другими СУБД

/COMPATIBILITY=<опция>[,<опция> [, …]]
<опция>::=STANDARD
          |CASTNOLENCHECK
          |CASTNOLTRM
          |GEOPREFIX
          |RESIGNAL_ALL
          |ORACLE
          |BROWSE_BLOB
          |NOREC_EXCEPTION
          |OPTIMISTIC
          |NAMES_UPPERCASE
            
Опция STANDARD

При запуске с опцией STANDARD ядро СУБД ЛИНТЕР начинает жёстко придерживаться стандарта SQL92. Поведение ядра, запущенного без ключа с данной опцией, в некоторых случаях не совпадает со стандартом.

Отличия в работе ядра, запущенного с ключом /COMPATIBILITY=STANDARD:

  1. позиционные DML-операции и работа транзакций.

    При запуске с опцией STANDARD команды UPDATE CURRENT и DELETE CURRENT могут выполняться по собственному каналу, а не по тому каналу, по которому был подан SELECT-запрос. Это важно для согласованной работы транзакций.

    При запуске без опции STANDARD команды UPDATE CURRENT и DELETE CURRENT выполняются по тому каналу, по которому был подан соответствующий SELECT;

  2. очистка канала после завершения транзакции.

    При запуске с опцией STANDARD очистка канала по командам COMT/RBAC (завершение транзакции) закрывает выборку. Исключение составляет выполнение команды PUTM (в СУБД ЛИНТЕР можно подавать команду COMT внутри потока команд пакетного добавления без завершения транзакции), в этом случае выборка не будет закрыта.

    При запуске без опции STANDARD после команд COMT/ROLB выборка не будет закрыта, следовательно, можно подавать команды GET* по тому же каналу;

  3. код завершения в случае обработки 0 записей.

    При запуске с опцией STANDARD всеми DML-операциями (SELECT, DELETE, UPDATE, INSERT FROM SELECT) в случае обработки 0 записей возвращается код завершения «Нет данных» (код 2).

    При запуске без опции STANDARD в случае обработки 0 записей операциями DELETE, UPDATE, INSERT FROM SELECT возвращается код успешного завершения (код 0), а код завершения «Нет данных» возвращается только операцией SELECT;

  4. выполнение операций 'CAST <выражение> AS CHAR' в том случае, когда <выражение> имеет тип REAL или DOUBLE.

    При запуске с опцией STANDARD результат выполнения описанной операции выводится в экспоненциальной форме с усеченными нулями и без знака '+'.

    При запуске без опции STANDARD результат выполнения описанной операции всегда выводится в форме с десятичной точкой и без экспоненты (так же, как для значений DECIMAL);

  5. выполнение операций 'CAST <выражение> AS CHAR', где <выражение> имеет тип DECIMAL.

    При запуске с опцией STANDARD при преобразовании выражения типа DECIMAL с указанием точности в CHAR выводится столько символов после запятой, сколько указано точностью.

    Без опции STANDARD при преобразовании DECIMAL в CHAR концевые нули всегда усекаются;

  6. привилегии для выполнения операций DELETE/UPDATE.

    При запуске с опцией STANDARD для выполнения операции DELETE/UPDATE над некоторой таблицей с отбором записей по WHERE необходима не только привилегия DELETE/UPDATE на эту таблицу, но и привилегия SELECT на нее.

    При запуске без опции STANDARD для выполнения операции достаточно привилегии DELETE/UPDATE;

  7. усечение лишних концевых пробелов в константах.

    При запуске с опцией STANDARD перед проверкой совместимости типов происходит усечение лишних концевых пробелов в текстовых константах.

    При запуске без опции STANDARD перед проверкой совместимости типов усечение лишних концевых пробелов не происходит, например, не удастся занести в CHAR(5) константу "A" ("буква и 5 пробелов");

  8. обязательность условия для JOIN.

    При запуске с опцией STANDARD, если не задано условие соединения (ON или USING) для конструкции JOIN без конструкций NATURAL и UNION, выдается ошибка.

    При запуске без опции STANDARD условие соединения воспринимается, как если бы соединяемые по JOIN таблицы были перечислены во FROM через запятую;

  9. ESC-символ по умолчанию.

    При запуске с опцией STANDARD ESC-символа по умолчанию нет.

    При запуске без опции STANDARD ESC-символом по умолчанию является символ '\'.

Опция CASTNOLENCHECK

Задаёт подавление вывода кода завершения 1063 «Попытка усечения непустых символов» при преобразовании числового значения в строковое с явным указанием длины результата в конструкции выполнении CAST.

По умолчанию данный код завершения выдается.

Опция CASTNOLTRM

Запрещает усечение ведущих пробелов при преобразовании чисел с фиксированной точкой в строковое значение в конструкции CAST.

При задании ключа с данной опцией ведущие пробелы в 32-символьном представлении DECIMAL-значения не усекаются, по умолчанию – усекаются.

Опция GEOPREFIX

Задаёт распознавание ключевых слов подсистемы геометрических данных только при наличии префикса LIN_ (например, LIN_ASTEXT вместо ASTEXT). По умолчанию воспринимаются ключевые слова без префикса LIN_, хотя некоторые из них распознаются только в определенном контексте (например, ASTEXT, если дальше следует признак функции (открывающая скобка "(")).

Опция RESIGNAL_ALL

Заставляет некритичные исключения обрабатывать как критичные (т.е. при таком запуске ядра СУБД нет необходимости в каждом вложенном блоке явно выполнять оператор RESIGNAL).

Если опция RESIGNAL_ALL задана, то обработка некритичных исключения сразу передается в текущий <блок обработки исключений>, при его отсутствии – исключение будет передано на верхний уровень по иерархии.

Подробнее см. документ «СУБД ЛИНТЕР. Процедурный язык».

Опция ORACLE

Заставляет обеспечивать идентичность обработки данных СУБД ЛИНТЕР и ORACLE по умолчанию в случаях, когда их обработка различается.

При указании данной опции:

  • разность дат возвращается в виде значения типа NUMERIC (в днях), а не значения типа DATE;

  • выдается информация о том, что в SELECT-запросе делается попытка вызова хранимой процедуры, содержащей вызовы запросов, отличных от SELECT (выполнение которых может выдавать различные результаты при последовательных вызовах с одними и теми же аргументами). На консоль ядра СУБД и в файл linter.out будут выдаваться сообщения типа

    WARNING: user function "имя_процедуры" (#ROWID) possibly contains non-SELECT query calls

  • результатом конкатенации символьных значений с NULL-значением будет исходная символьная строка (а не NULL-значение).

Опция BROWSE_BLOB

Блокирует текущую запись, если в ней есть BLOB-значение по умолчанию так, как если бы был задан модификатор for browse, т.е. изменяет поведение при обнаружении конфликта доступа к BLOB-значению. В случае отсутствия ключа будет выдано диагностическое сообщение «Строка при работе с BLOB не заблокирована», а в случае его наличия будет выполнена блокировка записи.

Опция NOREC_EXCEPTION

При выполнении оператора FETCH процедурного языка при отсутствии обработанных строк в курсоре будет сгенерировано исключение 2 (NOREC).

Опция OPTIMISTIC

Разрешает иcпользование режима OPTMISTIC.

Опция NAMES_UPPERCASE

Приводит все идентификаторы, так же в двойных кавычках, к верхнему регистру.