Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/tokenizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -704,8 +704,9 @@ impl<'a> Tokenizer<'a> {
}
Ok(Some(Token::Whitespace(Whitespace::Newline)))
}
// BigQuery uses b or B for byte string literal
b @ 'B' | b @ 'b' if dialect_of!(self is BigQueryDialect | GenericDialect) => {
// BigQuery and MySQL use b or B for byte string literal, Postgres for bit strings
b @ 'B' | b @ 'b' if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | MySqlDialect | GenericDialect) =>
{
chars.next(); // consume
match chars.peek() {
Some('\'') => {
Expand Down
31 changes: 31 additions & 0 deletions tests/sqlparser_mysql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2960,3 +2960,34 @@ fn parse_logical_xor() {
select.projection[3]
);
}

#[test]
fn parse_bitstring_literal_in_projection_is_not_alias() {
let select = mysql_and_generic().verified_only_select("SELECT B'111'");
assert_eq!(
select.projection,
vec![SelectItem::UnnamedExpr(Expr::Value(
Value::SingleQuotedByteStringLiteral("111".to_string())
))]
);
}

#[test]
fn parse_bitstring_literal_in_insert_value_succeeds() {
let stmt = mysql_and_generic().verified_stmt("INSERT INTO foo VALUES (B'111')");
match &stmt {
Statement::Insert(Insert {
source: Some(query),
..
}) => assert_eq!(
*query.body,
SetExpr::Values(Values {
explicit_row: false,
rows: vec![vec![Expr::Value(Value::SingleQuotedByteStringLiteral(
"111".to_string()
))]]
})
),
_ => unreachable!(),
}
}
31 changes: 31 additions & 0 deletions tests/sqlparser_postgres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5098,3 +5098,34 @@ fn parse_create_type_as_enum() {
_ => unreachable!(),
}
}

#[test]
fn parse_bitstring_literal_in_projection_is_not_alias() {
let select = pg_and_generic().verified_only_select("SELECT B'111'");
assert_eq!(
select.projection,
vec![SelectItem::UnnamedExpr(Expr::Value(
Value::SingleQuotedByteStringLiteral("111".to_string())
))]
);
}

#[test]
fn parse_bitstring_literal_in_insert_value_succeeds() {
let stmt = pg_and_generic().verified_stmt("INSERT INTO foo VALUES (B'111')");
match &stmt {
Statement::Insert(Insert {
source: Some(query),
..
}) => assert_eq!(
*query.body,
SetExpr::Values(Values {
explicit_row: false,
rows: vec![vec![Expr::Value(Value::SingleQuotedByteStringLiteral(
"111".to_string()
))]]
})
),
_ => unreachable!(),
}
}