Возможности 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 is a simple example SQL statement. If Tarantool appears to handle the example, it is marked «OK», otherwise it is marked «No».
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E011-01 | Типы данных INTEGER и SMALLINT | CREATE TABLE t (s1 INT PRIMARY KEY); |
OK. |
E011-02 | Типы данных REAL, DOUBLE PRECISION и FLOAT | CREATE TABLE tr (s1 FLOAT PRIMARY KEY); |
No. Tarantool’s floating point data type is DOUBLE. 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); |
No, 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; |
OK. |
E011-05 | Числовые сравнения | SELECT * FROM t WHERE 1 < 2; |
OK. |
E011-06 | Неявное приведение числовых типов данных | SELECT * FROM t WHERE s1 = 1.00; |
OK, because Tarantool allows comparison of 1.00 with an INTEGER column. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E021-01 | Символьный тип данных (включая все варианты написания) | CREATE TABLE t44 (s1 CHAR PRIMARY KEY); |
No, CHAR is not supported. This type of unsupported features will only be counted once. |
E021-02 | Тип данных CHARACTER VARYING (включая все варианты написания) | CREATE TABLE t45 (s1 VARCHAR PRIMARY KEY); |
No, Tarantool only allows VARCHAR(n), which is a synonym for STRING. |
E021-03 | Символьные литералы | INSERT INTO t45 VALUES (''); |
OK, and the bad practice of accepting "" for
character literals is avoided. |
E021-04 | Функция CHARACTER_LENGTH | SELECT character_length(s1) FROM t; |
OK. Tarantool treats this as a synonym of LENGTH(). |
E021-05 | OCTET_LENGTH | SELECT octet_length(s1) FROM t; |
No. There is no such function. |
E021-06 | Функция SUBSTRING | SELECT substring(s1 FROM 1 FOR 1) FROM t; |
No. There is no such function. There is a function SUBSTR(x,n,n), which is OK. |
E021-07 | Конкатенация символов | SELECT 'a' || 'b' FROM t; |
OK. |
E021-08 | Функции UPPER и LOWER | SELECT upper('a'),lower('B') FROM t; |
OK. Tarantool supports both UPPER() and LOWER(). |
E021-09 | Функция TRIM | SELECT trim('a ') FROM t; |
OK. |
E021-10 | Неявное приведение типов символьных строк фиксированной и переменной длины | SELECT * FROM tm WHERE char_column > varchar_column; |
No, there is no fixed-length character string type. |
E021-11 | Функция POSITION | SELECT position(x IN y) FROM z; |
No. Tarantool’s POSITION function
requires „, “ rather than „IN “. |
E021-12 | Сравнение символов | SELECT * FROM t WHERE s1 > 'a'; |
OK. We should note here that comparisons use a binary collation by default, but it is easy to use a COLLATE clause. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E031 | Идентификаторы | CREATE TABLE rank (ceil INT PRIMARY KEY); |
No. Tarantool’s list of reserved words differs from the standard’s list of reserved words. |
E031-01 | Идентификаторы с разделителем | CREATE TABLE "t47" (s1 INT PRIMARY KEY); |
OK. Also, enclosing identifiers inside double quotes means they won’t be converted to upper case or lower case, this is the behavior that some other DBMSs lack. |
E031-02 | Идентификаторы в нижнем регистре | CREATE TABLE t48 (s1 INT PRIMARY KEY); |
OK. |
E031-03 | Символ нижнего подчеркивания в конце | CREATE TABLE t49_ (s1 INT PRIMARY KEY); |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E051-01 | SELECT DISTINCT | SELECT DISTINCT s1 FROM t; |
OK. |
E051-02 | Предложение GROUP BY | SELECT DISTINCT s1 FROM t GROUP BY s1; |
OK. |
E051-04 | GROUP BY может содержать столбцы вне выборки SELECT | SELECT s1 FROM t GROUP BY lower(s1); |
OK. |
E051-05 | Элементы в списке выборки можно переименовывать | SELECT s1 AS K FROM t ORDER BY K; |
OK. |
E051-06 | Предложение HAVING | SELECT count(*) FROM t HAVING count(*) > 0; |
OK. Tarantool supports HAVING, and GROUP BY is not mandatory before HAVING. |
E051-07 | Допускается использование * в квалификаторе для списка выборки | SELECT t.* FROM t; |
OK. |
E051-08 | Корреляционные имена в предложении FROM | SELECT * FROM t AS K; |
OK. |
E051-09 | Переименование столбцов в предложении FROM | SELECT * FROM t AS x(q,c); |
No. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E061-01 | Предикат сравнения | SELECT * FROM t WHERE 0 = 0; |
OK. |
E061-02 | Предикат BETWEEN | SELECT * FROM t WHERE ' ' BETWEEN '' AND ' '; |
OK. |
E061-03 | Предикат IN со списком значений | SELECT * FROM t WHERE s1 IN ('a', upper('a')); |
OK. |
E061-04 | Предикат LIKE | SELECT * FROM t WHERE s1 LIKE '_'; |
OK. |
E061-05 | Предикат LIKE: предложение ESCAPE | VALUES ('abc_' LIKE 'abcX_' ESCAPE 'X'); |
OK. |
E061-06 | Предикат NULL | SELECT * FROM t WHERE s1 IS NOT NULL; |
OK. |
E061-07 | Предикат количественного сравнения | SELECT * FROM t WHERE s1 = ANY (SELECT s1 FROM t); |
No. Syntax error. |
E061-08 | Предикат EXISTS | SELECT * FROM t WHERE NOT EXISTS (SELECT * FROM t); |
OK. |
E061-09 | Подзапросы в предикате сравнения | SELECT * FROM t WHERE s1 > (SELECT s1 FROM t); |
OK. |
E061-11 | Подзапросы в предикате IN | SELECT * FROM t WHERE s1 IN (SELECT s1 FROM t); |
OK. |
E061-12 | Подзапросы в предикате количественного сравнения | SELECT * FROM t WHERE s1 >= ALL (SELECT s1 FROM t); |
No. Syntax error. |
E061-13 | Коррелирующие подзапросы | SELECT * FROM t WHERE s1 = (SELECT s1 FROM t2 WHERE t2.s2 = t.s1); |
OK. |
E061-14 | Условие поиска | SELECT * FROM t WHERE 0 <> 0 OR 'a' < 'b' AND s1 IS NULL; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E071-01 | Табличный оператор UNION DISTINCT | SELECT * FROM t UNION DISTINCT SELECT * FROM t; |
No. However,
SELECT * FROM t UNION SELECT * FROM t; is OK. |
E071-02 | Табличный оператор UNION ALL | SELECT * FROM t UNION ALL SELECT * FROM t; |
OK. |
E071-03 | Табличный оператор EXCEPT DISTINCT | SELECT * FROM t EXCEPT DISTINCT SELECT * FROM t; |
No. However,
SELECT * FROM t EXCEPT SELECT * FROM t; is OK. |
E071-05 | Столбцы, совмещенные с помощью табличных операторов, необязательно должны иметь идентичный тип данных | SELECT s1 FROM t UNION SELECT 5 FROM t; |
OK. |
E071-06 | Табличные операторы в подзапросах | SELECT * FROM t WHERE 'a' IN (SELECT * FROM t UNION SELECT * FROM t); |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E091-01 | AVG | SELECT avg(s1) FROM t7; |
No. Tarantool supports AVG but there is no warning that NULLs are eliminated. |
E091-02 | COUNT | SELECT count(*) FROM t7 WHERE s1 > 0; |
OK. |
E091-03 | MAX | SELECT max(s1) FROM t7 WHERE s1 > 0; |
OK. |
E091-04 | MIN | SELECT min(s1) FROM t7 WHERE s1 > 0; |
OK. |
E091-05 | SUM | SELECT sum(1) FROM t7 WHERE s1 > 0; |
OK. |
E091-06 | Квантификатор ALL | SELECT sum(ALL s1) FROM t7 WHERE s1 > 0; |
OK. |
E091-07 | Квантификатор DISTINCT | SELECT sum(DISTINCT s1) FROM t7 WHERE s1 > 0; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E101-01 | Инструкция INSERT | INSERT INTO t (s1,s2) VALUES (1,''), (2,NULL), (3,55); |
OK. |
E101-03 | Инструкция UPDATE с поиском | UPDATE t SET s1 = NULL WHERE s1 IN (SELECT s1 FROM t2); |
OK. |
E101-04 | Инструкция DELETE с поиском | DELETE FROM t WHERE s1 IN (SELECT s1 FROM t); |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E111 | Инструкция SELECT, возвращающая одну строку | SELECT count(*) FROM t; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E121-01 | DECLARE CURSOR | No. Tarantool doesn’t support cursors. | |
E121-02 | Столбцы ORDER BY необязательно должны быть в списке выборки | SELECT s1 FROM t ORDER BY s2; |
OK. |
E121-03 | Выражения в ORDER BY | SELECT s1 FROM t7 ORDER BY -s1; |
OK. |
E121-04 | Инструкция OPEN | No. Tarantool doesn’t support cursors. | |
E121-06 | Инструкция UPDATE с позицией | No. Tarantool doesn’t support cursors. | |
E121-07 | Инструкция DELETE с позицией | No. Tarantool doesn’t support cursors. | |
E121-08 | Инструкция CLOSE | No. Tarantool doesn’t support cursors. | |
E121-10 | Инструкция FETCH с неявным NEXT | No. Tarantool doesn’t support cursors. | |
E121-17 | Курсоры WITH HOLD | No. Tarantool doesn’t support cursors. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E131 | Поддержка значения NULL (NULL вместо значений) | SELECT s1 FROM t7 WHERE s1 IS NULL; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E141-01 | Ограничения NOT NULL | CREATE TABLE t8 (s1 INT PRIMARY KEY, s2 INT NOT NULL); |
OK. |
E141-02 | Ограничения UNIQUE для столбцов NOT NULL | CREATE TABLE t9 (s1 INT PRIMARY KEY , s2 INT NOT NULL UNIQUE); |
OK. |
E141-03 | Ограничения PRIMARY KEY | CREATE TABLE t10 (s1 INT PRIMARY KEY); |
OK, although Tarantool shouldn’t always insist on having a primary key. |
E141-04 | Базовое ограничение FOREIGN KEY без действия (NO ACTION) по умолчанию для операций удаления и изменения со ссылками | CREATE TABLE t11 (s0 INT PRIMARY KEY, s1 INT REFERENCES t10); |
OK. |
E141-06 | Ограничения CHECK | CREATE TABLE t12 (s1 INT PRIMARY KEY, s2 INT, CHECK (s1 = s2)); |
OK. |
E141-07 | Значения столбцов по умолчанию | CREATE TABLE t13 (s1 INT PRIMARY KEY, s2 INT DEFAULT -1); |
OK. |
E141-08 | NOT NULL подразумевается для первичного ключа | CREATE TABLE t14 (s1 INT PRIMARY KEY); |
OK. We are unable to insert NULL although we don’t explicitly say the column is 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)); |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E151-01 | Инструкция COMMIT | COMMIT; |
No. Tarantool supports COMMIT but it is necessary to say START TRANSACTION first. |
E151-02 | Инструкция ROLLBACK | ROLLBACK; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E152-01 | Инструкция SET TRANSACTION: предложение ISOLATION SERIALIZABLE | SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
No. Syntax error. |
E152-02 | Инструкция SET TRANSACTION: предложения READ ONLY и READ WRITE | SET TRANSACTION READ ONLY; |
No. Syntax error. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
E153 | Запросы, изменяющие данные, с подзапросами | UPDATE "view_containing_subquery" SET column1=0; |
No. |
E161 | Комментарии SQL с двумя знаками минуса в начале | --comment; |
OK. |
E171 | Поддержка SQLSTATE | DROP TABLE no_such_table; |
No. Tarantool returns an error message but not an SQLSTATE string. |
E182 | Привязка базового языка | OK. Any of the Tarantool connectors should be able to call box.execute(). |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F021 | Базовая информационная схема | SELECT * FROM information_schema.tables; |
No. Tarantool’s metadata is not in a schema with that name (not counted in the final score). |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F031-01 | Инструкция CREATE TABLE создает хранимые таблицы БД | CREATE TABLE t20 (t20_1 INT NOT NULL); |
No. We always have to specify PRIMARY KEY (we only count this flaw once). |
F031-02 | Инструкция CREATE VIEW | CREATE VIEW t21 AS SELECT * FROM t20; |
OK. |
F031-03 | Инструкция GRANT | No. Tarantool doesn’t support privileges except via NoSQL. | |
F031-04 | Инструкция ALTER TABLE: добавление столбца | ALTER TABLE t7 ADD COLUMN t7_2 VARCHAR(1) DEFAULT 'q'; |
OK. Tarantool supports ALTER TABLE, and support for ADD COLUMN was added in Tarantool 2.7. |
F031-13 | Инструкция DROP TABLE: предложение RESTRICT | DROP TABLE t20 RESTRICT; |
No. Tarantool supports DROP TABLE but not this clause. |
F031-16 | Инструкция DROP VIEW: предложение RESTRICT | DROP VIEW v2 RESTRICT; |
No. Tarantool supports DROP VIEW but not this clause. |
F031-19 | Инструкция REVOKE: предложение RESTRICT | No. Tarantool does not support privileges except via NoSQL. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F041-01 | Операция inner join, но необязательно с ключевым словом INNER | SELECT a.s1 FROM t7 a JOIN t7 b; |
OK. |
F041-02 | Ключевое слово INNER | SELECT a.s1 FROM t7 a INNER JOIN t7 b; |
OK. |
F041-03 | LEFT OUTER JOIN | SELECT t7.*,t22.* FROM t22 LEFT OUTER JOIN t7 ON (t22_1 = s1); |
OK. |
F041-04 | RIGHT OUTER JOIN | SELECT t7.*,t22.* FROM t22 RIGHT OUTER JOIN t7 ON (t22_1 = s1); |
No. Syntax error. |
F041-05 | Вложенные outer join | SELECT t7.*,t22.* FROM t22 LEFT OUTER JOIN t7 ON (t22_1 = s1) LEFT OUTER JOIN t23; |
OK. |
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); |
OK. |
F041-08 | Все операторы сравнения поддерживаются | SELECT * FROM t WHERE 0 = 1 OR 0 > 1 OR 0 < 1 OR 0 <> 1; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F051-01 | Тип данных DATE (включая поддержку литерала DATE) | CREATE TABLE dates (s1 DATE); |
No. Tarantool does not support the DATE data type. |
F051-02 | Тип данных TIME (включая поддержку литерала TIME) | CREATE TABLE times (s1 TIME DEFAULT TIME '1:2:3'); |
No. Syntax error. |
F051-03 | Тип данных TIMESTAMP (включая поддержку литерала TIMESTAMP) | CREATE TABLE timestamps (s1 TIMESTAMP); |
No. Syntax error. |
F051-04 | Предикат сравнения с типами данных DATE, TIME и TIMESTAMP | SELECT * FROM dates WHERE s1 = s1; |
No. Date and time data types are not supported. |
F051-05 | Явное преобразование CAST между типами даты и времени и типами символьных строк | SELECT cast(s1 AS VARCHAR(10)) FROM dates; |
No. Date and time data types are not supported. |
F051-06 | CURRENT_DATE | SELECT current_date FROM t; |
No. Syntax error. |
F051-07 | LOCALTIME | SELECT localtime FROM t; |
No. Syntax error. |
F051-08 | LOCALTIMESTAMP | SELECT localtimestamp FROM t; |
No. Syntax error. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F081 | UNION и EXCEPT в представлениях | CREATE VIEW vv AS SELECT * FROM t7 EXCEPT SELECT * * FROM t15; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F131-01 | Поддержка WHERE, GROUP BY и HAVING в запросах со сгруппированными представлениями | CREATE VIEW vv2 AS SELECT * FROM vv GROUP BY s1; |
OK. |
F131-02 | Поддержка нескольких таблиц в запросах со сгруппированными представлениями | CREATE VIEW vv3 AS SELECT * FROM vv2,t30; |
OK. |
F131-03 | Поддержка агрегатных функций в запросах со сгруппированными представлениями | CREATE VIEW vv4 AS SELECT count(*) FROM vv2; |
OK. |
F131-04 | Подзапросы с предложениями GROUP BY и HAVING и сгруппированными представлениями | CREATE VIEW vv5 AS SELECT count(*) FROM vv2 GROUP BY s1 HAVING count(*) > 0; |
OK. |
F131-05 | Инструкция SELECT, возвращающая одну строку, с GROUP BY и HAVING и сгруппированными представлениями | SELECT count(*) FROM vv2 GROUP BY s1 HAVING count(*) > 0; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F201 | Функция CAST | SELECT cast(s1 AS INT) FROM t; |
OK. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F221 | Явно заданное значение по умолчанию | UPDATE t SET s1 = DEFAULT; |
No. Syntax error. |
Код возможности | Возможность | Результаты тестов |
---|---|---|
F311-01 | CREATE SCHEMA | No. Tarantool doesn’t have schemas or databases. |
F311-02 | CREATE TABLE для хранимых таблиц БД | No. Tarantool doesn’t have CREATE TABLE inside CREATE SCHEMA. |
F311-03 | CREATE VIEW | No. Tarantool doesn’t have CREATE VIEW inside CREATE SCHEMA. |
F311-04 | CREATE VIEW: WITH CHECK OPTION | No. Tarantool doesn’t have CREATE VIEW inside CREATE SCHEMA. |
F311-05 | Инструкция GRANT | No. Tarantool doesn’t have GRANT inside CREATE SCHEMA. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
F471 | Скалярные значения подзапросов | SELECT s1 FROM t WHERE s1 = (SELECT count(*) FROM t); |
OK. |
F481 | Расширенный предикат NULL | SELECT * FROM t WHERE row(s1,s1) IS NOT NULL; |
No. Syntax error. |
F812 | Базовые флаги | No. Tarantool doesn’t support any flagging. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
S011 | Пользовательские типы | CREATE TYPE x AS FLOAT; |
No. Tarantool doesn’t support distinct types. |
Код возможности | Возможность | Пример | Результаты тестов |
---|---|---|---|
T321-01 | Пользовательские функции без переопределения | CREATE FUNCTION f() RETURNS INT RETURN 5; |
No. User-defined functions for SQL are created in Lua with a different syntax. |
T321-02 | Пользовательские процедуры без переопределения | CREATE PROCEDURE p() BEGIN END; |
No. User-defined functions for SQL are created in Lua with a different syntax. |
T321-03 | Вызов функций | SELECT f(1) FROM t; |
OK. Tarantool can invoke Lua user-defined functions. |
T321-04 | Инструкция CALL | CALL p(); |
No. Tarantool doesn’t support CALL statements. |
T321-05 | Инструкция RETURN | CREATE FUNCTION f() RETURNS INT RETURN 5; |
No. Tarantool doesn’t support RETURN statements. |