mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-07-07 17:04:59 +00:00
Add support of parsing struct field's options in BigQuery (#1890)
Some checks failed
license / Release Audit Tool (RAT) (push) Has been cancelled
Rust / codestyle (push) Has been cancelled
Rust / lint (push) Has been cancelled
Rust / benchmark-lint (push) Has been cancelled
Rust / compile (push) Has been cancelled
Rust / docs (push) Has been cancelled
Rust / compile-no-std (push) Has been cancelled
Rust / test (beta) (push) Has been cancelled
Rust / test (nightly) (push) Has been cancelled
Rust / test (stable) (push) Has been cancelled
Some checks failed
license / Release Audit Tool (RAT) (push) Has been cancelled
Rust / codestyle (push) Has been cancelled
Rust / lint (push) Has been cancelled
Rust / benchmark-lint (push) Has been cancelled
Rust / compile (push) Has been cancelled
Rust / docs (push) Has been cancelled
Rust / compile-no-std (push) Has been cancelled
Rust / test (beta) (push) Has been cancelled
Rust / test (nightly) (push) Has been cancelled
Rust / test (stable) (push) Has been cancelled
Co-authored-by: Ifeanyi Ubah <ify1992@yahoo.com>
This commit is contained in:
parent
be30697efb
commit
b1b379e570
5 changed files with 138 additions and 52 deletions
|
@ -428,14 +428,22 @@ impl fmt::Display for Interval {
|
||||||
pub struct StructField {
|
pub struct StructField {
|
||||||
pub field_name: Option<Ident>,
|
pub field_name: Option<Ident>,
|
||||||
pub field_type: DataType,
|
pub field_type: DataType,
|
||||||
|
/// Struct field options.
|
||||||
|
/// See [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#column_name_and_column_schema)
|
||||||
|
pub options: Option<Vec<SqlOption>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for StructField {
|
impl fmt::Display for StructField {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
if let Some(name) = &self.field_name {
|
if let Some(name) = &self.field_name {
|
||||||
write!(f, "{name} {}", self.field_type)
|
write!(f, "{name} {}", self.field_type)?;
|
||||||
} else {
|
} else {
|
||||||
write!(f, "{}", self.field_type)
|
write!(f, "{}", self.field_type)?;
|
||||||
|
}
|
||||||
|
if let Some(options) = &self.options {
|
||||||
|
write!(f, " OPTIONS({})", display_separated(options, ", "))
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3076,6 +3076,7 @@ impl<'a> Parser<'a> {
|
||||||
Ok(StructField {
|
Ok(StructField {
|
||||||
field_name: Some(field_name),
|
field_name: Some(field_name),
|
||||||
field_type,
|
field_type,
|
||||||
|
options: None,
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
self.expect_token(&Token::RParen)?;
|
self.expect_token(&Token::RParen)?;
|
||||||
|
@ -3109,10 +3110,12 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
|
let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
|
||||||
|
|
||||||
|
let options = self.maybe_parse_options(Keyword::OPTIONS)?;
|
||||||
Ok((
|
Ok((
|
||||||
StructField {
|
StructField {
|
||||||
field_name,
|
field_name,
|
||||||
field_type,
|
field_type,
|
||||||
|
options,
|
||||||
},
|
},
|
||||||
trailing_bracket,
|
trailing_bracket,
|
||||||
))
|
))
|
||||||
|
|
|
@ -601,11 +601,13 @@ fn parse_nested_data_types() {
|
||||||
field_name: Some("a".into()),
|
field_name: Some("a".into()),
|
||||||
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(
|
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(
|
||||||
Box::new(DataType::Int64,)
|
Box::new(DataType::Int64,)
|
||||||
))
|
)),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("b".into()),
|
field_name: Some("b".into()),
|
||||||
field_type: DataType::Bytes(Some(42))
|
field_type: DataType::Bytes(Some(42)),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
StructBracketKind::AngleBrackets
|
StructBracketKind::AngleBrackets
|
||||||
|
@ -619,6 +621,7 @@ fn parse_nested_data_types() {
|
||||||
vec![StructField {
|
vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Int64,
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}],
|
}],
|
||||||
StructBracketKind::AngleBrackets
|
StructBracketKind::AngleBrackets
|
||||||
),
|
),
|
||||||
|
@ -771,6 +774,7 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Int64,
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -799,7 +803,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
quote_style: None,
|
quote_style: None,
|
||||||
span: Span::empty(),
|
span: Span::empty(),
|
||||||
}),
|
}),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident {
|
field_name: Some(Ident {
|
||||||
|
@ -807,7 +812,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
quote_style: None,
|
quote_style: None,
|
||||||
span: Span::empty(),
|
span: Span::empty(),
|
||||||
}),
|
}),
|
||||||
field_type: DataType::String(None)
|
field_type: DataType::String(None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -825,17 +831,20 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
field_name: Some("arr".into()),
|
field_name: Some("arr".into()),
|
||||||
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
|
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
|
||||||
DataType::Float64
|
DataType::Float64
|
||||||
)))
|
))),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("str".into()),
|
field_name: Some("str".into()),
|
||||||
field_type: DataType::Struct(
|
field_type: DataType::Struct(
|
||||||
vec![StructField {
|
vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Bool
|
field_type: DataType::Bool,
|
||||||
|
options: None,
|
||||||
}],
|
}],
|
||||||
StructBracketKind::AngleBrackets
|
StructBracketKind::AngleBrackets
|
||||||
)
|
),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -858,13 +867,15 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
field_type: DataType::Struct(
|
field_type: DataType::Struct(
|
||||||
Default::default(),
|
Default::default(),
|
||||||
StructBracketKind::AngleBrackets
|
StructBracketKind::AngleBrackets
|
||||||
)
|
),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("y".into()),
|
field_name: Some("y".into()),
|
||||||
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
|
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
|
||||||
DataType::Struct(Default::default(), StructBracketKind::AngleBrackets)
|
DataType::Struct(Default::default(), StructBracketKind::AngleBrackets)
|
||||||
)))
|
))),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -879,7 +890,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
values: vec![Expr::Value(Value::Boolean(true).with_empty_span())],
|
values: vec![Expr::Value(Value::Boolean(true).with_empty_span())],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Bool
|
field_type: DataType::Bool,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -891,7 +903,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Bytes(Some(42))
|
field_type: DataType::Bytes(Some(42)),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -907,7 +920,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Date
|
field_type: DataType::Date,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -920,7 +934,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Datetime(None)
|
field_type: DataType::Datetime(None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -930,7 +945,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
values: vec![Expr::value(number("5.0"))],
|
values: vec![Expr::value(number("5.0"))],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Float64
|
field_type: DataType::Float64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[2])
|
expr_from_projection(&select.projection[2])
|
||||||
|
@ -940,7 +956,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
values: vec![Expr::value(number("1"))],
|
values: vec![Expr::value(number("1"))],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[3])
|
expr_from_projection(&select.projection[3])
|
||||||
|
@ -962,7 +979,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
})],
|
})],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Interval
|
field_type: DataType::Interval,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -977,7 +995,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::JSON
|
field_type: DataType::JSON,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -993,7 +1012,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::String(Some(42))
|
field_type: DataType::String(Some(42)),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1006,7 +1026,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Timestamp(None, TimezoneInfo::None)
|
field_type: DataType::Timestamp(None, TimezoneInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1020,7 +1041,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Time(None, TimezoneInfo::None)
|
field_type: DataType::Time(None, TimezoneInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[2])
|
expr_from_projection(&select.projection[2])
|
||||||
|
@ -1037,7 +1059,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Numeric(ExactNumberInfo::None)
|
field_type: DataType::Numeric(ExactNumberInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1050,7 +1073,8 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::BigNumeric(ExactNumberInfo::None)
|
field_type: DataType::BigNumeric(ExactNumberInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1067,10 +1091,12 @@ fn parse_typed_struct_syntax_bigquery() {
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("key".into()),
|
field_name: Some("key".into()),
|
||||||
field_type: DataType::Int64,
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("value".into()),
|
field_name: Some("value".into()),
|
||||||
field_type: DataType::Int64,
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -1092,6 +1118,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Int64,
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1120,7 +1147,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
quote_style: None,
|
quote_style: None,
|
||||||
span: Span::empty(),
|
span: Span::empty(),
|
||||||
}),
|
}),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident {
|
field_name: Some(Ident {
|
||||||
|
@ -1128,7 +1156,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
quote_style: None,
|
quote_style: None,
|
||||||
span: Span::empty(),
|
span: Span::empty(),
|
||||||
}),
|
}),
|
||||||
field_type: DataType::String(None)
|
field_type: DataType::String(None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -1151,13 +1180,15 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
field_type: DataType::Struct(
|
field_type: DataType::Struct(
|
||||||
Default::default(),
|
Default::default(),
|
||||||
StructBracketKind::AngleBrackets
|
StructBracketKind::AngleBrackets
|
||||||
)
|
),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("y".into()),
|
field_name: Some("y".into()),
|
||||||
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
|
field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
|
||||||
DataType::Struct(Default::default(), StructBracketKind::AngleBrackets)
|
DataType::Struct(Default::default(), StructBracketKind::AngleBrackets)
|
||||||
)))
|
))),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -1172,7 +1203,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
values: vec![Expr::Value(Value::Boolean(true).with_empty_span())],
|
values: vec![Expr::Value(Value::Boolean(true).with_empty_span())],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Bool
|
field_type: DataType::Bool,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1184,7 +1216,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Bytes(Some(42))
|
field_type: DataType::Bytes(Some(42)),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1200,7 +1233,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Date
|
field_type: DataType::Date,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1213,7 +1247,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Datetime(None)
|
field_type: DataType::Datetime(None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1223,7 +1258,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
values: vec![Expr::value(number("5.0"))],
|
values: vec![Expr::value(number("5.0"))],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Float64
|
field_type: DataType::Float64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[2])
|
expr_from_projection(&select.projection[2])
|
||||||
|
@ -1233,7 +1269,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
values: vec![Expr::value(number("1"))],
|
values: vec![Expr::value(number("1"))],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[3])
|
expr_from_projection(&select.projection[3])
|
||||||
|
@ -1255,7 +1292,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
})],
|
})],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Interval
|
field_type: DataType::Interval,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1270,7 +1308,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::JSON
|
field_type: DataType::JSON,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1286,7 +1325,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::String(Some(42))
|
field_type: DataType::String(Some(42)),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1299,7 +1339,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Timestamp(None, TimezoneInfo::None)
|
field_type: DataType::Timestamp(None, TimezoneInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1313,7 +1354,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Time(None, TimezoneInfo::None)
|
field_type: DataType::Time(None, TimezoneInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[2])
|
expr_from_projection(&select.projection[2])
|
||||||
|
@ -1330,7 +1372,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Numeric(ExactNumberInfo::None)
|
field_type: DataType::Numeric(ExactNumberInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1343,7 +1386,8 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
|
||||||
}],
|
}],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::BigNumeric(ExactNumberInfo::None)
|
field_type: DataType::BigNumeric(ExactNumberInfo::None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1360,7 +1404,8 @@ fn parse_typed_struct_with_field_name_bigquery() {
|
||||||
values: vec![Expr::value(number("5"))],
|
values: vec![Expr::value(number("5"))],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: Some(Ident::from("x")),
|
field_name: Some(Ident::from("x")),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1372,7 +1417,8 @@ fn parse_typed_struct_with_field_name_bigquery() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: Some(Ident::from("y")),
|
field_name: Some(Ident::from("y")),
|
||||||
field_type: DataType::String(None)
|
field_type: DataType::String(None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1387,11 +1433,13 @@ fn parse_typed_struct_with_field_name_bigquery() {
|
||||||
fields: vec![
|
fields: vec![
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::from("x")),
|
field_name: Some(Ident::from("x")),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::from("y")),
|
field_name: Some(Ident::from("y")),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -1409,7 +1457,8 @@ fn parse_typed_struct_with_field_name_bigquery_and_generic() {
|
||||||
values: vec![Expr::value(number("5"))],
|
values: vec![Expr::value(number("5"))],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: Some(Ident::from("x")),
|
field_name: Some(Ident::from("x")),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[0])
|
expr_from_projection(&select.projection[0])
|
||||||
|
@ -1421,7 +1470,8 @@ fn parse_typed_struct_with_field_name_bigquery_and_generic() {
|
||||||
)],
|
)],
|
||||||
fields: vec![StructField {
|
fields: vec![StructField {
|
||||||
field_name: Some(Ident::from("y")),
|
field_name: Some(Ident::from("y")),
|
||||||
field_type: DataType::String(None)
|
field_type: DataType::String(None),
|
||||||
|
options: None,
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
expr_from_projection(&select.projection[1])
|
expr_from_projection(&select.projection[1])
|
||||||
|
@ -1436,11 +1486,13 @@ fn parse_typed_struct_with_field_name_bigquery_and_generic() {
|
||||||
fields: vec![
|
fields: vec![
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::from("x")),
|
field_name: Some(Ident::from("x")),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::from("y")),
|
field_name: Some(Ident::from("y")),
|
||||||
field_type: DataType::Int64
|
field_type: DataType::Int64,
|
||||||
|
options: None,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -2407,3 +2459,16 @@ fn test_any_type() {
|
||||||
fn test_any_type_dont_break_custom_type() {
|
fn test_any_type_dont_break_custom_type() {
|
||||||
bigquery_and_generic().verified_stmt("CREATE TABLE foo (x ANY)");
|
bigquery_and_generic().verified_stmt("CREATE TABLE foo (x ANY)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_struct_field_options() {
|
||||||
|
bigquery().verified_stmt(concat!(
|
||||||
|
"CREATE TABLE my_table (",
|
||||||
|
"f0 STRUCT<a STRING, b INT64>, ",
|
||||||
|
"f1 STRUCT<",
|
||||||
|
"a STRING OPTIONS(description = 'This is a string', type = 'string'), ",
|
||||||
|
"b INT64",
|
||||||
|
"> OPTIONS(description = 'This is a struct field')",
|
||||||
|
")",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
|
@ -669,11 +669,13 @@ fn parse_create_table_with_nested_data_types() {
|
||||||
DataType::Tuple(vec![
|
DataType::Tuple(vec![
|
||||||
StructField {
|
StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::FixedString(128)
|
field_type: DataType::FixedString(128),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: None,
|
field_name: None,
|
||||||
field_type: DataType::Int128
|
field_type: DataType::Int128,
|
||||||
|
options: None,
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
))),
|
))),
|
||||||
|
@ -685,12 +687,14 @@ fn parse_create_table_with_nested_data_types() {
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("a".into()),
|
field_name: Some("a".into()),
|
||||||
field_type: DataType::Datetime64(9, None),
|
field_type: DataType::Datetime64(9, None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some("b".into()),
|
field_name: Some("b".into()),
|
||||||
field_type: DataType::Array(ArrayElemTypeDef::Parenthesis(
|
field_type: DataType::Array(ArrayElemTypeDef::Parenthesis(
|
||||||
Box::new(DataType::Uuid)
|
Box::new(DataType::Uuid)
|
||||||
))
|
)),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
]),
|
]),
|
||||||
options: vec![],
|
options: vec![],
|
||||||
|
|
|
@ -44,10 +44,12 @@ fn test_struct() {
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::new("v")),
|
field_name: Some(Ident::new("v")),
|
||||||
field_type: DataType::Varchar(None),
|
field_type: DataType::Varchar(None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::new("i")),
|
field_name: Some(Ident::new("i")),
|
||||||
field_type: DataType::Integer(None),
|
field_type: DataType::Integer(None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
StructBracketKind::Parentheses,
|
StructBracketKind::Parentheses,
|
||||||
|
@ -84,6 +86,7 @@ fn test_struct() {
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::new("v")),
|
field_name: Some(Ident::new("v")),
|
||||||
field_type: DataType::Varchar(None),
|
field_type: DataType::Varchar(None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::new("s")),
|
field_name: Some(Ident::new("s")),
|
||||||
|
@ -92,14 +95,17 @@ fn test_struct() {
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::new("a1")),
|
field_name: Some(Ident::new("a1")),
|
||||||
field_type: DataType::Integer(None),
|
field_type: DataType::Integer(None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
StructField {
|
StructField {
|
||||||
field_name: Some(Ident::new("a2")),
|
field_name: Some(Ident::new("a2")),
|
||||||
field_type: DataType::Varchar(None),
|
field_type: DataType::Varchar(None),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
StructBracketKind::Parentheses,
|
StructBracketKind::Parentheses,
|
||||||
),
|
),
|
||||||
|
options: None,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
StructBracketKind::Parentheses,
|
StructBracketKind::Parentheses,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue