Совместимость с ANSI¶
Приведенные в таблице возможности Picodata SQL соответствуют требованиям стандарта SQL:2016, а именно ISO/IEC 9075:2016 «Информационные технологии — Языки баз данных — SQL».
Легенда¶
E001-01—возможность полностью реализована
E001-01—возможность частично реализована
E001-01—возможность не реализована
Обязательные возможности¶
| Идентификатор | Наименование | Поддержка | Примечание |
|---|---|---|---|
| E011 | Числовые типы данных | ||
| E011-01 | Типы данных INTEGER и SMALLINT (включая все варианты написания) | INTEGER, INT, SMALLINT | SMALLINT, INT2, INT4, INT8 и BIGINT — синонимы 64-битного INTEGER |
| E011-02 | Типы данных REAL, DOUBLE PRECISION и FLOAT | DOUBLE, FLOAT8 | REAL, DOUBLE PRECISION и FLOAT не поддерживаются; доступны DOUBLE и его синоним FLOAT8 |
| E011-03 | Типы данных DECIMAL и NUMERIC | DECIMAL, NUMERIC | NUMERIC — синоним DECIMAL. Указанные в объявлении точность и масштаб не ограничивают сохраняемые значения |
| E011-04 | Арифметические операторы | Унарные плюс и минус допустимы только в числовых литералах; выражения вида -a и -(1 + 2) не поддерживаются |
|
| E011-05 | Числовые сравнения | ||
| E011-06 | Неявное приведение числовых типов данных | Числовые типы неявно приводятся в выражениях и сравнениях. При записи в колонку тип значения должен совпадать с типом колонки: например, вставка 6. в колонку INTEGER отклоняется |
|
| E021 | Типы символьных строк | ||
| E021-01 | Тип данных CHARACTER (включая все варианты написания) | Строковые типы фиксированной длины CHARACTER и CHAR не поддерживаются; используйте TEXT или VARCHAR | |
| E021-02 | Тип данных CHARACTER VARYING (включая все варианты написания) | TEXT, STRING, VARCHAR | CHARACTER VARYING и CHAR VARYING не поддерживаются. VARCHAR — синоним TEXT; ограничение длины VARCHAR(n) не применяется |
| E021-03 | Символьные литералы | ||
| E021-04 | Функция CHARACTER_LENGTH | ||
| E021-05 | Функция OCTET_LENGTH | ||
| E021-06 | Функция SUBSTRING | Поддерживаются варианты FROM/FOR и поиск по регулярным выражениям. Числовые варианты используют SUBSTR; предложение USING не поддерживается | |
| E021-07 | Конкатенация символов | ||
| E021-08 | Функции UPPER и LOWER | ||
| E021-09 | Функция TRIM | TRIM | Форма TRIM(FROM x) без направления и удаляемых символов не поддерживается; используйте TRIM(x) |
| E021-10 | Неявное приведение между типами символьных строк фиксированной и переменной длины | ||
| E021-11 | Функция POSITION | ||
| E021-12 | Сравнение символов | ||
| E031 | Идентификаторы | ||
| E031-01 | Идентификаторы с разделителями | ||
| E031-02 | Идентификаторы в нижнем регистре | ||
| E031-03 | Символ нижнего подчеркивания в конце | ||
| E051 | Спецификация базовых запросов | ||
| E051-01 | SELECT DISTINCT | SELECT -> SELECT DISTINCT |
|
| E051-02 | Предложение GROUP BY | SELECT -> GROUP BY |
|
| E051-04 | GROUP BY может содержать колонки не из списка выборки | GROUP BY | Колонки группировки можно не включать в список SELECT, например SELECT COUNT(*) FROM t GROUP BY x |
| E051-05 | Элементы в списке выборки можно переименовывать | ||
| E051-06 | Предложение HAVING | SELECT -> HAVING |
|
| E051-07 | Допускается использование * в квалификаторе для списка выборки | ||
| E051-08 | Корреляционные имена в предложении FROM | ||
| E051-09 | Переименование колонок в предложении FROM | Псевдоним таблицы поддерживается, список новых имен колонок после него — нет | |
| E061 | Базовые предикаты и условия поиска | ||
| E061-01 | Предикат сравнения | ||
| E061-02 | Предикат BETWEEN | Выражение -> BETWEEN |
|
| E061-03 | Предикат IN со списком значений | Выражение -> IN |
|
| E061-04 | Предикат LIKE | LIKE | Форма NOT LIKE не поддерживается; отрицание записывается как NOT (x LIKE y) |
| E061-05 | Предикат LIKE: предложение ESCAPE | ||
| E061-06 | Предикат NULL | Выражение -> NULL |
|
| E061-07 | Предикат количественного сравнения | ||
| E061-08 | Предикат EXISTS | Выражение -> EXISTS |
|
| E061-09 | Подзапросы в предикате сравнения | ||
| E061-11 | Подзапросы в предикате IN | ||
| E061-12 | Подзапросы в предикате количественного сравнения | ||
| E061-13 | Коррелирующие подзапросы | ||
| E061-14 | Условие поиска | ||
| E071 | Базовые выражения с запросами | ||
| E071-01 | Табличный оператор UNION DISTINCT | SELECT -> UNION |
UNION устраняет повторы, но явное ключевое слово DISTINCT после UNION не поддерживается |
| E071-02 | Табличный оператор UNION ALL | SELECT -> UNION ALL |
|
| E071-03 | Табличный оператор EXCEPT DISTINCT | SELECT -> EXCEPT [ DISTINCT ] |
|
| E071-05 | Колонки, объединенные с помощью табличных операторов, необязательно должны иметь одинаковый тип данных | ||
| E071-06 | Табличные операторы в подзапросах | ||
| E081 | Базовые привилегии | GRANT, REVOKE | Используются привилегии READ, WRITE и EXECUTE. Отдельные права INSERT, UPDATE, DELETE, права на колонки, REFERENCES и WITH GRANT OPTION не поддерживаются |
| E091 | Функции множеств | ||
| E091-01 | AVG | AVG | |
| E091-02 | COUNT | COUNT | |
| E091-03 | MAX | MAX | |
| E091-04 | MIN | MIN | |
| E091-05 | SUM | ||
| E091-06 | Квантификатор ALL | Агрегаты учитывают повторы по умолчанию, но явное ключевое слово ALL в их аргументах не поддерживается | |
| E091-07 | Квантификатор DISTINCT | DISTINCT | |
| E101 | Базовые операции с данными | ||
| E101-01 | Инструкция INSERT | INSERT | |
| E101-03 | Инструкция UPDATE с возможностью поиска | UPDATE | |
| E101-04 | Инструкция DELETE с возможностью поиска | DELETE | |
| E111 | Инструкция SELECT, возвращающая одну строку | Речь об инструкции SELECT ... INTO, которая записывает результат в переменные; она не поддерживается |
|
| E121 | Базовая поддержка курсоров | ||
| E121-01 | DECLARE CURSOR | ||
| E121-02 | Колонки ORDER BY необязательно должны быть в списке выборки | ORDER BY разрешает ссылки на колонки результата SELECT; произвольные колонки исходной таблицы вне списка выборки недоступны | |
| E121-03 | Выражения значений в предложении ORDER BY | ORDER BY | Поддерживаются выражения над колонками результата SELECT. Отдельный параметр и выражения без ссылок на колонки или подзапросы отклоняются |
| E121-04 | Инструкция OPEN | ||
| E121-06 | Инструкция UPDATE с возможностью позиционирования | ||
| E121-07 | Инструкция DELETE с возможностью позиционирования | ||
| E121-08 | Инструкция CLOSE | ||
| E121-10 | Инструкция FETCH: неявный NEXT | ||
| E121-17 | Курсоры WITH HOLD | ||
| E131 | Поддержка значения NULL (NULL вместо значений) | NULL | |
| E141 | Базовые ограничения целостности | ||
| E141-01 | Ограничения NOT NULL | CREATE TABLE -> [ NOT ] NULL |
|
| E141-02 | Ограничения UNIQUE для колонок NOT NULL | CREATE UNIQUE INDEX | Уникальность обеспечивается отдельным индексом; ограничение UNIQUE в CREATE TABLE не поддерживается. Для шардированной таблицы уникальный индекс должен начинаться со всех колонок ключа шардирования |
| E141-03 | Ограничения PRIMARY KEY | CREATE TABLE -> PRIMARY KEY |
Первичный ключ гарантирует уникальность только в пределах одного экземпляра кластера. Глобально уникален ключ, который включает все колонки ключа шардирования |
| E141-04 | Базовое ограничение FOREIGN KEY с параметром NO ACTION по умолчанию как для ссылочной операции удаления, так и для ссылочной операции обновления | ||
| E141-06 | Ограничения CHECK | ||
| E141-07 | Значения колонок по умолчанию | ||
| E141-08 | Ограничения NOT NULL неявно используются с ограничениями PRIMARY KEY | CREATE TABLE -> PRIMARY KEY |
|
| E141-10 | Имена во внешнем ключе могут указываться в любом порядке | ||
| E151 | Поддержка транзакций | ||
| E151-01 | Инструкция COMMIT | Ограничения транзакций | COMMIT принимается как заглушка. Атомарное выполнение нескольких запросов доступно через транзакционный блок DO |
| E151-02 | Инструкция ROLLBACK | Ограничения транзакций | ROLLBACK принимается как заглушка. Атомарное выполнение нескольких запросов доступно через транзакционный блок DO |
| E152 | Базовая инструкция SET TRANSACTION | ||
| E152-01 | Инструкция SET TRANSACTION: предложение ISOLATION LEVEL SERIALIZABLE | SET TRANSACTION принимается, но не изменяет параметры транзакции | |
| E152-02 | Инструкция SET TRANSACTION: предложения READ ONLY и READ WRITE | SET TRANSACTION принимается, но не изменяет параметры транзакции | |
| E153 | Обновляемые запросы с подзапросами | ||
| E161 | Комментарии SQL, начинающиеся с двойного минуса | Серверный SQL-парсер не принимает комментарии. Удаление комментариев клиентом, например psql, не является поддержкой на сервере | |
| E171 | Поддержка SQLSTATE | Протокол PostgreSQL | Ответы об ошибках содержат пятисимвольные коды SQLSTATE. Набор кодов ограничен; многие ошибки SQL возвращаются как XX000 (internal_error) |
| E182 | Привязка к языку хоста | ||
| F021 | Базовая информационная схема | Представления INFORMATION_SCHEMA отсутствуют; метаданные доступны в системных таблицах | |
| F031 | Базовые операции со схемой | ||
| F031-01 | Инструкция CREATE TABLE для создания постоянных базовых таблиц | CREATE TABLE | Первичный ключ обязателен: таблицу без PRIMARY KEY создать нельзя |
| F031-02 | Инструкция CREATE VIEW | ||
| F031-03 | Инструкция GRANT | GRANT | Используются привилегии Picodata (READ, WRITE и другие, см. E081); стандартные привилегии SELECT, INSERT, UPDATE и DELETE не поддерживаются |
| F031-04 | Инструкция ALTER TABLE: предложение ADD COLUMN | ALTER TABLE | |
| F031-13 | Инструкция DROP TABLE: предложение RESTRICT | DROP TABLE | Предложение RESTRICT не поддерживается |
| F031-16 | Инструкция DROP VIEW: предложение RESTRICT | ||
| F031-19 | Инструкция REVOKE: предложение RESTRICT | REVOKE | Предложение RESTRICT не поддерживается |
| F041 | Базовая объединенная таблица | ||
| F041-01 | Внутреннее соединение (ключевое слово INNER необязательно) | SELECT -> [ INNER ] JOIN |
|
| F041-02 | Ключевое слово INNER | SELECT -> INNER JOIN |
|
| F041-03 | LEFT OUTER JOIN | SELECT -> LEFT OUTER JOIN |
|
| F041-04 | RIGHT OUTER JOIN | ||
| F041-05 | Внешние соединения могут быть вложенными | SELECT — Множественные соединения |
|
| F041-07 | Таблица, полученная левым или правым внешним соединением, может быть использована во внутреннем соединении | JOIN | Таблица с NULL-дополнением в LEFT JOIN может участвовать в последующем INNER JOIN. RIGHT JOIN не поддерживается |
| F041-08 | Поддерживаются все операторы сравнения (не только обычное равенство) | ||
| F051 | Базовая поддержка даты и времени | ||
| F051-01 | Тип данных DATE (включая поддержку литерала DATE) | DATETIME, типизированные литералы | Тип DATE и литерал DATE '...' не поддерживаются. Доступны DATETIME и литерал DATETIME '...' |
| F051-02 | Тип данных TIME (включая поддержку литерала TIME) с минимальной точностью дробной части секунд в 0 знаков | ||
| F051-03 | Тип данных TIMESTAMP (включая поддержку литерала TIMESTAMP) с минимальной точностью дробной части секунд в 0 и 6 знаков | Тип TIMESTAMP и литерал TIMESTAMP не поддерживаются; для хранения даты и времени используется DATETIME | |
| F051-04 | Предикат сравнения для типов данных DATE, TIME и TIMESTAMP | DATETIME | Сравнивать значения DATETIME можно; стандартные типы DATE, TIME и TIMESTAMP отсутствуют |
| F051-05 | Явное приведение с помощью CAST между типами даты и времени и типами символьных строк | CAST, DATETIME | Поддерживается приведение между DATETIME и TEXT. Стандартные типы DATE, TIME и TIMESTAMP отсутствуют |
| F051-06 | Функция CURRENT_DATE | CURRENT_DATE | Возвращает DATETIME со временем 00:00:00, а не DATE |
| F051-07 | LOCALTIME | ||
| F051-08 | LOCALTIMESTAMP | LOCALTIMESTAMP | Возвращает DATETIME с часовым поясом; результат совпадает с CURRENT_TIMESTAMP |
| F081 | UNION и EXCEPT в представлениях | ||
| F131 | Операции со сгруппированными представлениями | ||
| F131-01 | Предложения WHERE, GROUP BY и HAVING поддерживаются в запросах со сгруппированными представлениями | ||
| F131-02 | Несколько таблиц поддерживаются в запросах со сгруппированными представлениями | ||
| F131-03 | Агрегатные функции поддерживаются в запросах со сгруппированными представлениями | ||
| F131-04 | Подзапросы с предложениями GROUP BY и HAVING и сгруппированными представлениями | Подзапросы с GROUP BY и HAVING поддерживаются; представлений нет | |
| F131-05 | Инструкция SELECT, возвращающая одну строку, с предложениями GROUP BY и HAVING и сгруппированными представлениями | ||
| F181 | Поддержка нескольких модулей | ||
| F201 | Функция CAST | CAST | |
| F221 | Явные значения по умолчанию | ||
| F261 | Выражение CASE | ||
| F261-01 | Простое выражение CASE | CASE — Простое выражение CASE |
|
| F261-02 | Выражение CASE с условиями | CASE — Выражение CASE с условиями |
|
| F261-03 | NULLIF | ||
| F261-04 | COALESCE | COALESCE | |
| F311 | Инструкция определения схемы | ||
| F311-01 | CREATE SCHEMA | CREATE SCHEMA принимается как заглушка и не создает схему | |
| F311-02 | CREATE TABLE для постоянных базовых таблиц | Самостоятельная команда CREATE TABLE поддерживается (F031-01); создание таблиц внутри CREATE SCHEMA не поддерживается | |
| F311-03 | CREATE VIEW | ||
| F311-04 | CREATE VIEW: WITH CHECK OPTION | ||
| F311-05 | Инструкция GRANT | Самостоятельная команда GRANT поддерживается (F031-03); выдача привилегий внутри CREATE SCHEMA не поддерживается | |
| F471 | Скалярные подзапросы | Подзапрос, возвращающий одно значение, можно использовать в выражениях, например SELECT a + (SELECT MAX(b) FROM t2) FROM t1. Коррелированные подзапросы не поддерживаются (E061-13) |
|
| F481 | Расширенный предикат NULL | IS NULL применим к любому скалярному выражению; проверка строки из нескольких значений, например (a, b) IS NULL, не поддерживается |
|
| F501 | Представления возможностей и соответствия стандарту | ||
| F812 | Базовая диагностика отклонений от стандарта | ||
| S011 | Пользовательские типы данных | ||
| T321 | Базовые подпрограммы, вызываемые SQL | ||
| T321-01 | Пользовательские функции без перегрузки | ||
| T321-02 | Пользовательские хранимые процедуры без перегрузки | Параметры задаются только типами, без имен и режимов IN, OUT, INOUT. Тело процедуры — одна команда INSERT, UPDATE или DELETE | |
| T321-03 | Вызов функции | ||
| T321-04 | Инструкция CALL | CALL | Аргументами могут быть только литералы и параметры запроса, например CALL p(1, $1); выражения вроде 1 + 2 не допускаются |
| T321-05 | Инструкция RETURN | RETURN QUERY | RETURN QUERY в блоке DO добавляет строки к результату и не завершает блок. Стандартная инструкция RETURN не реализована |
| T321-06 | Представление ROUTINES | ||
| T321-07 | Представление PARAMETERS | ||
| T631 | Предикат IN с одним элементом списка | ||
Необязательные возможности¶
| Идентификатор | Наименование | Поддержка | Примечание |
|---|---|---|---|
| F200 | Инструкция TRUNCATE TABLE | TRUNCATE TABLE | |
| F321 | Авторизация пользователя | CURRENT_USER, управление доступом | CURRENT_USER возвращает имя пользователя, с привилегиями которого выполняется запрос. SESSION_USER, SYSTEM_USER и SET SESSION AUTHORIZATION не поддерживаются |
| F571 | Проверка истинности значений | Выражение | IS [NOT] TRUE, IS [NOT] FALSE, IS [NOT] UNKNOWN |
| F641 | Конструкторы строк и таблиц | VALUES | Поддерживаются VALUES с несколькими строками и строки значений в сравнениях и IN, например (a, b) = (1, 2). Строку нельзя использовать как самостоятельное значение |
| F850 | ORDER BY в запросе верхнего уровня | SELECT -> ORDER BY |
Поддерживаются ASC, DESC, NULLS FIRST и NULLS LAST; ограничения ссылок на колонки описаны в E121-02 и E121-03 |
| F851 | ORDER BY в подзапросах | ORDER BY допускается в подзапросах и CTE | |
| S091 | Базовая поддержка массивов | ARRAY, литералы массивов | Поддерживаются одномерные массивы встроенных типов и ARRAY[...]. Массивы нельзя сравнивать и использовать как ключи шардирования; пользовательские типы элементов отсутствуют |
| T031 | Тип данных BOOLEAN | BOOLEAN, BOOL | |
| T121 | WITH (без RECURSIVE) в запросе | CTE | Рекурсивные CTE (WITH RECURSIVE) не поддерживаются |
| T331 | Базовые роли | Команда SET ROLE для смены активной роли не поддерживается | |
| T441 | Функции ABS и MOD | ABS | Функции MOD нет; остаток от деления вычисляет оператор % |
| T611 | Элементарные операции OLAP (оконные функции) | Поддерживаются агрегатные оконные функции, ROW_NUMBER, PARTITION BY, ORDER BY, рамки ROWS и RANGE и именованные окна (WINDOW). Функций RANK и DENSE_RANK нет | |
| T617 | Функции FIRST_VALUE и LAST_VALUE | LAST_VALUE | Функции FIRST_VALUE нет |
Дополняющие стандарт возможности¶
| Идентификатор | Наименование | Поддержка | Примечание |
|---|---|---|---|
| — | Тип данных TEXT | TEXT, STRING | |
| — | Тип данных UUID | UUID | |
| — | Тип данных JSON | JSON | |
| — | Тип данных UNSIGNED | UNSIGNED | Целое число не меньше 0; используется только в определениях колонок |
| — | GROUP_CONCAT | GROUP_CONCAT | |
| — | STRING_AGG | STRING_AGG | |
| — | CREATE INDEX | CREATE INDEX | |
| — | DROP INDEX | DROP INDEX | |
| — | LIMIT | SELECT -> LIMIT |
Стандартные OFFSET и FETCH FIRST не поддерживаются |
| — | INDEXED BY | INDEXED BY | |
| — | ALTER SYSTEM | ALTER SYSTEM | |
| — | ALTER USER | ALTER USER | |
| — | CREATE USER | CREATE USER | |
| — | DROP USER | DROP USER | |
| — | EXPLAIN | EXPLAIN | |
| — | TO_CHAR | TO_CHAR | |
| — | TO_DATE | TO_DATE | |
| — | CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Возвращает DATETIME с часовым поясом |
| — | ILIKE | ILIKE | |
| — | ALTER INDEX | ALTER INDEX | Переименование индекса |
| — | JSON_EXTRACT_PATH | JSON_EXTRACT_PATH | Извлечение значения JSON по пути; не заменяет стандартные операторы SQL/JSON |
| — | Транзакционные блоки DO | Транзакции | Атомарное выполнение в пределах одного узла и общего бакета; доступны LET, IF/ELSE и RETURN QUERY. Действуют ограничения |
| — | INSERT ON CONFLICT DO UPDATE | ON CONFLICT DO UPDATE | Поддерживается внутри транзакционных блоков для шардированных таблиц; действуют ограничения на вставку и обновление |
| — | DISCARD | DISCARD | Очистка локальных кешей SQL на инстансе |
| — | Функции Picodata | Функции | Сведения о кластере и инстансе: PICO_INSTANCE_NAME, PICO_LOG_LEVEL, PICO_INSTANCE_HEALTH_STATUS и другие |