Магия сохраняет силу

       

Starburst SQL (SBSQL)


Язык SQL в Starburst (SBSQL) расширен с целью включения рекурсии, определяемых пользователями функций и абстрактных типов данных. В SBSQL поддерживается ряд операций над таблицами, включая SELECT, GROUPBY и UNION. Операция SELECT производит соединения и ограничения входных таблиц и выводит множество столбцов (выражений на столбцах) отобранных кортежей. Опытный пользователь Starburst (настройщик базы данных, Database Customizer) может определять новые операции (например, внешнее соединение) на таблицах, так что компонент перезаписи запросов в Starburst должен легко приспосабливаться к расширениям языка.

Определение 1.1. Табличные выражения: Табличное выражение (table expression, texp) в SBSQL – это выражение, определяющее именованную порождаемую таблицу, которую можно использовать в запросе вместо базовой таблицы. Texp состоит из заголовка и тела. Заголовок texp специфицирует результирующую таблицу (имя, имена атрибутов). Телом texp в SBSQL является запрос, задающий способ формирования результирующей таблицы.

ПРИМЕР 1.1 (Табличное выражение):

(Q): SELECT Eno, Sal, Avgsal, Empcount FROM emp, dlnfo(Dno, Avgsal, Empcount) AS (SELECT Dno, AVG(Sal), COUNT(*) FROM emp GROUPBY Dno) WHERE Job = 'SI Programmer' AND emp.Dno = dlnfo.Dno

Здесь dlnfo является порождаемой таблицей, определяемой табличным выражением. Заголовок этой texp – dlnfo(Dno, Avgsal , Empcount), а тело – (SELECT Dno, AVG(Sal), COUNT(*) FROM emp GROUPBY Dno).

В этой статье для краткости мы используем некоторый вариант синтаксиса стандарта SQL. Мы записываем texp отдельно, как если бы определяли представление, так что (Q) из примера 1.1 записывается как:

(Tl): SELECT Eno, Sal, Avgsal, Empcount FROM emp(Eno, Sal, Dno, Job), dlnfo(Dno, Avgsal, Empcount) WHERE Job = '31 Programmer'

(T2): dlnfo(Dno, Avgsal, Empcount) AS (SELECT Dno, AVG(Sal),COUNT(*) FROM emp GROUPBY Dno)

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


Поддержка табличных выражений позволяет нам писать Datalog-запросы. Заголовок и тело правила Datalog отображаются на заголовок и тело texp. Несколько правил Datalog с одинаковыми заголовками отображаются на одно texp с телом, которое объединяет (UNION) запросы, ассоциируемые с телами этих правил.

ПРИМЕР 1.2 (Нелинейный запрос): Рассмотрим систему с большим числом компонентов. Компоненты могут являться базовыми блоками, или для них может требоваться поддержка других компонентов. Пусть у каждого компонента имеется основное и вспомогательное средства поддержки. Если происходит отказ основного средства поддержки, его функции начинает выполнять вспомогательное средство поддержки. Компонент выходит из строя, если происходит отказ его основного и вспомогательного средств поддержки. Некоторые компоненты могут ломаться сами по себе, и нас интересует результирующий набор отказавших компонентов.

Пусть primary(C,P) и secondary(C,S) задают первичные (P) и вспомогательные (S) средства поддержки компонента C соответственно. Пусть broken(B) – множество компонентов, поломавшихся сами по себе. Множество отказавших компонентов fail(C) определяется следующей texp:

(F): fail(C) AS ((SELECT * FROM broken) UNION DISTINCT (SELECT p.C

FROM primary p, secondary s, fall fl, fall f2 WHERE fl.C = p.P AND f2.C = s.S AND p.C = s.C))

Здесь fail – это имя результирующей таблицы texp F. Выражение F является рекурсивным, поскольку внутри F имеется ссылка на fail. Эта рекурсия является нелинейной (поскольку в списке одного раздела FROM fail появляется дважды), и невозможно написать эквивалентный линейный запрос ([AC89]).

В этой статье мы будем иногда называть запросы на языке SBSQL программами.


Содержание раздела