@@ -51,7 +51,7 @@ fn parse_byte_literal() {
51
51
}
52
52
53
53
#[ test]
54
- fn parse_struct_literal ( ) {
54
+ fn parse_tuple_struct_literal ( ) {
55
55
// tuple syntax: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#tuple_syntax
56
56
// syntax: (expr1, expr2 [, ... ])
57
57
let sql = "SELECT (1, 2, 3), (1, 1.0, '123', true)" ;
@@ -74,9 +74,12 @@ fn parse_struct_literal() {
74
74
] ) ,
75
75
expr_from_projection( & select. projection[ 1 ] )
76
76
) ;
77
+ }
77
78
78
- // // typeless struct syntax https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typeless_struct_syntax
79
- // // syntax: STRUCT( expr1 [AS field_name] [, ... ])
79
+ #[ test]
80
+ fn parse_typeless_struct_syntax ( ) {
81
+ // typeless struct syntax https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typeless_struct_syntax
82
+ // syntax: STRUCT( expr1 [AS field_name] [, ... ])
80
83
let sql = "SELECT STRUCT(1, 2, 3), STRUCT('abc'), STRUCT(1, t.str_col), STRUCT(1 AS a, 'abc' AS b), STRUCT(str_col AS abc)" ;
81
84
let select = bigquery ( ) . verified_only_select ( sql) ;
82
85
assert_eq ! ( 5 , select. projection. len( ) ) ;
@@ -156,12 +159,43 @@ fn parse_struct_literal() {
156
159
} ,
157
160
expr_from_projection( & select. projection[ 4 ] )
158
161
) ;
159
- // // typed struct syntax https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typed_struct_syntax
160
- // // syntax: STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
162
+ }
163
+
164
+ #[ test]
165
+ fn parse_typed_struct_syntax ( ) {
166
+ // typed struct syntax https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typed_struct_syntax
167
+ // syntax: STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
161
168
// let sql = r#"SELECT STRUCT<int64>(5), STRUCT<x int64, y string>(1, t.str_col), STRUCT<int64>(int_col)"#;
162
169
let sql = r#"SELECT STRUCT<BOOL>(true), STRUCT<BYTES>(B'abc')"# ;
163
170
let select = bigquery ( ) . verified_only_select ( sql) ;
164
171
assert_eq ! ( 2 , select. projection. len( ) ) ;
172
+ assert_eq ! (
173
+ & Expr :: Struct {
174
+ expr: Box :: new( StructExpr ( vec![ ExprWithFieldName {
175
+ expr: Expr :: Value ( Value :: Boolean ( true ) ) ,
176
+ field_name: None
177
+ } ] ) ) ,
178
+ type_ann: Some ( vec![ StructTypeAnn {
179
+ field_name: None ,
180
+ field_type: StructFieldType :: Bool
181
+ } ] )
182
+ } ,
183
+ expr_from_projection( & select. projection[ 0 ] )
184
+ ) ;
185
+
186
+ assert_eq ! (
187
+ & Expr :: Struct {
188
+ expr: Box :: new( StructExpr ( vec![ ExprWithFieldName {
189
+ expr: Expr :: Value ( Value :: SingleQuotedByteStringLiteral ( "abc" . to_string( ) ) ) ,
190
+ field_name: None
191
+ } ] ) ) ,
192
+ type_ann: Some ( vec![ StructTypeAnn {
193
+ field_name: None ,
194
+ field_type: StructFieldType :: Bytes
195
+ } ] )
196
+ } ,
197
+ expr_from_projection( & select. projection[ 1 ] )
198
+ ) ;
165
199
166
200
let sql = r#"SELECT STRUCT<DATE>("2011-05-05"), STRUCT<DATETIME>(DATETIME(2008, 12, 25, 05, 30, 00)), STRUCT<FLOAT64>(5.0), STRUCT<INT64>(1)"# ;
167
201
let select = bigquery ( ) . verified_only_select ( sql) ;
@@ -175,6 +209,7 @@ fn parse_struct_literal() {
175
209
let select = bigquery ( ) . verified_only_select ( sql) ;
176
210
assert_eq ! ( 3 , select. projection. len( ) ) ;
177
211
212
+ // TODO: support
178
213
// let sql = r#"SELECT STRUCT<NUMERIC>(NUMERIC '1'), STRUCT<BIGNUMERIC>(BIGNUMERIC '1')"#;
179
214
// let select = bigquery().verified_only_select(sql);
180
215
// assert_eq!(1, select.projection.len());
0 commit comments