From dc5f3d464635c3a419597df0607626e5a426ca33 Mon Sep 17 00:00:00 2001 From: Luca Date: Mon, 15 Sep 2025 09:54:24 +0200 Subject: [PATCH 1/5] Implemented the `From` method for all clear variants in Statement --- src/ast/helpers/stmt_create_table.rs | 5 +- src/ast/mod.rs | 9 +- src/ast/statement_from_impls.rs | 225 +++++++++++++++++++++++++++ src/dialect/mssql.rs | 10 +- 4 files changed, 235 insertions(+), 14 deletions(-) create mode 100644 src/ast/statement_from_impls.rs diff --git a/src/ast/helpers/stmt_create_table.rs b/src/ast/helpers/stmt_create_table.rs index fc00026974..fe950c909c 100644 --- a/src/ast/helpers/stmt_create_table.rs +++ b/src/ast/helpers/stmt_create_table.rs @@ -432,7 +432,7 @@ impl CreateTableBuilder { } pub fn build(self) -> Statement { - Statement::CreateTable(CreateTable { + CreateTable { or_replace: self.or_replace, temporary: self.temporary, external: self.external, @@ -484,7 +484,8 @@ impl CreateTableBuilder { refresh_mode: self.refresh_mode, initialize: self.initialize, require_user: self.require_user, - }) + } + .into() } } diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 6efe1f748c..b39bfca3ac 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -120,6 +120,7 @@ pub mod helpers; mod operator; mod query; mod spans; +mod statement_from_impls; pub use spans::Spanned; mod trigger; @@ -3029,14 +3030,6 @@ impl Display for Set { } } -/// Convert a `Set` into a `Statement`. -/// Convenience function, instead of writing `Statement::Set(Set::Set...{...})` -impl From for Statement { - fn from(set: Set) -> Self { - Statement::Set(set) - } -} - /// A representation of a `WHEN` arm with all the identifiers catched and the statements to execute /// for the arm. /// diff --git a/src/ast/statement_from_impls.rs b/src/ast/statement_from_impls.rs new file mode 100644 index 0000000000..7b92339154 --- /dev/null +++ b/src/ast/statement_from_impls.rs @@ -0,0 +1,225 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +//! Implementations of the `From` trait to convert from various +//! AST nodes to `Statement` nodes. + +use crate::ast::{ + AlterSchema, AlterType, CaseStatement, CreateConnector, CreateDomain, CreateFunction, + CreateIndex, CreateServerStatement, CreateTable, CreateTrigger, CreateUser, Delete, + DenyStatement, DropDomain, DropTrigger, ExportData, Function, IfStatement, Insert, + OpenStatement, PrintStatement, Query, RaiseStatement, RenameTable, ReturnStatement, Set, + ShowCharset, ShowObjects, Statement, Use, VacuumStatement, WhileStatement, +}; + +impl From for Statement { + fn from(s: Set) -> Self { + Self::Set(s) + } +} + +impl From for Statement { + fn from(q: Query) -> Self { + Box::new(q).into() + } +} + +impl From> for Statement { + fn from(q: Box) -> Self { + Self::Query(q) + } +} + +impl From for Statement { + fn from(i: Insert) -> Self { + Self::Insert(i) + } +} + +impl From for Statement { + fn from(c: CaseStatement) -> Self { + Self::Case(c) + } +} + +impl From for Statement { + fn from(i: IfStatement) -> Self { + Self::If(i) + } +} + +impl From for Statement { + fn from(w: WhileStatement) -> Self { + Self::While(w) + } +} + +impl From for Statement { + fn from(r: RaiseStatement) -> Self { + Self::Raise(r) + } +} + +impl From for Statement { + fn from(f: Function) -> Self { + Self::Call(f) + } +} + +impl From for Statement { + fn from(o: OpenStatement) -> Self { + Self::Open(o) + } +} + +impl From for Statement { + fn from(d: Delete) -> Self { + Self::Delete(d) + } +} + +impl From for Statement { + fn from(c: CreateTable) -> Self { + Self::CreateTable(c) + } +} + +impl From for Statement { + fn from(c: CreateIndex) -> Self { + Self::CreateIndex(c) + } +} + +impl From for Statement { + fn from(c: CreateServerStatement) -> Self { + Self::CreateServer(c) + } +} + +impl From for Statement { + fn from(c: CreateConnector) -> Self { + Self::CreateConnector(c) + } +} + +impl From for Statement { + fn from(a: AlterSchema) -> Self { + Self::AlterSchema(a) + } +} + +impl From for Statement { + fn from(a: AlterType) -> Self { + Self::AlterType(a) + } +} + +impl From for Statement { + fn from(d: DropDomain) -> Self { + Self::DropDomain(d) + } +} + +impl From for Statement { + fn from(s: ShowCharset) -> Self { + Self::ShowCharset(s) + } +} + +impl From for Statement { + fn from(s: ShowObjects) -> Self { + Self::ShowObjects(s) + } +} + +impl From for Statement { + fn from(u: Use) -> Self { + Self::Use(u) + } +} + +impl From for Statement { + fn from(c: CreateFunction) -> Self { + Self::CreateFunction(c) + } +} + +impl From for Statement { + fn from(c: CreateTrigger) -> Self { + Self::CreateTrigger(c) + } +} + +impl From for Statement { + fn from(d: DropTrigger) -> Self { + Self::DropTrigger(d) + } +} + +impl From for Statement { + fn from(d: DenyStatement) -> Self { + Self::Deny(d) + } +} + +impl From for Statement { + fn from(c: CreateDomain) -> Self { + Self::CreateDomain(c) + } +} + +impl From for Statement { + fn from(r: RenameTable) -> Self { + vec![r].into() + } +} + +impl From> for Statement { + fn from(r: Vec) -> Self { + Self::RenameTable(r) + } +} + +impl From for Statement { + fn from(p: PrintStatement) -> Self { + Self::Print(p) + } +} + +impl From for Statement { + fn from(r: ReturnStatement) -> Self { + Self::Return(r) + } +} + +impl From for Statement { + fn from(e: ExportData) -> Self { + Self::ExportData(e) + } +} + +impl From for Statement { + fn from(c: CreateUser) -> Self { + Self::CreateUser(c) + } +} + +impl From for Statement { + fn from(v: VacuumStatement) -> Self { + Self::Vacuum(v) + } +} diff --git a/src/dialect/mssql.rs b/src/dialect/mssql.rs index 15946d5db0..4fcc0e4b6c 100644 --- a/src/dialect/mssql.rs +++ b/src/dialect/mssql.rs @@ -226,12 +226,13 @@ impl MsSqlDialect { parser.prev_token(); } - Ok(Statement::If(IfStatement { + Ok(IfStatement { if_block, else_block, elseif_blocks: Vec::new(), end_token: None, - })) + } + .into()) } /// Parse `CREATE TRIGGER` for [MsSql] @@ -251,7 +252,7 @@ impl MsSqlDialect { parser.expect_keyword_is(Keyword::AS)?; let statements = Some(parser.parse_conditional_statements(&[Keyword::END])?); - Ok(Statement::CreateTrigger(CreateTrigger { + Ok(CreateTrigger { or_alter, or_replace: false, is_constraint: false, @@ -269,7 +270,8 @@ impl MsSqlDialect { statements_as: true, statements, characteristics: None, - })) + } + .into()) } /// Parse a sequence of statements, optionally separated by semicolon. From e93c8ee3a3fe0f608594a0d355dd134ed8ec83b2 Mon Sep 17 00:00:00 2001 From: Luca Date: Mon, 15 Sep 2025 09:59:39 +0200 Subject: [PATCH 2/5] Added alloc imports for no-std case --- src/ast/statement_from_impls.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ast/statement_from_impls.rs b/src/ast/statement_from_impls.rs index 7b92339154..7195e19d9f 100644 --- a/src/ast/statement_from_impls.rs +++ b/src/ast/statement_from_impls.rs @@ -17,7 +17,6 @@ //! Implementations of the `From` trait to convert from various //! AST nodes to `Statement` nodes. - use crate::ast::{ AlterSchema, AlterType, CaseStatement, CreateConnector, CreateDomain, CreateFunction, CreateIndex, CreateServerStatement, CreateTable, CreateTrigger, CreateUser, Delete, @@ -25,6 +24,14 @@ use crate::ast::{ OpenStatement, PrintStatement, Query, RaiseStatement, RenameTable, ReturnStatement, Set, ShowCharset, ShowObjects, Statement, Use, VacuumStatement, WhileStatement, }; +#[cfg(not(feature = "std"))] +use alloc::{ + boxed::Box, + format, + string::{String, ToString}, + vec, + vec::Vec, +}; impl From for Statement { fn from(s: Set) -> Self { From 9ef033fc349cbfce0b94ae72570b6b7e30c79c72 Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 16 Sep 2025 14:30:21 +0200 Subject: [PATCH 3/5] Folded `From` impls back into mod --- src/ast/mod.rs | 199 ++++++++++++++++++++++++++- src/ast/statement_from_impls.rs | 232 -------------------------------- 2 files changed, 198 insertions(+), 233 deletions(-) delete mode 100644 src/ast/statement_from_impls.rs diff --git a/src/ast/mod.rs b/src/ast/mod.rs index b39bfca3ac..41db113705 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -120,7 +120,6 @@ pub mod helpers; mod operator; mod query; mod spans; -mod statement_from_impls; pub use spans::Spanned; mod trigger; @@ -10700,6 +10699,204 @@ impl fmt::Display for VacuumStatement { } } +impl From for Statement { + fn from(s: Set) -> Self { + Self::Set(s) + } +} + +impl From for Statement { + fn from(q: Query) -> Self { + Box::new(q).into() + } +} + +impl From> for Statement { + fn from(q: Box) -> Self { + Self::Query(q) + } +} + +impl From for Statement { + fn from(i: Insert) -> Self { + Self::Insert(i) + } +} + +impl From for Statement { + fn from(c: CaseStatement) -> Self { + Self::Case(c) + } +} + +impl From for Statement { + fn from(i: IfStatement) -> Self { + Self::If(i) + } +} + +impl From for Statement { + fn from(w: WhileStatement) -> Self { + Self::While(w) + } +} + +impl From for Statement { + fn from(r: RaiseStatement) -> Self { + Self::Raise(r) + } +} + +impl From for Statement { + fn from(f: Function) -> Self { + Self::Call(f) + } +} + +impl From for Statement { + fn from(o: OpenStatement) -> Self { + Self::Open(o) + } +} + +impl From for Statement { + fn from(d: Delete) -> Self { + Self::Delete(d) + } +} + +impl From for Statement { + fn from(c: CreateTable) -> Self { + Self::CreateTable(c) + } +} + +impl From for Statement { + fn from(c: CreateIndex) -> Self { + Self::CreateIndex(c) + } +} + +impl From for Statement { + fn from(c: CreateServerStatement) -> Self { + Self::CreateServer(c) + } +} + +impl From for Statement { + fn from(c: CreateConnector) -> Self { + Self::CreateConnector(c) + } +} + +impl From for Statement { + fn from(a: AlterSchema) -> Self { + Self::AlterSchema(a) + } +} + +impl From for Statement { + fn from(a: AlterType) -> Self { + Self::AlterType(a) + } +} + +impl From for Statement { + fn from(d: DropDomain) -> Self { + Self::DropDomain(d) + } +} + +impl From for Statement { + fn from(s: ShowCharset) -> Self { + Self::ShowCharset(s) + } +} + +impl From for Statement { + fn from(s: ShowObjects) -> Self { + Self::ShowObjects(s) + } +} + +impl From for Statement { + fn from(u: Use) -> Self { + Self::Use(u) + } +} + +impl From for Statement { + fn from(c: CreateFunction) -> Self { + Self::CreateFunction(c) + } +} + +impl From for Statement { + fn from(c: CreateTrigger) -> Self { + Self::CreateTrigger(c) + } +} + +impl From for Statement { + fn from(d: DropTrigger) -> Self { + Self::DropTrigger(d) + } +} + +impl From for Statement { + fn from(d: DenyStatement) -> Self { + Self::Deny(d) + } +} + +impl From for Statement { + fn from(c: CreateDomain) -> Self { + Self::CreateDomain(c) + } +} + +impl From for Statement { + fn from(r: RenameTable) -> Self { + vec![r].into() + } +} + +impl From> for Statement { + fn from(r: Vec) -> Self { + Self::RenameTable(r) + } +} + +impl From for Statement { + fn from(p: PrintStatement) -> Self { + Self::Print(p) + } +} + +impl From for Statement { + fn from(r: ReturnStatement) -> Self { + Self::Return(r) + } +} + +impl From for Statement { + fn from(e: ExportData) -> Self { + Self::ExportData(e) + } +} + +impl From for Statement { + fn from(c: CreateUser) -> Self { + Self::CreateUser(c) + } +} + +impl From for Statement { + fn from(v: VacuumStatement) -> Self { + Self::Vacuum(v) + } +} + #[cfg(test)] mod tests { use crate::tokenizer::Location; diff --git a/src/ast/statement_from_impls.rs b/src/ast/statement_from_impls.rs deleted file mode 100644 index 7195e19d9f..0000000000 --- a/src/ast/statement_from_impls.rs +++ /dev/null @@ -1,232 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -//! Implementations of the `From` trait to convert from various -//! AST nodes to `Statement` nodes. -use crate::ast::{ - AlterSchema, AlterType, CaseStatement, CreateConnector, CreateDomain, CreateFunction, - CreateIndex, CreateServerStatement, CreateTable, CreateTrigger, CreateUser, Delete, - DenyStatement, DropDomain, DropTrigger, ExportData, Function, IfStatement, Insert, - OpenStatement, PrintStatement, Query, RaiseStatement, RenameTable, ReturnStatement, Set, - ShowCharset, ShowObjects, Statement, Use, VacuumStatement, WhileStatement, -}; -#[cfg(not(feature = "std"))] -use alloc::{ - boxed::Box, - format, - string::{String, ToString}, - vec, - vec::Vec, -}; - -impl From for Statement { - fn from(s: Set) -> Self { - Self::Set(s) - } -} - -impl From for Statement { - fn from(q: Query) -> Self { - Box::new(q).into() - } -} - -impl From> for Statement { - fn from(q: Box) -> Self { - Self::Query(q) - } -} - -impl From for Statement { - fn from(i: Insert) -> Self { - Self::Insert(i) - } -} - -impl From for Statement { - fn from(c: CaseStatement) -> Self { - Self::Case(c) - } -} - -impl From for Statement { - fn from(i: IfStatement) -> Self { - Self::If(i) - } -} - -impl From for Statement { - fn from(w: WhileStatement) -> Self { - Self::While(w) - } -} - -impl From for Statement { - fn from(r: RaiseStatement) -> Self { - Self::Raise(r) - } -} - -impl From for Statement { - fn from(f: Function) -> Self { - Self::Call(f) - } -} - -impl From for Statement { - fn from(o: OpenStatement) -> Self { - Self::Open(o) - } -} - -impl From for Statement { - fn from(d: Delete) -> Self { - Self::Delete(d) - } -} - -impl From for Statement { - fn from(c: CreateTable) -> Self { - Self::CreateTable(c) - } -} - -impl From for Statement { - fn from(c: CreateIndex) -> Self { - Self::CreateIndex(c) - } -} - -impl From for Statement { - fn from(c: CreateServerStatement) -> Self { - Self::CreateServer(c) - } -} - -impl From for Statement { - fn from(c: CreateConnector) -> Self { - Self::CreateConnector(c) - } -} - -impl From for Statement { - fn from(a: AlterSchema) -> Self { - Self::AlterSchema(a) - } -} - -impl From for Statement { - fn from(a: AlterType) -> Self { - Self::AlterType(a) - } -} - -impl From for Statement { - fn from(d: DropDomain) -> Self { - Self::DropDomain(d) - } -} - -impl From for Statement { - fn from(s: ShowCharset) -> Self { - Self::ShowCharset(s) - } -} - -impl From for Statement { - fn from(s: ShowObjects) -> Self { - Self::ShowObjects(s) - } -} - -impl From for Statement { - fn from(u: Use) -> Self { - Self::Use(u) - } -} - -impl From for Statement { - fn from(c: CreateFunction) -> Self { - Self::CreateFunction(c) - } -} - -impl From for Statement { - fn from(c: CreateTrigger) -> Self { - Self::CreateTrigger(c) - } -} - -impl From for Statement { - fn from(d: DropTrigger) -> Self { - Self::DropTrigger(d) - } -} - -impl From for Statement { - fn from(d: DenyStatement) -> Self { - Self::Deny(d) - } -} - -impl From for Statement { - fn from(c: CreateDomain) -> Self { - Self::CreateDomain(c) - } -} - -impl From for Statement { - fn from(r: RenameTable) -> Self { - vec![r].into() - } -} - -impl From> for Statement { - fn from(r: Vec) -> Self { - Self::RenameTable(r) - } -} - -impl From for Statement { - fn from(p: PrintStatement) -> Self { - Self::Print(p) - } -} - -impl From for Statement { - fn from(r: ReturnStatement) -> Self { - Self::Return(r) - } -} - -impl From for Statement { - fn from(e: ExportData) -> Self { - Self::ExportData(e) - } -} - -impl From for Statement { - fn from(c: CreateUser) -> Self { - Self::CreateUser(c) - } -} - -impl From for Statement { - fn from(v: VacuumStatement) -> Self { - Self::Vacuum(v) - } -} From 96e8eb3a2a5e8c2c27de7bfa5ea799b7c817f0da Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 16 Sep 2025 14:35:23 +0200 Subject: [PATCH 4/5] Added import of vec macro for the thumbv6m-none-eabi target --- src/ast/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 41db113705..7393d41a8f 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -20,6 +20,7 @@ use alloc::{ boxed::Box, format, + vec, string::{String, ToString}, vec::Vec, }; From e785dc1449d2eae6c3acb086eee0e2331bb8563c Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 16 Sep 2025 14:37:52 +0200 Subject: [PATCH 5/5] Formatted code --- src/ast/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 7393d41a8f..8df636f8e9 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -20,8 +20,8 @@ use alloc::{ boxed::Box, format, - vec, string::{String, ToString}, + vec, vec::Vec, }; use helpers::{