@@ -23,15 +23,15 @@ use std::collections::HashSet;
2323use syn:: {
2424 braced,
2525 parse:: { Parse , ParseStream } ,
26- Error , File , FnArg , Ident , Item , LitBool , LitChar , Pat , ReceiverKind , ReturnType , Signature ,
27- Token , TraitItem , Type ,
26+ Error , Expr , File , FnArg , Ident , Item , LitBool , LitChar , Pat , ReceiverKind , ReturnType ,
27+ Signature , Token , TraitItem , Type ,
2828} ;
2929
3030/// Override value types supported by the macro
3131pub ( crate ) enum Override {
3232 Bool ( LitBool ) ,
3333 Char ( LitChar ) ,
34- None ,
34+ Expr ( Expr ) ,
3535}
3636
3737/// Parsed input for the `derive_dialect!` macro
@@ -80,20 +80,8 @@ impl Parse for DeriveDialectInput {
8080 Override :: Bool ( content. parse ( ) ?)
8181 } else if content. peek ( LitChar ) {
8282 Override :: Char ( content. parse ( ) ?)
83- } else if content. peek ( Ident ) {
84- let ident: Ident = content. parse ( ) ?;
85- if ident == "None" {
86- Override :: None
87- } else {
88- return Err ( Error :: new (
89- ident. span ( ) ,
90- format ! ( "Expected `true`, `false`, a char, or `None`, found `{ident}`" ) ,
91- ) ) ;
92- }
9383 } else {
94- return Err (
95- content. error ( "Expected `true`, `false`, a char, or `None`" )
96- ) ;
84+ Override :: Expr ( content. parse ( ) ?)
9785 } ;
9886 overrides. push ( ( key, value) ) ;
9987 if content. peek ( Token ! [ , ] ) {
@@ -136,24 +124,31 @@ fn derive_dialect_inner(input: DeriveDialectInput) -> syn::Result<TokenStream> {
136124 let methods = extract_dialect_methods ( & file) ?;
137125
138126 // Validate overrides
127+ let method_names: HashSet < _ > = methods. iter ( ) . map ( |m| m. name . to_string ( ) ) . collect ( ) ;
139128 let bool_names: HashSet < _ > = methods
140129 . iter ( )
141130 . filter ( |m| is_bool_method ( & m. signature ) )
142131 . map ( |m| m. name . to_string ( ) )
143132 . collect ( ) ;
144133 for ( key, value) in & input. overrides {
145134 let key_str = key. to_string ( ) ;
135+ if !method_names. contains ( & key_str) {
136+ return Err ( Error :: new (
137+ key. span ( ) ,
138+ format ! ( "Unknown method `{key_str}`" ) ,
139+ ) ) ;
140+ }
146141 match value {
147142 Override :: Bool ( _) if !bool_names. contains ( & key_str) => {
148143 return Err ( Error :: new (
149144 key. span ( ) ,
150145 format ! ( "Unknown boolean method `{key_str}`" ) ,
151146 ) ) ;
152147 }
153- Override :: Char ( _) | Override :: None if key_str != "identifier_quote_style" => {
148+ Override :: Char ( _) if key_str != "identifier_quote_style" => {
154149 return Err ( Error :: new (
155150 key. span ( ) ,
156- format ! ( "Char/None only valid for `identifier_quote_style`, not `{key_str}`" ) ,
151+ format ! ( "Char only valid for `identifier_quote_style`, not `{key_str}`" ) ,
157152 ) ) ;
158153 }
159154 _ => { }
@@ -214,10 +209,9 @@ fn generate_derived_dialect(input: &DeriveDialectInput, methods: &[DialectMethod
214209 fn identifier_quote_style( & self , _: & str ) -> Option <char > { Some ( #c) }
215210 }
216211 }
217- Some ( Override :: None ) => {
218- quote_spanned ! { method_name. span( ) =>
219- fn identifier_quote_style( & self , _: & str ) -> Option <char > { None }
220- }
212+ Some ( Override :: Expr ( expr) ) => {
213+ let sig = & method. signature ;
214+ quote_spanned ! { method_name. span( ) => #sig { #expr } }
221215 }
222216 None => delegate ( method) ,
223217 }
@@ -230,7 +224,7 @@ fn generate_derived_dialect(input: &DeriveDialectInput, methods: &[DialectMethod
230224 use :: core:: iter:: Peekable ;
231225 use :: core:: str :: Chars ;
232226 use sqlparser:: ast:: { ColumnOption , Expr , GranteesType , Ident , ObjectNamePart , Statement } ;
233- use sqlparser:: dialect:: { Dialect , Precedence } ;
227+ use sqlparser:: dialect:: { BindPlaceholderStyle , Dialect , Precedence } ;
234228 use sqlparser:: keywords:: Keyword ;
235229 use sqlparser:: parser:: { Parser , ParserError } ;
236230
0 commit comments