whirlun commented on code in PR #2272:
URL: 
https://github.com/apache/datafusion-sqlparser-rs/pull/2272#discussion_r2907835788


##########
tests/sqlparser_databricks.rs:
##########
@@ -600,3 +600,150 @@ fn parse_databricks_struct_type() {
         _ => unreachable!(),
     }
 }
+
+// https://docs.databricks.com/en/sql/language-manual/functions/colonsign.html
+#[test]
+fn parse_databricks_json_accessor() {
+    // Basic colon accessor — unquoted field names are case-insensitive
+    databricks().verified_only_select("SELECT raw:owner, RAW:owner FROM 
store_data");
+
+    // Unquoted field access is case-insensitive; bracket notation is 
case-sensitive.
+    databricks().verified_only_select(
+        "SELECT raw:OWNER AS case_insensitive, raw:['OWNER'] AS case_sensitive 
FROM store_data",
+    );
+
+    // Backtick-quoted keys (Databricks delimited identifiers) normalise to 
double-quoted output.
+    databricks().one_statement_parses_to(
+        "SELECT raw:`zip code`, raw:`Zip Code`, raw:['fb:testid'] FROM 
store_data",
+        r#"SELECT raw:"zip code", raw:"Zip Code", raw:['fb:testid'] FROM 
store_data"#,
+    );
+
+    // Dot notation
+    databricks().verified_only_select("SELECT raw:store.bicycle FROM 
store_data");
+
+    // String-key bracket notation after a dot segment
+    databricks()
+        .verified_only_select("SELECT raw:store['bicycle'], 
raw:store['BICYCLE'] FROM store_data");
+
+    // Integer-index bracket notation
+    databricks()
+        .verified_only_select("SELECT raw:store.fruit[0], raw:store.fruit[1] 
FROM store_data");
+
+    // Wildcard [*] — including chained and mixed positions
+    databricks().verified_only_select(
+        "SELECT raw:store.basket[*], raw:store.basket[*][0] AS 
first_of_baskets, \
+         raw:store.basket[0][*] AS first_basket, raw:store.basket[*][*] AS 
all_elements_flattened, \
+         raw:store.basket[0][2].b AS subfield FROM store_data",
+    );
+
+    // Dot access following a wildcard bracket
+    databricks().verified_only_select("SELECT raw:store.book[*].isbn FROM 
store_data");
+
+    // Double-colon cast — type keyword normalises to upper case
+    databricks().one_statement_parses_to(
+        "SELECT raw:store.bicycle.price::double FROM store_data",
+        "SELECT raw:store.bicycle.price::DOUBLE FROM store_data",
+    );
+
+    // --- AST structure assertions ---
+
+    // Simple dot access
+    assert_eq!(
+        databricks().verified_expr("raw:owner"),
+        Expr::JsonAccess {
+            value: Box::new(Expr::Identifier(Ident::new("raw"))),
+            path: JsonPath {
+                path: vec![JsonPathElem::Dot {
+                    key: "owner".to_owned(),
+                    quoted: false,
+                }],
+            },
+        }
+    );
+
+    // Multi-level dot access
+    assert_eq!(
+        databricks().verified_expr("raw:store.bicycle"),
+        Expr::JsonAccess {
+            value: Box::new(Expr::Identifier(Ident::new("raw"))),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Dot {
+                        key: "store".to_owned(),
+                        quoted: false,
+                    },
+                    JsonPathElem::Dot {
+                        key: "bicycle".to_owned(),
+                        quoted: false,
+                    },
+                ],
+            },
+        }
+    );
+
+    // Dot path followed by an integer-index bracket
+    assert_eq!(
+        databricks().verified_expr("raw:store.fruit[0]"),
+        Expr::JsonAccess {
+            value: Box::new(Expr::Identifier(Ident::new("raw"))),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Dot {
+                        key: "store".to_owned(),
+                        quoted: false,
+                    },
+                    JsonPathElem::Dot {
+                        key: "fruit".to_owned(),
+                        quoted: false,
+                    },
+                    JsonPathElem::Bracket {
+                        key: Expr::value(number("0")),
+                    },
+                ],
+            },
+        }
+    );
+
+    // [*] is stored as Expr::Wildcard inside a Bracket element
+    assert_eq!(
+        databricks().verified_expr("raw:store.basket[*]"),
+        Expr::JsonAccess {
+            value: Box::new(Expr::Identifier(Ident::new("raw"))),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Dot {
+                        key: "store".to_owned(),
+                        quoted: false,
+                    },
+                    JsonPathElem::Dot {
+                        key: "basket".to_owned(),
+                        quoted: false,
+                    },
+                    JsonPathElem::Bracket {
+                        key: Expr::Wildcard(AttachedToken::empty()),
+                    },
+                ],
+            },
+        }
+    );
+
+    // raw:['OWNER'] — bracket directly after the colon. An empty-key sentinel 
Dot is prepended
+    // so that the display re-emits the leading `:`, enabling a correct 
round-trip.
+    assert_eq!(
+        databricks().verified_expr("raw:['OWNER']"),
+        Expr::JsonAccess {
+            value: Box::new(Expr::Identifier(Ident::new("raw"))),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Dot {
+                        key: String::new(),
+                        quoted: false,
+                    },
+                    JsonPathElem::Bracket {
+                        key: 
Expr::value(Value::SingleQuotedString("OWNER".to_owned())),
+                    },
+                ],
+            },
+        }
+    );

Review Comment:
   Removed AST tests.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to