diff --git a/Cargo.lock b/Cargo.lock index 95b643eb7..cd3ade11e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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]] diff --git a/simulator/Cargo.toml b/simulator/Cargo.toml index 0c7a76e45..01d45f633 100644 --- a/simulator/Cargo.toml +++ b/simulator/Cargo.toml @@ -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" diff --git a/simulator/model/query/expr.rs b/simulator/model/query/expr.rs new file mode 100644 index 000000000..7a5e0f89b --- /dev/null +++ b/simulator/model/query/expr.rs @@ -0,0 +1,5 @@ +use limbo_sqlite3_parser::ast; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +struct Predicate(ast::Expr); diff --git a/simulator/model/query/mod.rs b/simulator/model/query/mod.rs index ed947ca9b..a10f97d3b 100644 --- a/simulator/model/query/mod.rs +++ b/simulator/model/query/mod.rs @@ -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; diff --git a/vendored/sqlite3-parser/Cargo.toml b/vendored/sqlite3-parser/Cargo.toml index f432c345b..43ba78283 100644 --- a/vendored/sqlite3-parser/Cargo.toml +++ b/vendored/sqlite3-parser/Cargo.toml @@ -22,6 +22,7 @@ YYNOERRORRECOVERY = [] YYCOVERAGE = [] NDEBUG = [] default = ["YYNOERRORRECOVERY", "NDEBUG"] +serde = ["dep:serde", "indexmap/serde", "bitflags/serde"] [dependencies] phf = { version = "0.11", features = ["uncased"] } diff --git a/vendored/sqlite3-parser/src/parser/ast/mod.rs b/vendored/sqlite3-parser/src/parser/ast/mod.rs index 6d92c07ba..e213ccdfd 100644 --- a/vendored/sqlite3-parser/src/parser/ast/mod.rs +++ b/vendored/sqlite3-parser/src/parser/ast/mod.rs @@ -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, @@ -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, @@ -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, @@ -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 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, @@ -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, @@ -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), @@ -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>, // 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), @@ -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, Option), @@ -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, @@ -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, @@ -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); 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, @@ -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, @@ -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