В стандарте SQL:2006 были внесены значительные изменения в спецификации, связанные с XML, в рамках стандарта ISO/IEC 9075-14 (SQL/XML). Digital Q.DataBaseреализация типа данных XML и связанных с ним функций в основном соответствует более ранней редакции 2003 года с некоторыми заимствованиями из более поздних редакций. В частности:
В тех случаях, когда текущий стандарт предоставляет семейство типов данных XML
для хранения «документа» или «содержимого» в
нетипизированных вариантах или вариантах с типизацией по XML-схеме, а также тип
XML(SEQUENCE) для хранения произвольных фрагментов XML-содержимого,
Digital Q.DataBase предоставляет единственный
xml тип, который может содержать «документа» или
«содержимого». В PostgreSQL отсутствует эквивалент
стандартного «sequence» типа.
Digital Q.DataBase предоставляет две функции введенные в стандарте SQL:2006, но в вариантах, использующих язык XPath 1.0 вместо языка XML Query, как это определено для них в стандарте SQL.
Digital Q.DataBase не поддерживает
RETURNING CONTENT или RETURNING SEQUENCE
предложения и функции, которые согласно спецификации должны содержать данные элементы,
неявно возвращают содержимое.
В данном разделе представлены некоторые из возникающих различий, с которыми вы можете столкнуться.
Специфичные Digital Q.DataBaseдля PostgreSQL функции
xpath() и xpath_exists()
выполняют запросы к XML-документам с использованием языка XPath.
Digital Q.DataBase также предоставляет варианты стандартных функций, поддерживающие только XPath, — XMLEXISTS и
XMLTABLE, которые официально используют
язык XQuery. Для всех этих функций
Digital Q.DataBase используется
libxml2 библиотека, обеспечивающая поддержку только стандарта XPath 1.0.
Между языком XQuery и версиями XPath 2.0 и выше существует тесная связь: любое выражение, которое является синтаксически корректным и успешно выполняется в обеих средах, дает одинаковый результат (за небольшим исключением для выражений, содержащих цифровые символьные ссылки или предопределенные ссылки на сущности, которые XQuery заменяет соответствующим символом, в то время как XPath оставляет их без изменений). Однако между этими языками и XPath 1.0 подобная связь отсутствует; этот язык был разработан ранее и отличается во многих отношениях.
Следует учитывать две категории ограничений: ограничение от XQuery до уровня XPath для функций, определенных в стандарте SQL, и ограничение XPath до версии 1.0 как для стандарта SQL, так и для Digital Q.DataBase-специфичных функций.
Функциональные возможности XQuery, выходящие за рамки XPath, включают:
Выражения XQuery могут конструировать и возвращать новые XML-узлы в дополнение ко всем возможным значениям XPath. XPath может создавать и возвращать значения атомарных типов (числа, строки и т. д.), но может возвращать только те XML-узлы, которые уже присутствовали в документах, переданных выражению в качестве входных данных.
XQuery содержит управляющие конструкции для итерации, сортировки и группировки.
XQuery позволяет объявлять и использовать локальные функции.
Последние версии XPath начинают предлагать возможности, перекрывающиеся с вышеуказанными (такие как функции в функциональном стиле for-each и
sort, анонимные функции и
parse-xml для создания узла из строки),
однако такие функции не были доступны до версии XPath 3.0.
Разработчикам, знакомым с XQuery и XPath 2.0 или более поздними версиями, при использовании XPath 1.0 придется столкнуться с рядом отличий:
Базовым типом выражения XQuery/XPath является
sequence, которая может содержать XML-узлы, атомарные значения,
или и то, и другое, не существует в XPath 1.0. Выражение XPath 1.0 может только
формировать набор узлов (содержащий ноль или более XML-узлов) или одно
атомарное значение.
В отличие от последовательности XQuery/XPath, которая может содержать любые элементы в произвольном порядке, набор узлов XPath 1.0 не имеет гарантированного порядка и, как и любое множество, не допускает повторного вхождения одного и того же элемента.
Библиотека libxml2 , по всей видимости, всегда возвращает наборы узлов Digital Q.DataBase с сохранением того же относительного порядка элементов, который был во входном документе. В документации к ней не гарантируется такое поведение, и выражение XPath 1.0 не может им управлять.
В то время как XQuery/XPath предоставляет все типы, определенные в XML-схеме,
и множество операторов и функций для этих типов, в 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 значение, передаваемое в качестве
элемент контекста к любому типу Digital Q.DataBase
Функция на основе XPath должна быть представлена в форме документа.
Приведенный здесь перечень различий не является исчерпывающим. В XQuery и XPath версий 2.0 и выше предусмотрен режим совместимости с XPath 1.0, а в списках W3C изменений библиотеки функций и изменений языка, применяемых в этом режиме, приводится более подробное (но всё же не исчерпывающее) описание различий. Режим совместимости не позволяет обеспечить полную эквивалентность более поздних языков стандарту XPath 1.0.
В стандарте SQL:2006 и более поздних редакциях точно определены оба направления преобразования между стандартными типами данных SQL и типами XML-схемы. Однако данные правила сформулированы с использованием типов и семантики языков XQuery/XPath и не имеют прямого применения к иной модели данных стандарта XPath 1.0.
Когда Digital Q.DataBase сопоставляет значения данных SQL с данными XML
(как в функции xmlelement), или данные XML со значениями SQL (как в выходных
столбцах функции xmltable), за исключением нескольких случаев,
обрабатываемых особым образом, Digital Q.DataBase просто предполагает,
что строковое представление типа данных XML в формате XPath 1.0 будет допустимым в качестве
текстовой формы ввода для типа данных SQL, и наоборот. Это правило обладает преимуществом простоты, обеспечивая для многих типов данных результаты, аналогичные сопоставлениям, определенным в стандарте SQL.
В тех случаях, когда важна совместимость с другими системами, для некоторых типов данных может потребоваться использование функций форматирования типов данных (таких как функции в Раздел 2.6.8) в явном виде для получения сопоставлений, соответствующих стандарту.
В данном разделе рассматриваются ограничения, которые не являются характерными непосредственно для libxml2 библиотеки, но относятся к текущей реализации в Digital Q.DataBase.
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);
Digital Q.DataBase будет принимать
BY VALUE или BY REF в
XMLEXISTS или XMLTABLE
конструкции, но игнорирует их. xml тип данных содержит
сериализованное строковое представление, поэтому идентичность узлов
не сохраняется, а передача всегда фактически осуществляется ПО
ЗНАЧЕНИЮ.
Функции на основе XPath поддерживают передачу одного параметра в качестве элемента контекста выражения XPath, но не поддерживают передачу дополнительных значений для использования в выражении в качестве именованных параметров.
XML(SEQUENCE) Тип #
Данный Digital Q.DataBase xml тип данных
может содержать значение только в DOCUMENT
или CONTENT форме. Элемент контекста выражения XQuery/XPath
должен быть одиночным XML-узлом или атомарным значением, однако стандарт XPath 1.0
накладывает ограничение, согласно которому он может быть только XML-узлом, и не определяет тип узла,
позволяющий CONTENT. В конечном итоге получается, что правильно сформированный DOCUMENT является единственной формой XML-значения, которую Digital Q.DataBase может передавать в качестве элемента контекста XPath.