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

Co-authored-by: Ifeanyi Ubah <ify1992@yahoo.com>
This commit is contained in:
hulk 2025-06-18 13:00:53 +08:00 committed by GitHub
parent be30697efb
commit b1b379e570
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 138 additions and 52 deletions

View file

@ -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(())
} }
} }
} }

View file

@ -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,
)) ))

View file

@ -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')",
")",
));
}

View file

@ -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![],

View file

@ -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,