Parse byte/bit string literals in MySQL and Postgres (#1532)

This commit is contained in:
Michael Victor Zink 2024-11-19 21:55:38 -08:00 committed by GitHub
parent 73947a5f02
commit fad2ddd641
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 25 additions and 2 deletions

View file

@ -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('\'') => {

View file

@ -2960,3 +2960,14 @@ fn parse_logical_xor() {
select.projection[3]
);
}
#[test]
fn parse_bitstring_literal() {
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())
))]
);
}

View file

@ -5098,3 +5098,14 @@ fn parse_create_type_as_enum() {
_ => unreachable!(),
}
}
#[test]
fn parse_bitstring_literal() {
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())
))]
);
}