use crate::sql::token::Param;
use alloc::boxed::Box;
use alloc::string::String;
use alloc::vec::Vec;
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone, PartialEq)]
pub enum Statement {
Select(Select),
Insert(Insert),
Update(Update),
Delete(Delete),
CreateTable(CreateTable),
CreateIndex(CreateIndex),
CreateView(CreateView),
CreateVirtualTable(CreateVirtualTable),
CreateTrigger(CreateTrigger),
Drop(Drop),
Alter(Alter),
Begin,
Commit,
Rollback,
Savepoint(String),
Release(String),
RollbackTo(String),
Pragma(Pragma),
Vacuum {
schema: Option<String>,
into: Option<Box<Expr>>,
},
Reindex {
schema: Option<String>,
name: Option<String>,
},
Analyze(Option<String>),
Attach {
file: Expr,
name: String,
},
Detach(String),
Explain {
query_plan: bool,
stmt: Box<Statement>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct Cte {
pub name: String,
pub columns: Vec<String>,
pub select: Box<Select>,
pub materialized: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct WindowSpec {
pub partition_by: Vec<Expr>,
pub order_by: Vec<OrderTerm>,
pub frame: Option<WindowFrame>,
pub base_name: Option<String>,
pub base_parenthesized: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct WindowFrame {
pub mode: FrameMode,
pub start: FrameBound,
pub end: FrameBound,
pub exclude: FrameExclude,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum FrameExclude {
#[default]
NoOthers,
CurrentRow,
Group,
Ties,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FrameMode {
Rows,
Range,
Groups,
}
#[derive(Debug, Clone, PartialEq)]
pub enum FrameBound {
UnboundedPreceding,
Preceding(Box<Expr>),
CurrentRow,
Following(Box<Expr>),
UnboundedFollowing,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CompoundOp {
Union,
UnionAll,
Intersect,
Except,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Select {
pub ctes: Vec<Cte>,
pub compound: Vec<(CompoundOp, Select)>,
pub distinct: bool,
pub columns: Vec<ResultColumn>,
pub from: Option<FromClause>,
pub where_clause: Option<Expr>,
pub group_by: Vec<Expr>,
pub having: Option<Expr>,
pub window_defs: Vec<(String, WindowSpec)>,
pub order_by: Vec<OrderTerm>,
pub limit: Option<Expr>,
pub offset: Option<Expr>,
pub values_rows: usize,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone, PartialEq)]
pub enum ResultColumn {
Wildcard,
TableWildcard(String),
Expr {
expr: Expr,
alias: Option<String>,
source: Option<String>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct FromClause {
pub first: TableRef,
pub joins: Vec<Join>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct TableRef {
pub name: String,
pub schema: Option<String>,
pub alias: Option<String>,
pub subquery: Option<Box<Select>>,
pub index_hint: Option<IndexHint>,
pub tvf_args: Option<Vec<Expr>>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum IndexHint {
NotIndexed,
IndexedBy(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum JoinKind {
Inner,
Left,
Right,
Full,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Join {
pub kind: JoinKind,
pub table: TableRef,
pub on: Option<Expr>,
pub natural: bool,
pub using: Vec<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct OrderTerm {
pub expr: Expr,
pub descending: bool,
pub nulls_first: Option<bool>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Insert {
pub ctes: Vec<Cte>,
pub table: String,
pub schema: Option<String>,
pub columns: Vec<String>,
pub source: InsertSource,
pub on_conflict: OnConflict,
pub on_conflict_explicit: bool,
pub upsert: Vec<Upsert>,
pub returning: Vec<ResultColumn>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Upsert {
pub target: Vec<String>,
pub target_where: Option<Expr>,
pub action: UpsertAction,
}
#[derive(Debug, Clone, PartialEq)]
#[allow(clippy::large_enum_variant)]
pub enum UpsertAction {
Nothing,
Update {
assignments: Vec<(String, Expr)>,
where_clause: Option<Expr>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OnConflict {
Abort,
Fail,
Rollback,
Ignore,
Replace,
}
#[derive(Debug, Clone, PartialEq)]
pub enum InsertSource {
Values(Vec<Vec<Expr>>),
Select(Box<Select>),
DefaultValues,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Update {
pub ctes: Vec<Cte>,
pub table: String,
pub schema: Option<String>,
pub alias: Option<String>,
pub index_hint: Option<IndexHint>,
pub on_conflict: OnConflict,
pub on_conflict_explicit: bool,
pub assignments: Vec<(String, Expr)>,
pub row_assignments: Vec<(Vec<String>, Box<Select>)>,
pub from: Option<FromClause>,
pub where_clause: Option<Expr>,
pub order_by: Vec<OrderTerm>,
pub limit: Option<Expr>,
pub offset: Option<Expr>,
pub returning: Vec<ResultColumn>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Delete {
pub ctes: Vec<Cte>,
pub table: String,
pub schema: Option<String>,
pub alias: Option<String>,
pub index_hint: Option<IndexHint>,
pub where_clause: Option<Expr>,
pub order_by: Vec<OrderTerm>,
pub limit: Option<Expr>,
pub offset: Option<Expr>,
pub returning: Vec<ResultColumn>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CreateTable {
pub if_not_exists: bool,
pub name: String,
pub schema: Option<String>,
pub columns: Vec<ColumnDef>,
pub constraints: Vec<TableConstraint>,
pub without_rowid: bool,
pub strict: bool,
pub bad_table_option: Option<String>,
pub as_select: Option<Box<Select>>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ColumnDef {
pub name: String,
pub type_name: Option<String>,
pub constraints: Vec<ColumnConstraint>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum FkAction {
#[default]
NoAction,
Restrict,
Cascade,
SetNull,
SetDefault,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ForeignKey {
pub columns: Vec<String>,
pub ref_table: String,
pub ref_columns: Vec<String>,
pub on_delete: FkAction,
pub on_update: FkAction,
pub initially_deferred: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ColumnConstraint {
PrimaryKey {
descending: bool,
autoincrement: bool,
on_conflict: OnConflict,
},
NotNull(OnConflict),
Unique(OnConflict),
Default(Expr),
Collate(String),
Check(Expr, Option<String>),
References(ForeignKey),
Generated {
expr: Expr,
stored: bool,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum TableConstraint {
PrimaryKey(Vec<(String, bool)>, OnConflict),
Unique(Vec<(String, bool)>, OnConflict),
Check(Expr, Option<String>),
ForeignKey(ForeignKey),
}
#[derive(Debug, Clone, PartialEq)]
pub struct CreateIndex {
pub unique: bool,
pub if_not_exists: bool,
pub schema: Option<String>,
pub name: String,
pub table: String,
pub columns: Vec<OrderTerm>,
pub where_clause: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CreateView {
pub if_not_exists: bool,
pub schema: Option<String>,
pub name: String,
pub columns: Vec<String>,
pub select: Box<Select>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CreateVirtualTable {
pub if_not_exists: bool,
pub schema: Option<String>,
pub name: String,
pub module: String,
pub args: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TriggerTiming {
Before,
After,
InsteadOf,
}
#[derive(Debug, Clone, PartialEq)]
pub enum TriggerEvent {
Insert,
Update(Vec<String>),
Delete,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CreateTrigger {
pub if_not_exists: bool,
pub schema: Option<String>,
pub name: String,
pub timing: TriggerTiming,
pub event: TriggerEvent,
pub table: String,
pub when: Option<Expr>,
pub body: Vec<Statement>,
pub body_error: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DropKind {
Table,
Index,
View,
Trigger,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Drop {
pub kind: DropKind,
pub if_exists: bool,
pub name: String,
pub schema: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Alter {
pub schema: Option<String>,
pub table: String,
pub action: AlterAction,
}
#[derive(Debug, Clone, PartialEq)]
pub enum AlterAction {
RenameTable(String),
RenameColumn {
old: String,
new: String,
new_text: String,
},
AddColumn(ColumnDef, Option<String>),
DropColumn(String),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Pragma {
pub name: String,
pub value: Option<Expr>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
Literal(Literal),
Parameter(Param),
Column {
schema: Option<String>,
table: Option<String>,
column: String,
quoted: bool,
},
Unary {
op: UnaryOp,
expr: Box<Expr>,
},
Binary {
op: BinaryOp,
left: Box<Expr>,
right: Box<Expr>,
},
Function {
name: String,
distinct: bool,
args: Vec<Expr>,
star: bool,
filter: Option<Box<Expr>>,
order_by: Vec<OrderTerm>,
over: Option<WindowSpec>,
},
IsNull {
expr: Box<Expr>,
negated: bool,
},
InList {
expr: Box<Expr>,
list: Vec<Expr>,
negated: bool,
candidate_affinity: Option<String>,
},
Between {
expr: Box<Expr>,
low: Box<Expr>,
high: Box<Expr>,
negated: bool,
},
Case {
operand: Option<Box<Expr>>,
when_then: Vec<(Expr, Expr)>,
else_result: Option<Box<Expr>>,
},
Cast {
expr: Box<Expr>,
type_name: String,
},
Paren(Box<Expr>),
RowValue(Vec<Expr>),
Collate {
expr: Box<Expr>,
collation: String,
},
Subquery(Box<Select>),
Exists {
select: Box<Select>,
negated: bool,
},
InSelect {
expr: Box<Expr>,
select: Box<Select>,
negated: bool,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum Literal {
Null,
Integer(i64),
Real(f64),
Str(String),
Blob(Vec<u8>),
Boolean(bool),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnaryOp {
Negate,
Identity,
Not,
BitNot,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinaryOp {
Or,
And,
Eq,
NotEq,
Lt,
LtEq,
Gt,
GtEq,
Is,
IsNot,
Like,
Glob,
Add,
Sub,
Mul,
Div,
Mod,
Concat,
BitAnd,
BitOr,
LShift,
RShift,
JsonExtract,
JsonExtractText,
}