Skip to content

Commit 03ddbaf

Browse files
Fix literal-leading dialect override expressions
1 parent 681b993 commit 03ddbaf

3 files changed

Lines changed: 39 additions & 7 deletions

File tree

‎derive/src/dialect.rs‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,16 @@ impl Parse for DeriveDialectInput {
7676
while !content.is_empty() {
7777
let key: Ident = content.parse()?;
7878
content.parse::<Token![=]>()?;
79-
let value = if content.peek(LitBool) {
80-
Override::Bool(content.parse()?)
81-
} else if content.peek(LitChar) {
82-
Override::Char(content.parse()?)
83-
} else {
84-
Override::Expr(content.parse()?)
79+
let value = match content.parse::<Expr>()? {
80+
Expr::Lit(syn::ExprLit {
81+
lit: syn::Lit::Bool(value),
82+
..
83+
}) => Override::Bool(value),
84+
Expr::Lit(syn::ExprLit {
85+
lit: syn::Lit::Char(value),
86+
..
87+
}) => Override::Char(value),
88+
expr => Override::Expr(expr),
8589
};
8690
overrides.push((key, value));
8791
if content.peek(Token![,]) {

‎src/dialect/mod.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ pub use self::teradata::TeradataDialect;
117117
/// use sqlparser::dialect::{BindPlaceholderStyle, Dialect, GenericDialect};
118118
///
119119
/// derive_dialect!(DollarBindDialect, GenericDialect,
120-
/// overrides = { ordered_bind_placeholder_style = Some(BindPlaceholderStyle::DollarNumbered) }
120+
/// overrides = {
121+
/// ordered_bind_placeholder_style = true.then_some(BindPlaceholderStyle::DollarNumbered)
122+
/// }
121123
/// );
122124
/// let d: &dyn Dialect = &DollarBindDialect::new();
123125
/// assert_eq!(

‎tests/sqlparser_derive_dialect.rs‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,29 @@ fn test_lambda_keyword_syntax_with_json_arrow_operator() {
194194
};
195195
assert_eq!(&BinaryOperator::Arrow, op);
196196
}
197+
198+
#[test]
199+
fn test_literal_leading_char_expression_override() {
200+
derive_dialect!(LiteralExpressionDialect, GenericDialect, overrides = {
201+
is_identifier_start = '_' == ch || ch.is_ascii_alphabetic(),
202+
});
203+
let dialect = LiteralExpressionDialect::new();
204+
205+
assert!(dialect.is_identifier_start('_'));
206+
assert!(dialect.is_identifier_start('a'));
207+
assert!(!dialect.is_identifier_start('1'));
208+
}
209+
210+
#[test]
211+
fn test_literal_leading_bool_expression_override() {
212+
derive_dialect!(LiteralExpressionDialect, GenericDialect, overrides = {
213+
ordered_bind_placeholder_style =
214+
true.then_some(sqlparser::dialect::BindPlaceholderStyle::DollarNumbered),
215+
});
216+
let dialect = LiteralExpressionDialect::new();
217+
218+
assert_eq!(
219+
dialect.ordered_bind_placeholder_style(),
220+
Some(sqlparser::dialect::BindPlaceholderStyle::DollarNumbered)
221+
);
222+
}

0 commit comments

Comments
 (0)