Documentation
¶
Overview ¶
Package ast declares the syntax tree for the SQLite SQL dialect.
Node names follow SQLite rather than PostgreSQL or sqlc: the tree is a direct rendering of src/parse.y, and every node carries a comment naming the grammar rule it comes from. Mapping onto another representation is a consumer's job.
Every node embeds Span and so reports byte offsets into the original input; sqlc slices the source with those offsets, so they are load-bearing rather than diagnostic (see PLAN.md).
Index ¶
- func Statements(stmts []Stmt) string
- func String(n Node) string
- func Walk(n Node, fn func(Node) bool)
- type AlterAction
- type AlterTableStmt
- type AnalyzeStmt
- type AttachStmt
- type BeginStmt
- type BetweenExpr
- type BinaryExpr
- type BindParam
- type CTE
- type CaseExpr
- type CaseWhen
- type CastExpr
- type CollateExpr
- type ColumnConstraint
- type ColumnConstraintKind
- type ColumnDef
- type ColumnName
- type CommitStmt
- type CompoundOp
- type ConflictAction
- type CreateIndexStmt
- type CreateTableStmt
- type CreateTriggerStmt
- type CreateViewStmt
- type CreateVirtualTableStmt
- type DeferClause
- type DeleteStmt
- type DetachStmt
- type Distinct
- type DropIndexStmt
- type DropTableStmt
- type DropTriggerStmt
- type DropViewStmt
- type ExistsExpr
- type ExplainStmt
- type Expr
- type ForeignKeyAction
- type ForeignKeyArg
- type ForeignKeyClause
- type FrameBound
- type FrameBoundType
- type FrameExclude
- type FrameType
- type FuncCall
- type Ident
- type InExpr
- type IndexedColumn
- type InsertStmt
- type IsExpr
- type JoinOperator
- type JoinType
- type LikeExpr
- type Limit
- type Literal
- type LiteralKind
- type Materialized
- type Node
- type NullCheckExpr
- type NullTest
- type NullsOrder
- type Operator
- type OrderingTerm
- type ParamKind
- type ParenExpr
- type PragmaStmt
- type QualifiedName
- type QualifiedRef
- type QuoteStyle
- type RaiseExpr
- type ReindexStmt
- type ReleaseStmt
- type ResultColumn
- type RollbackStmt
- type SavepointStmt
- type SelectCore
- type SelectQuery
- type SelectStmt
- type SetPair
- type SortOrder
- type Span
- type Star
- type Stmt
- type SubqueryExpr
- type TableConstraint
- type TableConstraintKind
- type TableOption
- type TableRef
- type TransactionType
- type TriggerTime
- type TypeName
- type UnaryExpr
- type UpdateStmt
- type Upsert
- type VacuumStmt
- type ValuesClause
- type VectorExpr
- type WindowDef
- type With
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Statements ¶
Statements renders a whole script, one statement per line.
Types ¶
type AlterAction ¶
type AlterAction int
AlterAction enumerates the ALTER TABLE forms of the pinned build.
const ( AlterRenameTable AlterAction = iota AlterRenameColumn AlterAddColumn AlterDropColumn AlterDropConstraint AlterDropNotNull AlterSetNotNull AlterAddConstraintCheck )
func (AlterAction) String ¶
func (a AlterAction) String() string
type AlterTableStmt ¶
type AlterTableStmt struct {
Span
Table *QualifiedName `json:"table"`
Action AlterAction `json:"action"`
ColumnKeyword bool `json:"columnKeyword,omitempty"`
Column *Ident `json:"column,omitempty"`
NewName *Ident `json:"newName,omitempty"`
ConstraintName *Ident `json:"constraintName,omitempty"`
ColumnDef *ColumnDef `json:"columnDef,omitempty"`
Expr Expr `json:"expr,omitempty"`
OnConflict ConflictAction `json:"onConflict,omitempty"`
}
AlterTableStmt is ALTER TABLE in all the forms the pinned build accepts.
cmd ::= ALTER TABLE fullname RENAME TO nm. cmd ::= alter_add carglist. (ALTER TABLE ... ADD [COLUMN] nm typetoken) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm. cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm. cmd ::= ALTER TABLE fullname DROP CONSTRAINT nm. cmd ::= ALTER TABLE fullname ALTER kwcolumn_opt nm DROP NOT NULL. cmd ::= ALTER TABLE fullname ALTER kwcolumn_opt nm SET NOT NULL onconf. cmd ::= ALTER TABLE fullname ADD [CONSTRAINT nm] CHECK LP expr RP onconf.
func (*AlterTableStmt) Children ¶
func (n *AlterTableStmt) Children() []Node
func (*AlterTableStmt) String ¶
func (n *AlterTableStmt) String() string
type AnalyzeStmt ¶
type AnalyzeStmt struct {
Span
Name *QualifiedName `json:"name,omitempty"`
}
AnalyzeStmt is ANALYZE [name [. name]].
cmd ::= ANALYZE. / cmd ::= ANALYZE nm dbnm.
func (*AnalyzeStmt) Children ¶
func (n *AnalyzeStmt) Children() []Node
type AttachStmt ¶
type AttachStmt struct {
Span
HasDatabase bool `json:"hasDatabase,omitempty"`
File Expr `json:"file"`
Name Expr `json:"name"`
Key Expr `json:"key,omitempty"`
}
AttachStmt is ATTACH [DATABASE] expr AS expr [KEY expr].
cmd ::= ATTACH database_kw_opt expr AS expr key_opt.
func (*AttachStmt) Children ¶
func (n *AttachStmt) Children() []Node
type BeginStmt ¶
type BeginStmt struct {
Span
Type TransactionType `json:"type,omitempty"`
// HasType and HasTransaction record keywords that carry no meaning but
// are part of the source: "trans_opt ::= TRANSACTION" has no name, so
// Name alone cannot say whether the keyword was written.
HasType bool `json:"hasType,omitempty"`
HasTransaction bool `json:"hasTransaction,omitempty"`
Name *Ident `json:"name,omitempty"`
}
BeginStmt is BEGIN [DEFERRED|IMMEDIATE|EXCLUSIVE] [TRANSACTION [name]].
cmd ::= BEGIN transtype trans_opt.
type BetweenExpr ¶
type BetweenExpr struct {
Span
Not bool `json:"not"`
X Expr `json:"x"`
Lo Expr `json:"lo"`
Hi Expr `json:"hi"`
}
BetweenExpr is "x BETWEEN lo AND hi", optionally negated.
expr ::= expr between_op expr AND expr.
func (*BetweenExpr) Children ¶
func (n *BetweenExpr) Children() []Node
type BinaryExpr ¶
BinaryExpr is an infix operator application.
expr ::= expr AND expr. and the other %left/%right operator rules.
func (*BinaryExpr) Children ¶
func (n *BinaryExpr) Children() []Node
type BindParam ¶
type BindParam struct {
Span
Kind ParamKind `json:"kind"`
Number int `json:"number"`
Name string `json:"name,omitempty"` // without the sigil
Raw string `json:"raw"`
}
BindParam is a parameter marker. Number is assigned the way sqlite3ExprAssignVarNumber does: explicit for ?NNN, otherwise one past the highest number used so far.
expr ::= VARIABLE.
type CTE ¶
type CTE struct {
Span
Name *Ident `json:"name"`
Columns []*Ident `json:"columns,omitempty"`
Materialized Materialized `json:"materialized,omitempty"`
Select *SelectStmt `json:"select"`
}
CTE is one common table expression.
wqitem ::= withnm eidlist_opt wqas LP select RP.
type CaseExpr ¶
type CaseExpr struct {
Span
Operand Expr `json:"operand,omitempty"`
Whens []*CaseWhen `json:"whens"`
Else Expr `json:"else,omitempty"`
}
CaseExpr is a CASE expression. Operand is nil for the searched form.
expr ::= CASE case_operand case_exprlist case_else END.
type CaseWhen ¶
CaseWhen is one WHEN/THEN pair.
case_exprlist ::= case_exprlist WHEN expr THEN expr.
type CollateExpr ¶
CollateExpr is "expr COLLATE name".
expr ::= expr COLLATE ids.
func (*CollateExpr) Children ¶
func (n *CollateExpr) Children() []Node
type ColumnConstraint ¶
type ColumnConstraint struct {
Span
Name *Ident `json:"name,omitempty"`
Kind ColumnConstraintKind `json:"kind"`
OnConflict ConflictAction `json:"onConflict,omitempty"`
Order SortOrder `json:"order,omitempty"` // PRIMARY KEY ASC/DESC
AutoIncrement bool `json:"autoIncrement,omitempty"`
Expr Expr `json:"expr,omitempty"` // CHECK, DEFAULT, GENERATED
Collation *Ident `json:"collation,omitempty"`
References *ForeignKeyClause `json:"references,omitempty"`
GeneratedKind *Ident `json:"generatedKind,omitempty"` // STORED / VIRTUAL
AlwaysWord bool `json:"alwaysWord,omitempty"` // GENERATED ALWAYS spelling
Deferrable *DeferClause `json:"deferrable,omitempty"`
}
ColumnConstraint is one column constraint. Name is the preceding CONSTRAINT clause, if any; SQLite attaches it to the constraint that follows.
ccons ::= CONSTRAINT nm. / NULL onconf. / NOT NULL onconf. ccons ::= PRIMARY KEY sortorder onconf autoinc. / UNIQUE onconf. ccons ::= CHECK LP expr RP. / DEFAULT .... / COLLATE ids. ccons ::= REFERENCES nm eidlist_opt refargs. / defer_subclause. ccons ::= [GENERATED ALWAYS] AS generated.
func (*ColumnConstraint) Children ¶
func (n *ColumnConstraint) Children() []Node
type ColumnConstraintKind ¶
type ColumnConstraintKind int
ColumnConstraintKind enumerates the "ccons" alternatives.
const ( ColumnNull ColumnConstraintKind = iota ColumnNotNull ColumnPrimaryKey ColumnUnique ColumnCheck ColumnDefault ColumnCollate ColumnReferences ColumnGenerated ColumnDeferrable // a bare [NOT] DEFERRABLE clause )
func (ColumnConstraintKind) String ¶
func (k ColumnConstraintKind) String() string
type ColumnDef ¶
type ColumnDef struct {
Span
Name *ColumnName `json:"name"`
Type *TypeName `json:"type,omitempty"`
Constraints []*ColumnConstraint `json:"constraints,omitempty"`
}
ColumnDef is one column of a CREATE TABLE (or of ALTER TABLE ADD COLUMN).
columnname ::= nm typetoken. / carglist ::= carglist ccons.
type ColumnName ¶
type ColumnName = Ident
ColumnName wraps the identifier naming a column, so that a ColumnDef's name keeps its own span distinct from the whole definition's.
type CommitStmt ¶
type CommitStmt struct {
Span
Keyword string `json:"keyword"` // "COMMIT" or "END"
HasTransaction bool `json:"hasTransaction,omitempty"`
Name *Ident `json:"name,omitempty"`
}
CommitStmt is COMMIT or END, optionally followed by TRANSACTION [name].
cmd ::= COMMIT|END trans_opt.
func (*CommitStmt) Children ¶
func (n *CommitStmt) Children() []Node
type CompoundOp ¶
type CompoundOp struct {
Span
Op string `json:"op"` // "UNION", "EXCEPT", "INTERSECT"
All bool `json:"all"`
}
CompoundOp is UNION, UNION ALL, EXCEPT or INTERSECT.
multiselect_op ::= UNION. / UNION ALL. / EXCEPT|INTERSECT.
func (*CompoundOp) Children ¶
func (n *CompoundOp) Children() []Node
type ConflictAction ¶
type ConflictAction int
ConflictAction is the conflict-resolution algorithm of an ON CONFLICT or OR clause.
const ( ConflictDefault ConflictAction = iota ConflictRollback ConflictAbort ConflictFail ConflictIgnore ConflictReplace )
func (ConflictAction) String ¶
func (a ConflictAction) String() string
type CreateIndexStmt ¶
type CreateIndexStmt struct {
Span
Unique bool `json:"unique,omitempty"`
IfNotExists bool `json:"ifNotExists,omitempty"`
Name *QualifiedName `json:"name"`
Table *Ident `json:"table"`
Columns []*OrderingTerm `json:"columns"`
Where Expr `json:"where,omitempty"`
}
CreateIndexStmt is CREATE [UNIQUE] INDEX.
cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP
where_opt.
func (*CreateIndexStmt) Children ¶
func (n *CreateIndexStmt) Children() []Node
func (*CreateIndexStmt) String ¶
func (n *CreateIndexStmt) String() string
type CreateTableStmt ¶
type CreateTableStmt struct {
Span
Temp bool `json:"temp,omitempty"`
IfNotExists bool `json:"ifNotExists,omitempty"`
Name *QualifiedName `json:"name"`
Columns []*ColumnDef `json:"columns,omitempty"`
Constraints []*TableConstraint `json:"constraints,omitempty"`
Options []*TableOption `json:"options,omitempty"` // WITHOUT ROWID, STRICT
Select *SelectStmt `json:"select,omitempty"`
}
CreateTableStmt is CREATE TABLE, in both the column-list and the AS SELECT forms.
cmd ::= create_table create_table_args. create_table ::= createkw temp TABLE ifnotexists nm dbnm. create_table_args ::= LP columnlist conslist_opt RP table_option_set. create_table_args ::= AS select.
func (*CreateTableStmt) Children ¶
func (n *CreateTableStmt) Children() []Node
func (*CreateTableStmt) String ¶
func (n *CreateTableStmt) String() string
type CreateTriggerStmt ¶
type CreateTriggerStmt struct {
Span
Temp bool `json:"temp,omitempty"`
IfNotExists bool `json:"ifNotExists,omitempty"`
Name *QualifiedName `json:"name"`
Time TriggerTime `json:"time,omitempty"`
HasTime bool `json:"hasTime,omitempty"`
Event string `json:"event"` // DELETE, INSERT, UPDATE
UpdateOf []*Ident `json:"updateOf,omitempty"`
Table *QualifiedName `json:"table"`
ForEachRow bool `json:"forEachRow,omitempty"`
When Expr `json:"when,omitempty"`
Body []Stmt `json:"body"`
}
CreateTriggerStmt is CREATE [TEMP] TRIGGER.
cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END.
trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time
trigger_event ON fullname foreach_clause when_clause.
func (*CreateTriggerStmt) Children ¶
func (n *CreateTriggerStmt) Children() []Node
func (*CreateTriggerStmt) String ¶
func (n *CreateTriggerStmt) String() string
type CreateViewStmt ¶
type CreateViewStmt struct {
Span
Temp bool `json:"temp,omitempty"`
IfNotExists bool `json:"ifNotExists,omitempty"`
Name *QualifiedName `json:"name"`
Columns []*IndexedColumn `json:"columns,omitempty"`
Select *SelectStmt `json:"select"`
}
CreateViewStmt is CREATE [TEMP] VIEW.
cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select.
func (*CreateViewStmt) Children ¶
func (n *CreateViewStmt) Children() []Node
func (*CreateViewStmt) String ¶
func (n *CreateViewStmt) String() string
type CreateVirtualTableStmt ¶
type CreateVirtualTableStmt struct {
Span
IfNotExists bool `json:"ifNotExists,omitempty"`
Name *QualifiedName `json:"name"`
Module *Ident `json:"module"`
HasArgs bool `json:"hasArgs,omitempty"`
Args []string `json:"args,omitempty"`
}
CreateVirtualTableStmt is CREATE VIRTUAL TABLE ... USING module(args). Module arguments are kept as their raw source text, exactly as SQLite does (the "anylist" production accepts any balanced token sequence).
create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm. cmd ::= create_vtab LP vtabarglist RP.
func (*CreateVirtualTableStmt) Children ¶
func (n *CreateVirtualTableStmt) Children() []Node
func (*CreateVirtualTableStmt) String ¶
func (n *CreateVirtualTableStmt) String() string
type DeferClause ¶
type DeferClause struct {
Span
Not bool `json:"not,omitempty"`
InitiallyDeferred bool `json:"initiallyDeferred,omitempty"`
HasInitially bool `json:"hasInitially,omitempty"`
}
DeferClause is "[NOT] DEFERRABLE [INITIALLY DEFERRED|IMMEDIATE]".
defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt. defer_subclause ::= DEFERRABLE init_deferred_pred_opt.
func (*DeferClause) Children ¶
func (n *DeferClause) Children() []Node
type DeleteStmt ¶
type DeleteStmt struct {
Span
With *With `json:"with,omitempty"`
Table *QualifiedName `json:"table"`
Alias *Ident `json:"alias,omitempty"`
IndexedBy *Ident `json:"indexedBy,omitempty"`
NotIndexed bool `json:"notIndexed,omitempty"`
Where Expr `json:"where,omitempty"`
Returning []*ResultColumn `json:"returning,omitempty"`
OrderBy []*OrderingTerm `json:"orderBy,omitempty"`
Limit *Limit `json:"limit,omitempty"`
}
DeleteStmt is a DELETE statement.
cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret.
cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret orderby_opt
limit_opt.
As for UPDATE, the second form is the one SQLITE_ENABLE_UPDATE_DELETE_LIMIT compiles in, and OrderBy and Limit are set only for a parse made with parser.Options.UpdateDeleteLimit.
func (*DeleteStmt) Children ¶
func (n *DeleteStmt) Children() []Node
func (*DeleteStmt) String ¶
func (n *DeleteStmt) String() string
type DetachStmt ¶
type DetachStmt struct {
Span
HasDatabase bool `json:"hasDatabase,omitempty"`
Name Expr `json:"name"`
}
DetachStmt is DETACH [DATABASE] expr.
cmd ::= DETACH database_kw_opt expr.
func (*DetachStmt) Children ¶
func (n *DetachStmt) Children() []Node
type DropIndexStmt ¶
type DropIndexStmt struct {
Span
IfExists bool `json:"ifExists,omitempty"`
Name *QualifiedName `json:"name"`
}
DropIndexStmt is DROP INDEX.
cmd ::= DROP INDEX ifexists fullname.
func (*DropIndexStmt) Children ¶
func (n *DropIndexStmt) Children() []Node
type DropTableStmt ¶
type DropTableStmt struct {
Span
IfExists bool `json:"ifExists,omitempty"`
Name *QualifiedName `json:"name"`
}
DropTableStmt is DROP TABLE.
cmd ::= DROP TABLE ifexists fullname.
func (*DropTableStmt) Children ¶
func (n *DropTableStmt) Children() []Node
type DropTriggerStmt ¶
type DropTriggerStmt struct {
Span
IfExists bool `json:"ifExists,omitempty"`
Name *QualifiedName `json:"name"`
}
DropTriggerStmt is DROP TRIGGER.
cmd ::= DROP TRIGGER ifexists fullname.
func (*DropTriggerStmt) Children ¶
func (n *DropTriggerStmt) Children() []Node
type DropViewStmt ¶
type DropViewStmt struct {
Span
IfExists bool `json:"ifExists,omitempty"`
Name *QualifiedName `json:"name"`
}
DropViewStmt is DROP VIEW.
cmd ::= DROP VIEW ifexists fullname.
func (*DropViewStmt) Children ¶
func (n *DropViewStmt) Children() []Node
type ExistsExpr ¶
type ExistsExpr struct {
Span
Select *SelectStmt `json:"select"`
}
ExistsExpr is "EXISTS (select)".
expr ::= EXISTS LP select RP.
func (*ExistsExpr) Children ¶
func (n *ExistsExpr) Children() []Node
type ExplainStmt ¶
type ExplainStmt struct {
Span
QueryPlan bool `json:"queryPlan,omitempty"`
Stmt Stmt `json:"stmt"`
}
ExplainStmt wraps another statement in EXPLAIN or EXPLAIN QUERY PLAN.
ecmd ::= explain cmdx SEMI. explain ::= EXPLAIN. / explain ::= EXPLAIN QUERY PLAN.
func (*ExplainStmt) Children ¶
func (n *ExplainStmt) Children() []Node
func (*ExplainStmt) String ¶
func (n *ExplainStmt) String() string
type Expr ¶
type Expr interface {
Node
// contains filtered or unexported methods
}
Expr is implemented by all expression nodes.
type ForeignKeyAction ¶
type ForeignKeyAction int
ForeignKeyAction is the action of an ON DELETE / ON UPDATE clause.
const ( FKNoAction ForeignKeyAction = iota FKSetNull FKSetDefault FKCascade FKRestrict )
func (ForeignKeyAction) String ¶
func (a ForeignKeyAction) String() string
type ForeignKeyArg ¶
type ForeignKeyArg struct {
Span
Match *Ident `json:"match,omitempty"`
Event string `json:"event,omitempty"` // INSERT, DELETE, UPDATE
Action ForeignKeyAction `json:"action,omitempty"`
}
ForeignKeyArg is one refarg: a MATCH clause or an ON <event> action.
func (*ForeignKeyArg) Children ¶
func (n *ForeignKeyArg) Children() []Node
type ForeignKeyClause ¶
type ForeignKeyClause struct {
Span
Table *Ident `json:"table"`
Columns []*IndexedColumn `json:"columns,omitempty"`
Args []*ForeignKeyArg `json:"args,omitempty"`
}
ForeignKeyClause is a REFERENCES clause and its arguments.
ccons ::= REFERENCES nm eidlist_opt refargs. refarg ::= MATCH nm. / ON INSERT refact. / ON DELETE refact. / ON UPDATE refact.
func (*ForeignKeyClause) Children ¶
func (n *ForeignKeyClause) Children() []Node
type FrameBound ¶
type FrameBound struct {
Span
Type FrameBoundType `json:"type"`
Expr Expr `json:"expr,omitempty"`
}
FrameBound is one endpoint of a window frame.
frame_bound ::= expr PRECEDING|FOLLOWING. / CURRENT ROW. frame_bound_s ::= UNBOUNDED PRECEDING. / frame_bound_e ::= UNBOUNDED FOLLOWING.
func (*FrameBound) Children ¶
func (n *FrameBound) Children() []Node
type FrameBoundType ¶
type FrameBoundType int
FrameBoundType enumerates the window frame endpoints.
const ( BoundUnboundedPreceding FrameBoundType = iota BoundPreceding BoundCurrentRow BoundFollowing BoundUnboundedFollowing )
func (FrameBoundType) String ¶
func (b FrameBoundType) String() string
type FrameExclude ¶
type FrameExclude int
FrameExclude is the EXCLUDE clause of a frame specification.
const ( ExcludeNone FrameExclude = iota ExcludeNoOthers ExcludeCurrentRow ExcludeGroup ExcludeTies )
func (FrameExclude) String ¶
func (e FrameExclude) String() string
type FuncCall ¶
type FuncCall struct {
Span
Name *Ident `json:"name"`
Distinct bool `json:"distinct"`
All bool `json:"all"` // the redundant ALL qualifier
Star bool `json:"star"`
Args []Expr `json:"args,omitempty"`
OrderBy []*OrderingTerm `json:"orderBy,omitempty"` // aggregate inner ORDER BY
Filter Expr `json:"filter,omitempty"` // FILTER (WHERE ...)
Over *WindowDef `json:"over,omitempty"`
}
FuncCall is a function invocation, including aggregate and window forms.
expr ::= idj LP distinct exprlist RP [filter_over]. expr ::= idj LP distinct exprlist ORDER BY sortlist RP [filter_over]. expr ::= idj LP STAR RP [filter_over].
type Ident ¶
type Ident struct {
Span
Name string `json:"name"` // dequoted
Raw string `json:"raw"` // exactly as it appeared
Quote QuoteStyle `json:"quote"` // QuoteNone when unquoted
}
Ident is a name: a table, column, function, alias, collation, ...
nm ::= idj. / nm ::= STRING.
type InExpr ¶
type InExpr struct {
Span
Not bool `json:"not"`
X Expr `json:"x"`
Parens bool `json:"parens"`
List []Expr `json:"list,omitempty"`
Select *SelectStmt `json:"select,omitempty"`
Table *QualifiedName `json:"table,omitempty"`
Args []Expr `json:"args,omitempty"` // table-valued function args
HasArgs bool `json:"hasArgs,omitempty"`
}
InExpr is "x IN ...". Exactly one of List, Select and Table is set; an empty parenthesised list leaves all three unset with Parens true.
expr ::= expr in_op LP exprlist RP. expr ::= expr in_op LP select RP. expr ::= expr in_op nm dbnm paren_exprlist.
type IndexedColumn ¶
type IndexedColumn struct {
Span
Name *Ident `json:"name"`
Collation *Ident `json:"collation,omitempty"`
Order SortOrder `json:"order,omitempty"`
}
IndexedColumn is one entry of an "eidlist": a column name with the COLLATE and ASC/DESC decorations SQLite still parses for historical schemas.
eidlist ::= eidlist COMMA nm collate sortorder.
func (*IndexedColumn) Children ¶
func (n *IndexedColumn) Children() []Node
type InsertStmt ¶
type InsertStmt struct {
Span
With *With `json:"with,omitempty"`
Replace bool `json:"replace,omitempty"` // spelled REPLACE
OrConflict ConflictAction `json:"orConflict,omitempty"`
Table *QualifiedName `json:"table"`
Alias *Ident `json:"alias,omitempty"`
Columns []*Ident `json:"columns,omitempty"`
Select *SelectStmt `json:"select,omitempty"`
DefaultValues bool `json:"defaultValues,omitempty"`
Upserts []*Upsert `json:"upserts,omitempty"`
Returning []*ResultColumn `json:"returning,omitempty"`
}
InsertStmt is INSERT, INSERT OR <action>, or REPLACE.
cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert. cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning.
func (*InsertStmt) Children ¶
func (n *InsertStmt) Children() []Node
func (*InsertStmt) String ¶
func (n *InsertStmt) String() string
type IsExpr ¶
type IsExpr struct {
Span
Not bool `json:"not"`
Distinct bool `json:"distinct"` // the DISTINCT FROM spelling was used
X Expr `json:"x"`
Y Expr `json:"y"`
}
IsExpr is "IS", "IS NOT", "IS DISTINCT FROM" or "IS NOT DISTINCT FROM".
expr ::= expr IS expr. and its three siblings.
type JoinOperator ¶
type JoinOperator struct {
Span
Type JoinType `json:"type"`
Words []string `json:"words,omitempty"` // the keywords as written
}
JoinOperator is the operator attaching a FROM item to the one before it.
joinop ::= COMMA|JOIN. / JOIN_KW JOIN. / JOIN_KW nm JOIN. joinop ::= JOIN_KW nm nm JOIN.
func (*JoinOperator) Children ¶
func (n *JoinOperator) Children() []Node
type JoinType ¶
type JoinType int
JoinType is the bitmask of join keywords, matching sqlite3JoinType.
type LikeExpr ¶
type LikeExpr struct {
Span
Op *Ident `json:"op"` // the LIKE/GLOB/REGEXP/MATCH token, as written
Not bool `json:"not"`
X Expr `json:"x"`
Y Expr `json:"y"`
Escape Expr `json:"escape,omitempty"`
}
LikeExpr is a LIKE/GLOB/REGEXP/MATCH application, optionally negated and optionally with an ESCAPE operand.
expr ::= expr likeop expr. / expr ::= expr likeop expr ESCAPE expr.
type Limit ¶
type Limit struct {
Span
Count Expr `json:"count"`
Offset Expr `json:"offset,omitempty"`
Comma bool `json:"comma,omitempty"`
}
Limit is a LIMIT clause. In the "LIMIT x, y" spelling SQLite swaps the operands, so Count is y and Offset is x; Comma records the spelling.
limit_opt ::= LIMIT expr. / LIMIT expr OFFSET expr. / LIMIT expr COMMA expr.
type Literal ¶
type Literal struct {
Span
Kind LiteralKind `json:"kind"`
Value string `json:"value"` // dequoted for strings, raw otherwise
Raw string `json:"raw"`
}
Literal is a constant.
term ::= NULL|FLOAT|BLOB. / term ::= STRING. / term ::= INTEGER. term ::= QNUMBER. / term ::= CTIME_KW.
type LiteralKind ¶
type LiteralKind int
LiteralKind distinguishes the literal forms of the "term" production.
const ( LitNull LiteralKind = iota LitInteger LitFloat LitString LitBlob LitCurrentDate LitCurrentTime LitCurrentTimestamp )
func (LiteralKind) String ¶
func (k LiteralKind) String() string
type Materialized ¶
type Materialized int
Materialized records the optional MATERIALIZED hint on a CTE.
const ( MaterializedAny Materialized = iota MaterializedYes MaterializedNo )
func (Materialized) String ¶
func (m Materialized) String() string
type Node ¶
Node is implemented by every syntax tree node. Positions are byte offsets into the original input.
type NullCheckExpr ¶
NullCheckExpr is a postfix null test.
expr ::= expr ISNULL|NOTNULL. / expr ::= expr NOT NULL.
func (*NullCheckExpr) Children ¶
func (n *NullCheckExpr) Children() []Node
type NullTest ¶
type NullTest int
NullTest distinguishes the three spellings of a postfix null test. They are not interchangeable: "expr NOT NULL" takes its precedence from NOT, while ISNULL and NOTNULL are comparison-level operators, so "NOT x NOTNULL" and "NOT x NOT NULL" are different trees.
type NullsOrder ¶
type NullsOrder int
NullsOrder is NULLS FIRST, NULLS LAST, or unstated.
const ( NullsDefault NullsOrder = iota NullsFirst NullsLast )
func (NullsOrder) String ¶
func (o NullsOrder) String() string
type OrderingTerm ¶
type OrderingTerm struct {
Span
Expr Expr `json:"expr"`
Order SortOrder `json:"order,omitempty"`
Nulls NullsOrder `json:"nulls,omitempty"`
}
OrderingTerm is one entry of an ORDER BY (or index/aggregate) sort list.
sortlist ::= sortlist COMMA expr sortorder nulls.
func (*OrderingTerm) Children ¶
func (n *OrderingTerm) Children() []Node
type ParenExpr ¶
ParenExpr preserves an explicit parenthesisation. SQLite discards these (expr ::= LP expr RP just yields the inner expression), but keeping them makes the round-trip renderer exact.
type PragmaStmt ¶
type PragmaStmt struct {
Span
Name *QualifiedName `json:"name"`
Value string `json:"value,omitempty"` // as written, "-" included
Paren bool `json:"paren,omitempty"` // the LP ... RP spelling
HasValue bool `json:"hasValue,omitempty"`
}
PragmaStmt is a PRAGMA in any of its three value spellings.
cmd ::= PRAGMA nm dbnm. cmd ::= PRAGMA nm dbnm EQ nmnum. / PRAGMA nm dbnm EQ minus_num. cmd ::= PRAGMA nm dbnm LP nmnum RP. / PRAGMA nm dbnm LP minus_num RP.
func (*PragmaStmt) Children ¶
func (n *PragmaStmt) Children() []Node
type QualifiedName ¶
type QualifiedName struct {
Span
Schema *Ident `json:"schema,omitempty"`
Name *Ident `json:"name"`
}
QualifiedName is a "nm dbnm" pair: an optionally schema-qualified object name. Schema is nil when the name was unqualified.
fullname ::= nm. / fullname ::= nm DOT nm.
func (*QualifiedName) Children ¶
func (n *QualifiedName) Children() []Node
type QualifiedRef ¶
QualifiedRef is a dotted column reference with two or three parts.
expr ::= nm DOT nm. / expr ::= nm DOT nm DOT nm.
func (*QualifiedRef) Children ¶
func (n *QualifiedRef) Children() []Node
type QuoteStyle ¶
type QuoteStyle byte
QuoteStyle records how an identifier was spelled in the source. SQLite accepts four quoting styles for identifiers plus the unquoted form, and consumers (sqlc among them) need to tell them apart.
const ( QuoteNone QuoteStyle = 0 QuoteDouble QuoteStyle = '"' QuoteBack QuoteStyle = '`' QuoteSquare QuoteStyle = '[' QuoteSingle QuoteStyle = '\'' // a string literal used in a name position )
func (QuoteStyle) String ¶
func (q QuoteStyle) String() string
type RaiseExpr ¶
type RaiseExpr struct {
Span
Action string `json:"action"` // IGNORE, ROLLBACK, ABORT or FAIL
Message Expr `json:"message,omitempty"`
}
RaiseExpr is the trigger-only RAISE() form.
expr ::= RAISE LP IGNORE RP. / expr ::= RAISE LP raisetype COMMA expr RP.
type ReindexStmt ¶
type ReindexStmt struct {
Span
Name *QualifiedName `json:"name,omitempty"`
}
ReindexStmt is REINDEX [name [. name]].
cmd ::= REINDEX. / cmd ::= REINDEX nm dbnm.
func (*ReindexStmt) Children ¶
func (n *ReindexStmt) Children() []Node
type ReleaseStmt ¶
type ReleaseStmt struct {
Span
SavepointKeyword bool `json:"savepointKeyword,omitempty"`
Name *Ident `json:"name"`
}
ReleaseStmt is RELEASE [SAVEPOINT] <name>.
cmd ::= RELEASE savepoint_opt nm.
func (*ReleaseStmt) Children ¶
func (n *ReleaseStmt) Children() []Node
type ResultColumn ¶
type ResultColumn struct {
Span
Expr Expr `json:"expr"`
Alias *Ident `json:"alias,omitempty"`
HasAs bool `json:"hasAs,omitempty"` // the alias was introduced by AS
}
ResultColumn is one entry of a select list.
selcollist ::= sclp scanpt expr scanpt as.
func (*ResultColumn) Children ¶
func (n *ResultColumn) Children() []Node
type RollbackStmt ¶
type RollbackStmt struct {
Span
HasTransaction bool `json:"hasTransaction,omitempty"`
Name *Ident `json:"name,omitempty"` // TRANSACTION <name>
Savepoint *Ident `json:"savepoint,omitempty"` // TO [SAVEPOINT] <name>
SavepointKeyword bool `json:"savepointKeyword,omitempty"`
}
RollbackStmt is ROLLBACK, with or without a savepoint.
cmd ::= ROLLBACK trans_opt. cmd ::= ROLLBACK trans_opt TO savepoint_opt nm.
func (*RollbackStmt) Children ¶
func (n *RollbackStmt) Children() []Node
type SavepointStmt ¶
SavepointStmt is SAVEPOINT <name>.
cmd ::= SAVEPOINT nm.
func (*SavepointStmt) Children ¶
func (n *SavepointStmt) Children() []Node
type SelectCore ¶
type SelectCore interface {
Node
// contains filtered or unexported methods
}
SelectCore is one term of a compound select: a SELECT or a VALUES clause.
type SelectQuery ¶
type SelectQuery struct {
Span
Distinct Distinct `json:"distinct,omitempty"`
Columns []*ResultColumn `json:"columns"`
From []*TableRef `json:"from,omitempty"`
Where Expr `json:"where,omitempty"`
GroupBy []Expr `json:"groupBy,omitempty"`
Having Expr `json:"having,omitempty"`
Windows []*WindowDef `json:"windows,omitempty"`
OrderBy []*OrderingTerm `json:"orderBy,omitempty"`
Limit *Limit `json:"limit,omitempty"`
}
SelectQuery is the SELECT form of a query core.
oneselect ::= SELECT distinct selcollist from where_opt groupby_opt
having_opt [window_clause] orderby_opt limit_opt.
func (*SelectQuery) Children ¶
func (n *SelectQuery) Children() []Node
type SelectStmt ¶
type SelectStmt struct {
Span
With *With `json:"with,omitempty"`
Cores []SelectCore `json:"cores"`
Ops []CompoundOp `json:"ops,omitempty"`
}
SelectStmt is a complete SELECT: an optional WITH clause followed by one or more query cores joined by compound operators.
select ::= WITH [RECURSIVE] wqlist selectnowith. / select ::= selectnowith. selectnowith ::= selectnowith multiselect_op oneselect.
Cores is never empty and Ops has exactly len(Cores)-1 entries. ORDER BY and LIMIT belong to the core they were written on: SQLite's grammar hangs them off oneselect, and rejects a leading one only in a grammar action ("ORDER BY clause should come after UNION not before"), which is not a parse error.
func (*SelectStmt) Children ¶
func (n *SelectStmt) Children() []Node
func (*SelectStmt) String ¶
func (n *SelectStmt) String() string
type SetPair ¶
type SetPair struct {
Span
Columns []*Ident `json:"columns"`
Paren bool `json:"paren,omitempty"`
Value Expr `json:"value"`
}
SetPair is one assignment of an UPDATE ... SET or upsert DO UPDATE SET list. Columns holds more than one name for the "(a,b) = expr" form.
setlist ::= nm EQ expr. / setlist ::= LP idlist RP EQ expr.
type Star ¶
Star is "*" or "tbl.*" in a result column list.
selcollist ::= sclp scanpt STAR. / selcollist ::= sclp scanpt nm DOT STAR.
type Stmt ¶
Stmt is implemented by all statement nodes. SetSpan is part of the interface because the parser widens a statement's span once it has seen the terminating semicolon, and a node that could not be widened would get a quietly wrong span rather than a compile error.
type SubqueryExpr ¶
type SubqueryExpr struct {
Span
Select *SelectStmt `json:"select"`
}
SubqueryExpr is a parenthesised SELECT used as a scalar.
expr ::= LP select RP.
func (*SubqueryExpr) Children ¶
func (n *SubqueryExpr) Children() []Node
type TableConstraint ¶
type TableConstraint struct {
Span
Name *Ident `json:"name,omitempty"`
Kind TableConstraintKind `json:"kind"`
Columns []*OrderingTerm `json:"columns,omitempty"` // PRIMARY KEY / UNIQUE
AutoIncrement bool `json:"autoIncrement,omitempty"`
OnConflict ConflictAction `json:"onConflict,omitempty"`
Expr Expr `json:"expr,omitempty"` // CHECK
FKColumns []*IndexedColumn `json:"fkColumns,omitempty"`
References *ForeignKeyClause `json:"references,omitempty"`
Deferrable *DeferClause `json:"deferrable,omitempty"`
}
TableConstraint is one table-level constraint.
tcons ::= CONSTRAINT nm.
tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf. / UNIQUE LP sortlist RP onconf.
tcons ::= CHECK LP expr RP onconf.
tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs
defer_subclause_opt.
func (*TableConstraint) Children ¶
func (n *TableConstraint) Children() []Node
type TableConstraintKind ¶
type TableConstraintKind int
TableConstraintKind enumerates the "tcons" alternatives.
const ( TablePrimaryKey TableConstraintKind = iota TableUnique TableCheck TableForeignKey )
func (TableConstraintKind) String ¶
func (k TableConstraintKind) String() string
type TableOption ¶
TableOption is one entry of a table_option_set. SQLite rejects an unknown one from a grammar action rather than the grammar, so any name parses.
table_option ::= WITHOUT nm. / table_option ::= nm.
func (*TableOption) Children ¶
func (n *TableOption) Children() []Node
type TableRef ¶
type TableRef struct {
Span
Join *JoinOperator `json:"join,omitempty"` // nil for the first item
Name *QualifiedName `json:"name,omitempty"`
Args []Expr `json:"args,omitempty"` // table-valued function
HasArgs bool `json:"hasArgs,omitempty"`
Select *SelectStmt `json:"select,omitempty"`
List []*TableRef `json:"list,omitempty"`
Alias *Ident `json:"alias,omitempty"`
HasAs bool `json:"hasAs,omitempty"`
IndexedBy *Ident `json:"indexedBy,omitempty"`
NotIndexed bool `json:"notIndexed,omitempty"`
On Expr `json:"on,omitempty"`
Using []*Ident `json:"using,omitempty"`
}
TableRef is one item of a FROM clause. Following SQLite's SrcList, the list is flat and each item records how it attaches to the previous one. Exactly one of Name, Select and List describes the source.
seltablist ::= stl_prefix nm dbnm as [indexed_by] on_using. seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using. seltablist ::= stl_prefix LP select RP as on_using. seltablist ::= stl_prefix LP seltablist RP as on_using.
type TransactionType ¶
type TransactionType int
TransactionType is the DEFERRED/IMMEDIATE/EXCLUSIVE qualifier of BEGIN.
const ( TxnDeferred TransactionType = iota TxnImmediate TxnExclusive )
func (TransactionType) String ¶
func (t TransactionType) String() string
type TriggerTime ¶
type TriggerTime int
TriggerTime is BEFORE, AFTER or INSTEAD OF.
const ( TriggerBefore TriggerTime = iota TriggerAfter TriggerInsteadOf )
func (TriggerTime) String ¶
func (t TriggerTime) String() string
type TypeName ¶
type TypeName struct {
Span
Name string `json:"name"` // the identifier tokens, space-joined
Args []string `json:"args,omitempty"` // the signed numbers, as written
Raw string `json:"raw"` // the whole source span
}
TypeName is a column or cast type: one or more identifier tokens followed by an optional size specification.
typetoken ::= typename [LP signed [COMMA signed] RP].
type UnaryExpr ¶
UnaryExpr is a prefix operator application.
expr ::= NOT expr. / expr ::= BITNOT expr. / expr ::= PLUS|MINUS expr.
type UpdateStmt ¶
type UpdateStmt struct {
Span
With *With `json:"with,omitempty"`
OrConflict ConflictAction `json:"orConflict,omitempty"`
Table *QualifiedName `json:"table"`
Alias *Ident `json:"alias,omitempty"`
IndexedBy *Ident `json:"indexedBy,omitempty"`
NotIndexed bool `json:"notIndexed,omitempty"`
Set []*SetPair `json:"set"`
From []*TableRef `json:"from,omitempty"`
Where Expr `json:"where,omitempty"`
Returning []*ResultColumn `json:"returning,omitempty"`
OrderBy []*OrderingTerm `json:"orderBy,omitempty"`
Limit *Limit `json:"limit,omitempty"`
}
UpdateStmt is an UPDATE statement.
cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from
where_opt_ret.
cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from
where_opt_ret orderby_opt limit_opt.
The second form is the one SQLITE_ENABLE_UPDATE_DELETE_LIMIT compiles in. The pinned build defines neither it nor SQLITE_UDL_CAPABLE_PARSER, so OrderBy and Limit are only ever set for a parse that asked for them with parser.Options.UpdateDeleteLimit; without it they are a syntax error.
func (*UpdateStmt) Children ¶
func (n *UpdateStmt) Children() []Node
func (*UpdateStmt) String ¶
func (n *UpdateStmt) String() string
type Upsert ¶
type Upsert struct {
Span
Target []*OrderingTerm `json:"target,omitempty"`
TargetWhere Expr `json:"targetWhere,omitempty"`
DoNothing bool `json:"doNothing,omitempty"`
Set []*SetPair `json:"set,omitempty"`
Where Expr `json:"where,omitempty"`
}
Upsert is one ON CONFLICT clause of an INSERT.
upsert ::= ON CONFLICT [LP sortlist RP where_opt] DO UPDATE SET setlist where_opt. upsert ::= ON CONFLICT [LP sortlist RP where_opt] DO NOTHING.
type VacuumStmt ¶
type VacuumStmt struct {
Span
Schema *Ident `json:"schema,omitempty"`
Into Expr `json:"into,omitempty"`
}
VacuumStmt is VACUUM [schema] [INTO expr].
cmd ::= VACUUM vinto. / cmd ::= VACUUM nm vinto.
func (*VacuumStmt) Children ¶
func (n *VacuumStmt) Children() []Node
type ValuesClause ¶
ValuesClause is the VALUES form of a query core. SQLite models multi-row VALUES as a compound of single-row selects; meyer keeps it as one node.
values ::= VALUES LP nexprlist RP. mvalues ::= values COMMA LP nexprlist RP. / mvalues COMMA LP nexprlist RP.
func (*ValuesClause) Children ¶
func (n *ValuesClause) Children() []Node
type VectorExpr ¶
VectorExpr is a parenthesised row value with two or more elements.
expr ::= LP nexprlist COMMA expr RP.
func (*VectorExpr) Children ¶
func (n *VectorExpr) Children() []Node
type WindowDef ¶
type WindowDef struct {
Span
Name *Ident `json:"name,omitempty"` // WINDOW <name> AS (...)
Base *Ident `json:"base,omitempty"` // inherited window name
NameOnly bool `json:"nameOnly,omitempty"`
Partition []Expr `json:"partition,omitempty"`
OrderBy []*OrderingTerm `json:"orderBy,omitempty"`
Frame FrameType `json:"frame,omitempty"`
StartBound *FrameBound `json:"startBound,omitempty"`
EndBound *FrameBound `json:"endBound,omitempty"`
Exclude FrameExclude `json:"exclude,omitempty"`
}
WindowDef is a window definition: the body of an OVER(...) or of one entry in a WINDOW clause. A bare "OVER name" sets Base and nothing else.
window ::= [nm] [PARTITION BY nexprlist] [ORDER BY sortlist] frame_opt. windowdefn ::= nm AS LP window RP.