Возможности SQL | Tarantool
Документация на русском языке
поддерживается сообществом
Справочники SQL reference Возможности SQL

Возможности SQL

This section compares Tarantool’s features with SQL:2016’s «Feature taxonomy and definition for mandatory features».

For each feature in that list, there will be a simple example SQL statement. If Tarantool appears to handle the example, it will be marked «Okay», else it will be marked «Fail». Since this is rough and arbitrary, the hope is that tests which are unfairly marked «Okay» will probably be balanced by tests which are unfairly marked «Fail».

Код возможности Возможность Пример Результаты тестов
E011-01 Типы данных INTEGER и SMALLINT CREATE TABLE t (s1 INT PRIMARY KEY); Работает.
E011-02 Типы данных REAL, DOUBLE PRECISION и FLOAT CREATE TABLE tr (s1 FLOAT PRIMARY KEY); Ошибка. Тип данных с плавающей точкой в Tarantool — DOUBLE. Примечание: Скорее всего, типы с плавающей точкой в версиях 2.1 и 2.2 не будут совместимы: в версии 2.1 для столбцов этих типов задается формат „number“, а в версии 2.2 — „float32“ и „float64“. Для смены формата требуется перенос данных, который не выполняется автоматически, поскольку в версии 2.1 нет информации, как отличать столбцы „number“, созданные через Lua, от FLOAT/DOUBLE/REAL, созданных через SQL.
E011-03 Типы данных DECIMAL и NUMERIC CREATE TABLE td (s1 NUMERIC PRIMARY KEY); Fail, NUMERIC data types are not supported, although the DECIMAL data type is supported.
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 поддерживает сравнение 1.00 с INTEGER.

Код возможности Возможность Пример Результаты тестов
E021-01 Символьный тип данных (включая все варианты написания) CREATE TABLE t44 (s1 CHAR PRIMARY KEY); Ошибка, тип данных CHAR не поддерживается. Этот тип ошибки будет учитываться только один раз.
E021-02 Тип данных CHARACTER VARYING (включая все варианты написания) CREATE TABLE t45 (s1 VARCHAR PRIMARY KEY); Ошибка, Tarantool поддерживает только VARCHAR(n), являющийся синонимом STRING.
E021-03 Символьные литералы INSERT INTO t45 VALUES (''); Работает. Кроме того, избегается нежелательная практика принятия "" за символьные литералы.
E021-04 Функция CHARACTER_LENGTH SELECT character_length(s1) FROM t; Работает. Tarantool воспринимает эту функцию как синоним 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 и LOWER SELECT upper('a'),lower('B') FROM t; Работает. Tarantool поддерживает как UPPER(), так и LOWER().
E021-09 Функция TRIM SELECT trim('a ') FROM t; Работает.
E021-10 Неявное приведение типов символьных строк фиксированной и переменной длины SELECT * FROM tm WHERE char_column > varchar_column; Ошибка, тип символьной строки фиксированной длины отсутствует.
E021-11 Функция POSITION SELECT position(x IN y) FROM z; Ошибка. В функции Tarantool POSITION используется „,“, а не „IN“.
E021-12 Сравнение символов SELECT * FROM t WHERE s1 > 'a'; Работает. Стоит отметить, что в сравнениях по умолчанию используется двоичная сортировка, но можно использовать и COLLATE.

Код возможности Возможность Пример Результаты тестов
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-01 SELECT DISTINCT SELECT DISTINCT s1 FROM t; Работает.
E051-02 Предложение GROUP BY 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 SELECT count(*) FROM t HAVING count(*) > 0; Работает. Tarantool поддерживает HAVING, при этом GROUP BY перед HAVING не является обязательным.
E051-07 Допускается использование * в квалификаторе для списка выборки SELECT t.* FROM t; Работает.
E051-08 Корреляционные имена в предложении FROM SELECT * FROM t AS K; Работает.
E051-09 Переименование столбцов в предложении FROM SELECT * FROM t AS x(q,c); Ошибка.

Код возможности Возможность Пример Результаты тестов
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-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; Работает.
E071-06 Табличные операторы в подзапросах SELECT * FROM t WHERE 'a' IN (SELECT * FROM t UNION SELECT * FROM t); Работает.

Tarantool не поддерживает права, кроме как через NoSQL.

Код возможности Возможность Пример Результаты тестов
E091-01 AVG SELECT avg(s1) FROM t7; Ошибка. Tarantool поддерживает AVG, но предупреждение об исключении 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-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-01 DECLARE CURSOR   Ошибка. Tarantool не поддерживает курсоры.
E121-02 Столбцы ORDER BY необязательно должны быть в списке выборки SELECT s1 FROM t ORDER BY s2; Работает.
E121-03 Выражения в ORDER BY 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 с неявным NEXT   Ошибка. Tarantool не поддерживает курсоры.
E121-17 Курсоры WITH HOLD   Ошибка. Tarantool не поддерживает курсоры.

Код возможности Возможность Пример Результаты тестов
E131 Поддержка значения NULL (NULL вместо значений) SELECT s1 FROM t7 WHERE s1 IS NULL; Работает.

Код возможности Возможность Пример Результаты тестов
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) по умолчанию для операций удаления и изменения со ссылками 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); Работает. NULL вставить не удастся, хотя столбец не объявлен явным образом как NOT NULL.
E141-10 Имена для FOREIGN KEY можно указывать в любом порядке 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-01 Инструкция COMMIT COMMIT; Ошибка. Tarantool поддерживает COMMIT, но перед этим требуется использовать START TRANSACTION.
E151-02 Инструкция ROLLBACK ROLLBACK; Работает.

Код возможности Возможность Пример Результаты тестов
E152-01 Инструкция SET TRANSACTION: предложение ISOLATION SERIALIZABLE SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; Ошибка — в синтаксисе.
E152-02 Инструкция SET TRANSACTION: предложения READ ONLY и READ WRITE SET TRANSACTION READ ONLY; Ошибка — в синтаксисе.

Код возможности Возможность Пример Результаты тестов
E153 Запросы, изменяющие данные, с подзапросами UPDATE "view_containing_subquery" SET column1=0; Ошибка.
E161 Комментарии SQL с двумя знаками минуса в начале --comment; Работает.
E171 Поддержка SQLSTATE DROP TABLE no_such_table; Ошибка. Tarantool возвращает сообщение об ошибке, но не строку SQLSTATE.
E182 Привязка базового языка   Работает. Любые коннекторы Tarantool должны иметь возможность вызвать box.execute().

Код возможности Возможность Пример Результаты тестов
F021 Базовая информационная схема SELECT * FROM information_schema.tables; Ошибка. Метаданные Tarantool не содержатся в схеме с таким именем (ошибка не учитывается в итоговом подсчете).

Код возможности Возможность Пример Результаты тестов
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(1) DEFAULT 'q'; Работает. Tarantool поддерживает ALTER TABLE, а в версии Tarantool 2.7 добавлена поддержка ADD COLUMN.
F031-13 Инструкция DROP TABLE: предложение RESTRICT DROP TABLE t20 RESTRICT; Ошибка. Tarantool поддерживает DROP TABLE, но не предложение RESTRICT.
F031-16 Инструкция DROP VIEW: предложение RESTRICT DROP VIEW v2 RESTRICT; Ошибка. Tarantool поддерживает DROP VIEW, но не предложение RESTRICT.
F031-19 Инструкция REVOKE: предложение RESTRICT   Ошибка. Tarantool не поддерживает права, кроме как через NoSQL.

Код возможности Возможность Пример Результаты тестов
F041-01 Операция inner join, но необязательно с ключевым словом 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 Вложенные outer join SELECT t7.*,t22.* FROM t22 LEFT OUTER JOIN t7 ON (t22_1 = s1) LEFT OUTER JOIN t23; Работает.
F041-07 Таблица, полученная в результате операции left или right outer join, может быть использована в inner join SELECT t7.* FROM (t22 LEFT OUTER JOIN t7 ON (t22_1 = s1)) j INNER JOIN t22 ON (j.t22_4 = t7.s1); Работает.
F041-08 Все операторы сравнения поддерживаются SELECT * FROM t WHERE 0 = 1 OR 0 > 1 OR 0 < 1 OR 0 <> 1; Работает.

Код возможности Возможность Пример Результаты тестов
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; Ошибка. Типы данных даты и времени не поддерживаются.
F051-05 Явное преобразование CAST между типами даты и времени и типами символьных строк SELECT cast(s1 AS VARCHAR(10)) FROM dates; Ошибка. Типы данных даты и времени не поддерживаются.
F051-06 CURRENT_DATE SELECT current_date FROM t; Ошибка — в синтаксисе.
F051-07 LOCALTIME SELECT localtime FROM t; Ошибка — в синтаксисе.
F051-08 LOCALTIMESTAMP SELECT localtimestamp FROM t; Ошибка — в синтаксисе.

Код возможности Возможность Пример Результаты тестов
F081 UNION и EXCEPT в представлениях CREATE VIEW vv AS SELECT * FROM t7 EXCEPT SELECT * * FROM t15; Работает.

Код возможности Возможность Пример Результаты тестов
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; Работает.
F131-05 Инструкция SELECT, возвращающая одну строку, с GROUP BY и HAVING и сгруппированными представлениями SELECT count(*) FROM vv2 GROUP BY s1 HAVING count(*) > 0; Работает.

Ошибка. В Tarantool отсутствуют модули.

Код возможности Возможность Пример Результаты тестов
F201 Функция CAST SELECT cast(s1 AS INT) FROM t; Работает.

Код возможности Возможность Пример Результаты тестов
F221 Явно заданное значение по умолчанию UPDATE t SET s1 = DEFAULT; Ошибка — в синтаксисе.

Код возможности Возможность Пример Результаты тестов
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-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 в составе CREATE SCHEMA нет GRANT.

Код возможности Возможность Пример Результаты тестов
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-01 Пользовательские функции без переопределения CREATE FUNCTION f() RETURNS INT RETURN 5; Ошибка. Пользовательские функции для SQL создаются с помощью Lua с другим синтаксисом.
T321-02 Пользовательские процедуры без переопределения CREATE PROCEDURE p() BEGIN END; Ошибка. Пользовательские функции для SQL создаются с помощью Lua с другим синтаксисом.
T321-03 Вызов функций SELECT f(1) FROM t; Работает. Tarantool может вызывать пользовательские Lua-функции.
T321-04 Инструкция CALL CALL p(); Ошибка. Tarantool не поддерживает инструкции CALL.
T321-05 Инструкция RETURN CREATE FUNCTION f() RETURNS INT RETURN 5; Ошибка. Tarantool не поддерживает инструкции RETURN.

Код возможности Возможность Пример Результаты тестов
T631 Предикат IN с одним элементом списка SELECT * FROM t WHERE 1 IN (1); Работает.

Количество элементов с отметкой «Ошибка»: 67.

Количество элементов с отметкой «Работает»: 79.