Skip to content

Commit

Permalink
Fix identifier starts with $ should be regarded as a placeholder in…
Browse files Browse the repository at this point in the history
… SQLite (#1402)
  • Loading branch information
git-hulk authored Sep 1, 2024
1 parent 7b4ac7c commit df86f25
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
1 change: 0 additions & 1 deletion src/dialect/sqlite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ impl Dialect for SQLiteDialect {
ch.is_ascii_lowercase()
|| ch.is_ascii_uppercase()
|| ch == '_'
|| ch == '$'
|| ('\u{007f}'..='\u{ffff}').contains(&ch)
}

Expand Down
17 changes: 17 additions & 0 deletions tests/sqlparser_sqlite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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 {})],
Expand Down

0 comments on commit df86f25

Please sign in to comment.