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