AST and token reference

syntaqlite's parser produces a flat arena of typed nodes. This page lists all node types and token types. For a guide on using the parser from Rust, see Using from Rust.

Parse tree structure

All nodes for a statement are allocated into a contiguous arena. Each node has a tag (its type) and a fixed set of fields:

Field kindStorageExamples
IndexReference to another node in the arenaChild nodes (expressions, clauses)
Inline span(offset, length) into the source textIdentifiers, literals
Inline enumDiscriminant valueBinaryOp, SortOrder
Inline flagsBit field (up to 8 bits)DISTINCT, STAR
Inline boolBooleanIF NOT EXISTS

List nodes (e.g., ResultColumnList) store a count followed by that many child references.

Statement nodes

NodeSQL
SelectStmtSELECT ...
CompoundSelectSELECT ... UNION SELECT ...
InsertStmtINSERT INTO ...
UpdateStmtUPDATE ...
DeleteStmtDELETE FROM ...
CreateTableStmtCREATE TABLE ...
CreateIndexStmtCREATE INDEX ...
CreateViewStmtCREATE VIEW ...
CreateTriggerStmtCREATE TRIGGER ...
CreateVirtualTableStmtCREATE VIRTUAL TABLE ...
DropStmtDROP TABLE/INDEX/VIEW/TRIGGER ...
AlterTableStmtALTER TABLE ...
PragmaStmtPRAGMA ...
AnalyzeOrReindexStmtANALYZE ... / REINDEX ...
AttachStmtATTACH DATABASE ...
DetachStmtDETACH DATABASE ...
VacuumStmtVACUUM ...
ExplainStmtEXPLAIN ...
TransactionStmtBEGIN/COMMIT/ROLLBACK ...
SavepointStmtSAVEPOINT/RELEASE ...
WithClauseWITH ... SELECT/INSERT/UPDATE/DELETE ...
ValuesClauseVALUES (...)

Expression nodes

NodeExample
BinaryExpra + b, x = 1, a AND b
UnaryExpr-x, NOT flag
Literal42, 'hello', NULL, X'FF'
ColumnReft.col, col
Variable?, ?1, :name, @var, $param
FunctionCalllength(name)
AggregateFunctionCallcount(*), sum(DISTINCT x)
OrderedSetFunctionCallpercentile(x, 0.5)
CastExprCAST(x AS TEXT)
CollateExprname COLLATE NOCASE
CaseExprCASE WHEN ... THEN ... END
CaseWhenWHEN ... THEN ... branch
SubqueryExpr(SELECT ...) as expression
ExistsExprEXISTS (SELECT ...)
InExprx IN (1, 2, 3)
IsExprx IS NULL
BetweenExprx BETWEEN 1 AND 10
LikeExprname LIKE 'A%'

Clause and source nodes

NodeDescription
ResultColumnSingle item in SELECT list
ResultColumnListFull SELECT list
TableRefTable reference in FROM
SubqueryTableSourceSubquery in FROM
JoinClauseJOIN ... ON ...
JoinPrefixINNER, LEFT OUTER, CROSS, etc.
OrderingTermSingle ORDER BY item
OrderByListFull ORDER BY clause
LimitClauseLIMIT ... OFFSET ...
CteDefinitionSingle CTE in WITH
CteListList of CTEs
WindowDefOVER (PARTITION BY ... ORDER BY ...)
NamedWindowDefWINDOW name AS (...)
FrameSpecROWS/RANGE/GROUPS BETWEEN ...
FrameBoundCURRENT ROW, N PRECEDING, etc.

Schema nodes

NodeDescription
ColumnDefColumn definition in CREATE TABLE
ColumnDefListList of column definitions
ColumnConstraintPRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT, etc.
ColumnConstraintListList of column constraints
TableConstraintTable-level PRIMARY KEY, UNIQUE, FOREIGN KEY
TableConstraintListList of table constraints
ForeignKeyClauseREFERENCES table(col) with actions

Enums

Inline enum fields used across node types:

EnumValues
BinaryOpPLUS, MINUS, STAR, SLASH, REM, LT, GT, LE, GE, EQ, NE, AND, OR, BIT_AND, BIT_OR, LSHIFT, RSHIFT, CONCAT, PTR, PTR2
UnaryOpMINUS, PLUS, BIT_NOT, NOT
LiteralTypeINTEGER, FLOAT, STRING, BLOB, NULL, CURRENT, QNUMBER
SortOrderASC, DESC
NullsOrderNONE, FIRST, LAST
ConflictActionDEFAULT, ROLLBACK, ABORT, FAIL, IGNORE, REPLACE
CompoundOpUNION, UNION_ALL, INTERSECT, EXCEPT
ForeignKeyActionNO_ACTION, SET_NULL, SET_DEFAULT, CASCADE, RESTRICT
MaterializedDEFAULT, MATERIALIZED, NOT_MATERIALIZED

Flags

Compact bit fields stored inline in nodes:

Flag fieldBits
ResultColumnFlagsSTAR (bit 0)
SelectStmtFlagsDISTINCT (bit 0), ALL (bit 1)
CreateTableStmtFlagsIF_NOT_EXISTS (bit 0), TEMP (bit 1), WITHOUT_ROWID (bit 2), STRICT (bit 3)

Token types

The tokenizer produces 187 token types. The main categories:

Keywords

TokenTokenTokenToken
AbortActionAddAfter
AllAlterAlwaysAnalyze
AndAsAscAttach
AutoincrBeforeBeginBetween
ByCascadeCaseCast
CheckCollateColumnCommit
ConflictConstraintCreateCross
CurrentCurrentDateCurrentTimeCurrentTimestamp
DatabaseDefaultDeferrableDeferred
DeleteDescDetachDistinct
DoDropEachElse
EndEscapeExceptExclude
ExclusiveExistsExplainFail
FilterFirstFollowingFor
ForeignFromFullGlob
GroupGroupsHavingIf
IgnoreImmediateInIndex
IndexedInitiallyInnerInsert
InsteadIntersectIntoIs
IsnullJoinKeyLast
LeftLikeLimitMatch
MaterializedNaturalNoNot
NothingNotnullNullNulls
OfOffsetOnOr
OrderOthersOuterOver
PartitionPlanPragmaPreceding
PrimaryQueryRaiseRange
RecursiveReferencesReindexRelease
RenameReplaceRestrictReturning
RightRollbackRowRows
SavepointSelectSetTable
TempThenTiesTo
TransactionTriggerUnboundedUnion
UniqueUpdateUsingVacuum
ValuesViewVirtualWhen
WhereWindowWithWithout

Operators and punctuation

TokenSymbolTokenSymbol
Plus+Minus-
Star*Slash/
Rem%Eq= / ==
Ne!= / <>Lt<
Gt>Le<=
Ge>=Concat||
Ptr->Ptr2->>
BitAnd&BitOr|
BitNot~LShift<<
RShift>>Lp(
Rp)Comma,
Dot.Semi;

Literals and identifiers

TokenDescription
IntegerInteger literal (42)
FloatFloating-point literal (3.14)
StringString literal ('hello')
BlobBlob literal (X'FF')
IdIdentifier (users, "quoted id")
VariableBind parameter (?, ?1, :name, @var, $param)

Whitespace, comments, and errors

TokenDescription
SpaceWhitespace (spaces, tabs, newlines)
CommentLine (--) or block (/* */) comment
ErrorUnrecognized or malformed token
IllegalToken not valid in current context