Expand description
AST for the PG-dialect subset SPG accepts in v0.2.
Display is implemented so that for any AST a produced by crate::parser,
re-parsing format!("{a}") yields a structurally equal AST. Binary and
unary operators always emit parentheses to remove any precedence
ambiguity — round-trip safety wins over prettiness.
Structs§
- Alter
Index Statement - Alter
Sequence Statement - v7.17.0 —
ALTER SEQUENCEAST node. - Alter
Table Statement - v6.7.2 —
ALTER TABLE t SET <setting> = <value>. v6.7.2 ships the singlehot_tier_bytessetting; later v6.7.x sub-versions can add more SET subjects without changing the dispatch shape. - Column
Def - Column
Name - Create
Domain Statement - v7.17.0 Phase 1.5 —
CREATE DOMAINAST. - Create
Function Statement - v7.12.4 —
CREATE [OR REPLACE] FUNCTION. v7.12.4 shipsRETURNS TRIGGER LANGUAGE plpgsqlas the primary use case (the row-level trigger body the CREATE TRIGGER below references). Non-trigger user-defined functions parse but error at execution time with a clear unsupported message; that surface lands in v7.12.5+. - Create
Index Statement - Create
Materialized View Statement - v7.17.0 Phase 1.3 —
CREATE MATERIALIZED VIEWAST node. - Create
Publication Statement - v6.1.2 —
CREATE PUBLICATIONAST node. Thescopefield uses thePublicationScopeshape. v6.1.2 only acceptedAllTables; v6.1.3 unlocks theForTables/AllTablesExceptvariants by flipping the parser gate (no AST migration). - Create
Sequence Statement - v7.17.0 —
CREATE SEQUENCEAST node. SeeStatement::CreateSequence. - Create
Subscription Statement - v6.1.4 —
CREATE SUBSCRIPTIONAST node. v6.1.4 ships a single fixed-shape DDL; the WITH-clause options PG supports (enabled,slot_name,streaming,binary) are out of scope for v6.1.4 —enableddefaults to true and there are no other knobs to set in v6.1.x. - Create
Table Statement - Create
Trigger Statement - v7.12.4 —
CREATE [OR REPLACE] TRIGGER. Always row-level (FOR EACH ROW) in v7.12.4 — statement-level triggers parse but the executor refuses them.WHEN (cond)clauses are out of scope; the trigger function can short-circuit on a leading IF inside its body once v7.12.5 lands IF. - Create
Type Statement - v7.17.0 Phase 1.4 —
CREATE TYPEAST. - Create
User Statement - Create
View Statement - v7.17.0 Phase 1.2 —
CREATE VIEWAST node. - Cte
- Delete
Statement DELETE FROM <table> [WHERE cond]. v4.4 — removes matched rows from the active catalog and prunes them from every index.- Explain
Statement - Foreign
KeyConstraint - v7.6.0 — A single FOREIGN KEY constraint. Both column-level
REFERENCESand table-levelFOREIGN KEY (...) REFERENCES ...parse into this shape — the column-level form has a single-entrycolumns/parent_columns. - From
Clause - FROM clause shape. v1.10 accepts a primary table plus a flat list of
joined peers —
FROM a [, b]* [INNER|LEFT] JOIN c ON expr .... The joins evaluate left-associatively in nested-loop order. - From
Join - Function
Arg - v7.12.4 — one positional argument to a
CREATE FUNCTION. - Insert
Statement - Merge
Statement - v7.17.0 Phase 3.P0-42 — SQL:2003 / PG 15+ MERGE statement.
One WHEN clause fires per source row depending on whether the
oncondition matched any target row(s); the executor walksclausesin declaration order and fires the first whosematchedkind and optionalconditionare both satisfied. - Merge
When Clause - OnConflict
Clause - v7.9.7 — INSERT upsert clause:
ON CONFLICT (target) DO action. - OrderBy
- Partition
BySpec - v7.37.6-B —
PARTITION BY <kind> (key_columns…)parent suffix. v7.37.6-B only RANGE is recognised; the enum keeps space for future LIST / HASH without breaking the public AST shape. - Partition
OfSpec - v7.37.6-B —
PARTITION OF <parent> <bounds>child suffix. Bounds is either a half-open range (FOR VALUES FROM (a) TO (b)) or the catch-allDEFAULTpartition. - PlPg
SqlBlock - v7.12.4 — PL/pgSQL
BEGIN ... END;block. v7.12.6 widens from assignment + return to a real-PL/pgSQL surface:DECLARE-block local variables,IF/ELSIF/ELSE/END IFcontrol flow,RAISEdiagnostics, and embedded SQL statements that execute through the regular engine path. The remaining v7.12.x carve-out is loops (LOOP/WHILE/FOR), which mailrs’s trigger doesn’t need but other PG customers may; deferred to a future minor release. - PlPg
SqlDeclare - v7.12.6 — single
DECLAREentry: variable name + declared type + optional initialiser. Variables default to SQL NULL when no init is given (matches PG). - Select
Statement - Sequence
Options - v7.17.0 — option grammar shared by CREATE / ALTER SEQUENCE.
All fields are optional.
min_value/max_valuecarrySome(SeqBound::NoBound)forNO MINVALUE/NO MAXVALUE. - Table
Ref - Update
Statement UPDATE <table> SET col = expr [, ...] [WHERE cond]. v4.4 — the engine evaluatesexprper matched row in the table’s row order and rewrites cells in place. Indexed columns are dropped + re- inserted into the affected B-tree on each row change.- Window
Frame - v4.20 explicit window frame:
ROWS|RANGE BETWEEN <bound> AND <bound>.endisNonefor the shorthand “ROWS” where end implicitly = CURRENT ROW.
Enums§
- Alter
Index Target - Alter
Table Target - Assign
Target - BinOp
- Cast
Target - Collation
- v7.17.0 Phase 2.5 — text collation classification surfaced
from the SQL parser. Mirrors
spg_storage::Collation; the engine bridges between the two at CREATE TABLE time. - Column
Type Name - SQL-level type names. The mapping to the storage runtime’s
DataTypehappens inspg-engine— keepingspg-sqlfree of storage deps. - CteBody
- v7.37.43-T4.4 — CTE body. Read-only (Select) or data-modifying (Insert / Update / Delete with optional RETURNING). The data-modifying variants must carry a RETURNING projection for the outer query to reference the CTE alias by; an empty RETURNING is only valid if no outer reference materialises (rare — typically caught at planning).
- Expr
- Extract
Field - FkAction
- v7.6.0 — Referential action for
ON DELETE/ON UPDATE. - Frame
Bound - Frame
Kind - Function
ArgMode - Function
ArgType - Function
Body - Function
Return - Index
Method - Isolation
Level - v7.38 轴 4 — PG-standard isolation levels. SPG accepts all four
at parse time and tracks the selected value on the engine. The
actual semantic differentiation (REPEATABLE READ snapshot,
SERIALIZABLE SSI) lands in the v7.38 isolation framework train;
today every level reads as effective READ COMMITTED (which is
also how PG treats READ UNCOMMITTED — it silently upgrades to
READ COMMITTED). Default =
ReadCommitted. - Join
Kind - Limit
Expr - v7.9.24 — LIMIT / OFFSET value. Integer literal at parse
time or a placeholder
$Nresolved during extended-query Bind. mailrs migration follow-up H2. - Literal
- Merge
Action - Merge
Matched - Null
Treatment - v6.4.2 — null treatment on
LAG/LEAD/FIRST_VALUE/LAST_VALUE. PG / ANSI default isRespect— NULLs participate in the offset walk.Ignorecauses the function to skip NULL values in the argument expression, returning the next non-NULL. - OnConflict
Action - v7.9.7 — action on conflict.
- Partition
Kind Ast - Partition
OfBounds Ast - PlPg
SqlStmt - Publication
Scope - v6.1.2 — Which tables a publication covers. v6.1.3 (this commit)
flips the parser gate for the
ForTables/AllTablesExceptvariants — the on-disk shape, snapshot serialisation, and the AST round-trip Display path were already in place in v6.1.2 so this is a parser-only widening. - Raise
Level - Range
Kind Ast - v7.17.0 Phase 3.P0-38 — PG range element kind. Mirrors
spg_storage::RangeKind; we keep it spg-sql-local so the AST crate doesn’t depend on storage. Bridged at engine boundary. - Return
Target - Select
Item - SeqBound
- v7.17.0 —
MINVALUE n/NO MINVALUE. - Sequence
Data Type - v7.17.0 — narrow type for
ASclause of CREATE SEQUENCE. - Sequence
Owned By - v7.17.0 —
OWNED BY {table.col | NONE}. - SetValue
- v7.12.1 — payload of a SET right-hand side. PG syntax accepts
a string literal, an identifier (often a config name), an
integer/float, or the bare
DEFAULTkeyword. - Statement
- Table
Constraint - v7.9.18 — table-level constraint at the end of a CREATE TABLE column list. Either a composite PRIMARY KEY or a UNIQUE (single- or multi-column).
- Trigger
Event - Trigger
ForEach - Trigger
Selector - v7.16.1 — target of
ALTER TABLE … { ENABLE | DISABLE } TRIGGER …. PG also acceptsUSER,REPLICA,ALWAYSmodifiers; v7.16.1 ships the two shapes pg_dump actually emits (ALL+ per-name) — the rest parse-accept asNamedshouldn’t surface from a dump. - Trigger
Timing - Type
Kind - v7.17.0 Phase 1.4 — flavour of the new type. Only ENUM is implemented; the variant set is open so Phase 1.5 (DOMAIN) and later (COMPOSITE, RANGE) can land without an AST shape migration.
- UnOp
- Union
Kind - VecEncoding
- In-cell encoding for a
VECTOR(N)column. v6.0.1 added the optionalUSING <encoding>clause; omitting it keeps the pre-v6F32default.Sq8quantises each cell to a per-vector affine(min, max, [u8; dim])triple (4× compression).F16(v6.0.3, DDL keywordHALF) stores each element as IEEE-754 binary16 (2× compression, ~3 decimal digits of precision).