Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 RECURSIVE0A000 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

FormSQLSTATE
WITH RECURSIVE0A000
Data-modifying CTEs (WITH … INSERT/UPDATE/DELETE)0A000
DISTINCT ON (...)0A000
NTILE, именованные окна (WINDOW-clause)0A000
JOIN … USING (...) / NATURAL JOIN0A000
ORDER BY ... NULLS FIRST|LAST, COLLATE0A000

AngaraStat surfaces

Встроенные статистические представления — то, на что опирается планировщик при оценке кардинальности. Полезны, чтобы понять, по каким колонкам собрана статистика (histogram/MCV/HLL) и насколько она свежа (*_epoch); пустые histogram/MCV означают, что для колонки ещё не набран Level 2.

sys.table_stats

ColumnDescription
stats_level_maxMax collection level configured
last_committed_rowidLast committed row ID
last_insert_epochEpoch of last insert
last_mutation_epochEpoch of last mutation

sys.column_stats

ColumnDescription
ndv_approxApproximate number of distinct values (HLL)
col_minColumn minimum (typed Value)
col_maxColumn maximum (typed Value)
null_countNumber of NULLs
stats_epochStats collection epoch
hll_enabledWhether HLL tracking is active
histogram_boundsEqui-depth histogram boundaries (Level 2)
mcv_valuesMost common values (Level 2)
mcv_frequenciesMCV frequencies (Level 2)
reservoir_sizeReservoir sample size (Level 2)
reservoir_epochReservoir epoch (Level 2)
reservoir_drift_countDrift 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 CTE0A000
DISTINCT ON, NTILE, именованные окна0A000
ORDER BY ... NULLS FIRST|LAST / COLLATE0A000
JOIN ... USING (...) / NATURAL JOIN0A000
CROSS JOIN сверх бюджета строк54000
ORDER BY ordinal out of range42P10
Expression type error42883