Skip to content

Commit 03bfb07

Browse files
yoavcloudayman-sigma
authored andcommitted
Parse casting to array using double colon operator in Redshift (apache#1737)
1 parent 01570d5 commit 03bfb07

File tree

7 files changed

+21
-8
lines changed

7 files changed

+21
-8
lines changed

src/dialect/duckdb.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ impl Dialect for DuckDbDialect {
8282
}
8383

8484
// See DuckDB <https://duckdb.org/docs/sql/data_types/array.html#defining-an-array-field>
85-
fn supports_array_typedef_size(&self) -> bool {
85+
fn supports_array_typedef_with_brackets(&self) -> bool {
8686
true
8787
}
8888

src/dialect/generic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl Dialect for GenericDialect {
148148
true
149149
}
150150

151-
fn supports_array_typedef_size(&self) -> bool {
151+
fn supports_array_typedef_with_brackets(&self) -> bool {
152152
true
153153
}
154154

src/dialect/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -931,9 +931,11 @@ pub trait Dialect: Debug + Any {
931931
false
932932
}
933933

934-
/// Returns true if the dialect supports size definition for array types.
935-
/// For example: ```CREATE TABLE my_table (my_array INT[3])```.
936-
fn supports_array_typedef_size(&self) -> bool {
934+
/// Returns true if the dialect supports array type definition with brackets with
935+
/// an optional size. For example:
936+
/// ```CREATE TABLE my_table (arr1 INT[], arr2 INT[3])```
937+
/// ```SELECT x::INT[]```
938+
fn supports_array_typedef_with_brackets(&self) -> bool {
937939
false
938940
}
939941
/// Returns true if the dialect supports geometric types.

src/dialect/postgresql.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ impl Dialect for PostgreSqlDialect {
247247
}
248248

249249
/// See: <https://www.postgresql.org/docs/current/arrays.html#ARRAYS-DECLARATION>
250-
fn supports_array_typedef_size(&self) -> bool {
250+
fn supports_array_typedef_with_brackets(&self) -> bool {
251251
true
252252
}
253253

src/dialect/redshift.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,8 @@ impl Dialect for RedshiftSqlDialect {
117117
fn supports_geometric_types(&self) -> bool {
118118
true
119119
}
120+
121+
fn supports_array_typedef_with_brackets(&self) -> bool {
122+
true
123+
}
120124
}

src/parser/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9133,9 +9133,9 @@ impl<'a> Parser<'a> {
91339133
_ => self.expected_at("a data type name", next_token_index),
91349134
}?;
91359135

9136-
if self.dialect.supports_array_typedef_size() {
9137-
// Parse array data type size
9136+
if self.dialect.supports_array_typedef_with_brackets() {
91389137
while self.consume_token(&Token::LBracket) {
9138+
// Parse optional array data type size
91399139
let size = self.maybe_parse(|p| p.parse_literal_uint())?;
91409140
self.expect_token(&Token::RBracket)?;
91419141
data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))

tests/sqlparser_common.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14389,3 +14389,10 @@ fn test_geometric_binary_operators() {
1438914389
}
1439014390
));
1439114391
}
14392+
14393+
#[test]
14394+
fn parse_array_type_def_with_brackets() {
14395+
let dialects = all_dialects_where(|d| d.supports_array_typedef_with_brackets());
14396+
dialects.verified_stmt("SELECT x::INT[]");
14397+
dialects.verified_stmt("SELECT STRING_TO_ARRAY('1,2,3', ',')::INT[3]");
14398+
}

0 commit comments

Comments
 (0)