Skip to content

Commit ac6fcab

Browse files
committed
MySQL: Parse bitwise shift left/right operators
According to the [docs], MySQL supports `<<` and `>>` operators. They are currently named `PGBitwiseShiftLeft` and `PGBitwiseShiftRight`, respectively, so the name is a bit misleading, but doesn't see worth changing at the moment. [docs]: https://dev.mysql.com/doc/refman/8.4/en/bit-functions.html
1 parent 4de1ac9 commit ac6fcab

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/parser/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3485,10 +3485,10 @@ impl<'a> Parser<'a> {
34853485
Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
34863486
Some(BinaryOperator::DuckIntegerDivide)
34873487
}
3488-
Token::ShiftLeft if dialect_is!(dialect is PostgreSqlDialect | DuckDbDialect | GenericDialect | RedshiftSqlDialect) => {
3488+
Token::ShiftLeft if dialect_is!(dialect is PostgreSqlDialect | DuckDbDialect | GenericDialect | RedshiftSqlDialect | MySqlDialect) => {
34893489
Some(BinaryOperator::PGBitwiseShiftLeft)
34903490
}
3491-
Token::ShiftRight if dialect_is!(dialect is PostgreSqlDialect | DuckDbDialect | GenericDialect | RedshiftSqlDialect) => {
3491+
Token::ShiftRight if dialect_is!(dialect is PostgreSqlDialect | DuckDbDialect | GenericDialect | RedshiftSqlDialect | MySqlDialect) => {
34923492
Some(BinaryOperator::PGBitwiseShiftRight)
34933493
}
34943494
Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {

tests/sqlparser_mysql.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3765,6 +3765,28 @@ fn parse_logical_xor() {
37653765
);
37663766
}
37673767

3768+
#[test]
3769+
fn parse_bitwise_shift_ops() {
3770+
let sql = "SELECT 1 << 2, 8 >> 3";
3771+
let select = mysql().verified_only_select(sql);
3772+
assert_eq!(
3773+
SelectItem::UnnamedExpr(Expr::BinaryOp {
3774+
left: Box::new(Expr::Value((number("1")).with_empty_span())),
3775+
op: BinaryOperator::PGBitwiseShiftLeft,
3776+
right: Box::new(Expr::Value((number("2")).with_empty_span())),
3777+
}),
3778+
select.projection[0]
3779+
);
3780+
assert_eq!(
3781+
SelectItem::UnnamedExpr(Expr::BinaryOp {
3782+
left: Box::new(Expr::Value((number("8")).with_empty_span())),
3783+
op: BinaryOperator::PGBitwiseShiftRight,
3784+
right: Box::new(Expr::Value((number("3")).with_empty_span())),
3785+
}),
3786+
select.projection[1]
3787+
);
3788+
}
3789+
37683790
#[test]
37693791
fn parse_bitstring_literal() {
37703792
let select = mysql_and_generic().verified_only_select("SELECT B'111'");

0 commit comments

Comments
 (0)