This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new 6daa46db MySQL: Add support for casting using the BINARY keyword 
(#2146)
6daa46db is described below

commit 6daa46db7e595b585bed8ae35fbceefa3448e596
Author: Yoav Cohen <[email protected]>
AuthorDate: Wed Jan 14 12:41:05 2026 +0100

    MySQL: Add support for casting using the BINARY keyword (#2146)
---
 src/dialect/mod.rs        | 6 ++++++
 src/dialect/mysql.rs      | 6 ++++++
 src/parser/mod.rs         | 9 +++++++++
 tests/sqlparser_common.rs | 6 ++++++
 4 files changed, 27 insertions(+)

diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs
index 9e6c1859..873108ee 100644
--- a/src/dialect/mod.rs
+++ b/src/dialect/mod.rs
@@ -1237,6 +1237,12 @@ pub trait Dialect: Debug + Any {
     fn supports_double_ampersand_operator(&self) -> bool {
         false
     }
+
+    /// Returns true if the dialect supports casting an expression to a binary 
type
+    /// using the `BINARY <expr>` syntax.
+    fn supports_binary_kw_as_cast(&self) -> bool {
+        false
+    }
 }
 
 /// Operators for which precedence must be defined.
diff --git a/src/dialect/mysql.rs b/src/dialect/mysql.rs
index 60385c5b..81aa9d44 100644
--- a/src/dialect/mysql.rs
+++ b/src/dialect/mysql.rs
@@ -176,6 +176,12 @@ impl Dialect for MySqlDialect {
     fn supports_double_ampersand_operator(&self) -> bool {
         true
     }
+
+    /// Deprecated functionality by MySQL but still supported
+    /// See: 
<https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html#operator_binary>
+    fn supports_binary_kw_as_cast(&self) -> bool {
+        true
+    }
 }
 
 /// `LOCK TABLES`
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 64b65391..4cee5c33 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -1645,6 +1645,15 @@ impl<'a> Parser<'a> {
                 // an unary negation `NOT ('a' LIKE 'b')`. To solve this, we 
don't accept the
                 // `type 'string'` syntax for the custom data types at all.
                 DataType::Custom(..) => parser_err!("dummy", loc),
+                // MySQL supports using the `BINARY` keyword as a cast to 
binary type.
+                DataType::Binary(..) if 
self.dialect.supports_binary_kw_as_cast() => {
+                    Ok(Expr::Cast {
+                        kind: CastKind::Cast,
+                        expr: Box::new(parser.parse_expr()?),
+                        data_type: DataType::Binary(None),
+                        format: None,
+                    })
+                }
                 data_type => Ok(Expr::TypedString(TypedString {
                     data_type,
                     value: parser.parse_value()?,
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index c7a1981e..95ad9a20 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -18061,3 +18061,9 @@ fn test_parse_key_value_options_trailing_semicolon() {
         "CREATE USER u1 option1='value1' option2='value2'",
     );
 }
+
+#[test]
+fn test_binary_kw_as_cast() {
+    all_dialects_where(|d| d.supports_binary_kw_as_cast())
+        .one_statement_parses_to("SELECT BINARY 1+1", "SELECT CAST(1 + 1 AS 
BINARY)");
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to