Соответствие стандарту 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 | |
F202 | TRUNCATE 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-01 | NATURAL JOIN | ||
F401-02 | FULL OUTER JOIN | ||
F401-04 | CROSS JOIN | ||
F402 | Соединения по именам столбцов для больших объектов, массивов и мультимножеств | ||
F404 | Диапазонная переменная для имен общих столбцов | ||
F411 | Указание часового пояса | отличия в интерпретации литералов | |
F421 | Национальные символы | ||
F431 | Прокручиваемые курсоры только для чтения | ||
F431-01 | FETCH с явным NEXT | ||
F431-02 | FETCH FIRST | ||
F431-03 | FETCH LAST | ||
F431-04 | FETCH PRIOR | ||
F431-05 | FETCH ABSOLUTE | ||
F431-06 | FETCH 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 | Действия при обновлении со ссылками | ||
F711 | ALTER для домена | ||
F731 | Права на INSERT для столбцов | ||
F751 | Усовершенствования CHECK для представлений | ||
F761 | Управление сеансом | ||
F762 | CURRENT_CATALOG | ||
F763 | CURRENT_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 | Необязательное указание границ массива | ||
S098 | ARRAY_AGG | ||
S111 | ONLY в выражениях запросов | ||
S201 | Вызываемые из SQL подпрограммы для массивов | ||
S201-01 | Параметры-массивы | ||
S201-02 | Массивы в качестве типа результата функций | ||
S211 | Пользовательские функции приведений | ||
S301 | Расширенный UNNEST | ||
S404 | TRIM_ARRAY | ||
T031 | Тип данных BOOLEAN | ||
T071 | Тип данных BIGINT | ||
T121 | WITH (без RECURSIVE) в выражении запроса | ||
T122 | WITH (без 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 | ||
T434 | GROUP 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 | ||
X020 | XMLConcat | ||
X031 | XMLElement | ||
X032 | XMLForest | ||
X034 | XMLAgg | ||
X035 | XMLAgg: параметр ORDER BY | ||
X036 | XMLComment | ||
X037 | XMLPI | ||
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 | Расширенное отображение таблиц: кодирование двоичных строк в шестнадцатеричном виде | ||
X060 | XMLParse: ввод символьных строк и параметр CONTENT | ||
X061 | XMLParse: ввод символьных строк и параметр DOCUMENT | ||
X070 | XMLSerialize: сериализация символьных строк и параметр CONTENT | ||
X071 | XMLSerialize: сериализация символьных строк и параметр DOCUMENT | ||
X072 | XMLSerialize: сериализация символьных строк | ||
X090 | Предикат XML-документа | ||
X120 | Параметры XML в подпрограммах SQL | ||
X121 | Параметры XML во внешних подпрограммах | ||
X221 | Механизм передачи XML BY VALUE | ||
X301 | XMLTable: выбор списка производных столбцов | ||
X302 | XMLTable: выбор столбца нумерации | ||
X303 | XMLTable: выбор столбца по умолчанию | ||
X304 | XMLTable: передача элемента контекста | требуется 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 | Более одного указания соразделения | ||
B204 | PRUNE WHEN EMPTY | ||
B205 | Сквозное использование столбцов | ||
B206 | Параметры дескриптора PTF | ||
B207 | Векторное произведение партиционирований | ||
B208 | Интерфейс компонентных процедур PTF | ||
B209 | Расширенные имена PTF | ||
B211 | Язык модулей — Ada: поддержка VARCHAR и NUMERIC | ||
B221 | Язык подпрограмм — Ada: поддержка VARCHAR и NUMERIC | ||
F054 | TIMESTAMP в списке приоритетов типа DATE | ||
F121 | Базовое управление диагностикой | ||
F121-01 | Оператор GET DIAGNOSTICS | ||
F121-02 | Оператор SET TRANSACTION: предложение DIAGNOSTICS SIZE | ||
F122 | Расширенное управление диагностикой | ||
F123 | Вся диагностика | ||
F263 | Разделенные запятыми предикаты в простом выражении CASE | ||
F291 | Предикат UNIQUE | ||
F301 | CORRESPONDING в выражениях запросов | ||
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 | Различные типы на основе отдельных типов | ||
S403 | ARRAY_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 | |
T322 | PSM | Объявляемые атрибуты типа данных | |
T324 | Явная настройка безопасности подпрограмм SQL | ||
T326 | Табличные функции | ||
T471 | Наборы результатов в качестве возвращаемого значения | ||
T472 | DESCRIBE CURSOR | ||
T495 | Совмещенное изменение и извлечение данных | другой синтаксис | |
T502 | Предикаты периодов | ||
T511 | Счетчики транзакций | ||
T522 | Значения по умолчанию для параметров IN процедур, вызываемых из SQL | поддерживаются, за исключением ключевого слова DEFAULT в вызове | |
T561 | Удерживаемые указатели | ||
T571 | Возвращающие массивы внешние функции, вызываемые из SQL | ||
T572 | Возвращающие мультимножества внешние функции, вызываемые из SQL | ||
T601 | Ссылки на локальные курсоры | ||
T616 | Варианты обработки NULL для функций LEAD и LAG | ||
T618 | Функция NTH_VALUE | функция существует, но некоторые параметры отсутствуют | |
T619 | Вложенные оконные функции | ||
T625 | LISTAGG | ||
T641 | Присвоение значения нескольким столбцам | поддерживаются только некоторые варианты синтаксиса | |
T652 | Операторы динамического SQL в подпрограммах SQL | ||
T653 | Операторы модификации схемы SQL во внешних подпрограммах | ||
T654 | Операторы динамического SQL во внешних подпрограммах | ||
T811 | Базовые функции-конструкторы SQL/JSON | ||
T812 | SQL/JSON: JSON_OBJECTAGG | ||
T813 | SQL/JSON: JSON_ARRAYAGG с ORDER BY | ||
T814 | Двоеточие в JSON_OBJECT или JSON_OBJECTAGG | ||
T821 | Базовые операторы запросов SQL/JSON | ||
T822 | SQL/JSON: предикат IS JSON WITH UNIQUE KEYS | ||
T823 | SQL/JSON: предложение PASSING | ||
T824 | JSON_TABLE: специфичное предложение PLAN | ||
T825 | SQL/JSON: предложения ON EMPTY и ON ERROR | ||
T826 | Выражение общего значения в предложениях ON ERROR или ON EMPTY | ||
T827 | JSON_TABLE: одноуровневые предложения NESTED COLUMNS | ||
T828 | JSON_QUERY | ||
T829 | JSON_QUERY: варианты обертки массива | ||
T830 | Требование уникальных ключей в функциях-конструкторах SQL/JSON | ||
T838 | JSON_TABLE: предложение PLAN DEFAULT | ||
T839 | Форматируемое приведение даты/времени из символьных строк и обратно | ||
M001 | Передача данных | ||
M002 | Передача данных через SQL/CLI | ||
M003 | Передача данных через встроенный SQL | ||
M004 | Поддержка сторонних данных | частично поддерживается | |
M005 | Поддержка сторонних схем | ||
M006 | Подпрограмма GetSQLString | ||
M007 | TransmitRequest | ||
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 | ||
X025 | XMLCAST | ||
X030 | XMLDocument | ||
X038 | XMLText | ||
X065 | XMLParse: ввод BLOB и вариант CONTENT | ||
X066 | XMLParse: ввод BLOB и вариант DOCUMENT | ||
X068 | XMLSerialize: BOM | ||
X069 | XMLSerialize: INDENT | ||
X073 | XMLSerialize: сериализация BLOB и вариант CONTENT | ||
X074 | XMLSerialize: сериализация BLOB и вариант DOCUMENT | ||
X075 | XMLSerialize: сериализация BLOB | ||
X076 | XMLSerialize: VERSION | ||
X077 | XMLSerialize: явное указание ENCODING | ||
X078 | XMLSerialize: явное объявление XML | ||
X080 | Пространства имен при публикации XML | ||
X081 | Объявления пространств имен XML на уровне запроса | ||
X082 | Объявления пространств имен XML в DML | ||
X083 | Объявления пространств имен XML в DDL | ||
X084 | Объявления пространств имен XML в составных операторах | ||
X085 | Предопределенные префиксы пространств имен | ||
X086 | Объявления пространств имен XML в XMLTable | ||
X091 | Предикат содержимого XML | ||
X096 | XMLExists | Только 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)) | ||
X200 | XMLQuery | ||
X201 | XMLQuery: RETURNING CONTENT | ||
X202 | XMLQuery: RETURNING SEQUENCE | ||
X203 | XMLQuery: передача элемента контекста | ||
X204 | XMLQuery: инициализация переменной XQuery | ||
X205 | XMLQuery: указание EMPTY ON EMPTY | ||
X206 | XMLQuery: указание NULL ON EMPTY | ||
X211 | Поддержка XML 1.1 | ||
X222 | Механизм передачи XML BY REF | анализатор принимает BY REF, но игнорирует его; передача всегда идет по BY VALUE | |
X231 | Тип XML(CONTENT (UNTYPED)) | ||
X232 | Тип XML(CONTENT (ANY)) | ||
X241 | RETURNING CONTENT при публикации XML | ||
X242 | RETURNING 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: расположение схемы | ||
X271 | XMLValidate: управляемый данными | ||
X272 | XMLValidate: предложение ACCORDING TO | ||
X273 | XMLValidate: предложение ELEMENT | ||
X274 | XMLValidate: расположение схемы | ||
X281 | XMLValidate с вариантом DOCUMENT | ||
X282 | XMLValidate с вариантом CONTENT | ||
X283 | XMLValidate с вариантом SEQUENCE | ||
X284 | XMLValidate: NAMESPACE без предложения ELEMENT | ||
X286 | XMLValidate: NO NAMESPACE с предложением ELEMENT | ||
X300 | XMLTable | Только XPath 1.0 | |
X305 | XMLTable: инициализация переменной 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).