File tree Expand file tree Collapse file tree 6 files changed +53
-10
lines changed Expand file tree Collapse file tree 6 files changed +53
-10
lines changed Original file line number Diff line number Diff line change @@ -80,4 +80,9 @@ impl Dialect for DuckDbDialect {
80
80
fn supports_load_extension ( & self ) -> bool {
81
81
true
82
82
}
83
+
84
+ // See DuckDB <https://duckdb.org/docs/sql/data_types/array.html#defining-an-array-field>
85
+ fn supports_array_typedef_size ( & self ) -> bool {
86
+ true
87
+ }
83
88
}
Original file line number Diff line number Diff line change @@ -143,4 +143,8 @@ impl Dialect for GenericDialect {
143
143
fn supports_string_escape_constant ( & self ) -> bool {
144
144
true
145
145
}
146
+
147
+ fn supports_array_typedef_size ( & self ) -> bool {
148
+ true
149
+ }
146
150
}
Original file line number Diff line number Diff line change @@ -890,6 +890,12 @@ pub trait Dialect: Debug + Any {
890
890
fn requires_single_line_comment_whitespace ( & self ) -> bool {
891
891
false
892
892
}
893
+
894
+ /// Returns true if the dialect supports size definition for array types.
895
+ /// For example: ```CREATE TABLE my_table (my_array INT[3])```.
896
+ fn supports_array_typedef_size ( & self ) -> bool {
897
+ false
898
+ }
893
899
}
894
900
895
901
/// This represents the operators for which precedence must be defined
Original file line number Diff line number Diff line change @@ -253,6 +253,11 @@ impl Dialect for PostgreSqlDialect {
253
253
fn supports_numeric_literal_underscores ( & self ) -> bool {
254
254
true
255
255
}
256
+
257
+ /// See: <https://www.postgresql.org/docs/current/arrays.html#ARRAYS-DECLARATION>
258
+ fn supports_array_typedef_size ( & self ) -> bool {
259
+ true
260
+ }
256
261
}
257
262
258
263
pub fn parse_create ( parser : & mut Parser ) -> Option < Result < Statement , ParserError > > {
Original file line number Diff line number Diff line change @@ -8943,16 +8943,13 @@ impl<'a> Parser<'a> {
8943
8943
_ => self.expected_at("a data type name", next_token_index),
8944
8944
}?;
8945
8945
8946
- // Parse array data types. Note: this is postgresql-specific and different from
8947
- // Keyword::ARRAY syntax from above
8948
- while self.consume_token(&Token::LBracket) {
8949
- let size = if dialect_of!(self is GenericDialect | DuckDbDialect | PostgreSqlDialect) {
8950
- self.maybe_parse(|p| p.parse_literal_uint())?
8951
- } else {
8952
- None
8953
- };
8954
- self.expect_token(&Token::RBracket)?;
8955
- data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
8946
+ if self.dialect.supports_array_typedef_size() {
8947
+ // Parse array data type size
8948
+ while self.consume_token(&Token::LBracket) {
8949
+ let size = self.maybe_parse(|p| p.parse_literal_uint())?;
8950
+ self.expect_token(&Token::RBracket)?;
8951
+ data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
8952
+ }
8956
8953
}
8957
8954
Ok((data, trailing_bracket))
8958
8955
}
Original file line number Diff line number Diff line change @@ -1256,6 +1256,32 @@ fn parse_semi_structured_data_traversal() {
1256
1256
. to_string( ) ,
1257
1257
"sql parser error: Expected: variant object key name, found: 42"
1258
1258
) ;
1259
+
1260
+ // casting a json access and accessing an array element
1261
+ assert_eq ! (
1262
+ snowflake( ) . verified_expr( "a:b::ARRAY[1]" ) ,
1263
+ Expr :: JsonAccess {
1264
+ value: Box :: new( Expr :: Cast {
1265
+ kind: CastKind :: DoubleColon ,
1266
+ data_type: DataType :: Array ( ArrayElemTypeDef :: None ) ,
1267
+ format: None ,
1268
+ expr: Box :: new( Expr :: JsonAccess {
1269
+ value: Box :: new( Expr :: Identifier ( Ident :: new( "a" ) ) ) ,
1270
+ path: JsonPath {
1271
+ path: vec![ JsonPathElem :: Dot {
1272
+ key: "b" . to_string( ) ,
1273
+ quoted: false
1274
+ } ]
1275
+ }
1276
+ } )
1277
+ } ) ,
1278
+ path: JsonPath {
1279
+ path: vec![ JsonPathElem :: Bracket {
1280
+ key: Expr :: Value ( number( "1" ) )
1281
+ } ]
1282
+ }
1283
+ }
1284
+ ) ;
1259
1285
}
1260
1286
1261
1287
#[ test]
You can’t perform that action at this time.
0 commit comments