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

 
/COMPATIBILITY=< опция >[,< опция > [, …]]
< опция >::=STANDARD
          |CASTNOLENCHECK
          |CASTNOLTRM
          |GEOPREFIX
          |PGGEO
          |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 перед проверкой совместимости типов происходит усечение лишних концевых пробелов в текстовых константах. Концевые пробелы в пределах длины типа не усекаются при операциях над значенями типов CHAR и NCHAR (как это делается в обычном режиме).

    create or replace table tab2(c1 char(10), c2 char(10));
    insert into tab2 values ('123', '456');
    set compatibility 'STANDARD' on;
    select c1 || c2 from tab2;
    |123       456       |
    set compatibility 'STANDARD' off;
    select c1 || c2 from tab2;
    |123456              |

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

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

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

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

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

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

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

  10. сравнение NULL-значения < значимого выражения условия > в опции CASE с NULL-значением < значимого выражения условия > в опции WHEN.

    При запуске c опцией STANDARD результат - FALSE.

    При запуске без опции STANDARD результат - TRUE.

  11. удаление таблицы (синонима), на которую ссылается представление.

    Запрещено обычное удаление таблицы, на которую ссылаются представления (VIEW). При этом на консоль ядра СУБД и в файл linter.out выдаётся список объектов, ссылающихся на удаляемый объект и не позволяющих его удалить.

  12. доступ личной последовательности.

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

  13. тип данных результата функция SUM.

    При запуске c опцией STANDARD функция SUM с аргументом одного из типов SMALLINT, INT, BIGINT возвращает результат типа BIGINT, при работе в обычном режиме она в этих же случаях возвращает результат типа DECIMAL.

Опция CASTNOLENCHECK

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

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

Опция CASTNOLTRM

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

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

Опция GEOPREFIX

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

Опция PGGEO

В данном режиме координаты могут быть разделены пробелами и запятыми, в стандартном режиме они могут быть разделены только пробелами. При этом для каждой точки допустимо указание до 4-х координат из многомерного пространства, реально используются из которых только первые две.

Опция 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-значение).

  • Наличие псевдостолбца с именем «LEVEL» в выборке вида SELECT * FROM… зависит от ключа /COMPATIBILITY=ORACLE в команде запуска ядра СУБД:

    1. псевдостолбец будет присутствовать, если ключ не задан;

    2. псевдостолбец будет отсутствовать, если ключ задан.

Опция BROWSE_BLOB

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

Опция NOREC_EXCEPTION

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

Опция OPTIMISTIC

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

Опция NAMES_UPPERCASE

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

Примечание

Поддерживается со сборки 6.0.17.97.