File tree Expand file tree Collapse file tree 8 files changed +50
-2
lines changed
Expand file tree Collapse file tree 8 files changed +50
-2
lines changed Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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 {
Original file line number Diff line number Diff 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 ,
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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) => {
Original file line number Diff line number Diff 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]
23732396fn parse_binary_any() {
23742397 let select = verified_only_select("SELECT a = ANY(b)");
You can’t perform that action at this time.
0 commit comments