diff --git a/Cargo.toml b/Cargo.toml index 24ee2c991..19cc623d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ serde = { version = "1.0", features = ["derive"], optional = true } # of dev-dependencies because of # https://github.com/rust-lang/cargo/issues/1596 serde_json = { version = "1.0", optional = true } -sqlparser_derive = { version = "0.1", path = "derive", optional = true } +sqlparser_derive = { version = "0.1.1", path = "derive", optional = true } [dev-dependencies] simple_logger = "4.0" diff --git a/derive/Cargo.toml b/derive/Cargo.toml index 7a592566f..58e1fbf57 100644 --- a/derive/Cargo.toml +++ b/derive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "sqlparser_derive" description = "proc macro for sqlparser" -version = "0.1.0" +version = "0.1.1" authors = ["sqlparser-rs authors"] homepage = "https://github.com/sqlparser-rs/sqlparser-rs" documentation = "https://docs.rs/sqlparser_derive/" diff --git a/derive/README.md b/derive/README.md index 2f373b2b9..ec0fcb6fb 100644 --- a/derive/README.md +++ b/derive/README.md @@ -6,13 +6,13 @@ This crate contains a procedural macro that can automatically derive implementations of the `Visit` trait in the [sqlparser](https://crates.io/crates/sqlparser) crate ```rust -#[derive(Visit)] +#[derive(Visit, VisitMut)] struct Foo { boolean: bool, bar: Bar, } -#[derive(Visit)] +#[derive(Visit, VisitMut)] enum Bar { A(), B(String, bool), @@ -51,7 +51,7 @@ impl Visit for Bar { Additionally certain types may wish to call a corresponding method on visitor before recursing ```rust -#[derive(Visit)] +#[derive(Visit, VisitMut)] #[visit(with = "visit_expr")] enum Expr { A(), diff --git a/derive/src/lib.rs b/derive/src/lib.rs index b211b767b..fbc3ef2e1 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -6,25 +6,58 @@ use syn::{ Ident, Index, Lit, Meta, MetaNameValue, NestedMeta, }; + +/// Implementation of `[#derive(Visit)]` +#[proc_macro_derive(VisitMut, attributes(visit))] +pub fn derive_visit_mut(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + derive_visit(input, &VisitType { + visit_trait: quote!(VisitMut), + visitor_trait: quote!(VisitorMut), + modifier: Some(quote!(mut)), + }) +} + /// Implementation of `[#derive(Visit)]` #[proc_macro_derive(Visit, attributes(visit))] -pub fn derive_visit(input: proc_macro::TokenStream) -> proc_macro::TokenStream { +pub fn derive_visit_immutable(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + derive_visit(input, &VisitType { + visit_trait: quote!(Visit), + visitor_trait: quote!(Visitor), + modifier: None, + }) +} + +struct VisitType { + visit_trait: TokenStream, + visitor_trait: TokenStream, + modifier: Option, +} + +fn derive_visit( + input: proc_macro::TokenStream, + visit_type: &VisitType, +) -> proc_macro::TokenStream { // Parse the input tokens into a syntax tree. let input = parse_macro_input!(input as DeriveInput); let name = input.ident; + let VisitType { visit_trait, visitor_trait, modifier } = visit_type; + let attributes = Attributes::parse(&input.attrs); - // Add a bound `T: HeapSize` to every type parameter T. - let generics = add_trait_bounds(input.generics); + // Add a bound `T: Visit` to every type parameter T. + let generics = add_trait_bounds(input.generics, visit_type); let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); let (pre_visit, post_visit) = attributes.visit(quote!(self)); - let children = visit_children(&input.data); + let children = visit_children(&input.data, visit_type); let expanded = quote! { // The generated impl. - impl #impl_generics sqlparser::ast::Visit for #name #ty_generics #where_clause { - fn visit(&self, visitor: &mut V) -> ::std::ops::ControlFlow { + impl #impl_generics sqlparser::ast::#visit_trait for #name #ty_generics #where_clause { + fn visit( + &#modifier self, + visitor: &mut V + ) -> ::std::ops::ControlFlow { #pre_visit #children #post_visit @@ -92,25 +125,25 @@ impl Attributes { } // Add a bound `T: Visit` to every type parameter T. -fn add_trait_bounds(mut generics: Generics) -> Generics { +fn add_trait_bounds(mut generics: Generics, VisitType{visit_trait, ..}: &VisitType) -> Generics { for param in &mut generics.params { if let GenericParam::Type(ref mut type_param) = *param { - type_param.bounds.push(parse_quote!(sqlparser::ast::Visit)); + type_param.bounds.push(parse_quote!(sqlparser::ast::#visit_trait)); } } generics } // Generate the body of the visit implementation for the given type -fn visit_children(data: &Data) -> TokenStream { +fn visit_children(data: &Data, VisitType{visit_trait, modifier, ..}: &VisitType) -> TokenStream { match data { Data::Struct(data) => match &data.fields { Fields::Named(fields) => { let recurse = fields.named.iter().map(|f| { let name = &f.ident; let attributes = Attributes::parse(&f.attrs); - let (pre_visit, post_visit) = attributes.visit(quote!(&self.#name)); - quote_spanned!(f.span() => #pre_visit sqlparser::ast::Visit::visit(&self.#name, visitor)?; #post_visit) + let (pre_visit, post_visit) = attributes.visit(quote!(&#modifier self.#name)); + quote_spanned!(f.span() => #pre_visit sqlparser::ast::#visit_trait::visit(&#modifier self.#name, visitor)?; #post_visit) }); quote! { #(#recurse)* @@ -121,7 +154,7 @@ fn visit_children(data: &Data) -> TokenStream { let index = Index::from(i); let attributes = Attributes::parse(&f.attrs); let (pre_visit, post_visit) = attributes.visit(quote!(&self.#index)); - quote_spanned!(f.span() => #pre_visit sqlparser::ast::Visit::visit(&self.#index, visitor)?; #post_visit) + quote_spanned!(f.span() => #pre_visit sqlparser::ast::#visit_trait::visit(&#modifier self.#index, visitor)?; #post_visit) }); quote! { #(#recurse)* @@ -140,8 +173,8 @@ fn visit_children(data: &Data) -> TokenStream { let visit = fields.named.iter().map(|f| { let name = &f.ident; let attributes = Attributes::parse(&f.attrs); - let (pre_visit, post_visit) = attributes.visit(quote!(&#name)); - quote_spanned!(f.span() => #pre_visit sqlparser::ast::Visit::visit(#name, visitor)?; #post_visit) + let (pre_visit, post_visit) = attributes.visit(name.to_token_stream()); + quote_spanned!(f.span() => #pre_visit sqlparser::ast::#visit_trait::visit(#name, visitor)?; #post_visit) }); quote!( @@ -155,8 +188,8 @@ fn visit_children(data: &Data) -> TokenStream { let visit = fields.unnamed.iter().enumerate().map(|(i, f)| { let name = format_ident!("_{}", i); let attributes = Attributes::parse(&f.attrs); - let (pre_visit, post_visit) = attributes.visit(quote!(&#name)); - quote_spanned!(f.span() => #pre_visit sqlparser::ast::Visit::visit(#name, visitor)?; #post_visit) + let (pre_visit, post_visit) = attributes.visit(name.to_token_stream()); + quote_spanned!(f.span() => #pre_visit sqlparser::ast::#visit_trait::visit(#name, visitor)?; #post_visit) }); quote! { diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index af8320d8f..ba90659ab 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -18,7 +18,7 @@ use core::fmt; use serde::{Deserialize, Serialize}; #[cfg(feature = "visitor")] -use sqlparser_derive::Visit; +use sqlparser_derive::{Visit, VisitMut}; use crate::ast::ObjectName; @@ -27,7 +27,7 @@ use super::value::escape_single_quote_string; /// SQL data types #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum DataType { /// Fixed-length character type e.g. CHARACTER(10) Character(Option), @@ -341,7 +341,7 @@ fn format_datetime_precision_and_tz( /// guarantee compatibility with the input query we must maintain its exact information. #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum TimezoneInfo { /// No information about time zone. E.g., TIMESTAMP None, @@ -389,7 +389,7 @@ impl fmt::Display for TimezoneInfo { /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ExactNumberInfo { /// No additional information e.g. `DECIMAL` None, @@ -420,7 +420,7 @@ impl fmt::Display for ExactNumberInfo { /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-length #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct CharacterLength { /// Default (if VARYING) or maximum (if not VARYING) length pub length: u64, @@ -443,7 +443,7 @@ impl fmt::Display for CharacterLength { /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#char-length-units #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CharLengthUnits { /// CHARACTERS unit Characters, diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 612f79131..8576d7277 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -21,7 +21,7 @@ use core::fmt; use serde::{Deserialize, Serialize}; #[cfg(feature = "visitor")] -use sqlparser_derive::Visit; +use sqlparser_derive::{Visit, VisitMut}; use crate::ast::value::escape_single_quote_string; use crate::ast::{display_comma_separated, display_separated, DataType, Expr, Ident, ObjectName}; @@ -30,7 +30,7 @@ use crate::tokenizer::Token; /// An `ALTER TABLE` (`Statement::AlterTable`) operation #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum AlterTableOperation { /// `ADD ` AddConstraint(TableConstraint), @@ -100,7 +100,7 @@ pub enum AlterTableOperation { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum AlterIndexOperation { RenameIndex { index_name: ObjectName }, } @@ -224,7 +224,7 @@ impl fmt::Display for AlterIndexOperation { /// An `ALTER COLUMN` (`Statement::AlterTable`) operation #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum AlterColumnOperation { /// `SET NOT NULL` SetNotNull, @@ -268,7 +268,7 @@ impl fmt::Display for AlterColumnOperation { /// `ALTER TABLE ADD ` statement. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum TableConstraint { /// `[ CONSTRAINT ] { PRIMARY KEY | UNIQUE } ()` Unique { @@ -433,7 +433,7 @@ impl fmt::Display for TableConstraint { /// [1]: https://dev.mysql.com/doc/refman/8.0/en/create-table.html #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum KeyOrIndexDisplay { /// Nothing to display None, @@ -469,7 +469,7 @@ impl fmt::Display for KeyOrIndexDisplay { /// [3]: https://www.postgresql.org/docs/14/sql-createindex.html #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum IndexType { BTree, Hash, @@ -488,7 +488,7 @@ impl fmt::Display for IndexType { /// SQL column definition #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct ColumnDef { pub name: Ident, pub data_type: DataType, @@ -524,7 +524,7 @@ impl fmt::Display for ColumnDef { /// "column options," and we allow any column option to be named. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct ColumnOptionDef { pub name: Option, pub option: ColumnOption, @@ -540,7 +540,7 @@ impl fmt::Display for ColumnOptionDef { /// TABLE` statement. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ColumnOption { /// `NULL` Null, @@ -630,7 +630,7 @@ fn display_constraint_name(name: &'_ Option) -> impl fmt::Display + '_ { /// Used in foreign key constraints in `ON UPDATE` and `ON DELETE` options. #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ReferentialAction { Restrict, Cascade, diff --git a/src/ast/helpers/stmt_create_table.rs b/src/ast/helpers/stmt_create_table.rs index 403d91131..14bcd3633 100644 --- a/src/ast/helpers/stmt_create_table.rs +++ b/src/ast/helpers/stmt_create_table.rs @@ -5,7 +5,7 @@ use alloc::{boxed::Box, format, string::String, vec, vec::Vec}; use serde::{Deserialize, Serialize}; #[cfg(feature = "visitor")] -use sqlparser_derive::Visit; +use sqlparser_derive::{Visit, VisitMut}; use crate::ast::{ ColumnDef, FileFormat, HiveDistributionStyle, HiveFormat, ObjectName, OnCommit, Query, @@ -43,7 +43,7 @@ use crate::parser::ParserError; /// [1]: crate::ast::Statement::CreateTable #[derive(Debug, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct CreateTableBuilder { pub or_replace: bool, pub temporary: bool, diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 45f1c8162..c3eb688db 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -23,7 +23,7 @@ use core::fmt; use serde::{Deserialize, Serialize}; #[cfg(feature = "visitor")] -use sqlparser_derive::Visit; +use sqlparser_derive::{Visit, VisitMut}; pub use self::data_type::{ CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, TimezoneInfo, @@ -96,7 +96,7 @@ where /// An identifier, decomposed into its value or character data and the quote style. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct Ident { /// The value of the identifier without quotes. pub value: String, @@ -157,7 +157,7 @@ impl fmt::Display for Ident { /// A name of a table, view, custom type, etc., possibly multi-part, i.e. db.schema.obj #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct ObjectName(pub Vec); impl fmt::Display for ObjectName { @@ -170,7 +170,7 @@ impl fmt::Display for ObjectName { /// `ARRAY[..]`, or `[..]` #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct Array { /// The list of expressions between brackets pub elem: Vec, @@ -193,7 +193,7 @@ impl fmt::Display for Array { /// JsonOperator #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum JsonOperator { /// -> keeps the value as json Arrow, @@ -257,7 +257,11 @@ impl fmt::Display for JsonOperator { /// inappropriate type, like `WHERE 1` or `SELECT 1=1`, as necessary. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit), visit(with = "visit_expr"))] +#[cfg_attr( + feature = "visitor", + derive(Visit, VisitMut), + visit(with = "visit_expr") +)] pub enum Expr { /// Identifier e.g. table name or column name Identifier(Ident), @@ -911,7 +915,7 @@ impl fmt::Display for Expr { /// A window specification (i.e. `OVER (PARTITION BY .. ORDER BY .. etc.)`) #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct WindowSpec { pub partition_by: Vec, pub order_by: Vec, @@ -957,7 +961,7 @@ impl fmt::Display for WindowSpec { /// reject invalid bounds like `ROWS UNBOUNDED FOLLOWING` before execution. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct WindowFrame { pub units: WindowFrameUnits, pub start_bound: WindowFrameBound, @@ -983,7 +987,7 @@ impl Default for WindowFrame { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum WindowFrameUnits { Rows, Range, @@ -1003,7 +1007,7 @@ impl fmt::Display for WindowFrameUnits { /// Specifies [WindowFrame]'s `start_bound` and `end_bound` #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum WindowFrameBound { /// `CURRENT ROW` CurrentRow, @@ -1027,7 +1031,7 @@ impl fmt::Display for WindowFrameBound { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum AddDropSync { ADD, DROP, @@ -1046,7 +1050,7 @@ impl fmt::Display for AddDropSync { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ShowCreateObject { Event, Function, @@ -1071,7 +1075,7 @@ impl fmt::Display for ShowCreateObject { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CommentObject { Column, Table, @@ -1088,7 +1092,7 @@ impl fmt::Display for CommentObject { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum Password { Password(Expr), NullPassword, @@ -1098,7 +1102,11 @@ pub enum Password { #[allow(clippy::large_enum_variant)] #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit), visit(with = "visit_statement"))] +#[cfg_attr( + feature = "visitor", + derive(Visit, VisitMut), + visit(with = "visit_statement") +)] pub enum Statement { /// Analyze (Hive) Analyze { @@ -2739,7 +2747,7 @@ impl fmt::Display for Statement { /// ``` #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum SequenceOptions { IncrementBy(Expr, bool), MinValue(MinMaxValue), @@ -2804,7 +2812,7 @@ impl fmt::Display for SequenceOptions { /// [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum MinMaxValue { // clause is not specified Empty, @@ -2816,7 +2824,7 @@ pub enum MinMaxValue { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] #[non_exhaustive] pub enum OnInsert { /// ON DUPLICATE KEY UPDATE (MySQL when the key already exists, then execute an update instead) @@ -2827,21 +2835,21 @@ pub enum OnInsert { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct OnConflict { pub conflict_target: Option, pub action: OnConflictAction, } #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ConflictTarget { Columns(Vec), OnConstraint(ObjectName), } #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum OnConflictAction { DoNothing, DoUpdate(DoUpdate), @@ -2849,7 +2857,7 @@ pub enum OnConflictAction { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct DoUpdate { /// Column assignments pub assignments: Vec, @@ -2911,7 +2919,7 @@ impl fmt::Display for OnConflictAction { /// Privileges granted in a GRANT statement or revoked in a REVOKE statement. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum Privileges { /// All privileges applicable to the object type All { @@ -2948,7 +2956,7 @@ impl fmt::Display for Privileges { /// Specific direction for FETCH statement #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum FetchDirection { Count { limit: Value }, Next, @@ -3012,7 +3020,7 @@ impl fmt::Display for FetchDirection { /// A privilege on a database object (table, sequence, etc.). #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum Action { Connect, Create, @@ -3062,7 +3070,7 @@ impl fmt::Display for Action { /// Objects on which privileges are granted in a GRANT statement. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum GrantObjects { /// Grant privileges on `ALL SEQUENCES IN SCHEMA [, ...]` AllSequencesInSchema { schemas: Vec }, @@ -3109,7 +3117,7 @@ impl fmt::Display for GrantObjects { /// SQL assignment `foo = expr` as used in SQLUpdate #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct Assignment { pub id: Vec, pub value: Expr, @@ -3123,7 +3131,7 @@ impl fmt::Display for Assignment { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum FunctionArgExpr { Expr(Expr), /// Qualified wildcard, e.g. `alias.*` or `schema.table.*`. @@ -3144,7 +3152,7 @@ impl fmt::Display for FunctionArgExpr { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum FunctionArg { Named { name: Ident, arg: FunctionArgExpr }, Unnamed(FunctionArgExpr), @@ -3161,7 +3169,7 @@ impl fmt::Display for FunctionArg { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CloseCursor { All, Specific { name: Ident }, @@ -3179,7 +3187,7 @@ impl fmt::Display for CloseCursor { /// A function call #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct Function { pub name: ObjectName, pub args: Vec, @@ -3193,7 +3201,7 @@ pub struct Function { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum AnalyzeFormat { TEXT, GRAPHVIZ, @@ -3235,7 +3243,7 @@ impl fmt::Display for Function { /// External table's available file format #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum FileFormat { TEXTFILE, SEQUENCEFILE, @@ -3265,7 +3273,7 @@ impl fmt::Display for FileFormat { /// [ WITHIN GROUP (ORDER BY [, ...] ) ]` #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct ListAgg { pub distinct: bool, pub expr: Box, @@ -3303,7 +3311,7 @@ impl fmt::Display for ListAgg { /// The `ON OVERFLOW` clause of a LISTAGG invocation #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ListAggOnOverflow { /// `ON OVERFLOW ERROR` Error, @@ -3341,7 +3349,7 @@ impl fmt::Display for ListAggOnOverflow { /// ORDER BY position is defined differently for BigQuery, Postgres and Snowflake. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct ArrayAgg { pub distinct: bool, pub expr: Box, @@ -3378,7 +3386,7 @@ impl fmt::Display for ArrayAgg { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ObjectType { Table, View, @@ -3403,7 +3411,7 @@ impl fmt::Display for ObjectType { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum KillType { Connection, Query, @@ -3424,7 +3432,7 @@ impl fmt::Display for KillType { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum HiveDistributionStyle { PARTITIONED { columns: Vec, @@ -3444,7 +3452,7 @@ pub enum HiveDistributionStyle { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum HiveRowFormat { SERDE { class: String }, DELIMITED, @@ -3452,7 +3460,7 @@ pub enum HiveRowFormat { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] #[allow(clippy::large_enum_variant)] pub enum HiveIOFormat { IOF { @@ -3466,7 +3474,7 @@ pub enum HiveIOFormat { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Default)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct HiveFormat { pub row_format: Option, pub storage: Option, @@ -3475,7 +3483,7 @@ pub struct HiveFormat { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct SqlOption { pub name: Ident, pub value: Value, @@ -3489,7 +3497,7 @@ impl fmt::Display for SqlOption { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum TransactionMode { AccessMode(TransactionAccessMode), IsolationLevel(TransactionIsolationLevel), @@ -3507,7 +3515,7 @@ impl fmt::Display for TransactionMode { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum TransactionAccessMode { ReadOnly, ReadWrite, @@ -3525,7 +3533,7 @@ impl fmt::Display for TransactionAccessMode { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum TransactionIsolationLevel { ReadUncommitted, ReadCommitted, @@ -3547,7 +3555,7 @@ impl fmt::Display for TransactionIsolationLevel { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ShowStatementFilter { Like(String), ILike(String), @@ -3571,7 +3579,7 @@ impl fmt::Display for ShowStatementFilter { /// for more details. #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum SqliteOnConflict { Rollback, Abort, @@ -3595,7 +3603,7 @@ impl fmt::Display for SqliteOnConflict { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CopyTarget { Stdin, Stdout, @@ -3627,7 +3635,7 @@ impl fmt::Display for CopyTarget { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum OnCommit { DeleteRows, PreserveRows, @@ -3639,7 +3647,7 @@ pub enum OnCommit { /// #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CopyOption { /// FORMAT format_name Format(Ident), @@ -3693,7 +3701,7 @@ impl fmt::Display for CopyOption { /// #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CopyLegacyOption { /// BINARY Binary, @@ -3722,7 +3730,7 @@ impl fmt::Display for CopyLegacyOption { /// #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CopyLegacyCsvOption { /// HEADER Header, @@ -3754,7 +3762,7 @@ impl fmt::Display for CopyLegacyCsvOption { /// #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum MergeClause { MatchedUpdate { predicate: Option, @@ -3816,7 +3824,7 @@ impl fmt::Display for MergeClause { #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum DiscardObject { ALL, PLANS, @@ -3838,7 +3846,7 @@ impl fmt::Display for DiscardObject { /// Optional context modifier for statements that can be or `LOCAL`, or `SESSION`. #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ContextModifier { /// No context defined. Each dialect defines the default in this scenario. None, @@ -3884,7 +3892,7 @@ impl fmt::Display for DropFunctionOption { /// Function describe in DROP FUNCTION. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct DropFunctionDesc { pub name: ObjectName, pub args: Option>, @@ -3903,7 +3911,7 @@ impl fmt::Display for DropFunctionDesc { /// Function argument in CREATE OR DROP FUNCTION. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct OperateFunctionArg { pub mode: Option, pub name: Option, @@ -3952,7 +3960,7 @@ impl fmt::Display for OperateFunctionArg { /// The mode of an argument in CREATE FUNCTION. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum ArgMode { In, Out, @@ -3972,7 +3980,7 @@ impl fmt::Display for ArgMode { /// These attributes inform the query optimizer about the behavior of the function. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum FunctionBehavior { Immutable, Stable, @@ -3991,7 +3999,7 @@ impl fmt::Display for FunctionBehavior { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum FunctionDefinition { SingleQuotedDef(String), DoubleDollarDef(String), @@ -4013,7 +4021,7 @@ impl fmt::Display for FunctionDefinition { /// for more details #[derive(Debug, Default, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct CreateFunctionBody { /// LANGUAGE lang_name pub language: Option, @@ -4052,7 +4060,7 @@ impl fmt::Display for CreateFunctionBody { #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum CreateFunctionUsing { Jar(String), File(String), @@ -4075,7 +4083,7 @@ impl fmt::Display for CreateFunctionUsing { /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#schema-definition #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum SchemaName { /// Only schema name specified: ``. Simple(ObjectName), @@ -4106,7 +4114,7 @@ impl fmt::Display for SchemaName { /// [1]: https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html#function_match #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum SearchModifier { /// `IN NATURAL LANGUAGE MODE`. InNaturalLanguageMode, diff --git a/src/ast/operator.rs b/src/ast/operator.rs index b8f371be3..ca609941b 100644 --- a/src/ast/operator.rs +++ b/src/ast/operator.rs @@ -19,14 +19,14 @@ use alloc::{string::String, vec::Vec}; use serde::{Deserialize, Serialize}; #[cfg(feature = "visitor")] -use sqlparser_derive::Visit; +use sqlparser_derive::{Visit, VisitMut}; use super::display_separated; /// Unary operators #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum UnaryOperator { Plus, Minus, @@ -64,7 +64,7 @@ impl fmt::Display for UnaryOperator { /// Binary operators #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum BinaryOperator { Plus, Minus, diff --git a/src/ast/query.rs b/src/ast/query.rs index 0a01cf33c..55699f40b 100644 --- a/src/ast/query.rs +++ b/src/ast/query.rs @@ -17,7 +17,7 @@ use alloc::{boxed::Box, vec::Vec}; use serde::{Deserialize, Serialize}; #[cfg(feature = "visitor")] -use sqlparser_derive::Visit; +use sqlparser_derive::{Visit, VisitMut}; use crate::ast::*; @@ -25,7 +25,7 @@ use crate::ast::*; /// including `WITH`, `UNION` / other set operations, and `ORDER BY`. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub struct Query { /// WITH (common table expressions, or CTEs) pub with: Option, @@ -73,7 +73,7 @@ impl fmt::Display for Query { #[allow(clippy::large_enum_variant)] #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "visitor", derive(Visit))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] pub enum SetExpr { /// Restricted SELECT .. FROM .. HAVING (no ORDER BY or set operations) Select(Box