Queries
Справочник поддерживаемых форм запросов: CTE, JOIN, подзапросы, множества (UNION/INTERSECT/EXCEPT), оконные функции, агрегация, сортировка, статистические поверхности.
Non-recursive WITH (CTE)
AngaraBase поддерживает ограниченные (non-recursive) CTE как derived source в FROM:
WITH recent AS (
SELECT id, v FROM t WHERE v > 100
)
SELECT r.id, r.v
FROM recent r
ORDER BY r.id;
Supported CTE projection forms
WITH c AS (SELECT id, v FROM t)
SELECT * FROM c WHERE id < 10;
Explicitly unsupported
WITH RECURSIVE—0A000 feature_not_supported- Data-modifying CTEs (
WITH ... INSERT/UPDATE/DELETE) —0A000 feature_not_supported
JOINs
Поддерживаются все пять видов: INNER, LEFT [OUTER], RIGHT [OUTER],
FULL [OUTER], CROSS.
SELECT a.id, b.name
FROM orders a
INNER JOIN customers b ON a.customer_id = b.id;
SELECT a.id, b.name
FROM orders a
LEFT JOIN customers b ON a.customer_id = b.id;
SELECT a.id, b.name
FROM orders a
FULL OUTER JOIN customers b ON a.customer_id = b.id;
Условие соединения задаётся только через ON <expr> (для CROSS JOIN условие не
нужно). USING (...) и NATURAL JOIN не поддерживаются — 0A000.
CROSS JOIN ограничен бюджетом числа строк sql.join.max_cross_join_rows
(по умолчанию 1 000 000; env ANGARABASE_MAX_CROSS_JOIN_ROWS); превышение —
54000 program_limit_exceeded.
ORDER BY
SELECT * FROM t ORDER BY v;
SELECT * FROM t ORDER BY v ASC;
SELECT * FROM t ORDER BY v DESC;
ORDER BY <expr> поддерживает ограниченные скалярные выражения, уже поддерживаемые движком.
Поддержка псевдонимов (Aliases)
ORDER BY может ссылаться на псевдонимы (алиасы), определённые в SELECT-списке с помощью ключевого слова AS. Это работает как для обычных колонок, так и для результатов агрегации:
-- Алиас для выражения
SELECT x * 2 AS doubled FROM t ORDER BY doubled;
-- Алиас для агрегации
SELECT grp, sum(amount) AS total
FROM t
GROUP BY grp
ORDER BY total DESC;
Порядковые номера колонок (Ordinals)
Поддерживается сортировка по порядковому номеру колонки в SELECT-списке (1-based), согласно стандарту SQL:2011:
-- Сортировка по первой колонке (a)
SELECT a, b FROM t ORDER BY 1;
-- Сортировка по второй колонке (b) в обратном порядке
SELECT a, b FROM t ORDER BY 2 DESC;
Если указанный номер выходит за пределы количества колонок в запросе (или равен 0), возвращается ошибка 42P10 (invalid_column_reference).
NULL ordering
- В
ASCпорядкеNULLтрактуется как наибольшее значение (выводится последним). - В
DESCпорядкеNULLвыводится первым. - Явное
NULLS FIRST/NULLS LASTне поддерживается —0A000.
GROUP BY / HAVING
SELECT v, COUNT(*) AS cnt
FROM t
GROUP BY v
HAVING COUNT(*) > 1;
DISTINCT поддерживается; DISTINCT ON (...) — 0A000.
Подзапросы
Поддерживаются IN (...), EXISTS / NOT EXISTS и скалярные подзапросы в
SELECT-списке (в т.ч. коррелированные):
SELECT * FROM orders o WHERE EXISTS (SELECT 1 FROM items i WHERE i.order_id = o.id);
SELECT id, (SELECT COUNT(*) FROM items i WHERE i.order_id = o.id) AS n FROM orders o;
SELECT * FROM t WHERE id IN (SELECT order_id FROM items);
Множества (UNION / INTERSECT / EXCEPT)
SELECT id FROM a
UNION -- с дедупликацией
SELECT id FROM b;
SELECT id FROM a UNION ALL SELECT id FROM b; -- без дедупликации
SELECT id FROM a INTERSECT SELECT id FROM b;
SELECT id FROM a EXCEPT SELECT id FROM b;
Оконные функции (OVER (...))
Поддерживаются ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, FIRST_VALUE,
LAST_VALUE и оконные агрегаты SUM/COUNT/AVG/MIN/MAX с PARTITION BY /
ORDER BY:
SELECT id, grp,
ROW_NUMBER() OVER (PARTITION BY grp ORDER BY id) AS rn,
SUM(amount) OVER (PARTITION BY grp) AS grp_total
FROM t;
Не поддерживаются (0A000): NTILE, именованные окна (WINDOW-clause).
LIMIT / OFFSET
SELECT * FROM t ORDER BY id LIMIT 10;
SELECT * FROM t ORDER BY id LIMIT 10 OFFSET 20;
Ошибки в выражениях (Expression Errors)
При использовании несовместимых типов в арифметических выражениях (например, попытка сложения строки с числом 'строка' + 1), AngaraBase возвращает ошибку 42883 (undefined_function / operator not found).
Примечание: строковые литералы, содержащие числа (например, '123'), могут автоматически приводиться к числовому типу в зависимости от контекста.
Unsupported query forms
| Form | SQLSTATE |
|---|---|
WITH RECURSIVE | 0A000 |
Data-modifying CTEs (WITH … INSERT/UPDATE/DELETE) | 0A000 |
DISTINCT ON (...) | 0A000 |
NTILE, именованные окна (WINDOW-clause) | 0A000 |
JOIN … USING (...) / NATURAL JOIN | 0A000 |
ORDER BY ... NULLS FIRST|LAST, COLLATE | 0A000 |
AngaraStat surfaces
Встроенные статистические представления — то, на что опирается планировщик при
оценке кардинальности. Полезны, чтобы понять, по каким колонкам собрана
статистика (histogram/MCV/HLL) и насколько она свежа (*_epoch); пустые
histogram/MCV означают, что для колонки ещё не набран Level 2.
sys.table_stats
| Column | Description |
|---|---|
stats_level_max | Max collection level configured |
last_committed_rowid | Last committed row ID |
last_insert_epoch | Epoch of last insert |
last_mutation_epoch | Epoch of last mutation |
sys.column_stats
| Column | Description |
|---|---|
ndv_approx | Approximate number of distinct values (HLL) |
col_min | Column minimum (typed Value) |
col_max | Column maximum (typed Value) |
null_count | Number of NULLs |
stats_epoch | Stats collection epoch |
hll_enabled | Whether HLL tracking is active |
histogram_bounds | Equi-depth histogram boundaries (Level 2) |
mcv_values | Most common values (Level 2) |
mcv_frequencies | MCV frequencies (Level 2) |
reservoir_size | Reservoir sample size (Level 2) |
reservoir_epoch | Reservoir epoch (Level 2) |
reservoir_drift_count | Drift count since last reservoir refresh (Level 2) |
SELECT * FROM sys.table_stats WHERE table_name = 'events';
SELECT * FROM sys.column_stats WHERE table_name = 'events' AND column_name = 'ts';
Expected SQLSTATE
| Ситуация | SQLSTATE |
|---|---|
WITH RECURSIVE / data-modifying CTE | 0A000 |
DISTINCT ON, NTILE, именованные окна | 0A000 |
ORDER BY ... NULLS FIRST|LAST / COLLATE | 0A000 |
JOIN ... USING (...) / NATURAL JOIN | 0A000 |
CROSS JOIN сверх бюджета строк | 54000 |
ORDER BY ordinal out of range | 42P10 |
| Expression type error | 42883 |
Links
- DML operations: dml.md
- DDL (stats options): ddl.md
- SQL compatibility overview: overview.md
- Known issues: Known issues