65
65
from google .api_core .iam import Policy
66
66
from google .cloud import bigquery
67
67
from google .cloud import bigquery_v2
68
+ from google .cloud .bigquery ._pandas_helpers import _BIGNUMERIC_SUPPORT
68
69
from google .cloud .bigquery .dataset import Dataset
69
70
from google .cloud .bigquery .dataset import DatasetReference
70
71
from google .cloud .bigquery .table import Table
@@ -891,6 +892,9 @@ def test_load_table_from_dataframe_w_nulls(self):
891
892
bigquery .SchemaField ("time_col" , "TIME" ),
892
893
bigquery .SchemaField ("ts_col" , "TIMESTAMP" ),
893
894
)
895
+ if _BIGNUMERIC_SUPPORT :
896
+ scalars_schema += (bigquery .SchemaField ("bignum_col" , "BIGNUMERIC" ),)
897
+
894
898
table_schema = scalars_schema + (
895
899
# TODO: Array columns can't be read due to NULLABLE versus REPEATED
896
900
# mode mismatch. See:
@@ -902,21 +906,22 @@ def test_load_table_from_dataframe_w_nulls(self):
902
906
)
903
907
num_rows = 100
904
908
nulls = [None ] * num_rows
905
- df_data = collections .OrderedDict (
906
- [
907
- ("bool_col" , nulls ),
908
- ("bytes_col" , nulls ),
909
- ("date_col" , nulls ),
910
- ("dt_col" , nulls ),
911
- ("float_col" , nulls ),
912
- ("geo_col" , nulls ),
913
- ("int_col" , nulls ),
914
- ("num_col" , nulls ),
915
- ("str_col" , nulls ),
916
- ("time_col" , nulls ),
917
- ("ts_col" , nulls ),
918
- ]
919
- )
909
+ df_data = [
910
+ ("bool_col" , nulls ),
911
+ ("bytes_col" , nulls ),
912
+ ("date_col" , nulls ),
913
+ ("dt_col" , nulls ),
914
+ ("float_col" , nulls ),
915
+ ("geo_col" , nulls ),
916
+ ("int_col" , nulls ),
917
+ ("num_col" , nulls ),
918
+ ("str_col" , nulls ),
919
+ ("time_col" , nulls ),
920
+ ("ts_col" , nulls ),
921
+ ]
922
+ if _BIGNUMERIC_SUPPORT :
923
+ df_data .append (("bignum_col" , nulls ))
924
+ df_data = collections .OrderedDict (df_data )
920
925
dataframe = pandas .DataFrame (df_data , columns = df_data .keys ())
921
926
922
927
dataset_id = _make_dataset_id ("bq_load_test" )
@@ -1003,6 +1008,9 @@ def test_load_table_from_dataframe_w_explicit_schema(self):
1003
1008
bigquery .SchemaField ("time_col" , "TIME" ),
1004
1009
bigquery .SchemaField ("ts_col" , "TIMESTAMP" ),
1005
1010
)
1011
+ if _BIGNUMERIC_SUPPORT :
1012
+ scalars_schema += (bigquery .SchemaField ("bignum_col" , "BIGNUMERIC" ),)
1013
+
1006
1014
table_schema = scalars_schema + (
1007
1015
# TODO: Array columns can't be read due to NULLABLE versus REPEATED
1008
1016
# mode mismatch. See:
@@ -1012,57 +1020,65 @@ def test_load_table_from_dataframe_w_explicit_schema(self):
1012
1020
# https://jira.apache.org/jira/browse/ARROW-2587
1013
1021
# bigquery.SchemaField("struct_col", "RECORD", fields=scalars_schema),
1014
1022
)
1015
- df_data = collections .OrderedDict (
1016
- [
1017
- ("bool_col" , [True , None , False ]),
1018
- ("bytes_col" , [b"abc" , None , b"def" ]),
1019
- (
1020
- "date_col" ,
1021
- [datetime .date (1 , 1 , 1 ), None , datetime .date (9999 , 12 , 31 )],
1022
- ),
1023
- # (
1024
- # "dt_col",
1025
- # [
1026
- # datetime.datetime(1, 1, 1, 0, 0, 0),
1027
- # None,
1028
- # datetime.datetime(9999, 12, 31, 23, 59, 59, 999999),
1029
- # ],
1030
- # ),
1031
- ("float_col" , [float ("-inf" ), float ("nan" ), float ("inf" )]),
1032
- (
1033
- "geo_col" ,
1034
- [
1035
- "POINT(30 10)" ,
1036
- None ,
1037
- "POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))" ,
1038
- ],
1039
- ),
1040
- ("int_col" , [- 9223372036854775808 , None , 9223372036854775807 ]),
1041
- (
1042
- "num_col" ,
1043
- [
1044
- decimal .Decimal ("-99999999999999999999999999999.999999999" ),
1045
- None ,
1046
- decimal .Decimal ("99999999999999999999999999999.999999999" ),
1047
- ],
1048
- ),
1049
- ("str_col" , [u"abc" , None , u"def" ]),
1050
- (
1051
- "time_col" ,
1052
- [datetime .time (0 , 0 , 0 ), None , datetime .time (23 , 59 , 59 , 999999 )],
1053
- ),
1023
+
1024
+ df_data = [
1025
+ ("bool_col" , [True , None , False ]),
1026
+ ("bytes_col" , [b"abc" , None , b"def" ]),
1027
+ ("date_col" , [datetime .date (1 , 1 , 1 ), None , datetime .date (9999 , 12 , 31 )]),
1028
+ # (
1029
+ # "dt_col",
1030
+ # [
1031
+ # datetime.datetime(1, 1, 1, 0, 0, 0),
1032
+ # None,
1033
+ # datetime.datetime(9999, 12, 31, 23, 59, 59, 999999),
1034
+ # ],
1035
+ # ),
1036
+ ("float_col" , [float ("-inf" ), float ("nan" ), float ("inf" )]),
1037
+ (
1038
+ "geo_col" ,
1039
+ [
1040
+ "POINT(30 10)" ,
1041
+ None ,
1042
+ "POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))" ,
1043
+ ],
1044
+ ),
1045
+ ("int_col" , [- 9223372036854775808 , None , 9223372036854775807 ]),
1046
+ (
1047
+ "num_col" ,
1048
+ [
1049
+ decimal .Decimal ("-99999999999999999999999999999.999999999" ),
1050
+ None ,
1051
+ decimal .Decimal ("99999999999999999999999999999.999999999" ),
1052
+ ],
1053
+ ),
1054
+ ("str_col" , [u"abc" , None , u"def" ]),
1055
+ (
1056
+ "time_col" ,
1057
+ [datetime .time (0 , 0 , 0 ), None , datetime .time (23 , 59 , 59 , 999999 )],
1058
+ ),
1059
+ (
1060
+ "ts_col" ,
1061
+ [
1062
+ datetime .datetime (1 , 1 , 1 , 0 , 0 , 0 , tzinfo = pytz .utc ),
1063
+ None ,
1064
+ datetime .datetime (
1065
+ 9999 , 12 , 31 , 23 , 59 , 59 , 999999 , tzinfo = pytz .utc
1066
+ ),
1067
+ ],
1068
+ ),
1069
+ ]
1070
+ if _BIGNUMERIC_SUPPORT :
1071
+ df_data .append (
1054
1072
(
1055
- "ts_col " ,
1073
+ "bignum_col " ,
1056
1074
[
1057
- datetime . datetime ( 1 , 1 , 1 , 0 , 0 , 0 , tzinfo = pytz . utc ),
1075
+ decimal . Decimal ( "-{d38}.{d38}" . format ( d38 = "9" * 38 ) ),
1058
1076
None ,
1059
- datetime .datetime (
1060
- 9999 , 12 , 31 , 23 , 59 , 59 , 999999 , tzinfo = pytz .utc
1061
- ),
1077
+ decimal .Decimal ("{d38}.{d38}" .format (d38 = "9" * 38 )),
1062
1078
],
1063
- ),
1064
- ]
1065
- )
1079
+ )
1080
+ )
1081
+ df_data = collections . OrderedDict ( df_data )
1066
1082
dataframe = pandas .DataFrame (df_data , dtype = "object" , columns = df_data .keys ())
1067
1083
1068
1084
dataset_id = _make_dataset_id ("bq_load_test" )
@@ -1172,6 +1188,7 @@ def test_load_table_from_dataframe_w_explicit_schema_source_format_csv(self):
1172
1188
bigquery .SchemaField ("geo_col" , "GEOGRAPHY" ),
1173
1189
bigquery .SchemaField ("int_col" , "INTEGER" ),
1174
1190
bigquery .SchemaField ("num_col" , "NUMERIC" ),
1191
+ bigquery .SchemaField ("bignum_col" , "BIGNUMERIC" ),
1175
1192
bigquery .SchemaField ("str_col" , "STRING" ),
1176
1193
bigquery .SchemaField ("time_col" , "TIME" ),
1177
1194
bigquery .SchemaField ("ts_col" , "TIMESTAMP" ),
@@ -1210,6 +1227,14 @@ def test_load_table_from_dataframe_w_explicit_schema_source_format_csv(self):
1210
1227
decimal .Decimal ("99999999999999999999999999999.999999999" ),
1211
1228
],
1212
1229
),
1230
+ (
1231
+ "bignum_col" ,
1232
+ [
1233
+ decimal .Decimal ("-{d38}.{d38}" .format (d38 = "9" * 38 )),
1234
+ None ,
1235
+ decimal .Decimal ("{d38}.{d38}" .format (d38 = "9" * 38 )),
1236
+ ],
1237
+ ),
1213
1238
("str_col" , [u"abc" , None , u"def" ]),
1214
1239
(
1215
1240
"time_col" ,
@@ -2157,6 +2182,10 @@ def test_query_w_query_params(self):
2157
2182
pi_numeric_param = ScalarQueryParameter (
2158
2183
name = "pi_numeric_param" , type_ = "NUMERIC" , value = pi_numeric
2159
2184
)
2185
+ bignum = decimal .Decimal ("-{d38}.{d38}" .format (d38 = "9" * 38 ))
2186
+ bignum_param = ScalarQueryParameter (
2187
+ name = "bignum_param" , type_ = "BIGNUMERIC" , value = bignum
2188
+ )
2160
2189
truthy = True
2161
2190
truthy_param = ScalarQueryParameter (name = "truthy" , type_ = "BOOL" , value = truthy )
2162
2191
beef = b"DEADBEEF"
@@ -2302,6 +2331,15 @@ def test_query_w_query_params(self):
2302
2331
"query_parameters" : [with_friends_param ],
2303
2332
},
2304
2333
]
2334
+ if _BIGNUMERIC_SUPPORT :
2335
+ examples .append (
2336
+ {
2337
+ "sql" : "SELECT @bignum_param" ,
2338
+ "expected" : bignum ,
2339
+ "query_parameters" : [bignum_param ],
2340
+ }
2341
+ )
2342
+
2305
2343
for example in examples :
2306
2344
jconfig = QueryJobConfig ()
2307
2345
jconfig .query_parameters = example ["query_parameters" ]
0 commit comments