Skip to content

Commit 62baf62

Browse files
SQLite: Support $ inside identifiers
1 parent 0cb62a1 commit 62baf62

2 files changed

Lines changed: 17 additions & 2 deletions

File tree

‎src/dialect/sqlite.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl Dialect for SQLiteDialect {
6363
}
6464

6565
fn is_identifier_part(&self, ch: char) -> bool {
66-
self.is_identifier_start(ch) || ch.is_ascii_digit()
66+
self.is_identifier_start(ch) || ch.is_ascii_digit() || ch == '$'
6767
}
6868

6969
fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {

‎tests/sqlparser_sqlite.rs‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use test_utils::*;
2929
use sqlparser::ast::SelectItem::UnnamedExpr;
3030
use sqlparser::ast::Value::Placeholder;
3131
use sqlparser::ast::*;
32-
use sqlparser::dialect::{GenericDialect, SQLiteDialect};
32+
use sqlparser::dialect::{AnsiDialect, GenericDialect, SQLiteDialect};
3333
use sqlparser::parser::{ParserError, ParserOptions};
3434
use sqlparser::tokenizer::Token;
3535

@@ -971,3 +971,18 @@ fn sqlite_and_generic() -> TestedDialects {
971971
Box::new(GenericDialect {}),
972972
])
973973
}
974+
975+
#[test]
976+
fn test_dollar_sign_in_identifier() {
977+
// SQLite allows $ anywhere after the first character of an identifier
978+
sqlite().verified_stmt("SELECT a$ FROM t");
979+
sqlite().verified_stmt("SELECT 1 AS a$");
980+
sqlite().one_statement_parses_to("CREATE TABLE t(a$ INT)", "CREATE TABLE t (a$ INT)");
981+
sqlite().verified_stmt("INSERT INTO t$ VALUES (1)");
982+
// AS$ is parsed as the alias name
983+
sqlite().one_statement_parses_to("SELECT a AS$", "SELECT a AS AS$");
984+
// Dialects without $ as an identifier character still reject these identifiers
985+
assert!(TestedDialects::new(vec![Box::new(AnsiDialect {})])
986+
.parse_sql_statements("SELECT a$ FROM t")
987+
.is_err());
988+
}

0 commit comments

Comments
 (0)