@@ -39,43 +39,45 @@ fn parse_literal_string() {
39
39
r#"'''triple-single'unescaped''', "# ,
40
40
r#""double\"escaped", "# ,
41
41
r#""""triple-double\"escaped""", "# ,
42
- r#""""triple-double"unescaped""""# ,
42
+ r#""""triple-double"unescaped""", "# ,
43
+ r#""""triple-double'unescaped""", "# ,
44
+ r#"'''triple-single"unescaped'''"# ,
43
45
) ;
44
46
let dialect = TestedDialects :: new_with_options (
45
47
vec ! [ Box :: new( BigQueryDialect { } ) ] ,
46
48
ParserOptions :: new ( ) . with_unescape ( false ) ,
47
49
) ;
48
50
let select = dialect. verified_only_select ( sql) ;
49
- assert_eq ! ( 10 , select. projection. len( ) ) ;
51
+ assert_eq ! ( 12 , select. projection. len( ) ) ;
50
52
assert_eq ! (
51
- & Expr :: Value ( Value :: SingleQuotedString ( "single" . to_string ( ) ) ) ,
53
+ & Expr :: Value ( Value :: SingleQuotedString ( "single" . into ( ) ) ) ,
52
54
expr_from_projection( & select. projection[ 0 ] )
53
55
) ;
54
56
assert_eq ! (
55
- & Expr :: Value ( Value :: DoubleQuotedString ( "double" . to_string ( ) ) ) ,
57
+ & Expr :: Value ( Value :: DoubleQuotedString ( "double" . into ( ) ) ) ,
56
58
expr_from_projection( & select. projection[ 1 ] )
57
59
) ;
58
60
assert_eq ! (
59
- & Expr :: Value ( Value :: TripleSingleQuotedString ( "triple-single" . to_string ( ) ) ) ,
61
+ & Expr :: Value ( Value :: TripleSingleQuotedString ( "triple-single" . into ( ) ) ) ,
60
62
expr_from_projection( & select. projection[ 2 ] )
61
63
) ;
62
64
assert_eq ! (
63
- & Expr :: Value ( Value :: TripleDoubleQuotedString ( "triple-double" . to_string ( ) ) ) ,
65
+ & Expr :: Value ( Value :: TripleDoubleQuotedString ( "triple-double" . into ( ) ) ) ,
64
66
expr_from_projection( & select. projection[ 3 ] )
65
67
) ;
66
68
assert_eq ! (
67
- & Expr :: Value ( Value :: SingleQuotedString ( r#"single\'escaped"# . to_string ( ) ) ) ,
69
+ & Expr :: Value ( Value :: SingleQuotedString ( r#"single\'escaped"# . into ( ) ) ) ,
68
70
expr_from_projection( & select. projection[ 4 ] )
69
71
) ;
70
72
assert_eq ! (
71
73
& Expr :: Value ( Value :: TripleSingleQuotedString (
72
- r#"triple-single\'escaped"# . to_string ( )
74
+ r#"triple-single\'escaped"# . into ( )
73
75
) ) ,
74
76
expr_from_projection( & select. projection[ 5 ] )
75
77
) ;
76
78
assert_eq ! (
77
79
& Expr :: Value ( Value :: TripleSingleQuotedString (
78
- r#"triple-single'unescaped"# . to_string ( )
80
+ r#"triple-single'unescaped"# . into ( )
79
81
) ) ,
80
82
expr_from_projection( & select. projection[ 6 ] )
81
83
) ;
@@ -95,6 +97,18 @@ fn parse_literal_string() {
95
97
) ) ,
96
98
expr_from_projection( & select. projection[ 9 ] )
97
99
) ;
100
+ assert_eq ! (
101
+ & Expr :: Value ( Value :: TripleDoubleQuotedString (
102
+ r#"triple-double'unescaped"# . to_string( )
103
+ ) ) ,
104
+ expr_from_projection( & select. projection[ 10 ] )
105
+ ) ;
106
+ assert_eq ! (
107
+ & Expr :: Value ( Value :: TripleSingleQuotedString (
108
+ r#"triple-single"unescaped"# . to_string( )
109
+ ) ) ,
110
+ expr_from_projection( & select. projection[ 11 ] )
111
+ ) ;
98
112
}
99
113
100
114
#[ test]
@@ -588,7 +602,7 @@ fn parse_tuple_struct_literal() {
588
602
& Expr :: Tuple ( vec![
589
603
Expr :: Value ( number( "1" ) ) ,
590
604
Expr :: Value ( number( "1.0" ) ) ,
591
- Expr :: Value ( Value :: SingleQuotedString ( "123" . to_string ( ) ) ) ,
605
+ Expr :: Value ( Value :: SingleQuotedString ( "123" . into ( ) ) ) ,
592
606
Expr :: Value ( Value :: Boolean ( true ) )
593
607
] ) ,
594
608
expr_from_projection( & select. projection[ 1 ] )
@@ -616,7 +630,7 @@ fn parse_typeless_struct_syntax() {
616
630
617
631
assert_eq ! (
618
632
& Expr :: Struct {
619
- values: vec![ Expr :: Value ( Value :: SingleQuotedString ( "abc" . to_string ( ) ) ) , ] ,
633
+ values: vec![ Expr :: Value ( Value :: SingleQuotedString ( "abc" . into ( ) ) ) , ] ,
620
634
fields: Default :: default ( )
621
635
} ,
622
636
expr_from_projection( & select. projection[ 1 ] )
@@ -639,7 +653,7 @@ fn parse_typeless_struct_syntax() {
639
653
name: Ident :: from( "a" )
640
654
} ,
641
655
Expr :: Named {
642
- expr: Expr :: Value ( Value :: SingleQuotedString ( "abc" . to_string ( ) ) ) . into( ) ,
656
+ expr: Expr :: Value ( Value :: SingleQuotedString ( "abc" . into ( ) ) ) . into( ) ,
643
657
name: Ident :: from( "b" )
644
658
} ,
645
659
] ,
@@ -804,9 +818,7 @@ fn parse_typed_struct_syntax_bigquery() {
804
818
assert_eq ! ( 4 , select. projection. len( ) ) ;
805
819
assert_eq ! (
806
820
& Expr :: Struct {
807
- values: vec![ Expr :: Value ( Value :: DoubleQuotedString (
808
- "2011-05-05" . to_string( )
809
- ) ) , ] ,
821
+ values: vec![ Expr :: Value ( Value :: DoubleQuotedString ( "2011-05-05" . into( ) ) ) , ] ,
810
822
fields: vec![ StructField {
811
823
field_name: None ,
812
824
field_type: DataType :: Date
@@ -818,7 +830,7 @@ fn parse_typed_struct_syntax_bigquery() {
818
830
& Expr :: Struct {
819
831
values: vec![ Expr :: TypedString {
820
832
data_type: DataType :: Datetime ( None ) ,
821
- value: "1999-01-01 01:23:34.45" . to_string ( )
833
+ value: Value :: SingleQuotedString ( "1999-01-01 01:23:34.45" . into ( ) )
822
834
} , ] ,
823
835
fields: vec![ StructField {
824
836
field_name: None ,
@@ -854,7 +866,7 @@ fn parse_typed_struct_syntax_bigquery() {
854
866
assert_eq ! (
855
867
& Expr :: Struct {
856
868
values: vec![ Expr :: Interval ( Interval {
857
- value: Box :: new( Expr :: Value ( Value :: SingleQuotedString ( "2" . to_string ( ) ) ) ) ,
869
+ value: Box :: new( Expr :: Value ( Value :: SingleQuotedString ( "2" . into ( ) ) ) ) ,
858
870
leading_field: Some ( DateTimeField :: Hour ) ,
859
871
leading_precision: None ,
860
872
last_field: None ,
@@ -871,7 +883,9 @@ fn parse_typed_struct_syntax_bigquery() {
871
883
& Expr :: Struct {
872
884
values: vec![ Expr :: TypedString {
873
885
data_type: DataType :: JSON ,
874
- value: r#"{"class" : {"students" : [{"name" : "Jane"}]}}"# . to_string( )
886
+ value: Value :: SingleQuotedString (
887
+ r#"{"class" : {"students" : [{"name" : "Jane"}]}}"# . into( )
888
+ )
875
889
} , ] ,
876
890
fields: vec![ StructField {
877
891
field_name: None ,
@@ -886,7 +900,7 @@ fn parse_typed_struct_syntax_bigquery() {
886
900
assert_eq ! ( 3 , select. projection. len( ) ) ;
887
901
assert_eq ! (
888
902
& Expr :: Struct {
889
- values: vec![ Expr :: Value ( Value :: DoubleQuotedString ( "foo" . to_string ( ) ) ) , ] ,
903
+ values: vec![ Expr :: Value ( Value :: DoubleQuotedString ( "foo" . into ( ) ) ) , ] ,
890
904
fields: vec![ StructField {
891
905
field_name: None ,
892
906
field_type: DataType :: String ( Some ( 42 ) )
@@ -898,7 +912,7 @@ fn parse_typed_struct_syntax_bigquery() {
898
912
& Expr :: Struct {
899
913
values: vec![ Expr :: TypedString {
900
914
data_type: DataType :: Timestamp ( None , TimezoneInfo :: None ) ,
901
- value: "2008-12-25 15:30:00 America/Los_Angeles" . to_string ( )
915
+ value: Value :: SingleQuotedString ( "2008-12-25 15:30:00 America/Los_Angeles" . into ( ) )
902
916
} , ] ,
903
917
fields: vec![ StructField {
904
918
field_name: None ,
@@ -912,7 +926,7 @@ fn parse_typed_struct_syntax_bigquery() {
912
926
& Expr :: Struct {
913
927
values: vec![ Expr :: TypedString {
914
928
data_type: DataType :: Time ( None , TimezoneInfo :: None ) ,
915
- value: "15:30:00" . to_string ( )
929
+ value: Value :: SingleQuotedString ( "15:30:00" . into ( ) )
916
930
} , ] ,
917
931
fields: vec![ StructField {
918
932
field_name: None ,
@@ -929,7 +943,7 @@ fn parse_typed_struct_syntax_bigquery() {
929
943
& Expr :: Struct {
930
944
values: vec![ Expr :: TypedString {
931
945
data_type: DataType :: Numeric ( ExactNumberInfo :: None ) ,
932
- value: "1" . to_string ( )
946
+ value: Value :: SingleQuotedString ( "1" . into ( ) )
933
947
} , ] ,
934
948
fields: vec![ StructField {
935
949
field_name: None ,
@@ -942,7 +956,7 @@ fn parse_typed_struct_syntax_bigquery() {
942
956
& Expr :: Struct {
943
957
values: vec![ Expr :: TypedString {
944
958
data_type: DataType :: BigNumeric ( ExactNumberInfo :: None ) ,
945
- value: "1" . to_string ( )
959
+ value: Value :: SingleQuotedString ( "1" . into ( ) )
946
960
} , ] ,
947
961
fields: vec![ StructField {
948
962
field_name: None ,
@@ -1119,9 +1133,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1119
1133
assert_eq ! ( 4 , select. projection. len( ) ) ;
1120
1134
assert_eq ! (
1121
1135
& Expr :: Struct {
1122
- values: vec![ Expr :: Value ( Value :: SingleQuotedString (
1123
- "2011-05-05" . to_string( )
1124
- ) ) , ] ,
1136
+ values: vec![ Expr :: Value ( Value :: SingleQuotedString ( "2011-05-05" . into( ) ) ) , ] ,
1125
1137
fields: vec![ StructField {
1126
1138
field_name: None ,
1127
1139
field_type: DataType :: Date
@@ -1133,7 +1145,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1133
1145
& Expr :: Struct {
1134
1146
values: vec![ Expr :: TypedString {
1135
1147
data_type: DataType :: Datetime ( None ) ,
1136
- value: "1999-01-01 01:23:34.45" . to_string ( )
1148
+ value: Value :: SingleQuotedString ( "1999-01-01 01:23:34.45" . into ( ) )
1137
1149
} , ] ,
1138
1150
fields: vec![ StructField {
1139
1151
field_name: None ,
@@ -1169,7 +1181,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1169
1181
assert_eq ! (
1170
1182
& Expr :: Struct {
1171
1183
values: vec![ Expr :: Interval ( Interval {
1172
- value: Box :: new( Expr :: Value ( Value :: SingleQuotedString ( "1" . to_string ( ) ) ) ) ,
1184
+ value: Box :: new( Expr :: Value ( Value :: SingleQuotedString ( "1" . into ( ) ) ) ) ,
1173
1185
leading_field: Some ( DateTimeField :: Month ) ,
1174
1186
leading_precision: None ,
1175
1187
last_field: None ,
@@ -1186,7 +1198,9 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1186
1198
& Expr :: Struct {
1187
1199
values: vec![ Expr :: TypedString {
1188
1200
data_type: DataType :: JSON ,
1189
- value: r#"{"class" : {"students" : [{"name" : "Jane"}]}}"# . to_string( )
1201
+ value: Value :: SingleQuotedString (
1202
+ r#"{"class" : {"students" : [{"name" : "Jane"}]}}"# . into( )
1203
+ )
1190
1204
} , ] ,
1191
1205
fields: vec![ StructField {
1192
1206
field_name: None ,
@@ -1201,7 +1215,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1201
1215
assert_eq ! ( 3 , select. projection. len( ) ) ;
1202
1216
assert_eq ! (
1203
1217
& Expr :: Struct {
1204
- values: vec![ Expr :: Value ( Value :: SingleQuotedString ( "foo" . to_string ( ) ) ) , ] ,
1218
+ values: vec![ Expr :: Value ( Value :: SingleQuotedString ( "foo" . into ( ) ) ) , ] ,
1205
1219
fields: vec![ StructField {
1206
1220
field_name: None ,
1207
1221
field_type: DataType :: String ( Some ( 42 ) )
@@ -1213,7 +1227,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1213
1227
& Expr :: Struct {
1214
1228
values: vec![ Expr :: TypedString {
1215
1229
data_type: DataType :: Timestamp ( None , TimezoneInfo :: None ) ,
1216
- value: "2008-12-25 15:30:00 America/Los_Angeles" . to_string ( )
1230
+ value: Value :: SingleQuotedString ( "2008-12-25 15:30:00 America/Los_Angeles" . into ( ) )
1217
1231
} , ] ,
1218
1232
fields: vec![ StructField {
1219
1233
field_name: None ,
@@ -1227,7 +1241,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1227
1241
& Expr :: Struct {
1228
1242
values: vec![ Expr :: TypedString {
1229
1243
data_type: DataType :: Time ( None , TimezoneInfo :: None ) ,
1230
- value: "15:30:00" . to_string ( )
1244
+ value: Value :: SingleQuotedString ( "15:30:00" . into ( ) )
1231
1245
} , ] ,
1232
1246
fields: vec![ StructField {
1233
1247
field_name: None ,
@@ -1244,7 +1258,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1244
1258
& Expr :: Struct {
1245
1259
values: vec![ Expr :: TypedString {
1246
1260
data_type: DataType :: Numeric ( ExactNumberInfo :: None ) ,
1247
- value: "1" . to_string ( )
1261
+ value: Value :: SingleQuotedString ( "1" . into ( ) )
1248
1262
} , ] ,
1249
1263
fields: vec![ StructField {
1250
1264
field_name: None ,
@@ -1257,7 +1271,7 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
1257
1271
& Expr :: Struct {
1258
1272
values: vec![ Expr :: TypedString {
1259
1273
data_type: DataType :: BigNumeric ( ExactNumberInfo :: None ) ,
1260
- value: "1" . to_string ( )
1274
+ value: Value :: SingleQuotedString ( "1" . into ( ) )
1261
1275
} , ] ,
1262
1276
fields: vec![ StructField {
1263
1277
field_name: None ,
@@ -1285,7 +1299,7 @@ fn parse_typed_struct_with_field_name_bigquery() {
1285
1299
) ;
1286
1300
assert_eq ! (
1287
1301
& Expr :: Struct {
1288
- values: vec![ Expr :: Value ( Value :: DoubleQuotedString ( "foo" . to_string ( ) ) ) , ] ,
1302
+ values: vec![ Expr :: Value ( Value :: DoubleQuotedString ( "foo" . into ( ) ) ) , ] ,
1289
1303
fields: vec![ StructField {
1290
1304
field_name: Some ( Ident :: from( "y" ) ) ,
1291
1305
field_type: DataType :: String ( None )
@@ -1332,7 +1346,7 @@ fn parse_typed_struct_with_field_name_bigquery_and_generic() {
1332
1346
) ;
1333
1347
assert_eq ! (
1334
1348
& Expr :: Struct {
1335
- values: vec![ Expr :: Value ( Value :: SingleQuotedString ( "foo" . to_string ( ) ) ) , ] ,
1349
+ values: vec![ Expr :: Value ( Value :: SingleQuotedString ( "foo" . into ( ) ) ) , ] ,
1336
1350
fields: vec![ StructField {
1337
1351
field_name: Some ( Ident :: from( "y" ) ) ,
1338
1352
field_type: DataType :: String ( None )
@@ -2234,6 +2248,20 @@ fn test_select_as_value() {
2234
2248
assert_eq ! ( Some ( ValueTableMode :: AsValue ) , select. value_table_mode) ;
2235
2249
}
2236
2250
2251
+ #[ test]
2252
+ fn test_triple_quote_typed_strings ( ) {
2253
+ bigquery ( ) . verified_expr ( r#"JSON '''{"foo":"bar's"}'''"# ) ;
2254
+
2255
+ let expr = bigquery ( ) . verified_expr ( r#"JSON """{"foo":"bar's"}""""# ) ;
2256
+ assert_eq ! (
2257
+ Expr :: TypedString {
2258
+ data_type: DataType :: JSON ,
2259
+ value: Value :: TripleDoubleQuotedString ( r#"{"foo":"bar's"}"# . into( ) )
2260
+ } ,
2261
+ expr
2262
+ ) ;
2263
+ }
2264
+
2237
2265
#[ test]
2238
2266
fn test_array_agg ( ) {
2239
2267
bigquery_and_generic ( ) . verified_expr ( "ARRAY_AGG(state)" ) ;
0 commit comments