add optional serde implementations for parser ast

This commit is contained in:
pedrocarlo 2025-06-02 16:20:48 -03:00
parent f1146e716c
commit f535ff1398
6 changed files with 92 additions and 1 deletions

4
Cargo.lock generated
View file

@ -240,6 +240,9 @@ name = "bitflags"
version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
dependencies = [
"serde",
]
[[package]]
name = "blake3"
@ -1428,6 +1431,7 @@ checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
dependencies = [
"equivalent",
"hashbrown 0.15.2",
"serde",
]
[[package]]

View file

@ -35,5 +35,5 @@ chrono = { version = "0.4.40", features = ["serde"] }
tracing = "0.1.41"
tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }
anyhow.workspace = true
limbo_sqlite3_parser = { workspace = true }
limbo_sqlite3_parser = { workspace = true, features = ["serde"]}
hex = "0.4.3"

View file

@ -0,0 +1,5 @@
use limbo_sqlite3_parser::ast;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
struct Predicate(ast::Expr);

View file

@ -15,6 +15,7 @@ pub mod create;
pub mod create_index;
pub mod delete;
pub mod drop;
pub mod expr;
pub mod insert;
pub mod select;
pub mod update;

View file

@ -22,6 +22,7 @@ YYNOERRORRECOVERY = []
YYCOVERAGE = []
NDEBUG = []
default = ["YYNOERRORRECOVERY", "NDEBUG"]
serde = ["dep:serde", "indexmap/serde", "bitflags/serde"]
[dependencies]
phf = { version = "0.11", features = ["uncased"] }

View file

@ -69,6 +69,7 @@ pub(crate) enum ExplainKind {
/// SQL statement
// https://sqlite.org/syntax/sql-stmt.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Stmt {
/// `ALTER TABLE`: table name, body
AlterTable(Box<(QualifiedName, AlterTableBody)>),
@ -193,6 +194,7 @@ pub enum Stmt {
/// `CREATE VIRTUAL TABLE`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CreateVirtualTable {
/// `IF NOT EXISTS`
pub if_not_exists: bool,
@ -206,6 +208,7 @@ pub struct CreateVirtualTable {
/// `CREATE TRIGGER
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CreateTrigger {
/// `TEMPORARY`
pub temporary: bool,
@ -229,6 +232,7 @@ pub struct CreateTrigger {
/// `INSERT`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Insert {
/// CTE
pub with: Option<With>,
@ -246,6 +250,7 @@ pub struct Insert {
/// `UPDATE` clause
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Update {
/// CTE
pub with: Option<With>,
@ -271,6 +276,7 @@ pub struct Update {
/// `DELETE`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Delete {
/// CTE
pub with: Option<With>,
@ -290,6 +296,7 @@ pub struct Delete {
#[repr(transparent)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
/// Internal ID of a table reference.
///
/// Used by [Expr::Column] and [Expr::RowId] to refer to a table.
@ -332,6 +339,7 @@ impl std::fmt::Display for TableInternalId {
/// SQL expression
// https://sqlite.org/syntax/expr.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expr {
/// `BETWEEN`
Between {
@ -570,6 +578,7 @@ impl Expr {
/// SQL literal
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Literal {
/// Number
Numeric(String),
@ -608,6 +617,7 @@ impl Literal {
/// Textual comparison operator in an expression
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum LikeOperator {
/// `GLOB`
Glob,
@ -640,6 +650,7 @@ impl LikeOperator {
/// SQL operators
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Operator {
/// `+`
Add,
@ -750,6 +761,7 @@ impl Operator {
/// Unary operators
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum UnaryOperator {
/// bitwise negation (`~`)
BitwiseNot,
@ -777,6 +789,7 @@ impl From<YYCODETYPE> for UnaryOperator {
// https://sqlite.org/lang_select.html
// https://sqlite.org/syntax/factored-select-stmt.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Select {
/// CTE
pub with: Option<With>,
@ -790,6 +803,7 @@ pub struct Select {
/// `SELECT` body
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SelectBody {
/// first select
pub select: Box<OneSelect>,
@ -821,6 +835,7 @@ impl SelectBody {
/// Compound select
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CompoundSelect {
/// operator
pub operator: CompoundOperator,
@ -831,6 +846,7 @@ pub struct CompoundSelect {
/// Compound operators
// https://sqlite.org/syntax/compound-operator.html
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CompoundOperator {
/// `UNION`
Union,
@ -845,6 +861,7 @@ pub enum CompoundOperator {
/// `SELECT` core
// https://sqlite.org/syntax/select-core.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum OneSelect {
/// `SELECT`
Select(Box<SelectInner>),
@ -853,6 +870,7 @@ pub enum OneSelect {
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
/// `SELECT` core
pub struct SelectInner {
/// `DISTINCT`
@ -872,6 +890,7 @@ pub struct SelectInner {
/// `SELECT` ... `FROM` clause
// https://sqlite.org/syntax/join-clause.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FromClause {
/// table
pub select: Option<Box<SelectTable>>, // FIXME mandatory
@ -928,6 +947,7 @@ impl FromClause {
/// `SELECT` distinctness
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Distinctness {
/// `DISTINCT`
Distinct,
@ -938,6 +958,7 @@ pub enum Distinctness {
/// `SELECT` or `RETURNING` result column
// https://sqlite.org/syntax/result-column.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ResultColumn {
/// expression
Expr(Expr, Option<As>),
@ -949,6 +970,7 @@ pub enum ResultColumn {
/// Alias
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum As {
/// `AS`
As(Name),
@ -959,6 +981,7 @@ pub enum As {
/// `JOIN` clause
// https://sqlite.org/syntax/join-clause.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct JoinedSelectTable {
/// operator
pub operator: JoinOperator,
@ -971,6 +994,7 @@ pub struct JoinedSelectTable {
/// Table or subquery
// https://sqlite.org/syntax/table-or-subquery.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SelectTable {
/// table
Table(QualifiedName, Option<As>, Option<Indexed>),
@ -985,6 +1009,7 @@ pub enum SelectTable {
/// Join operators
// https://sqlite.org/syntax/join-operator.html
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum JoinOperator {
/// `,`
Comma,
@ -1028,6 +1053,7 @@ impl JoinOperator {
bitflags::bitflags! {
/// `JOIN` types
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct JoinType: u8 {
/// `INNER`
const INNER = 0x01;
@ -1072,6 +1098,8 @@ impl TryFrom<&[u8]> for JoinType {
/// `JOIN` constraint
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum JoinConstraint {
/// `ON`
On(Expr),
@ -1081,6 +1109,7 @@ pub enum JoinConstraint {
/// `GROUP BY`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct GroupBy {
/// expressions
pub exprs: Vec<Expr>,
@ -1090,6 +1119,7 @@ pub struct GroupBy {
/// identifier or one of several keywords or `INDEXED`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Id(pub String);
impl Id {
@ -1103,6 +1133,7 @@ impl Id {
/// identifier or string or `CROSS` or `FULL` or `INNER` or `LEFT` or `NATURAL` or `OUTER` or `RIGHT`.
#[derive(Clone, Debug, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Name(pub String); // TODO distinction between Name and "Name"/[Name]/`Name`
impl Name {
@ -1199,6 +1230,7 @@ impl PartialEq<&str> for Name {
/// Qualified name
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct QualifiedName {
/// schema
pub db_name: Option<Name>,
@ -1245,6 +1277,7 @@ impl QualifiedName {
/// Ordered set of distinct column names
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DistinctNames(IndexSet<Name>);
impl DistinctNames {
@ -1280,6 +1313,7 @@ impl Deref for DistinctNames {
/// `ALTER TABLE` body
// https://sqlite.org/lang_altertable.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AlterTableBody {
/// `RENAME TO`: new table name
RenameTo(Name),
@ -1300,6 +1334,7 @@ pub enum AlterTableBody {
// https://sqlite.org/lang_createtable.html
// https://sqlite.org/syntax/create-table-stmt.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CreateTableBody {
/// columns and constraints
ColumnsAndConstraints {
@ -1332,6 +1367,7 @@ impl CreateTableBody {
/// Table column definition
// https://sqlite.org/syntax/column-def.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ColumnDefinition {
/// column name
pub col_name: Name,
@ -1403,6 +1439,7 @@ impl ColumnDefinition {
/// Named column constraint
// https://sqlite.org/syntax/column-constraint.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NamedColumnConstraint {
/// constraint name
pub name: Option<Name>,
@ -1413,6 +1450,7 @@ pub struct NamedColumnConstraint {
/// Column constraint
// https://sqlite.org/syntax/column-constraint.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ColumnConstraint {
/// `PRIMARY KEY`
PrimaryKey {
@ -1462,6 +1500,7 @@ pub enum ColumnConstraint {
/// Named table constraint
// https://sqlite.org/syntax/table-constraint.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NamedTableConstraint {
/// constraint name
pub name: Option<Name>,
@ -1472,6 +1511,7 @@ pub struct NamedTableConstraint {
/// Table constraint
// https://sqlite.org/syntax/table-constraint.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TableConstraint {
/// `PRIMARY KEY`
PrimaryKey {
@ -1505,6 +1545,7 @@ pub enum TableConstraint {
bitflags::bitflags! {
/// `CREATE TABLE` options
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TableOptions: u8 {
/// None
const NONE = 0;
@ -1517,6 +1558,7 @@ bitflags::bitflags! {
/// Sort orders
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SortOrder {
/// `ASC`
Asc,
@ -1526,6 +1568,7 @@ pub enum SortOrder {
/// `NULLS FIRST` or `NULLS LAST`
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum NullsOrder {
/// `NULLS FIRST`
First,
@ -1536,6 +1579,7 @@ pub enum NullsOrder {
/// `REFERENCES` clause
// https://sqlite.org/syntax/foreign-key-clause.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ForeignKeyClause {
/// foreign table name
pub tbl_name: Name,
@ -1547,6 +1591,7 @@ pub struct ForeignKeyClause {
/// foreign-key reference args
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RefArg {
/// `ON DELETE`
OnDelete(RefAct),
@ -1560,6 +1605,7 @@ pub enum RefArg {
/// foreign-key reference actions
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum RefAct {
/// `SET NULL`
SetNull,
@ -1575,6 +1621,7 @@ pub enum RefAct {
/// foreign-key defer clause
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeferSubclause {
/// `DEFERRABLE`
pub deferrable: bool,
@ -1584,6 +1631,7 @@ pub struct DeferSubclause {
/// `INITIALLY` `DEFERRED` / `IMMEDIATE`
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum InitDeferredPred {
/// `INITIALLY DEFERRED`
InitiallyDeferred,
@ -1594,6 +1642,7 @@ pub enum InitDeferredPred {
/// Indexed column
// https://sqlite.org/syntax/indexed-column.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IndexedColumn {
/// column name
pub col_name: Name,
@ -1605,6 +1654,7 @@ pub struct IndexedColumn {
/// `INDEXED BY` / `NOT INDEXED`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Indexed {
/// `INDEXED BY`: idx name
IndexedBy(Name),
@ -1614,6 +1664,7 @@ pub enum Indexed {
/// Sorted column
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SortedColumn {
/// expression
pub expr: Expr,
@ -1625,6 +1676,7 @@ pub struct SortedColumn {
/// `LIMIT`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Limit {
/// count
pub expr: Expr,
@ -1636,6 +1688,7 @@ pub struct Limit {
// https://sqlite.org/lang_insert.html
// https://sqlite.org/syntax/insert-stmt.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum InsertBody {
/// `SELECT` or `VALUES`
Select(Box<Select>, Option<Upsert>),
@ -1645,6 +1698,7 @@ pub enum InsertBody {
/// `UPDATE ... SET`
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Set {
/// column name(s)
pub col_names: DistinctNames,
@ -1655,6 +1709,7 @@ pub struct Set {
/// `PRAGMA` body
// https://sqlite.org/syntax/pragma-stmt.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PragmaBody {
/// `=`
Equals(PragmaValue),
@ -1669,6 +1724,7 @@ pub type PragmaValue = Expr; // TODO
// https://sqlite.org/pragma.html
#[derive(Clone, Debug, PartialEq, Eq, EnumIter, EnumString, strum::Display)]
#[strum(serialize_all = "snake_case")]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PragmaName {
/// set the autovacuum mode
AutoVacuum,
@ -1694,6 +1750,7 @@ pub enum PragmaName {
/// `CREATE TRIGGER` time
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TriggerTime {
/// `BEFORE`
Before, // default
@ -1705,6 +1762,7 @@ pub enum TriggerTime {
/// `CREATE TRIGGER` event
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TriggerEvent {
/// `DELETE`
Delete,
@ -1720,6 +1778,7 @@ pub enum TriggerEvent {
// https://sqlite.org/lang_createtrigger.html
// https://sqlite.org/syntax/create-trigger-stmt.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TriggerCmd {
/// `UPDATE`
Update(Box<TriggerCmdUpdate>),
@ -1733,6 +1792,7 @@ pub enum TriggerCmd {
/// `UPDATE` trigger command
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TriggerCmdUpdate {
/// `OR`
pub or_conflict: Option<ResolveType>,
@ -1748,6 +1808,7 @@ pub struct TriggerCmdUpdate {
/// `INSERT` trigger command
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TriggerCmdInsert {
/// `OR`
pub or_conflict: Option<ResolveType>,
@ -1765,6 +1826,7 @@ pub struct TriggerCmdInsert {
/// `DELETE` trigger command
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TriggerCmdDelete {
/// table name
pub tbl_name: Name,
@ -1774,6 +1836,7 @@ pub struct TriggerCmdDelete {
/// Conflict resolution types
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ResolveType {
/// `ROLLBACK`
Rollback,
@ -1803,6 +1866,7 @@ impl ResolveType {
// https://sqlite.org/lang_with.html
// https://sqlite.org/syntax/with-clause.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct With {
/// `RECURSIVE`
pub recursive: bool,
@ -1812,6 +1876,7 @@ pub struct With {
/// CTE materialization
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Materialized {
/// No hint
Any,
@ -1824,6 +1889,7 @@ pub enum Materialized {
/// CTE
// https://sqlite.org/syntax/common-table-expression.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CommonTableExpr {
/// table name
pub tbl_name: Name,
@ -1849,6 +1915,7 @@ impl CommonTableExpr {
/// Column type
// https://sqlite.org/syntax/type-name.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Type {
/// type name
pub name: String, // TODO Validate: Ids+
@ -1859,6 +1926,7 @@ pub struct Type {
/// Column type size limit(s)
// https://sqlite.org/syntax/type-name.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TypeSize {
/// maximum size
MaxSize(Box<Expr>),
@ -1868,6 +1936,7 @@ pub enum TypeSize {
/// Transaction types
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TransactionType {
/// `DEFERRED`
Deferred, // default
@ -1881,6 +1950,7 @@ pub enum TransactionType {
// https://sqlite.org/lang_upsert.html
// https://sqlite.org/syntax/upsert-clause.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Upsert {
/// conflict targets
pub index: Option<Box<UpsertIndex>>,
@ -1892,6 +1962,7 @@ pub struct Upsert {
/// Upsert conflict targets
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UpsertIndex {
/// columns
pub targets: Vec<SortedColumn>,
@ -1901,6 +1972,7 @@ pub struct UpsertIndex {
/// Upsert `DO` action
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum UpsertDo {
/// `SET`
Set {
@ -1915,6 +1987,7 @@ pub enum UpsertDo {
/// Function call tail
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FunctionTail {
/// `FILTER` clause
pub filter_clause: Option<Box<Expr>>,
@ -1925,6 +1998,7 @@ pub struct FunctionTail {
/// Function call `OVER` clause
// https://sqlite.org/syntax/over-clause.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Over {
/// Window definition
Window(Window),
@ -1934,6 +2008,7 @@ pub enum Over {
/// `OVER` window definition
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct WindowDef {
/// window name
pub name: Name,
@ -1944,6 +2019,7 @@ pub struct WindowDef {
/// Window definition
// https://sqlite.org/syntax/window-defn.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Window {
/// base window name
pub base: Option<Name>,
@ -1958,6 +2034,7 @@ pub struct Window {
/// Frame specification
// https://sqlite.org/syntax/frame-spec.html
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FrameClause {
/// unit
pub mode: FrameMode,
@ -1971,6 +2048,7 @@ pub struct FrameClause {
/// Frame modes
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FrameMode {
/// `GROUPS`
Groups,
@ -1982,6 +2060,7 @@ pub enum FrameMode {
/// Frame bounds
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FrameBound {
/// `CURRENT ROW`
CurrentRow,
@ -1997,6 +2076,7 @@ pub enum FrameBound {
/// Frame exclusions
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FrameExclude {
/// `NO OTHERS`
NoOthers,