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 fcc7bce1 Fix MAP literals parsing (#2205)
fcc7bce1 is described below

commit fcc7bce1fa704125eaa9c033d3a022db7d661070
Author: Samyak Sarnayak <[email protected]>
AuthorDate: Sat Feb 7 02:28:29 2026 +0530

    Fix MAP literals parsing (#2205)
---
 src/parser/mod.rs         |  3 ++-
 tests/sqlparser_common.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 585242a8..0b152f2b 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -3510,7 +3510,8 @@ impl<'a> Parser<'a> {
     ///
     /// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
     fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
-        let key = self.parse_expr()?;
+        // Stop before `:` so it can act as a key/value separator
+        let key = 
self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
 
         self.expect_token(&Token::Colon)?;
 
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index b6b86704..3c32e627 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -13584,6 +13584,10 @@ fn test_map_syntax() {
         Expr::value(number(s))
     }
 
+    fn null_expr() -> Expr {
+        Expr::Value((Value::Null).with_empty_span())
+    }
+
     check(
         "MAP {1: 10.0, 2: 20.0}",
         Expr::Map(Map {
@@ -13648,6 +13652,55 @@ fn test_map_syntax() {
     );
 
     check("MAP {}", Expr::Map(Map { entries: vec![] }));
+
+    check(
+        "MAP {'a': 1, 'b': NULL}",
+        Expr::Map(Map {
+            entries: vec![
+                MapEntry {
+                    key: Box::new(Expr::Value(
+                        
(Value::SingleQuotedString("a".to_owned())).with_empty_span(),
+                    )),
+                    value: Box::new(number_expr("1")),
+                },
+                MapEntry {
+                    key: Box::new(Expr::Value(
+                        
(Value::SingleQuotedString("b".to_owned())).with_empty_span(),
+                    )),
+                    value: Box::new(null_expr()),
+                },
+            ],
+        }),
+    );
+
+    check(
+        "MAP {1: [1, NULL, 3], 2: [4, NULL, 6], 3: [7, 8, 9]}",
+        Expr::Map(Map {
+            entries: vec![
+                MapEntry {
+                    key: Box::new(number_expr("1")),
+                    value: Box::new(Expr::Array(Array {
+                        elem: vec![number_expr("1"), null_expr(), 
number_expr("3")],
+                        named: false,
+                    })),
+                },
+                MapEntry {
+                    key: Box::new(number_expr("2")),
+                    value: Box::new(Expr::Array(Array {
+                        elem: vec![number_expr("4"), null_expr(), 
number_expr("6")],
+                        named: false,
+                    })),
+                },
+                MapEntry {
+                    key: Box::new(number_expr("3")),
+                    value: Box::new(Expr::Array(Array {
+                        elem: vec![number_expr("7"), number_expr("8"), 
number_expr("9")],
+                        named: false,
+                    })),
+                },
+            ],
+        }),
+    );
 }
 
 #[test]


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

Reply via email to