Обзор совместимости SQL
AngaraBase реализует подмножество PostgreSQL SQL через pgwire-протокол.
Принцип — fail-closed: неподдерживаемая конструкция возвращает явный
SQLSTATE (чаще всего 0A000 feature_not_supported), а не молчаливый
некорректный результат. Эта страница — карта того, что поддержано, и как быстро
интерпретировать ошибки.
Стандартные SQL-конструкции
Матрица того, что AngaraBase понимает в запросах. Поддерживается — корректная
семантика с pinned-тестами; Частично — работает с ограничениями (см.
заметку); 0A000 — неподдержанная форма возвращает детерминированную ошибку.
Запросы (SELECT)
| Конструкция | Статус | Заметка |
|---|---|---|
SELECT … FROM … WHERE …, LIMIT, OFFSET | ✅ Поддерживается | предикаты: сравнения, IN, BETWEEN, IS [NOT] NULL, AND/OR/NOT, boolean-колонка как предикат |
ORDER BY <col> / <expr> / порядковый номер | ✅ Поддерживается | NULLS FIRST/LAST и COLLATE → 0A000; неверный ordinal → 42P10 |
DISTINCT | ✅ Поддерживается | DISTINCT ON (...) → 0A000 |
GROUP BY (в т.ч. многоключевой) · HAVING | ✅ Поддерживается | агрегаты COUNT/SUM/MIN/MAX/AVG; HAVING без GROUP BY тоже |
WITH (CTE, non-recursive) | ✅ Поддерживается | CTE как источник в FROM; WITH RECURSIVE и data-modifying CTE → 0A000 (recursive — planned v0.7) |
Подзапросы: IN (…), EXISTS/NOT EXISTS, скалярный в SELECT | ✅ Поддерживается | коррелированные поддержаны |
Множества: UNION, UNION ALL, INTERSECT, EXCEPT | ✅ Поддерживается | hash-based dedup |
JOIN
| Конструкция | Статус | Заметка |
|---|---|---|
INNER, LEFT [OUTER], RIGHT [OUTER], FULL [OUTER], CROSS | ✅ Поддерживается | все пять видов |
| Условие соединения | ✅ ON <expr> | USING (...) и NATURAL JOIN → 0A000 |
LATERAL (…) | ✅ Поддерживается | коррелированная производная таблица |
CROSS JOIN бюджет строк | ⚠️ Частично | лимит sql.join.max_cross_join_rows (деф. 1 000 000); превышение → 54000 |
Оконные функции (OVER (…))
| Функция | Статус | Заметка |
|---|---|---|
ROW_NUMBER, RANK, DENSE_RANK | ✅ Поддерживается | PARTITION BY / ORDER BY |
LAG, LEAD, FIRST_VALUE, LAST_VALUE | ✅ Поддерживается | |
SUM/COUNT/AVG/MIN/MAX OVER (…) | ✅ Поддерживается | оконные агрегаты |
NTILE, именованные окна (WINDOW-clause) | ❌ 0A000 |
DDL / DML / типы
Подробные таблицы и Expected SQLSTATE — на страницах раздела:
| Тема | Страница | Статус |
|---|---|---|
| Типы данных | data-types.md | Stable |
| DDL (CREATE, ALTER, DROP) | ddl.md | Stable |
| DML (INSERT, UPDATE, DELETE) | dml.md | Stable |
| Запросы (CTE, JOIN, ORDER BY) | queries.md | Stable |
| Секционирование таблиц | partitioning.md | Baseline |
Ключевые DDL-границы: CREATE MATERIALIZED VIEW поддержан, обычный CREATE VIEW
— planned (0A000), CREATE TRIGGER — non-goal (0A000), FOREIGN KEY —
принимается как NOT ENFORCED.
Коды ошибок (SQLSTATE) — быстрый справочник
| SQLSTATE | Имя | Типичный сценарий |
|---|---|---|
0A000 | feature_not_supported | WITH RECURSIVE, JOIN … USING/NATURAL, NTILE, именованные окна, DISTINCT ON, обычный CREATE VIEW (planned), CREATE TRIGGER (non-goal), сложные RLS-предикаты |
54000 | program_limit_exceeded | CROSS JOIN сверх бюджета sql.join.max_cross_join_rows (деф. 1 000 000) |
23514 | check_violation | роутинг секций: нет подходящей партиции и нет DEFAULT |
42809 | wrong_object_type | UPDATE/DELETE на append-only; PK/FK update под no_delete |
22023 | invalid_parameter_value | неверный stats_level_max, break-glass TTL, setval вне [MINVALUE..MAXVALUE] |
42501 | insufficient_privilege | нет ролей для security-операций, нет SecurityContext |
25001 | active_sql_transaction | SET SESSION CONTEXT внутри активной транзакции |
42P10 | invalid_column_reference | ORDER BY по номеру вне диапазона колонок |
2200H | sequence_generator_limit_exceeded | nextval за MAXVALUE/MINVALUE без CYCLE |
55000 | object_not_in_prerequisite_state | currval(seq) до первого nextval в этой сессии |
42P07 | duplicate_object | CREATE SEQUENCE существующего имени без IF NOT EXISTS |
42P01 | undefined_table | DROP SEQUENCE / nextval / currval / setval несуществующей последовательности |
428C9 | generated_always | INSERT явного non-NULL в GENERATED ALWAYS AS IDENTITY |
Полный список с контекстом: Известные ограничения и SQLSTATE.
Подключение ORM и инструментов
ORM и клиенты (DBeaver, psql, Hibernate, Django и др.) при подключении выполняют
служебные pg_catalog-запросы. AngaraBase поддерживает базовую интроспекцию
pg_catalog, нужную для подключения этих инструментов. Если клиент не
подключается, проверьте Совместимость клиентов.
Если запрос зависает (нет ответа), это ошибка с нашей стороны — пожалуйста, соберите артефакты по инструкции в Поддержке и сообщите нам.
Встроенные функции SQL
| Функция | Сигнатура | Описание |
|---|---|---|
NOW() | () → timestamp | Текущее время UTC |
CURRENT_TIMESTAMP | () → timestamp | Алиас для NOW() |
date_trunc(field, ts) | (text, timestamp) → timestamp | Усечение до field (second…millennium); неизвестное поле → NULL |
set_config(name, val, local) | (text, text, bool) → text | Заглушка: возвращает val (совместимость с Django) |
obj_description(oid, cat) | (oid, text) → text | Заглушка: возвращает NULL (интроспекция Django) |
Видимость векторного выполнения
Когда режим выполнения допускает векторный путь
(ANGARABASE_SQL_EXECUTION_MODE=auto для поддержанных планов или force_vector),
EXPLAIN показывает имена векторных операторов: VectorSeqScan, VectorFilter,
VectorProject, VectorHashJoin, VectorAgg. Если форму плана AngaraVector не
поддерживает, в EXPLAIN остаются строчные (row) операторы.
Режимы ANGARABASE_SQL_EXECUTION_MODE:
auto(по умолчанию) — Stable векторный путь только для полностью поддержанных форм, иначе детерминированный откат на строчный;force_row— Stable всегда строчный исполнитель;force_vector— Experimental fail-closed сfeature_not_supported, если векторное выполнение невозможно; для целевого тестирования, не для production-нагрузки в0.6.x.
Опции таблиц AngaraMemory
CREATE TABLE ... WITH (...) поддерживает bounded-таблицы в памяти:
storage='memory'— Baseline движок таблиц AngaraMemory;durability='none'|'logged'|'snapshotted'— Baseline volatile/durable;max_rows=<n>— Stable жёсткий лимит строк; переполнение fail-closed (54023);eviction_policy='error'|'fifo'— Experimental по умолчаниюerror;checkpoint_interval_ms=<n>— Baseline имеет смысл только приdurability='snapshotted'.
Если max_rows не задан, применяется bounded-дефолт из политики инстанса. При
durability='snapshotted' горячий путь DML не персистит страницы немедленно —
запись планирует checkpoint-воркер по checkpoint_interval_ms.