Fix identifier starts with $ should be regarded as a placeholder in SQLite (#1402)

This commit is contained in:
hulk 2024-09-01 19:21:59 +08:00 committed by GitHub
parent 7b4ac7ca9f
commit df86f259ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 1 deletions

View file

@ -41,7 +41,6 @@ impl Dialect for SQLiteDialect {
ch.is_ascii_lowercase()
|| ch.is_ascii_uppercase()
|| ch == '_'
|| ch == '$'
|| ('\u{007f}'..='\u{ffff}').contains(&ch)
}

View file

@ -20,6 +20,7 @@ mod test_utils;
use test_utils::*;
use sqlparser::ast::SelectItem::UnnamedExpr;
use sqlparser::ast::Value::Placeholder;
use sqlparser::ast::*;
use sqlparser::dialect::{GenericDialect, SQLiteDialect};
use sqlparser::parser::{ParserError, ParserOptions};
@ -470,6 +471,22 @@ fn parse_start_transaction_with_modifier() {
);
}
#[test]
fn test_dollar_identifier_as_placeholder() {
// This relates to the discussion in issue #291. The `$id` should be treated as a placeholder,
// not as an identifier in SQLite dialect.
//
// Reference: https://www.sqlite.org/lang_expr.html#varparam
match sqlite().verified_expr("id = $id") {
Expr::BinaryOp { op, left, right } => {
assert_eq!(op, BinaryOperator::Eq);
assert_eq!(left, Box::new(Expr::Identifier(Ident::new("id"))));
assert_eq!(right, Box::new(Expr::Value(Placeholder("$id".to_string()))));
}
_ => unreachable!(),
}
}
fn sqlite() -> TestedDialects {
TestedDialects {
dialects: vec![Box::new(SQLiteDialect {})],