Соответствие стандарту SQL

В этом разделе в общих чертах описывается, в какой степени QHB соответствует текущему стандарту SQL. Следующая информация не является полноценной декларацией соответствия, но при этом представляет основные темы достаточно подробно, чтобы быть полезной и целесообразной для пользователей.

Официально стандарт SQL называется ISO/IEC 9075 «Database Language SQL» (Язык баз данных SQL). Время от времени выпускается обновленная версия стандарта; последнее обновление было сделано в 2016 году. Эта версия стандарта получила название ISO/IEC 9075:2016, или просто SQL:2016. Ранее были выпущены версии SQL:2011, SQL:2008, SQL:2006, SQL:2003, SQL:1999 и SQL-92. Каждая версия заменяет предыдущую, поэтому заявления о соответствии более ранним версиям не имеют официальной ценности. Разработка QHB нацелена на соответствие последней официальной версии стандарта, если оно не противоречит традиционному функционалу или здравому смыслу. Поддерживается большая часть функционала, требуемого стандартом SQL, хотя иногда с немного отличающимся синтаксисом или функциями. Можно ожидать, что со временем степень соответствия стандарту будет постепенно возрастать.

SQL-92 определил три уровня функционального соответствия стандарту: начальный (Entry), промежуточный (Intermediate) и полный (Full). Большинство СУБД, заявлявших о соответствии стандарту SQL, соответствовали ему только на начальном уровне, поскольку общий набор функций на промежуточном и полном уровнях либо был слишком обширным, либо конфликтовал с устаревшими моделями поведения.

Начиная с SQL:1999, вместо трех бесполезных пространных уровней, вычлененных в SQL-92, в стандарте SQL определен широкий ряд отдельных функциональных возможностей. Большое его подмножество представляет собой «Основной» функционал, который должны обеспечивать все реализации, совместимые с SQL. Поддержка остальных возможностей не являются обязательной.

Версии стандарта, начиная с SQL:2003, также разбиты на несколько частей. Каждая часть имеет краткое название. Обратите внимание, что нумерация этих частей непоследовательная.

  • ISO/IEC 9075-1 Структура (SQL/Framework)

  • ISO/IEC 9075-2 Основа (SQL/Foundation)

  • ISO/IEC 9075-3 Интерфейс уровня вызовов (SQL/CLI)

  • ISO/IEC 9075-4 Модули постоянного хранения (SQL/PSM)

  • ISO/IEC 9075-9 Управление внешними данными (SQL/MED)

  • ISO/IEC 9075-10 Привязки объектных языков (SQL/OLB)

  • ISO/IEC 9075-11 Схемы информации и определений (SQL/Schemata)

  • ISO/IEC 9075-13 Программы и типы, использующие язык Java (SQL/JRT)

  • ISO/IEC 9075-14 Спецификации, связанные с XML (SQL/XML)

  • ISO/IEC 9075-15 Многомерные массивы (SQL/MDA)

Ядро QHB реализует части 1, 2, 9, 11 и 14. Часть 3 реализуется драйвером ODBC, а часть 13 — плагином PL/Java, но точное соответствие этих компонентов стандарту на данный момент не проверено. Части 4, 10 и 15 в QHB в настоящее время не реализованы.

QHB поддерживает почти весь основной функционал SQL:2016. Из 177 обязательных возможностей, необходимых для полного соответствия «Основному» функционалу, QHB обеспечивает соответствие как минимум для 170. Кроме того, она поддерживает длинный список дополнительных возможностей. Следует отметить, что на момент написания этой документации ни одна из существующих версий СУБД не претендовала на полное соответствие «Основному» функционалу SQL:2016.

В следующих двух разделах мы предоставляем список функциональных возможностей, которые поддерживает QHB, а также список возможностей, определенных в SQL:2016, которые в QHB еще не поддерживаются. Оба списка носят приблизительный характер: функционал, указанный как поддерживаемый, может отличаться от стандарта в незначительных деталях, а неподдерживаемый функционал на самом деле может быть по большей части реализован. Наиболее точная информация о том, что работает, а что нет, содержится в основной документации.

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



Поддерживаемый функционал

ИдентификаторОснова?ОписаниеКомментарий
B012Встроенный C
B021Непосредственный SQL
E011ОсноваЧисловые типы данных
E011-01ОсноваТипы данных INTEGER и SMALLINT
E011-02ОсноваТипы данных REAL, DOUBLE PRECISION и FLOAT
E011-03ОсноваТипы данных DECIMAL и NUMERIC
E011-04ОсноваАрифметические операторы
E011-05ОсноваЧисловое сравнение
E011-06ОсноваНеявное приведение среди числовых типов данных
E021ОсноваСимвольные типы данных
E021-01ОсноваТип данных CHARACTER
E021-02ОсноваТип данных CHARACTER VARYING
E021-03ОсноваСимвольные литералы
E021-04ОсноваФункция CHARACTER_LENGTHубирает завершающие пробелы из значений CHARACTER перед подсчетом
E021-05ОсноваФункция OCTET_LENGTH
E021-06ОсноваФункция SUBSTRING
E021-07ОсноваКонкатенация символов
E021-08ОсноваФункции UPPER и LOWER
E021-09ОсноваФункция TRIM
E021-10ОсноваНеявные приведения среди типов символьных строк
E021-11ОсноваФункция POSITION
E021-12ОсноваСравнение символов
E031ОсноваИдентификаторы
E031-01ОсноваИдентификаторы с разделителями
E031-02ОсноваИдентификаторы в нижнем регистре
E031-03ОсноваЗавершающее подчеркивание
E051ОсноваБазовая спецификация запросов
E051-01ОсноваSELECT DISTINCT
E051-02ОсноваПредложение GROUP BY
E051-04ОсноваGROUP BY может содержать столбцы не из <списка выборки>
E051-05ОсноваЭлементы списка выборки можно переименовывать
E051-06ОсноваПредложение HAVING
E051-07ОсноваУточняющий символ * в списке выборки
E051-08ОсноваКорреляционные имена в предложении FROM
E051-09ОсноваПереименование столбцов в предложении FROM
E061ОсноваБазовые предикаты и условия поиска
E061-01ОсноваПредикат сравнения
E061-02ОсноваПредикат BETWEEN
E061-03ОсноваПредикат IN со списком значений
E061-04ОсноваПредикат LIKE
E061-05ОсноваПредложение ESCAPE в предикате LIKE
E061-06ОсноваПредикат NULL
E061-07ОсноваПредикаты количественного сравнения
E061-08ОсноваПредикат EXISTS
E061-09ОсноваПодзапросы в предикате сравнения
E061-11ОсноваПодзапросы в предикате IN
E061-12ОсноваПодзапросы в предикате количественного сравнения
E061-13ОсноваКоррелирующие подзапросы
E061-14ОсноваУсловие поиска
E071ОсноваБазовые выражения запросов
E071-01ОсноваТабличный оператор UNION DISTINCT
E071-02ОсноваТабличный оператор UNION ALL
E071-03ОсноваТабличный оператор EXCEPT DISTINCT
E071-05ОсноваСтолбцам, объединенным с помощью табличных операторов, необязательно иметь одинаковый тип данных.
E071-06ОсноваТабличные операторы в подзапросах
E081ОсноваОсновные права доступа
E081-01ОсноваПраво на SELECT
E081-02ОсноваПраво на DELETE
E081-03ОсноваПраво на INSERT на уровне таблицы
E081-04ОсноваПраво на UPDATE на уровне таблицы
E081-05ОсноваПраво на UPDATE на уровне столбца
E081-06ОсноваПраво REFERENCES на уровне таблицы
E081-07ОсноваПраво REFERENCES на уровне столбца
E081-08ОсноваПредложение WITH GRANT OPTION
E081-09ОсноваПраво USAGE
E081-10ОсноваПраво на EXECUTE
E091ОсноваФункции множеств
E091-01ОсноваAVG
E091-02ОсноваCOUNT
E091-03ОсноваMAX
E091-04ОсноваMIN
E091-05ОсноваSUM
E091-06ОсноваКвантификатор ALL
E091-07ОсноваКвантификатор DISTINCT
E101ОсноваБазовые манипуляции с данными
E101-01ОсноваОператор INSERT
E101-03ОсноваОператор UPDATE с критерием отбора
E101-04ОсноваОператор DELETE с критерием отбора
E111ОсноваОператор SELECT, возвращающий одну строку
E121ОсноваБазовая поддержка курсоров
E121-01ОсноваDECLARE CURSOR
E121-02ОсноваСтолбцы ORDER BY, которым необязательно быть в списке выборки
E121-03ОсноваВыражения значений в предложении ORDER BY
E121-04ОсноваОператор OPEN
E121-06ОсноваОператор UPDATE с позиционированием
E121-07ОсноваОператор DELETE с позиционированием
E121-08ОсноваОператор CLOSE
E121-10ОсноваОператор FETCH с неявным NEXT
E121-17ОсноваКурсоры WITH HOLD
E131ОсноваПоддержка значения NULL (NULL вместо значений)
E141ОсноваБазовые ограничения целостности
E141-01ОсноваОграничения NOT NULL
E141-02ОсноваОграничения UNIQUE столбцов NOT NULL
E141-03ОсноваОграничения PRIMARY KEY
E141-04ОсноваОсновное ограничение FOREIGN KEY со значением по умолчанию NO ACTION (без действия) как для операции удаления со ссылками, так и для операций изменения со ссылками
E141-06ОсноваОграничения CHECK
E141-07ОсноваЗначения столбцов по умолчанию
E141-08ОсноваNOT NULL распространяется на PRIMARY KEY
E141-10ОсноваИмена во внешнем ключе можно указывать в любом порядке
E151ОсноваПоддержка транзакций
E151-01ОсноваОператор COMMIT
E151-02ОсноваОператор ROLLBACK
E152ОсноваБазовый оператор SET TRANSACTION
E152-01ОсноваОператор SET TRANSACTION: предложение ISOLATION LEVEL SERIALIZABLE
E152-02ОсноваОператор SET TRANSACTION: предложения READ ONLY и READ WRITE
E153ОсноваОбновляемые запросы с подзапросами
E161ОсноваКомментарии SQL, начинающиеся с двух минусов
E171ОсноваПоддержка SQLSTATE
E182ОсноваПривязки для базовых языков
F021ОсноваБазовая информационная схема
F021-01ОсноваПредставление COLUMNS
F021-02ОсноваПредставление TABLES
F021-03ОсноваПредставление VIEWS
F021-04ОсноваПредставление TABLE_CONSTRAINTS
F021-05ОсноваПредставление REFERENTIAL_CONSTRAINTS
F021-06ОсноваПредставление CHECK_CONSTRAINTS
F031ОсноваБазовые манипуляции со схемой
F031-01ОсноваОператор CREATE TABLE для создания хранимых базовых таблиц
F031-02ОсноваОператор CREATE VIEW
F031-03ОсноваОператор GRANT
F031-04ОсноваОператор ALTER TABLE: предложение ADD COLUMN
F031-13ОсноваОператор DROP TABLE: предложение RESTRICT
F031-16ОсноваОператор DROP VIEW: предложение RESTRICT
F031-19ОсноваОператор REVOKE: предложение RESTRICT
F032Каскадное удаление (CASCADE)
F033Оператор ALTER TABLE: предложение DROP COLUMN
F034Расширенный оператор REVOKE
F034-01Оператор REVOKE, выполняемый не владельцем объекта схемы
F034-02Оператор REVOKE: предложение GRANT OPTION FOR
F034-03Оператор REVOKE для отзыва права, данного субъекту с указанием WITH GRANT OPTION
F041ОсноваБазовое соединение таблиц
F041-01ОсноваВнутреннее соединение (но не обязательно с ключевым словом INNER)
F041-02ОсноваКлючевое слово INNER
F041-03ОсноваLEFT OUTER JOIN
F041-04ОсноваRIGHT OUTER JOIN
F041-05ОсноваВнешние соединения могут быть вложенными
F041-07ОсноваВнутренняя таблица с левой или правой стороны внешнего соединения также может использоваться во внутреннем соединении
F041-08ОсноваПоддерживаются все операторы сравнения (а не только =)
F051ОсноваБазовая поддержка даты и времени
F051-01ОсноваТип данных DATE (включая поддержку литерала DATE)
F051-02ОсноваТип данных TIME (включая поддержку литерала TIME) с точностью до доли секунды как минимум с 0 знаков после запятой
F051-03ОсноваТип данных TIMESTAMP (включая поддержку литерала TIMESTAMP) с точностью до доли секунды как минимум с 0 и 6 знаками после запятой
F051-04ОсноваПредикат сравнения для типов данных DATE, TIME и TIMESTAMP
F051-05ОсноваЯвное приведение (CAST) между типами даты/времени и типами символьных строк
F051-06ОсноваCURRENT_DATE
F051-07ОсноваLOCALTIME
F051-08ОсноваLOCALTIMESTAMP
F052Арифметика с интервалами и датами/временем
F053Предикат OVERLAPS
F081ОсноваUNION и EXCEPT в представлениях
F111Уровни изоляции, отличные от SERIALIZABLE
F111-01Уровень изоляции READ UNCOMMITTED
F111-02Уровень изоляции READ COMMITTED
F111-03Уровень изоляции REPEATABLE READ
F131ОсноваОперации группировки
F131-01ОсноваПредложения WHERE, GROUP BY и HAVING, поддерживаемые в запросах со сгруппированными представлениями
F131-02ОсноваПоддержка нескольких таблиц в запросах со сгруппированными представлениями
F131-03ОсноваПоддержка функций множеств в запросах со сгруппированными представлениями
F131-04ОсноваПодзапросы с предложениями GROUP BY и HAVING и сгруппированными представлениями
F131-05ОсноваSELECT, возвращающий одну строку, с предложениями GROUP BY и HAVING и сгруппированными представлениями
F171Несколько схем для одного пользователя
F181ОсноваПоддержка множества модулей
F191Действия при удалении со ссылками
F200Оператор TRUNCATE TABLE
F201ОсноваФункция CAST
F202TRUNCATE TABLE: возможность перезапуска столбца идентификаторов
F221ОсноваЯвные значения по умолчанию
F222Оператор INSERT: предложение DEFAULT VALUES
F231Таблицы прав
F231-01Представление TABLE_PRIVILEGES
F231-02Представление COLUMN_PRIVILEGES
F231-03Представление USAGE_PRIVILEGES
F251Поддержка доменов
F261ОсноваВыражение CASE
F261-01ОсноваПростой оператор CASE
F261-02ОсноваОператор CASE с критериями отбора
F261-03ОсноваNULLIF
F261-04ОсноваCOALESCE
F262Расширенное выражение CASE
F271Составные символьные литералы
F281Улучшенный оператор LIKE
F302Табличный оператор INTERSECT
F302-01Табличный оператор INTERSECT DISTINCT
F302-02Табличный оператор INTERSECT ALL
F304Табличный оператор EXCEPT ALL
F311ОсноваОператор определения схемы
F311-01ОсноваCREATE SCHEMA
F311-02ОсноваCREATE TABLE для хранимых базовых таблиц
F311-03ОсноваCREATE VIEW
F311-04ОсноваCREATE VIEW: WITH CHECK OPTION
F311-05ОсноваОператор GRANT
F321Авторизация пользователей
F341Таблицы используемости
F361Поддержка подпрограмм
F381Расширенные манипуляции со схемой
F381-01Оператор ALTER TABLE: предложение ALTER COLUMN
F381-02Оператор ALTER TABLE: предложение ADD CONSTRAINT
F381-03Оператор ALTER TABLE: предложение DROP CONSTRAINT
F382Изменение типа данных столбца
F383Предложение, устанавливающее NOT NULL для столбца
F384Предложение, удаляющее свойство столбца идентификаторов
F385Предложение, удаляющее выражение генерирования столбца
F386Предложение, устанавливающее генерирование значений столбца идентификаторов
F391Длинные идентификаторы
F392Управляющие символы Unicode в идентификаторах
F393Управляющие символы Unicode в литералах
F394Необязательное указание нормальной формы
F401Расширенное соединение таблиц
F401-01NATURAL JOIN
F401-02FULL OUTER JOIN
F401-04CROSS JOIN
F402Соединения по именам столбцов для больших объектов, массивов и мультимножеств
F404Диапазонная переменная для имен общих столбцов
F411Указание часового поясаотличия в интерпретации литералов
F421Национальные символы
F431Прокручиваемые курсоры только для чтения
F431-01FETCH с явным NEXT
F431-02FETCH FIRST
F431-03FETCH LAST
F431-04FETCH PRIOR
F431-05FETCH ABSOLUTE
F431-06FETCH RELATIVE
F441Расширенная поддержка функций множеств
F442Смешанные ссылки на столбцы в функциях множеств
F471ОсноваСкалярные значения подзапросов
F481ОсноваРасширенный предикат NULL
F491Управление ограничениями
F501ОсноваПредставления функционалов и соответствия
F501-01ОсноваПредставление SQL_FEATURES
F501-02ОсноваПредставление SQL_SIZING
F502Таблицы расширенной документации
F531Временные таблицы
F555Дополнительная точность в секундах
F561Полные выражения значений
F571Проверки значений истинности
F591Производные таблицы
F611Типы данных для индикаторов
F641Конструкторы строк и таблиц
F651Спецификаторы имен каталогов
F661Простые таблицы
F672Ретроспективные проверочные ограничения
F690Поддержка правил сортировкино без поддержки наборов символов
F692Расширенная поддержка правил сортировки
F701Действия при обновлении со ссылками
F711ALTER для домена
F731Права на INSERT для столбцов
F751Усовершенствования CHECK для представлений
F761Управление сеансом
F762CURRENT_CATALOG
F763CURRENT_SCHEMA
F771Управление соединением
F781Самоссылающиеся операции
F791Нечувствительные курсоры
F801Полные функции множеств
F850<Предложение order by> на верхнем уровне в <выражении запроса>
F851<Предложение order by> в подзапросах
F852<Предложение order by> на верхнем уровне в представлениях
F855Вложенное <предложение order by> в <выражении запроса>
F856Вложенное <предложение fetch first> в <предложении запроса>
F857<Предложение fetch first> на верхнем уровне в <выражении запроса>
F858<Предложение fetch first> в подзапросах
F859<Предложение fetch first> на верхнем уровне в представлениях
F860<Указание числа строк> в <предложении fetch first>
F861<Предложение offset для результата> на верхнем уровне в <выражении запроса>
F862<Предложение offset для результата> в подзапросах
F863Вложенное <предложение offset для результата> в <выражении запроса>
F864<Предложение offset для результата> на верхнем уровне в представлениях
F865<Указание числа строк> с <предложением offset для результата>
F867Предложение FETCH FIRST: параметр WITH TIES
S071Пути SQL при разрешении имен функций и типов
S092Массивы пользовательских типов
S095Конструкторы массива из запроса
S096Необязательное указание границ массива
S098ARRAY_AGG
S111ONLY в выражениях запросов
S201Вызываемые из SQL подпрограммы для массивов
S201-01Параметры-массивы
S201-02Массивы в качестве типа результата функций
S211Пользовательские функции приведений
S301Расширенный UNNEST
S404TRIM_ARRAY
T031Тип данных BOOLEAN
T071Тип данных BIGINT
T121WITH (без RECURSIVE) в выражении запроса
T122WITH (без RECURSIVE) в подзапросе
T131Рекурсивный запрос
T132Рекурсивный запрос в подзапросе
T133Расширенные значения для меток цикловРазрабатываемый SQL:202x
T141Предикат SIMILAR
T151Предикат DISTINCT
T152Предикат DISTINCT с отрицанием
T171Предложение LIKE в определении таблицы
T172Предложение подзапроса AS в определении таблицы
T173Расширенное предложение LIKE в определении таблицы
T174Столбцы идентификаторов
T177Поддержка генератора последовательностей: возможность простого перезапуска
T178Столбцы идентификаторов: возможность простого перезапуска
T191Действие RESTRICT при нарушении ссылок
T201Сравнимые типы данных для ссылочных ограничений
T211-01Триггеры, активируемые при UPDATE, INSERT или DELETE в одной базовой таблице
T211-02Триггеры BEFORE
T211-03Триггеры AFTER
T211-04Триггеры FOR EACH ROW
T211-05Возможность задать условие поиска, которое должно быть истинным перед вызовом триггера
T211-07Право TRIGGER
T212Расширенные возможности триггеров
T213Триггеры INSTEAD OF
T241Оператор START TRANSACTION
T261Сцепленные транзакции
T271Точки сохранения
T281Право SELECT на уровне столбцов
T285Расширенные имена производных столбцов
T312Функция OVERLAY
T321-01ОсноваПользовательские функции без перегрузки
T321-02ОсноваПользовательские хранимые процедуры без перегрузки
T321-03ОсноваВызов функций
T321-04ОсноваОператор CALL
T321-06ОсноваПредставление ROUTINES
T321-07ОсноваПредставление PARAMETERS
T323Явная настройка безопасности внешних подпрограмм
T325Уточненные ссылки на параметры SQL
T331Базовые роли
T332Расширенные роли
T341Перегрузка вызываемых из SQL функций и процедур
T351Скобочные комментарии SQL (комментарии /*...*/)
T431Расширенные возможности группирования
T432Вложения и конкатенация GROUPING SETS
T433Многоаргументная функция GROUPING
T434GROUP BY DISTINCT
T441Функции ABS и MOD
T461Симметричный предикат BETWEEN
T491Производная таблица LATERAL
T501Расширенный предикат EXISTS
T521Именованные аргументы в операторе CALL
T523Значения по умолчанию для параметров INOUT процедур, вызываемых из SQL
T524Именованные аргументы при вызовах подпрограмм без применения оператора CALL
T525Значения по умолчанию для параметров функций, вызываемых из SQL
T551Необязательные ключевые слова для синтаксиса по умолчанию
T581Функция подстроки регулярного выражения
T591Ограничения UNIQUE для столбцов, принимающих NULL
T611Элементарные операции OLAP
T612Расширенные операции OLAP
T613Формирование выборка
T614Функция NTILE
T615Функции LEAD и LAG
T617Функции FIRST_VALUE и LAST_VALUE
T620Предложение WINDOW: параметр GROUPS
T621Расширенные числовые функции
T622Тригонометрические функции
T623Общие логарифмические функции
T624Стандартные логарифмические функции
T631ОсноваПредикат IN с одним элементом списка
T651Операторы SQL-схемы в подпрограммах SQL
T653Операторы SQL-схемы во внешних подпрограммах
T655Циклически зависимые подпрограммы
T831Язык путей SQL/JSON: строгий режим
T832Язык путей SQL/JSON: метод элементов
T833Язык путей SQL/JSON: множественные индексы
T834Язык путей SQL/JSON: метод доступа к членам по символу подстановки (*)
T835Язык путей SQL/JSON: выражения фильтров
T836Язык путей SQL/JSON: предикат «начинается с»
T837Язык путей SQL/JSON: предикат regex_like
X010Тип XML
X011Массивы типа XML
X014Атрибуты типа XML
X016Хранимые значения XML
X020XMLConcat
X031XMLElement
X032XMLForest
X034XMLAgg
X035XMLAgg: параметр ORDER BY
X036XMLComment
X037XMLPI
X040Базовое отображение таблиц
X041Базовое отображение таблиц: отсутствуют значения NULL
X042Базовое отображение таблиц: NULL в виде nil
X043Базовое отображение таблиц: таблица в виде леса элементов
X044Базовое отображение таблицы: таблица в виде элемента
X045Базовое отображение таблиц: с целевым пространством имен
X046Базовое отображение таблиц: отображение данных
X047Базовое отображение таблиц: отображение метаданных
X048Базовое отображение таблиц: кодирование двоичных строк в base64
X049Базовое отображение таблиц: кодирование двоичных строк в шестнадцатеричном виде
X050Расширенное отображение таблиц
X051Расширенное отображение таблиц: отсутствуют значения NULL
X052Расширенное отображение таблицы: NULL в виде nil
X053Расширенное отображение таблиц: таблица в виде леса элементов
X054Расширенное отображение таблицы: таблица в виде элемента
X055Расширенное отображение таблиц: с целевым пространством имен
X056Расширенное отображение таблиц: отображение данных
X057Расширенное отображение таблиц: отображение метаданных
X058Расширенное отображение таблиц: кодирование двоичных строк в base64
X059Расширенное отображение таблиц: кодирование двоичных строк в шестнадцатеричном виде
X060XMLParse: ввод символьных строк и параметр CONTENT
X061XMLParse: ввод символьных строк и параметр DOCUMENT
X070XMLSerialize: сериализация символьных строк и параметр CONTENT
X071XMLSerialize: сериализация символьных строк и параметр DOCUMENT
X072XMLSerialize: сериализация символьных строк
X090Предикат XML-документа
X120Параметры XML в подпрограммах SQL
X121Параметры XML во внешних подпрограммах
X221Механизм передачи XML BY VALUE
X301XMLTable: выбор списка производных столбцов
X302XMLTable: выбор столбца нумерации
X303XMLTable: выбор столбца по умолчанию
X304XMLTable: передача элемента контекстатребуется XML DOCUMENT
X400Сопоставление имен и идентификаторов
X410Изменение типа данных столбца: поддержка типа XML

Неподдерживаемый функционал

Следующие возможности, определенные в SQL:2016, не реализованы в этой версии QHB. В некоторых случаях доступна равнозначная им функциональность.

ИдентификаторОснова?ОписаниеКомментарий
B011Встроенный язык Ada
B013Встроенный язык COBOL
B014Встроенный язык Fortran
B015Встроенный язык MUMPS
B016Встроенный язык Pascal
B017Встроенный язык PL/I
B031Базовый динамический SQL
B032Расширенный динамический SQL
B032-01<Оператор describe input>
B033Нетипизированные аргументы функции, вызываемой из SQL
B034Динамическое указание атрибутов курсора
B035Нерасширенные имена дескрипторов
B041Расширения встроенных объявлений исключений SQL
B051Расширенные права для выполнения
B111Язык модулей — Ada
B112Язык модулей — C
B113Язык модулей — COBOL
B114Язык модулей — Fortran
B115Язык модулей — MUMPS
B116Язык модулей — Pascal
B117Язык модулей — PL/I
B121Язык подпрограмм — Ada
B122Язык подпрограмм — C
B123Язык подпрограмм — COBOL
B124Язык подпрограмм — Fortran
B125Язык подпрограмм — MUMPS
B126Язык подпрограмм — Pascal
B127Язык подпрограмм — PL/I
B128Язык подпрограмм — SQL
B200Полиморфные табличные функции (PTF)
B201Более одного обобщенного табличного параметра PTF
B202Соразделение PTF
B203Более одного указания соразделения
B204PRUNE WHEN EMPTY
B205Сквозное использование столбцов
B206Параметры дескриптора PTF
B207Векторное произведение партиционирований
B208Интерфейс компонентных процедур PTF
B209Расширенные имена PTF
B211Язык модулей — Ada: поддержка VARCHAR и NUMERIC
B221Язык подпрограмм — Ada: поддержка VARCHAR и NUMERIC
F054TIMESTAMP в списке приоритетов типа DATE
F121Базовое управление диагностикой
F121-01Оператор GET DIAGNOSTICS
F121-02Оператор SET TRANSACTION: предложение DIAGNOSTICS SIZE
F122Расширенное управление диагностикой
F123Вся диагностика
F263Разделенные запятыми предикаты в простом выражении CASE
F291Предикат UNIQUE
F301CORRESPONDING в выражениях запросов
F312Оператор MERGEвозможная альтернатива — INSERT ... ON CONFLICT DO UPDATE
F313Расширенный оператор MERGE
F314Оператор MERGE с ветвью DELETE
F403Партиционированные соединенные таблицы
F451Определение набора символов
F461Именованные наборы символов
F492Необязательное указание соблюдения ограничений таблицы
F521Утверждения
F671Подзапросы в CHECKнамеренно опущен
F673Вызовы подпрограммы, читающей SQL-данные, в условиях CHECK
F693Порядок сопоставления символов для SQL-сеансов и клиентских модулей
F695Поддержка перекодировки
F696Дополнительная документация по перекодировке
F721Откладываемые ограничениятолько сторонние и уникальные ключи
F741Типы ссылочных совпадений MATCHпока без частичного совпадения
F812ОсноваБазовое флагирование
F813Расширенное флагирование
F821Ссылки на локальные таблицы
F831Полное изменение курсора
F831-01Изменяемые прокручиваемые курсоры
F831-02Обновляемые упорядоченные курсоры
F841Предикат LIKE_REGEX
F842Функция OCCURRENCES_REGEX
F843Функция POSITION_REGEX
F844Функция SUBSTRING_REGEX
F845Функция TRANSLATE_REGEX
F846Поддержка октетов в операторах регулярных выражений
F847Неконстантные регулярные выражения
F866Предложение FETCH FIRST: параметр PERCENT
R010Распознавание шаблона строк: предложение FROM
R020Распознавание шаблона строк: предложение WINDOW
R030Распознавание шаблона строк: полная поддержка агрегатов
S011ОсноваРазличные типы данных
S011-01ОсноваПредставление USER_DEFINED_TYPES
S023Базовые структурированные типы
S024Расширенные структурированные типы
S025Окончательные структурированные типы
S026Самоссылающиеся структурированные типы
S027Создание метода по заданному имени метода
S028Допускающий перестановку список параметров UDT
S041Базовые ссылочные типы
S043Расширенные ссылочные типы
S051Создание таблицы из типачастично поддерживается
S081Подтаблицы
S091Базовая поддержка массивовчастично поддерживается
S091-01Массивы встроенных типов данных
S091-02Массивы отдельных типов
S091-03Выражения с массивами
S094Массивы ссылочных типов
S097Присвоение значения элементу массива
S151Предикат типа
S161Обработка подтипов
S162Обработка подтипов для ссылочных типов
S202Вызываемые из SQL подпрограммы для мультимножеств
S231Указатели на структурные типы
S232Указатели на массивы
S233Указатели на мультимножества
S241Функции преобразований
S242Оператор изменения преобразования
S251Упорядочивания, определяемые пользователем
S261Метод SPECIFICTYPE
S271Базовая поддержка мультимножеств
S272Мультимножества пользовательских типов
S274Мультимножества ссылочных типов
S275Расширенная поддержка мультимножеств
S281Типы вложенных коллекций
S291Ограничение уникальности для всей строки
S401Различные типы на основе типов массивов
S402Различные типы на основе отдельных типов
S403ARRAY_MAX_CARDINALITY
T011Метка времени в информационной схеме
T021Типы данных BINARY и VARBINARY
T022Расширенная поддержка типов данных BINARY и VARBINARY
T023Составные двоичные литералы
T024Пробелы в двоичных литералах
T041Базовая поддержка типов данных LOB
T041-01Тип данных BLOB
T041-02Тип данных CLOB
T041-03Функции POSITION, LENGTH, LOWER, TRIM, UPPER и SUBSTRING для типов данных LOB
T041-04Конкатенация типов данных LOB
T041-05Указатель на LOB: неудерживаемый
T042Расширенная поддержка типов данных LOB
T043Множитель T
T044Множитель P
T051Типы строк
T053Явные псевдонимы для ссылки на все поля
T061Поддержка UCS
T076Тип данных DECFLOAT
T101Расширенное определение допустимости значений NULL
T111Изменяемые соединения, объединения и столбцы
T175Генерируемые столбцыв основном поддерживается
T176Поддержка генератора последовательностейподдерживается за исключением NEXT VALUE FOR
T180Системно версионируемые таблицы
T181Таблицы с периодом времени применения
T211Базовые возможности триггеров
T211-06Поддержка правил времени выполнения для взаимодействия триггеров и ограничений
T211-08Несколько триггеров для одного события выполняются в том порядке, в каком они были созданы в каталогенамеренно опущено
T231Чувствительные курсоры
T251Оператор SET TRANSACTION: параметр LOCAL
T272Расширенное управление точками сохранения
T301Функциональные зависимостичастично поддерживается
T321ОсноваБазовые подпрограммы, вызываемые из SQL
T321-05ОсноваОператор RETURN
T322PSMОбъявляемые атрибуты типа данных
T324Явная настройка безопасности подпрограмм SQL
T326Табличные функции
T471Наборы результатов в качестве возвращаемого значения
T472DESCRIBE CURSOR
T495Совмещенное изменение и извлечение данныхдругой синтаксис
T502Предикаты периодов
T511Счетчики транзакций
T522Значения по умолчанию для параметров IN процедур, вызываемых из SQLподдерживаются, за исключением ключевого слова DEFAULT в вызове
T561Удерживаемые указатели
T571Возвращающие массивы внешние функции, вызываемые из SQL
T572Возвращающие мультимножества внешние функции, вызываемые из SQL
T601Ссылки на локальные курсоры
T616Варианты обработки NULL для функций LEAD и LAG
T618Функция NTH_VALUEфункция существует, но некоторые параметры отсутствуют
T619Вложенные оконные функции
T625LISTAGG
T641Присвоение значения нескольким столбцамподдерживаются только некоторые варианты синтаксиса
T652Операторы динамического SQL в подпрограммах SQL
T653Операторы модификации схемы SQL во внешних подпрограммах
T654Операторы динамического SQL во внешних подпрограммах
T811Базовые функции-конструкторы SQL/JSON
T812SQL/JSON: JSON_OBJECTAGG
T813SQL/JSON: JSON_ARRAYAGG с ORDER BY
T814Двоеточие в JSON_OBJECT или JSON_OBJECTAGG
T821Базовые операторы запросов SQL/JSON
T822SQL/JSON: предикат IS JSON WITH UNIQUE KEYS
T823SQL/JSON: предложение PASSING
T824JSON_TABLE: специфичное предложение PLAN
T825SQL/JSON: предложения ON EMPTY и ON ERROR
T826Выражение общего значения в предложениях ON ERROR или ON EMPTY
T827JSON_TABLE: одноуровневые предложения NESTED COLUMNS
T828JSON_QUERY
T829JSON_QUERY: варианты обертки массива
T830Требование уникальных ключей в функциях-конструкторах SQL/JSON
T838JSON_TABLE: предложение PLAN DEFAULT
T839Форматируемое приведение даты/времени из символьных строк и обратно
M001Передача данных
M002Передача данных через SQL/CLI
M003Передача данных через встроенный SQL
M004Поддержка сторонних данныхчастично поддерживается
M005Поддержка сторонних схем
M006Подпрограмма GetSQLString
M007TransmitRequest
M009Подпрограммы GetOpts и GetStatistics
M010Поддержка обертки сторонних данныхдругой API
M011Передача данных через Ada
M012Передача данных через C
M013Передача данных через COBOL
M014Передача данных через Fortran
M015Передача данных через MUMPS
M016Передача данных через Pascal
M017Передача данных через PL/I
M018Подпрограммы интерфейса обертки сторонних данных на языке Ada
M019Подпрограммы интерфейса обертки сторонних данных на языке Cдругой API
M020Подпрограммы интерфейса обертки сторонних данных на языке COBOL
M021Подпрограммы интерфейса обертки сторонних данных на языке Fortran
M022Подпрограммы интерфейса обертки сторонних данных на языке MUMPS
M023Подпрограммы интерфейса обертки сторонних данных на языке Pascal
M024Подпрограммы интерфейса обертки сторонних данных на языке PL/I
M030Поддержка сторонних данных SQL-сервера
M031Общие подпрограммы обертки сторонних данных
X012Мультимножества типа XML
X013Различные типы на основе типа XML
X015Поля типа XML
X025XMLCAST
X030XMLDocument
X038XMLText
X065XMLParse: ввод BLOB и вариант CONTENT
X066XMLParse: ввод BLOB и вариант DOCUMENT
X068XMLSerialize: BOM
X069XMLSerialize: INDENT
X073XMLSerialize: сериализация BLOB и вариант CONTENT
X074XMLSerialize: сериализация BLOB и вариант DOCUMENT
X075XMLSerialize: сериализация BLOB
X076XMLSerialize: VERSION
X077XMLSerialize: явное указание ENCODING
X078XMLSerialize: явное объявление XML
X080Пространства имен при публикации XML
X081Объявления пространств имен XML на уровне запроса
X082Объявления пространств имен XML в DML
X083Объявления пространств имен XML в DDL
X084Объявления пространств имен XML в составных операторах
X085Предопределенные префиксы пространств имен
X086Объявления пространств имен XML в XMLTable
X091Предикат содержимого XML
X096XMLExistsТолько XPath 1.0
X100Поддержка базового языка для XML: вариант CONTENT
X101Поддержка базового языка для XML: вариант DOCUMENT
X110Поддержка базового языка для XML: сопоставление VARCHAR
X111Поддержка базового языка для XML: сопоставление CLOB
X112Поддержка базового языка для XML: сопоставление BLOB
X113Поддержка базового языка для XML: параметр STRIP WHITESPACE
X114Поддержка базового языка для XML: параметр PRESERVE WHITESPACE
X131Предложение XMLBINARY на уровне запроса
X132Предложение XMLBINARY в DML
X133Предложение XMLBINARY в DDL
X134Предложение XMLBINARY в составных операторах
X135Предложение XMLBINARY в подзапросах
X141Предикат IS VALID: управляемый данными
X142Предикат IS VALID: предложение ACCORDING TO
X143Предикат IS VALID: предложение ELEMENT
X144Предикат IS VALID: расположение схемы
X145Предикат IS VALID вне проверочных ограничений
X151Предикат IS VALID с вариантом DOCUMENT
X152Предикат IS VALID с вариантом CONTENT
X153Предикат IS VALID с вариантом SEQUENCE
X155Предикат IS VALID: NAMESPACE без предложения ELEMENT
X157Предикат IS VALID: NO NAMESPACE с предложением ELEMENT
X160Базовая информационная схема для зарегистрированных XML-схем
X161Расширенная информационная схема для зарегистрированных XML-схем
X170Варианты обработки NULL с XML
X171Вариант NIL ON NO CONTENT
X181Тип XML(DOCUMENT (UNTYPED))
X182Тип XML(DOCUMENT(ANY))
X190Тип XML(SEQUENCE)
X191Тип XML(DOCUMENT(XMLSCHEMA))
X192Тип XML(CONTENT(XMLSCHEMA))
X200XMLQuery
X201XMLQuery: RETURNING CONTENT
X202XMLQuery: RETURNING SEQUENCE
X203XMLQuery: передача элемента контекста
X204XMLQuery: инициализация переменной XQuery
X205XMLQuery: указание EMPTY ON EMPTY
X206XMLQuery: указание NULL ON EMPTY
X211Поддержка XML 1.1
X222Механизм передачи XML BY REFанализатор принимает BY REF, но игнорирует его; передача всегда идет по BY VALUE
X231Тип XML(CONTENT (UNTYPED))
X232Тип XML(CONTENT (ANY))
X241RETURNING CONTENT при публикации XML
X242RETURNING SEQUENCE при публикации XML
X251Хранимые значения XML типа XML(DOCUMENT (UNTYPED))
X252Хранимые значения XML типа XML(DOCUMENT (ANY))
X253Хранимые значения XML типа XML(CONTENT (UNTYPED))
X254Хранимые значения XML типа XML(CONTENT (ANY))
X255Хранимые значения XML типа XML(SEQUENCE)
X256Хранимые значения XML типа XML(DOCUMENT (XMLSCHEMA))
X257Хранимые значения XML типа XML(CONTENT (XMLSCHEMA))
X260Тип XML: предложение ELEMENT
X261Тип XML: NAMESPACE без предложения ELEMENT
X263Тип XML: NO NAMESPACE с предложением ELEMENT
X264Тип XML: расположение схемы
X271XMLValidate: управляемый данными
X272XMLValidate: предложение ACCORDING TO
X273XMLValidate: предложение ELEMENT
X274XMLValidate: расположение схемы
X281XMLValidate с вариантом DOCUMENT
X282XMLValidate с вариантом CONTENT
X283XMLValidate с вариантом SEQUENCE
X284XMLValidate: NAMESPACE без предложения ELEMENT
X286XMLValidate: NO NAMESPACE с предложением ELEMENT
X300XMLTableТолько XPath 1.0
X305XMLTable: инициализация переменной XQuery

Ограничения XML и соответствие SQL/XML

В SQL:2006 в спецификации ISO/IEC 9075-14 (SQL/XML), посвященные XML, были внесены существенные изменения. Реализация типа данных XML и связанных с ним функций в QHB во большей степени соответствует более ранней редакции от 2003 года, с некоторыми заимствованиями из последующих редакций. В частности:

  • Тогда как в текущем стандарте предусмотрено семейство типов данных XML, содержащих «документы» или «содержимое» в нетипизированных вариантах или вариантах с типами XML Schema, а также тип XML(SEQUENCE), содержащий произвольные фрагменты содержимого XML, в QHB есть только один тип xml, который может содержать «документ» или «содержимое». Эквивалента определенному в стандарте типу «последовательность» в QHB не существует.

  • QHB предоставляет две функции, появившиеся в SQL:2006, но вместо языка XML Query, указанного для них в стандарте, в этих вариантах используется язык XPath 1.0.

В этом разделе описаны некоторые проистекающие из этого различия, с которыми вы можете столкнуться.


Запросы ограничены XPath 1.0

Специфичные для QHB функции xpath() и xpath_exists() выполняют запросы к документам XML на языке XPath. QHB также предоставляет стандартные функции XMLEXISTS и XMLTABLE, поддерживающие только XPath, хотя официально они должны поддерживать язык XQuery. Для всех этих функций QHB использует библиотеку libxml2, которая поддерживает только XPath 1.0.

Существует тесная связь между языком XQuery и XPath версии 2.0 и новее: любое выражение, которое синтаксически допустимо и успешно выполняется, выдает в обоих языках одинаковый результат (с небольшим исключением для выражений, содержащих ссылки на числовые символы или предварительно определенные сущности, которые XQuery заменяет соответствующими символами, а XPath оставляет в исходном виде). Но между этими языками и XPath 1.0 такой связи нет; он появился раньше и во многих отношениях отличается от них.

Следует иметь в виду две категории ограничений: ограничение языка XQuery до XPath для функций, указанных в стандарте SQL, и ограничение XPath до версии 1.0 как для стандартных, так и для специфичных функций QHB.


Ограничение языка XQuery относительно XPath

В число возможностей XQuery, отсутствующих у XPath, входят:

  • Выражения XQuery могут не только возвращать все возможные значения XPath, но и конструировать новые узлы XML. XPath может создавать и возвращать значения атомарных типов (числа, строки и т. д.), но возвращать способен только те узлы XML, которые уже присутствовали в документах, поступивших на вход выражения.

  • В XQuery есть управляющие конструкции для итерации, сортировки и группировки.

  • XQuery позволяет объявлять и использовать локальные функции.

В последних версиях XPath начинает появляться функционал, пересекающийся с функционалом XQuery (например функциональные конструкции for-each и sort, анонимные функции и функция parse-xml, создающая узел из строки), но до XPath 3.0 они были недоступны.

Ограничение XPath до версии 1.0

Разработчикам, знакомым с XQuery и XPath 2.0 или новее, приходится сталкиваться с рядом отличий XPath 1.0:

  • Фундаментальный тип выражения XQuery/XPath, тип sequence, который может содержать узлы XML, атомарные значения или и то, и другое, в XPath 1.0 отсутствует. В 1.0 выражение может создавать только множество узлов (содержащих ноль или более узлов XML) или одно атомарное значение.

  • В отличие от последовательности XQuery/XPath, которая может содержать любые требуемые элементы в любом желаемом порядке, во множестве узлов XPath 1.0 нет гарантированного порядка и оно, как и любое множество, не допускает несколько появлений одного и того же элемента.

Примечание
По-видимому, библиотека libxml2 всегда возвращает в QHB множества узлов с внутренними членами в том же относительном порядке, в каком они идут во входном документе. В ее документации это поведение не указано, а выражение XPath 1.0 не может им управлять.

  • Тогда как XQuery/XPath предоставляет все типы, определенные в стандарте XML Schema, а также множество операторов и функций для этих типов, XPath 1.0 поддерживает только множества узлов и три атомарных типа: boolean, double и string.

  • В XPath 1.0 отсутствует условный оператор. Выражение XQuery/XPath вида if ( hat ) then hat/@size else "no hat" не имеет эквивалента в XPath 1.0.

  • В XPath 1.0 отсутствует оператор сравнения строк с упорядочиванием. Условия "cat" < "dog" и "cat" > "dog" оба являются ложными, поскольку представляют собой числовые сравнения двух значений NaN. Условия же = и !=, напротив, сравнивают строки в виде строк.

  • XPath 1.0 размывает разницу между сравнениями значений и общими сравнениями, как они определены в XQuery/XPath. Сравнения sale/@hatsize = 7 и sale/@customer = "alice" по сути оба являются количественными сравнениями, и их результатом будет истина, если существует элемент sale с заданным значением атрибута, но sale/@taxable = false() — это сравнение значений с фактическим логическим значением всего множества узлов. Его результат будет истиной, только если ни у одного элемента sale вообще не будет атрибута taxable.

  • В модели данных XQuery/XPath узел документа может иметь либо форму документа (т. е. содержать ровно один элемент верхнего уровня, снаружи которого допускаются только комментарии и инструкции по обработке), либо форму содержимого (с ослабленными ограничениями). В XPath 1.0 ему соответствует корневой узел, который может иметь только форму документа. Это одна из причин, по которой значение типа xml, передаваемое в качестве элемента контекста любой функции QHB на базе XPath, должно быть в форме документа.

Кроме различий, отмеченных здесь, есть и другие. В языках XQuery и XPath 2.0 и новее существует режим совместимости с XPath 1.0, а имеющийся в документации W3C список изменений библиотеки функций и языковых изменений, применяемых в этом режиме, предоставляет более полное (но все же не исчерпывающее) описание различий. Режим совместимости не обеспечивает полную идентичность XPath 1.0 и более поздних языков.


Сопоставления типов данных и значений между SQL и XML

В SQL:2006 и более поздних версиях точно определены преобразования между стандартными типами данных SQL и типами стандарта XML Schema в обе стороны. Однако эти правила выражаются в типах и семантике XQuery/XPath и не могут быть напрямую применены к другой модели данных, характерной для XPath 1.0.

Когда QHB сопоставляет значения данных SQL с XML (как в функции xmlelement) или XML с SQL (как в выходных столбцах xmltable), за исключением нескольких специально обрабатываемых случаев, QHB просто предполагает, что строковая форма XPath 1.0, содержащая данные типа XML, будет допустима в качестве формы ввода в виде текста в типе данных SQL, и наоборот. Это правило подкупает своей простотой, и при этом результаты для многих типов данных именно такие, какими, согласно стандарту, должны быть у преобразований.

В тех случаях, когда требуется взаимодействие с другими системами, для некоторых типов данных может возникнуть необходимость в явном использовании функций форматирования типов данных (например, описанных в разделе Функции для форматирования типов данных) для получения сопоставлений, в точности соответствующих стандарту.


Непреднамеренные ограничения реализации

В этом разделе рассматриваются ограничения, которые присущи не самой библиотеке libxml2, а текущей реализации в QHB.

Поддерживается только механизм передачи параметров по значению (BY VALUE)

В стандарте SQL определены два механизма передачи параметров, которые применяются при передаче аргумента XML из SQL в функцию XML или получении результата: BY REF, в котором конкретное значение XML сохраняет идентификатор узла, и BY VALUE, в котором передается содержимое XML, но идентификатор узла теряется. Задать механизм можно перед списком параметров, в качестве механизма по умолчанию для всех параметров, или после каждого параметра, тем самым переопределив выбор по умолчанию.

Чтобы проиллюстрировать разницу, рассмотрим следующие два запроса. Если x является значением XML, в среде SQL:2006 они выдадут значения true и false соответственно:

SELECT XMLQUERY(’$a is $b’ PASSING BY REF x AS a, x AS b NULL ON EMPTY);

SELECT XMLQUERY(’$a is $b’ PASSING BY VALUE x AS a, x AS b NULL ON EMPTY);

QHB примет указания BY VALUE и BY REF в конструкции XMLEXISTS или XMLTABLE, но проигнорирует их. Тип данных xml содержит сериализованное представление символьной строки, поэтому идентификатор узла, который нужно сохранять, отсутствует, и фактически передача всегда производится по значению (BY VALUE).

Невозможно передать в запросы именованные параметры

Функции на основе XPath могут принимать один параметр, служащий элементом контекста для выражения XPath, но не поддерживают передачу дополнительных значений, которые могли бы использоваться в выражении как именованные параметры.

Отсутствие типа XML(SEQUENCE)

Тип данных xml в QHB может содержать значение только в форме документа (DOCUMENT) или содержимого (CONTENT). Элемент контекста выражения XQuery/XPath должен быть одиночным узлом XML или атомарным значением, но XPath 1.0 дополнительно ограничивает его только узлом XML и не имеет типа узла, содержащего CONTENT. В результате единственной формой значения XML, которую в качестве элемента контекста XPath может предоставить QHB, является корректно сформированный документ (DOCUMENT).