Skip to content

Commit

Permalink
Parse casting to array using double colon operator in Redshift (#1737)
Browse files Browse the repository at this point in the history
  • Loading branch information
yoavcloud authored Feb 22, 2025
1 parent 1f1c069 commit 7fc37a7
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/dialect/duckdb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ impl Dialect for DuckDbDialect {
}

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

Expand Down
2 changes: 1 addition & 1 deletion src/dialect/generic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ impl Dialect for GenericDialect {
true
}

fn supports_array_typedef_size(&self) -> bool {
fn supports_array_typedef_with_brackets(&self) -> bool {
true
}

Expand Down
8 changes: 5 additions & 3 deletions src/dialect/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -931,9 +931,11 @@ pub trait Dialect: Debug + Any {
false
}

/// Returns true if the dialect supports size definition for array types.
/// For example: ```CREATE TABLE my_table (my_array INT[3])```.
fn supports_array_typedef_size(&self) -> bool {
/// Returns true if the dialect supports array type definition with brackets with
/// an optional size. For example:
/// ```CREATE TABLE my_table (arr1 INT[], arr2 INT[3])```
/// ```SELECT x::INT[]```
fn supports_array_typedef_with_brackets(&self) -> bool {
false
}
/// Returns true if the dialect supports geometric types.
Expand Down
2 changes: 1 addition & 1 deletion src/dialect/postgresql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ impl Dialect for PostgreSqlDialect {
}

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

Expand Down
4 changes: 4 additions & 0 deletions src/dialect/redshift.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,8 @@ impl Dialect for RedshiftSqlDialect {
fn supports_geometric_types(&self) -> bool {
true
}

fn supports_array_typedef_with_brackets(&self) -> bool {
true
}
}
4 changes: 2 additions & 2 deletions src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9123,9 +9123,9 @@ impl<'a> Parser<'a> {
_ => self.expected_at("a data type name", next_token_index),
}?;

if self.dialect.supports_array_typedef_size() {
// Parse array data type size
if self.dialect.supports_array_typedef_with_brackets() {
while self.consume_token(&Token::LBracket) {
// Parse optional array data type size
let size = self.maybe_parse(|p| p.parse_literal_uint())?;
self.expect_token(&Token::RBracket)?;
data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
Expand Down
7 changes: 7 additions & 0 deletions tests/sqlparser_common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14386,3 +14386,10 @@ fn test_geometric_binary_operators() {
}
));
}

#[test]
fn parse_array_type_def_with_brackets() {
let dialects = all_dialects_where(|d| d.supports_array_typedef_with_brackets());
dialects.verified_stmt("SELECT x::INT[]");
dialects.verified_stmt("SELECT STRING_TO_ARRAY('1,2,3', ',')::INT[3]");
}

0 comments on commit 7fc37a7

Please sign in to comment.