Skip to main content

Module ast

Module ast 

Source
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§

AlterIndexStatement
AlterPolicyStatement
v7.39 (RLS) — ALTER POLICY name ON table { RENAME TO new | [TO roles] [USING (expr)] [WITH CHECK (expr)] }. Cannot change PERMISSIVE/RESTRICTIVE or the command (matches PG).
AlterSequenceStatement
v7.17.0 — ALTER SEQUENCE AST node.
AlterTableStatement
v6.7.2 — ALTER TABLE t SET <setting> = <value>. v6.7.2 ships the single hot_tier_bytes setting; later v6.7.x sub-versions can add more SET subjects without changing the dispatch shape.
ColumnDef
ColumnName
CopyOptions
Options for COPY … TO STDOUT [WITH] (…). Defaults reproduce the bare COPY … TO STDOUT text-format behaviour, so an empty option list is a no-op. delimiter / null_str / quote fall back to the per-format defaults (text: \t / \N; csv: , / `` / ") when unset.
CreateDomainStatement
v7.17.0 Phase 1.5 — CREATE DOMAIN AST.
CreateFunctionStatement
v7.12.4 — CREATE [OR REPLACE] FUNCTION. v7.12.4 ships RETURNS TRIGGER LANGUAGE plpgsql as 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+.
CreateIndexStatement
CreateMaterializedViewStatement
v7.17.0 Phase 1.3 — CREATE MATERIALIZED VIEW AST node.
CreatePolicyStatement
v7.39 (RLS) — CREATE POLICY name ON table [AS {PERMISSIVE|RESTRICTIVE}] [FOR cmd] [TO roles] [USING (expr)] [WITH CHECK (expr)].
CreatePublicationStatement
v6.1.2 — CREATE PUBLICATION AST node. The scope field uses the PublicationScope shape. v6.1.2 only accepted AllTables; v6.1.3 unlocks the ForTables / AllTablesExcept variants by flipping the parser gate (no AST migration).
CreateRuleStatement
v7.39 (round 139) — CREATE RULE query-rewrite rule AST node.
CreateSequenceStatement
v7.17.0 — CREATE SEQUENCE AST node. See Statement::CreateSequence.
CreateSubscriptionStatement
v6.1.4 — CREATE SUBSCRIPTION AST 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 — enabled defaults to true and there are no other knobs to set in v6.1.x.
CreateTableStatement
CreateTriggerStatement
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.
CreateTypeStatement
v7.17.0 Phase 1.4 — CREATE TYPE AST.
CreateUserStatement
CreateViewStatement
v7.17.0 Phase 1.2 — CREATE VIEW AST node.
Cte
CycleClause
v7.38 (read01 U16) — parsed CYCLE … SET … [TO … DEFAULT …] USING ….
DeleteStatement
DELETE FROM <table> [WHERE cond]. v4.4 — removes matched rows from the active catalog and prunes them from every index.
DmlOrderLimit
UPDATE <table> SET col = expr [, ...] [WHERE cond]. v4.4 — the engine evaluates expr per 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. v7.39 (round 413) — the boxed payload for MySQL’s ORDER BY [LIMIT] tail on a DML statement. Boxed off the statement struct so the PG-only common path stays at its pre-r413 size (see the round-305 nesting-stack lesson). v7.39 (round 431+1) — DELETE carries the identical clause with the identical meaning, so both share this one payload rather than each growing its own.
DropPolicyStatement
v7.39 (RLS) — DROP POLICY [IF EXISTS] name ON table.
ExceptionHandler
v7.37.20 (20.10) — one WHEN <cond> [OR <cond>...] THEN <body> arm inside an EXCEPTION block.
ExplainStatement
Each bool mirrors one independent PG EXPLAIN (…) option (ANALYZE, SUGGEST, COSTS OFF, BUFFERS, TIMING OFF, …); they compose freely, so a bitflags word or a nested options struct would only relocate the lint while making the option each caller sets harder to read.
ForeignKeyConstraint
v7.6.0 — A single FOREIGN KEY constraint. Both column-level REFERENCES and table-level FOREIGN KEY (...) REFERENCES ... parse into this shape — the column-level form has a single-entry columns / parent_columns.
FromClause
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.
FromJoin
FunctionArg
v7.12.4 — one positional argument to a CREATE FUNCTION.
FunctionAttrs
v7.39 (round 322, V46) — the attribute clauses CREATE FUNCTION accepts on either side of its body. Defaults are PG’s: VOLATILE, called on null input, SECURITY INVOKER, not leakproof, PARALLEL UNSAFE, and the language’s default cost / rows.
GrantPriv
v7.39 (read01 round 59) — one privilege in a GRANT, with the optional COLUMN list PG allows per privilege: GRANT SELECT (a, b), INSERT (c) ON t TO dan. An empty column list means the privilege is table-wide.
GrantStatement
v7.39 (read01 round 57) — a parsed GRANT / REVOKE. The same shape serves both; Statement::Grant vs Statement::Revoke says which way it runs.
IndexColumnOrder
v7.39 (round 537) — a CREATE INDEX key column’s ordering clause.
InsertStatement
JsonTable
v7.39 (round 205) — a JSON_TABLE FROM item.
LikeOptions
Which properties LIKE carries over. A bare LIKE copies names, types and NOT NULL and nothing else — measured on PG18, where a copied generated column becomes a plain one and a copied identity column loses its identity.
LikeSpec
v7.39 (round 531) — LIKE <table> [ {INCLUDING|EXCLUDING} <opt> ]* inside a CREATE TABLE column list.
LockingClause
v7.39 (round 293, E3 Phase 1) — a row-locking clause.
MergeStatement
v7.17.0 Phase 3.P0-42 — SQL:2003 / PG 15+ MERGE statement. One WHEN clause fires per source row depending on whether the on condition matched any target row(s); the executor walks clauses in declaration order and fires the first whose matched kind and optional condition are both satisfied.
MergeWhenClause
OnConflictClause
v7.9.7 — INSERT upsert clause: ON CONFLICT (target) DO action.
OrderBy
PartitionBySpec
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.
PartitionOfSpec
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-all DEFAULT partition.
PlPgSqlBlock
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 IF control flow, RAISE diagnostics, 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.
PlPgSqlDeclare
v7.12.6 — single DECLARE entry: variable name + declared type + optional initialiser. Variables default to SQL NULL when no init is given (matches PG).
SearchClause
v7.38 (read01 U16) — parsed SEARCH … FIRST BY … SET … clause.
SelectStatement
SequenceOptions
v7.17.0 — option grammar shared by CREATE / ALTER SEQUENCE. All fields are optional. min_value/max_value carry Some(SeqBound::NoBound) for NO MINVALUE / NO MAXVALUE.
SetDbRoleSettingStatement
v7.39 (round 547) — see Statement::SetDbRoleSetting. Boxed in the enum so the variant costs one pointer.
TableRef
UpdateFromSources
v7.39 (round 533) — what UPDATE … FROM src WHERE cond was lowered FROM, kept so the engine can finish the job.
UpdateStatement
WindowFrame
v4.20 explicit window frame: ROWS|RANGE BETWEEN <bound> AND <bound>. end is None for the shorthand “ROWS ” where end implicitly = CURRENT ROW.

Enums§

AlterDomainAction
v7.39 (round 260) — the ALTER DOMAIN actions SPG implements.
AlterIndexTarget
AlterTableTarget
AssignTarget
BinOp
CastTarget
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.
ColumnTypeName
SQL-level type names. The mapping to the storage runtime’s DataType happens in spg-engine — keeping spg-sql free of storage deps.
CopyFormat
COPY … TO STDOUT output format. text is PG’s default (tab-separated, \N nulls, backslash escapes); csv follows RFC-4180-style quoting.
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).
CursorDirection
v7.39 (round 218) — FETCH / MOVE cursor direction. PG grammar: single-row forms (NEXT / PRIOR / FIRST / LAST / ABSOLUTE n / RELATIVE n) return at most one row; multi-row forms (bare n / ALL / FORWARD [n|ALL] / BACKWARD [n|ALL]) stream a run. A negative bare/FORWARD count means BACKWARD (normalized at execution).
DiscardTarget
v7.39 (round 320, V53) — what a DISCARD throws away.
ExplainFormat
Expr
ExtractField
FkAction
v7.6.0 — Referential action for ON DELETE / ON UPDATE.
FrameBound
FrameExclusion
FrameKind
FunctionArgMode
FunctionArgType
FunctionBody
FunctionParallel
v7.39 (round 322, V46) — PG’s parallel-safety class.
FunctionReturn
FunctionVolatility
v7.39 (round 322, V46) — PG’s function volatility class. Declarative: it tells the planner how far a call may be moved or folded. SPG records it faithfully (pg_proc.provolatile, pg_get_functiondef) and does not yet exploit it for constant folding.
GrantObject
v7.39 (read01 round 57) — the object a GRANT names. SPG enforces TABLE privileges; every other object class parses and is accepted as a no-op, so a pg_dump that grants on schemas / sequences / functions still restores.
IndexMethod
IsolationLevel
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.
JoinKind
JsonTableColumn
v7.39 (round 205) — one entry in a JSON_TABLE (or NESTED) COLUMNS list.
JsonTableOnBehavior
v7.39 (round 205) — a JSON_TABLE column’s ON EMPTY / ON ERROR clause.
LimitExpr
v7.9.24 — LIMIT / OFFSET value. Integer literal at parse time or a placeholder $N resolved during extended-query Bind. mailrs migration follow-up H2.
Literal
LockStrength
PG’s four tuple-lock strengths, weakest first.
LockWait
What to do when the row is already locked.
MaintainKind
v7.39 (round 535) — which maintenance statement, and therefore what its target names. Measured on PG18: INDEX / TABLE / CLUSTER name a relation, SCHEMA names a schema, and SYSTEM / DATABASE name neither in a way SPG can refuse.
MatchType
v7.38 (read01, T29) — FK MATCH type. SIMPLE (default) skips the check when ANY referencing column is NULL; FULL requires all-or-none NULL (a mixed-NULL key errors). PARTIAL is parse-rejected (PG does not implement it either).
MergeAction
MergeMatched
MysqlIntWidth
v7.39 (round 386, type-fidelity epic P1) — the declared MySQL narrow integer width for a column whose ColumnTypeName is too wide to carry it: TINYINT collapses to SmallInt, MEDIUMINT to Int. Mirrors spg_storage::MysqlIntWidth; the engine bridges the two at CREATE TABLE time. Only recorded under the MySQL dialect.
NullTreatment
v6.4.2 — null treatment on LAG / LEAD / FIRST_VALUE / LAST_VALUE. PG / ANSI default is Respect — NULLs participate in the offset walk. Ignore causes the function to skip NULL values in the argument expression, returning the next non-NULL.
OnConflictAction
v7.9.7 — action on conflict.
Overriding
v7.38 (read01) — OVERRIDING { SYSTEM | USER } VALUE on an INSERT.
PartitionKindAst
PartitionOfBoundsAst
PlPgSqlStmt
PolicyCmd
v7.39 (RLS) — the command a CREATE POLICY scopes to. All is the default.
PublicationScope
v6.1.2 — Which tables a publication covers. v6.1.3 (this commit) flips the parser gate for the ForTables / AllTablesExcept variants — 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.
RaiseLevel
RangeKindAst
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.
ReturnTarget
SelectItem
SeqBound
v7.17.0 — MINVALUE n / NO MINVALUE.
SequenceDataType
v7.17.0 — narrow type for AS clause of CREATE SEQUENCE.
SequenceOwnedBy
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 DEFAULT keyword.
Statement
TableConstraint
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).
TriggerEvent
TriggerForEach
TriggerSelector
v7.16.1 — target of ALTER TABLE … { ENABLE | DISABLE } TRIGGER …. PG also accepts USER, REPLICA, ALWAYS modifiers; v7.16.1 ships the two shapes pg_dump actually emits (ALL + per-name) — the rest parse-accept as Named shouldn’t surface from a dump.
TriggerTiming
TypeKind
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
UnionKind
ValidateOnlyKind
v7.39 (round 696) — which operand a Statement::ValidateOnly names, and therefore which catalog answers whether it exists.
VecEncoding
In-cell encoding for a VECTOR(N) column. v6.0.1 added the optional USING <encoding> clause; omitting it keeps the pre-v6 F32 default. Sq8 quantises each cell to a per-vector affine (min, max, [u8; dim]) triple (4× compression). F16 (v6.0.3, DDL keyword HALF) stores each element as IEEE-754 binary16 (2× compression, ~3 decimal digits of precision).
ViewCheckOption
v7.39 (read01 round 132) — WITH [LOCAL | CASCADED] CHECK OPTION on an auto-updatable view. Cascaded is PG’s default when the bare WITH CHECK OPTION is written.

Functions§

figure_column_name
v7.39 (round 505) — the column name PG18 gives a projected expression that carries no AS alias. None means ?column?.
pretty_expr
v7.39 (round 311, V32) — PG’s PRETTY deparse of an expression, the form pg_get_constraintdef(oid, true) and friends return.
pretty_expr_mysql
v7.39 (round 527) — the same deparse, spelling a cast the way MySQL writes it.
render_exact_decimal
Render an exact decimal unscaled / 10^scale, keeping the scale (trailing zeros): (200, 2)2.00, (1, 1)0.1, (-15, 1)-1.5.