From 01e4ecf6c171450945a2d293ceb904acf45cf755 Mon Sep 17 00:00:00 2001 From: Yoav Cohen Date: Mon, 29 Dec 2025 18:16:36 +0100 Subject: [PATCH 1/2] MySQL: Add support for && as boolean AND --- src/dialect/mod.rs | 5 +++++ src/dialect/mysql.rs | 5 +++++ src/parser/mod.rs | 3 +++ tests/sqlparser_common.rs | 6 ++++++ 4 files changed, 19 insertions(+) diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs index 0b6212974..92f2531f7 100644 --- a/src/dialect/mod.rs +++ b/src/dialect/mod.rs @@ -1221,6 +1221,11 @@ pub trait Dialect: Debug + Any { fn supports_quote_delimited_string(&self) -> bool { false } + + /// Returns true if the dialect considers the `&&` operator as a boolean AND operator. + fn supports_overlap_as_and_operator(&self) -> bool { + false + } } /// This represents the operators for which precedence must be defined diff --git a/src/dialect/mysql.rs b/src/dialect/mysql.rs index 53a30f184..8e3ef3717 100644 --- a/src/dialect/mysql.rs +++ b/src/dialect/mysql.rs @@ -171,6 +171,11 @@ impl Dialect for MySqlDialect { fn supports_cross_join_constraint(&self) -> bool { true } + + /// See: + fn supports_overlap_as_and_operator(&self) -> bool { + true + } } /// `LOCK TABLES` diff --git a/src/parser/mod.rs b/src/parser/mod.rs index e436a7afc..5b4dbcd73 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -3500,6 +3500,9 @@ impl<'a> Parser<'a> { Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => { Some(BinaryOperator::PGOverlap) } + Token::Overlap if dialect.supports_overlap_as_and_operator() => { + Some(BinaryOperator::And) + } Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => { Some(BinaryOperator::PGStartsWith) } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index d3f85affa..7d8e92764 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -18037,3 +18037,9 @@ fn parse_select_parenthesized_wildcard() { assert_eq!(select2.projection.len(), 1); assert!(matches!(select2.projection[0], SelectItem::Wildcard(_))); } + +#[test] +fn parse_overlap_as_bool_and() { + let dialects = all_dialects_where(|d| d.supports_overlap_as_and_operator()); + dialects.one_statement_parses_to("SELECT x && y", "SELECT x AND y"); +} From 691bb83d4c73e5b35ebd0e8f8d89a1f2d4157a19 Mon Sep 17 00:00:00 2001 From: Yoav Cohen Date: Fri, 9 Jan 2026 11:42:57 +0100 Subject: [PATCH 2/2] Rename dialect function --- src/dialect/mod.rs | 2 +- src/dialect/mysql.rs | 2 +- src/parser/mod.rs | 2 +- tests/sqlparser_common.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs index 92f2531f7..4c7173d54 100644 --- a/src/dialect/mod.rs +++ b/src/dialect/mod.rs @@ -1223,7 +1223,7 @@ pub trait Dialect: Debug + Any { } /// Returns true if the dialect considers the `&&` operator as a boolean AND operator. - fn supports_overlap_as_and_operator(&self) -> bool { + fn supports_double_ampersand_operator(&self) -> bool { false } } diff --git a/src/dialect/mysql.rs b/src/dialect/mysql.rs index 8e3ef3717..60385c5bc 100644 --- a/src/dialect/mysql.rs +++ b/src/dialect/mysql.rs @@ -173,7 +173,7 @@ impl Dialect for MySqlDialect { } /// See: - fn supports_overlap_as_and_operator(&self) -> bool { + fn supports_double_ampersand_operator(&self) -> bool { true } } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 5b4dbcd73..08ce9f1cc 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -3500,7 +3500,7 @@ impl<'a> Parser<'a> { Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => { Some(BinaryOperator::PGOverlap) } - Token::Overlap if dialect.supports_overlap_as_and_operator() => { + Token::Overlap if dialect.supports_double_ampersand_operator() => { Some(BinaryOperator::And) } Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 7d8e92764..dd95315b7 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -18040,6 +18040,6 @@ fn parse_select_parenthesized_wildcard() { #[test] fn parse_overlap_as_bool_and() { - let dialects = all_dialects_where(|d| d.supports_overlap_as_and_operator()); + let dialects = all_dialects_where(|d| d.supports_double_ampersand_operator()); dialects.one_statement_parses_to("SELECT x && y", "SELECT x AND y"); }