SQL

SQL

В данном разделе мы рассмотрим «Классификацию функциональных возможностей и определение обязательных функциональных возможностей» по стандарту SQL:2016.

Для каждой функциональной возможности в таблице мы обозначим простой пример оператора SQL. Если Tarantool сможет обработать пример, отметим результат теста как «Пройден», в противном случае отметим его: «Не пройден». Поскольку оценка приблизительная и произвольная, примем, что количество несправедливо «пройденных» тестов будет примерно равно количеству несправедливо «не пройденных» тестов.

Идентификатор функциональной возможности Функциональная возможность Пример Результат теста
E011 Числовые типы данных
E011-01 INTEGER и SMALLINT create table t (s1 int primary key); Пройден.
E011-02 Типы данных REAL, DOUBLE PRECISION и FLOAT create table tr (s1 float primary key);

Пройден.

Note: Floating point SQL types are not planned to be compatible between 2.1 and 2.2 releases. The reason is that in 2.1 we set „number“ format for columns of these types, but will restrict it to „float32“ and „float64“ in 2.2. The format change requires data migration and cannot be done automatically, because in 2.1 we have no information to distinguish „number“ columns (created from Lua) from FLOAT/DOUBLE/REAL ones (created from SQL).

E011-03 Типы данных DECIMAL и NUMERIC create table td (s1 numeric primary key); Fail, DECIMAL and NUMERIC data types are not supported and a number containing post-decimal digits will be treated as approximate numeric.
E011-04 Арифметические операции select 10+1,9-2,8*3,7/2 from t; Пройден.
E011-05 Сравнения числовых данных select * from t where 1 < 2; Пройден.
E011-06 Неявно определенное приведение числовых типов данных select * from t where s1 = 1.00; Пройден, но только потому что Tarantool не различает отдельные числовые типы данных.
E021 Типы данных символьных строк
E021-01 Символьный тип данных (включая все варианты написания) create table t44 (s1 char primary key); Не пройден, поскольку допускается только написание CHAR. Такой тип результата «не пройден» будет засчитан только один раз.
E021-02 Тип данных CHARACTER VARYING (включая все варианты написания) create table t45 (s1 varchar primary key);

Не пройден, допускается только написание VARCHAR.

Note: VARCHAR(N) does not check the string length.

E021-03 Символьные литералы insert into t45 values (''); Пройден, кроме того, не принимаются нерекомендуемые символьные литералы «».
E021-04 CHARACTER_LENGTH function select character_length(s1) from t; Не пройден. Такой функции нет, есть функция LENGTH(), которую можно использовать.
E021-05 OCTET_LENGTH select octet_length(s1) from t; Не пройден. Такой функции нет.
E021-06 Функция SUBSTRING select substring(s1 from 1 for 1) from t; Не пройден. Такой функции нет, есть функция SUBSTR(x,n,n), которую можно использовать.
E021-07 Конкатенация символов select 'a' || 'b' from t; Пройден.
E021-08 UPPER and LOWER functions select upper('a'),lower('B') from t; Okay. SUBSTR(x,n,n) which is okay.
E021-09 Функция TRIM select trim('a ') from t; Пройден.
E021-10 Неявно определенное приведение типов символьных строк фиксированной длины и переменной длины select * from tm where char_column > varchar_column; Fail, there is no fixed-length character string type.
E021-11 Функция POSITION select position(x in y) from z; Fail. Tarantool’s function uses „,“ rather than „in“
E021-12 Сравнение символов select * from t where s1 > 'a'; Пройден. Здесь следует отметить, что по умолчанию в сравнениях используется бинарная сортировка, но можно легко указать сортировку по unicode или unicode_ci, или же создать новый тип сортировки.
E031 Идентификаторы create table rank (ceil int primary key); Не пройден. Список зарезервированных слов в Tarantool’е отличается от списка зарезервированных слов, заданного в стандарте.
E031-01 Идентификаторы с разделителями create table "t47" (s1 int primary key); Пройден. Использование идентификаторов, заключенных в двойные кавычки, означает, что они не будут преобразованы в верхний или нижний регистр, что, к сожалению, происходит в некоторых других СУБД.
E031-02 Идентификаторы в нижнем регистре create table t48 (s1 int primary key); Пройден.
E031-03 Подчеркивание в конце строки create table t49_ (s1 int primary key); Пройден.
E051 Спецификация базового запроса
E051-01 SELECT DISTINCT select distinct s1 from t; Пройден.
E051-02 GROUP BY clause select distinct s1 from t group by s1; Пройден.
E051-04 GROUP BY может содержать столбцы не из списка выборки select select s1 from t group by lower(s1); Пройден.
E051-05 Пункты списка выборки можно переименовать select s1 as K from t order by K; Пройден.
E051-06 HAVING clause select count(*) from t having count(*) > 0; Пройден. GROUP BY не обязательно указывать перед HAVING.
E051-07 Список выборки select допускает использование * select t.* from t; Пройден.
E051-08 Внутриоперативные имена в операторе FROM select * from t as K; Пройден.
E051-09 Переименование столбцов в операторе FROM select * from t as x(q,c); Не пройден.
E061 Базовые предикаты и условия поиска
E061-01 Предикат сравнения select * from t where 0 = 0; Пройден.
E061-02 Предикат BETWEEN select * from t where ' ' between '' and ' '; Пройден.
E061-03 Предикат IN со списком значений select * from t where s1 in ('a',upper('a')); Пройден.
E061-04 Предикат LIKE select * from t where s1 like '_'; Пройден.
E061-05 Предикат LIKE: оператор ESCAPE VALUES ('abc_' LIKE 'abcX_' ESCAPE 'X'); Пройден.
E061-06 Предикат NULL select * from t where s1 is not null; Пройден.
E061-07 Предикат количественного сравнения select * from t where s1 = any (select s1 from t); Не пройден. Ошибка синтаксиса.
E061-08 Предикат EXISTS select * from t where not exists (select * from t); Пройден.
E061-09 Подзапросы в предикате сравнения select * from t where s1 > (select s1 from t); Пройден.
E061-11 Подзапросы в предикате IN select * from t where s1 in (select s1 from t); Пройден.
E061-12 Подзапросы в предикате количественного сравнения select * from t where s1 >= all (select s1 from t); Не пройден. Ошибка синтаксиса.
E061-13 Связанные подзапросы select * from t where s1 = (select s1 from t2 where t2.s2 = t.s1); Пройден.
E061-14 Условие поиска select * from t where 0 <> 0 or 'a' < 'b' and s1 is null; Пройден.
E071 Базовые выражения запросов
E071-01 Оператор для таблиц UNION DISTINCT select * from t union distinct select * from t; Не пройден. Однако пройден тест «select * from t union select * from t;».
E071-02 Оператор для таблиц UNION ALL select * from t union all select * from t; Пройден.
E071-03 Оператор для таблиц EXCEPT DISTINCT select * from t except distinct select * from t; Не пройден. Однако пройден тест select * from t except select * from t;.
E071-05 Столбцы, объединенные с помощью операторов таблиц, не обязательно должны содержать один и тот же тип данных. select s1 from t union select 5 from t; Пройден, но только потому что Tarantool не слишком хорошо различает типы данных.
E071-06 Операторы для таблиц в подзапросах select * from t where 'a' in (select * from t union select * from t); Пройден.
E081 Базовые привилегии
E081-01 Выбор привилегии на уровне таблицы   Не пройден. Ошибка синтаксиса. (Tarantool не поддерживает привилегии.)
E081-02 Привилегия DELETE   Не пройден. (Tarantool не поддерживает привилегии.)
E081-03 Привилегия INSERT на уровне таблицы   Не пройден. (Tarantool не поддерживает привилегии.)
E081-04 Привилегия UPDATE на уровне таблицы   Не пройден. (Tarantool не поддерживает привилегии.)
E081-05 Привилегия UPDATE на уровне столбца   Не пройден. (Tarantool не поддерживает привилегии.)
E081-06 Привилегия REFERENCES на уровне таблицы   Не пройден. (Tarantool не поддерживает привилегии.)
E081-07 Привилегия REFERENCES на уровне столбца   Не пройден. (Tarantool не поддерживает привилегии.)
E081-08 WITH GRANT OPTION   Не пройден. (Tarantool не поддерживает привилегии.)
E081-09 Привилегия USAGE   Не пройден. (Tarantool не поддерживает привилегии.)
E081-10 Привилегия EXECUTE   Не пройден. (Tarantool не поддерживает привилегии.)
E091 Функции
E091-01 AVG select avg(s1) from t7; Не пройден. Нет предупреждения, что нулевые значения null были удалены.
E091-02 COUNT select count(*) from t7 where s1 > 0; Пройден.
E091-03 MAX select max(s1) from t7 where s1 > 0; Пройден.
E091-04 MIN select min(s1) from t7 where s1 > 0; Пройден.
E091-05 SUM select sum(1) from t7 where s1 > 0; Пройден.
E091-06 Квантификатор ALL select sum(all s1) from t7 where s1 > 0; Пройден.
E091-07 Квантификатор DISTINCT select sum(distinct s1) from t7 where s1 > 0; Пройден.
E101 Стандартные операции с данными
E101-01 Оператор INSERT insert into t (s1,s2) values (1,''),(2,null),(3,55); Пройден.
E101-03 Оператор UPDATE с поиском update t set s1 = null where s1 in (select s1 from t2); Пройден.
E101-04 Оператор DELETE с поиском delete from t where s1 in (select s1 from t); Пройден.
E111 Оператор SELECT в одну строку select count(*) from t; Пройден.
E121 Базовая поддержка курсора
E121-01 DECLARE CURSOR   Не пройден. Tarantool не поддерживает курсоры.
E121-02 Колонки ORDER BY в списке выборки select s1 from t order by s2; Пройден.
E121-03 Выражения значений в списке выборки select s1 from t7 order by -s1; Пройден.
E121-04 Оператор OPEN   Не пройден. Tarantool не поддерживает курсоры.
E121-06 Оператор UPDATE по позиции   Не пройден. Tarantool не поддерживает курсоры.
E121-07 Оператор DELETE по позиции   Не пройден. Tarantool не поддерживает курсоры.
E121-08 Оператор CLOSE   Не пройден. Tarantool не поддерживает курсоры.
E121-10 Неявный оператор FETCH   Не пройден. Tarantool не поддерживает курсоры.
E121-17 Курсоры WITH HOLD   Не пройден. Tarantool не поддерживает курсоры.
E131 Поддержка нулевых значений null (нули вместо значений) select s1 from t7 where s1 is null; Пройден.
E141 Базовые ограничения целостности
E141-01 Ограничения NOT NULL create table t8 (s1 int primary key, s2 int not null); Пройден.
E141-02 Ограничения UNIQUE для столбцов NOT NULL create table t9 (s1 int primary key , s2 int not null unique); Пройден.
E141-03 Ограничения PRIMARY KEY create table t10 (s1 int primary key); Пройден, хотя Tarantool не всегда должен настаивать на наличии первичного ключа.
E141-04 Базовое ограничение FOREIGN KEY со значением NO ACTION по умолчанию для delete по внешнему ключу и update по внешнему ключу. create table t11 (s0 int primary key, s1 int references t10); Пройден.
E141-06 Ограничения CHECK create table t12 (s1 int primary key, s2 int, check (s1 = s2)); Пройден.
E141-07 Значения по умолчанию в столбцах create table t13 (s1 int primary key, s2 int default -1); Пройден.
E141-08 NOT NULL, выведенный по первичному ключу create table t14 (s1 int primary key); Пройден. Мы не может вставитьt NULL, хотя не задаем явным образом, что столбец – NOT NULL.
E141-10 Имена во внешнем ключе могут быть указаны в любом порядке create table t15 (s1 int, s2 int, primary key (s1,s2)); create table t16 (s1 int primary key, s2 int, foreign key (s2,s1) references t15 (s1,s2)); Пройден.
E151 Поддержка транзакций
E151-01 Оператор COMMIT commit; Не пройден. Сначала необходимо ввести START TRANSACTION.
E151-02 Оператор ROLLBACK rollback; Пройден.
E152 Базовый оператор SET TRANSACTION
E152-01 Оператор SET TRANSACTION с выражением ISOLATION SERIALIZABLE set transaction isolation level serializable; Не пройден. Ошибка синтаксиса.
E152-02 Оператор SET TRANSACTION с выражением READ ONLY и READ WRITE set transaction read only; Не пройден. Ошибка синтаксиса.
E153 Обновляемые запросы с подзапросами
E161 Комментарии SQL с двойным ведущим знаком «минус» --comment; Пройден.
E171 Поддержка SQLSTATE drop table no_such_table; Не пройден. По крайней мере, сообщение об ошибке не указывает на существование SQLSTATE.
E182 Привязка к языку реализации   Okay. Any of the Tarantool connectors should be able to call box.execute().
F031 Базовые операции со схемой
F031-01 Оператор CREATE TABLE для создания персистентных таблиц в базе create table t20 (t20_1 int not null); Не пройден. Всегда нужно вводить PRIMARY KEY (засчитываем эту ошибку только один раз).
F031-02 Оператор CREATE VIEW create view t21 as select * from t20; Пройден.
F031-03 Оператор GRANT   Не пройден. Tarantool не поддерживает привилегии, кроме как с помощью NoSQL.
F031-04 Оператор ALTER TABLE: добавить столбец alter table t7 add column t7_2 varchar default 'q'; Fail. Table alterations work but not this clause.
F031-13 Оператор DROP TABLE: условие RESTRICT drop table t20 restrict; Не пройден. Ошибка синтаксиса, RESTRICT не предполагается.
F031-16 Оператор DROP VIEW: условие RESTRICT drop view v2 restrict; Не пройден. Ошибка синтаксиса, RESTRICT не предполагается.
F031-19 Оператор REVOKE: условие RESTRICT   Не пройден. Tarantool не поддерживает привилегии, кроме как с помощью NoSQL.
F041 Базовые объединения таблиц
F041-01 Внутреннее объединение, но необязательно с ключевым словом INNER select a.s1 from t7 a join t7 b; Пройден.
F041-02 Ключевое слово INNER select a.s1 from t7 a inner join t7 b; Пройден.
F041-03 LEFT OUTER JOIN select t7.*,t22.* from t22 left outer join t7 on (t22_1=s1); Пройден.
F041-04 RIGHT OUTER JOIN select t7.*,t22.* from t22 right outer join t7 on (t22_1=s1); Не пройден. Ошибка синтаксиса.
F041-05 Внешнее объединение может быть вложенным select t7.*,t22.* from t22 left outer join t7 on (t22_1=s1) left outer join t23;. Пройден.
F041-07 Внутренняя таблица в левом или правом внешнем объединении также может использоваться во внутреннем объединении select t7.* from t22 left outer join t7 on (t22_1=s1) inner join t22 on (t22_4=t22_5); Пройден. Запрос завершается ошибкой по причине ошибки синтаксиса, но это ожидаемо.
F041-08 Поддерживаются все операторы сравнения select * from t where 0=1 or 0>1 or 0<1 or 0<>1; Пройден.
F051 Базовые дата и время
F051-01 Тип данных DATE (включая поддержку литерала DATE) create table dates (s1 date); Не пройден. Tarantool не поддерживает тип DATE.
F051-02 Тип данных TIME (включая поддержку литерала TIME) create table times (s1 time default time '1:2:3'); Не пройден. Ошибка синтаксиса.
F051-03 Тип данных TIMESTAMP (включая поддержку литерала TIMESTAMP) create table timestamps (s1 timestamp); Не пройден. Ошибка синтаксиса.
F051-04 Предикат сравнения по типам данных DATE, TIME и TIMESTAMP select * from dates where s1 = s1; Fail. The data types are not supported.
F051-05 Явный CAST между типами даты и времени и типами символьных строк select cast(s1 as varchar(10)) from dates; Fail. The data types are not supported.
F051-06 CURRENT_DATE select current_date from t; Не пройден. Ошибка синтаксиса.
F051-07 CURRENT_TIME select * from t where current_time < '23:23:23'; Не пройден. Ошибка синтаксиса.
F051-08 LOCALTIME select localtime from t; Не пройден. Ошибка синтаксиса.
F051-09 LOCALTIMESTAMP select localtimestamp from t; Не пройден. Ошибка синтаксиса.
F081 UNION и EXCEPT в представлениях create view vv as select * from t7 except select * from t15; Пройден.
F131 Групповые операции
F131-01 Поддержка условий WHERE, GROUP BY и HAVING в запросах с групповыми представлениями create view vv2 as select * from vv group by s1; Пройден.
F131-02 Поддержка множества таблиц в запросах с групповыми представлениями create view vv3 as select * from vv2,t30; Пройден.
F131-03 Поддержка функций множеств в запросах с групповыми представлениями create view vv4 as select count(*) from vv2; Пройден.
F131-04 Подзапросы с условиями GROUP BY и HAVING и групповыми представлениями create view vv5 as select count(*) from vv2 group by s1 having count(*) > 0; Пройден.
F181 Поддержка множества модулей   Не пройден. Tarantool не поддерживает модули.
F201 Функция CAST select cast(s1 as int) from t; Пройден.
F221 Явно заданные значения по умолчанию update t set s1 = default; Не пройден. Ошибка синтаксиса.
F261 Оператор CASE
F261-01 Простой CASE select case when 1 = 0 then 5 else 7 end from t; Пройден.
F261-02 CASE с поиском select case 1 when 0 then 5 else 7 end from t; Пройден.
F261-03 NULLIF select nullif(s1,7) from t; Пройден.
F261-04 COALESCE select coalesce(s1,7) from t; Пройден.
F311 Оператор определения схемы
F311-01 CREATE SCHEMA   Не пройден. В Tarantool’е нет схем или баз данных.
F311-02 CREATE TABLE для персистентых базовых таблиц   Не пройден. В Tarantool’е нет CREATE TABLE в CREATE SCHEMA.
F311-03 CREATE VIEW   Не пройден. В Tarantool’е нет CREATE VIEW в CREATE SCHEMA.
F311-04 CREATE VIEW: WITH CHECK OPTION   Не пройден. В Tarantool’е нет CREATE VIEW в CREATE SCHEMA.
F311-05 Оператор GRANT   Не пройден. В Tarantool’е нет GRANT в CREATE SCHEMA.
F471 Скалярные значения в подзапросе select s1 from t where s1 = (select count(*) from t); Пройден.
F481 Расширенный предикат NULL select * from t where row(s1,s1) is not null; Не пройден. Ошибка синтаксиса.
F812 Базовое выделение флагами   Не пройден. Tarantool не поддерживает выделение флагами.
S011 Отдельные типы create type x as float; Не пройден. Tarantool не поддерживает отдельные типы.
T321 Базовые процедуры с помощью SQL
T321-01 Пользовательские функции без перегрузки create function f () returns int return 5; Не пройден. Tarantool не поддерживает пользовательские функции на языке SQL.
T321-02 Пользовательские процедуры без перегрузки create procedure p () begin end; Не пройден. Tarantool не поддерживает пользовательские процедуры.
T321-03 Вызов функции select f(1) from t; Пройден. Tarantool может вызывать пользовательские Lua-функции.
T321-04 Оператор CALL. call p(); Не пройден. Tarantool не поддерживает пользовательские процедуры.
T321-05 Оператор RETURN. create function f() returns int return 5; Не пройден. Tarantool не поддерживает пользовательские функции.
T631 Предикат IN с одним элементом списка select * from t where 1 in (1); Пройден.
F021 Базовая информационная схема select * from information_schema.tables; Не пройден. Нет схемы с таким именем (не учитывается при окончательном подсчете).

Общее количество пунктов, отмеченных «Не пройден»: 69

Общее количество пунктов, отмеченных «Пройден»: 77