6565from google .api_core .iam import Policy
6666from google .cloud import bigquery
6767from google .cloud import bigquery_v2
68+ from google .cloud .bigquery ._pandas_helpers import _BIGNUMERIC_SUPPORT
6869from google .cloud .bigquery .dataset import Dataset
6970from google .cloud .bigquery .dataset import DatasetReference
7071from google .cloud .bigquery .table import Table
@@ -891,6 +892,9 @@ def test_load_table_from_dataframe_w_nulls(self):
891892 bigquery .SchemaField ("time_col" , "TIME" ),
892893 bigquery .SchemaField ("ts_col" , "TIMESTAMP" ),
893894 )
895+ if _BIGNUMERIC_SUPPORT :
896+ scalars_schema += (bigquery .SchemaField ("bignum_col" , "BIGNUMERIC" ),)
897+
894898 table_schema = scalars_schema + (
895899 # TODO: Array columns can't be read due to NULLABLE versus REPEATED
896900 # mode mismatch. See:
@@ -902,21 +906,22 @@ def test_load_table_from_dataframe_w_nulls(self):
902906 )
903907 num_rows = 100
904908 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 )
920925 dataframe = pandas .DataFrame (df_data , columns = df_data .keys ())
921926
922927 dataset_id = _make_dataset_id ("bq_load_test" )
@@ -1003,6 +1008,9 @@ def test_load_table_from_dataframe_w_explicit_schema(self):
10031008 bigquery .SchemaField ("time_col" , "TIME" ),
10041009 bigquery .SchemaField ("ts_col" , "TIMESTAMP" ),
10051010 )
1011+ if _BIGNUMERIC_SUPPORT :
1012+ scalars_schema += (bigquery .SchemaField ("bignum_col" , "BIGNUMERIC" ),)
1013+
10061014 table_schema = scalars_schema + (
10071015 # TODO: Array columns can't be read due to NULLABLE versus REPEATED
10081016 # mode mismatch. See:
@@ -1012,57 +1020,65 @@ def test_load_table_from_dataframe_w_explicit_schema(self):
10121020 # https://jira.apache.org/jira/browse/ARROW-2587
10131021 # bigquery.SchemaField("struct_col", "RECORD", fields=scalars_schema),
10141022 )
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 (
10541072 (
1055- "ts_col " ,
1073+ "bignum_col " ,
10561074 [
1057- datetime . datetime ( 1 , 1 , 1 , 0 , 0 , 0 , tzinfo = pytz . utc ),
1075+ decimal . Decimal ( "-{d38}.{d38}" . format ( d38 = "9" * 38 ) ),
10581076 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 )),
10621078 ],
1063- ),
1064- ]
1065- )
1079+ )
1080+ )
1081+ df_data = collections . OrderedDict ( df_data )
10661082 dataframe = pandas .DataFrame (df_data , dtype = "object" , columns = df_data .keys ())
10671083
10681084 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):
11721188 bigquery .SchemaField ("geo_col" , "GEOGRAPHY" ),
11731189 bigquery .SchemaField ("int_col" , "INTEGER" ),
11741190 bigquery .SchemaField ("num_col" , "NUMERIC" ),
1191+ bigquery .SchemaField ("bignum_col" , "BIGNUMERIC" ),
11751192 bigquery .SchemaField ("str_col" , "STRING" ),
11761193 bigquery .SchemaField ("time_col" , "TIME" ),
11771194 bigquery .SchemaField ("ts_col" , "TIMESTAMP" ),
@@ -1210,6 +1227,14 @@ def test_load_table_from_dataframe_w_explicit_schema_source_format_csv(self):
12101227 decimal .Decimal ("99999999999999999999999999999.999999999" ),
12111228 ],
12121229 ),
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+ ),
12131238 ("str_col" , [u"abc" , None , u"def" ]),
12141239 (
12151240 "time_col" ,
@@ -2157,6 +2182,10 @@ def test_query_w_query_params(self):
21572182 pi_numeric_param = ScalarQueryParameter (
21582183 name = "pi_numeric_param" , type_ = "NUMERIC" , value = pi_numeric
21592184 )
2185+ bignum = decimal .Decimal ("-{d38}.{d38}" .format (d38 = "9" * 38 ))
2186+ bignum_param = ScalarQueryParameter (
2187+ name = "bignum_param" , type_ = "BIGNUMERIC" , value = bignum
2188+ )
21602189 truthy = True
21612190 truthy_param = ScalarQueryParameter (name = "truthy" , type_ = "BOOL" , value = truthy )
21622191 beef = b"DEADBEEF"
@@ -2302,6 +2331,15 @@ def test_query_w_query_params(self):
23022331 "query_parameters" : [with_friends_param ],
23032332 },
23042333 ]
2334+ if _BIGNUMERIC_SUPPORT :
2335+ examples .append (
2336+ {
2337+ "sql" : "SELECT @bignum_param" ,
2338+ "expected" : bignum ,
2339+ "query_parameters" : [bignum_param ],
2340+ }
2341+ )
2342+
23052343 for example in examples :
23062344 jconfig = QueryJobConfig ()
23072345 jconfig .query_parameters = example ["query_parameters" ]
0 commit comments