Skip to content

Commit 3af9988

Browse files
authored
MySQL: Parse bitwise shift left/right operators (#2152)
1 parent ce74e7f commit 3af9988

File tree

8 files changed

+50
-2
lines changed

8 files changed

+50
-2
lines changed

src/dialect/duckdb.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ impl Dialect for DuckDbDialect {
4343
true
4444
}
4545

46+
fn supports_bitwise_shift_operators(&self) -> bool {
47+
true
48+
}
49+
4650
fn supports_named_fn_args_with_eq_operator(&self) -> bool {
4751
true
4852
}

src/dialect/generic.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ impl Dialect for GenericDialect {
132132
true
133133
}
134134

135+
fn supports_bitwise_shift_operators(&self) -> bool {
136+
true
137+
}
138+
135139
fn supports_comment_on(&self) -> bool {
136140
true
137141
}

src/dialect/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,11 @@ pub trait Dialect: Debug + Any {
894894
false
895895
}
896896

897+
/// Returns true if the dialect supports `<<` and `>>` shift operators.
898+
fn supports_bitwise_shift_operators(&self) -> bool {
899+
false
900+
}
901+
897902
/// Returns true if the dialect supports nested comments
898903
/// e.g. `/* /* nested */ */`
899904
fn supports_nested_comments(&self) -> bool {

src/dialect/mysql.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ impl Dialect for MySqlDialect {
8484
true
8585
}
8686

87+
fn supports_bitwise_shift_operators(&self) -> bool {
88+
true
89+
}
90+
8791
fn parse_infix(
8892
&self,
8993
parser: &mut crate::parser::Parser,

src/dialect/postgresql.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ impl Dialect for PostgreSqlDialect {
199199
true
200200
}
201201

202+
fn supports_bitwise_shift_operators(&self) -> bool {
203+
true
204+
}
205+
202206
/// see <https://www.postgresql.org/docs/current/sql-comment.html>
203207
fn supports_comment_on(&self) -> bool {
204208
true

src/dialect/redshift.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ impl Dialect for RedshiftSqlDialect {
120120
true
121121
}
122122

123+
fn supports_bitwise_shift_operators(&self) -> bool {
124+
true
125+
}
126+
123127
fn supports_array_typedef_with_brackets(&self) -> bool {
124128
true
125129
}

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.supports_bitwise_shift_operators() => {
34893489
Some(BinaryOperator::PGBitwiseShiftLeft)
34903490
}
3491-
Token::ShiftRight if dialect_is!(dialect is PostgreSqlDialect | DuckDbDialect | GenericDialect | RedshiftSqlDialect) => {
3491+
Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
34923492
Some(BinaryOperator::PGBitwiseShiftRight)
34933493
}
34943494
Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {

tests/sqlparser_common.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2369,6 +2369,29 @@ fn parse_bitwise_ops() {
23692369
}
23702370
}
23712371

2372+
#[test]
2373+
fn parse_bitwise_shift_ops() {
2374+
let dialects = all_dialects_where(|d| d.supports_bitwise_shift_operators());
2375+
let sql = "SELECT 1 << 2, 3 >> 4";
2376+
let select = dialects.verified_only_select(sql);
2377+
assert_eq!(
2378+
SelectItem::UnnamedExpr(Expr::BinaryOp {
2379+
left: Box::new(Expr::Value((number("1")).with_empty_span())),
2380+
op: BinaryOperator::PGBitwiseShiftLeft,
2381+
right: Box::new(Expr::Value((number("2")).with_empty_span())),
2382+
}),
2383+
select.projection[0]
2384+
);
2385+
assert_eq!(
2386+
SelectItem::UnnamedExpr(Expr::BinaryOp {
2387+
left: Box::new(Expr::Value((number("3")).with_empty_span())),
2388+
op: BinaryOperator::PGBitwiseShiftRight,
2389+
right: Box::new(Expr::Value((number("4")).with_empty_span())),
2390+
}),
2391+
select.projection[1]
2392+
);
2393+
}
2394+
23722395
#[test]
23732396
fn parse_binary_any() {
23742397
let select = verified_only_select("SELECT a = ANY(b)");

0 commit comments

Comments
 (0)