2525
2626import google .cloud ._helpers
2727from google .cloud .bigquery import table
28- from google .cloud .bigquery ._pandas_helpers import _BIGNUMERIC_SUPPORT
2928from google .cloud .bigquery .dbapi import _helpers
3029from google .cloud .bigquery .dbapi import exceptions
3130from tests .unit .helpers import _to_pyarrow
@@ -39,9 +38,8 @@ def test_scalar_to_query_parameter(self):
3938 (123 ,"INT64" ),
4039 (- 123456789 ,"INT64" ),
4140 (1.25 ,"FLOAT64" ),
42- (decimal .Decimal ("1.25" ),"NUMERIC" ),
4341 (b"I am some bytes" ,"BYTES" ),
44- (u "I am a string" ,"STRING" ),
42+ ("I am a string" ,"STRING" ),
4543 (datetime .date (2017 ,4 ,1 ),"DATE" ),
4644 (datetime .time (12 ,34 ,56 ),"TIME" ),
4745 (datetime .datetime (2012 ,3 ,4 ,5 ,6 ,7 ),"DATETIME" ),
@@ -51,14 +49,17 @@ def test_scalar_to_query_parameter(self):
5149 ),
5250"TIMESTAMP" ,
5351 ),
52+ (decimal .Decimal ("1.25" ),"NUMERIC" ),
53+ (decimal .Decimal ("9.9999999999999999999999999999999999999E+28" ),"NUMERIC" ),
54+ (decimal .Decimal ("1.0E+29" ),"BIGNUMERIC" ),# more than max NUMERIC value
55+ (decimal .Decimal ("1.123456789" ),"NUMERIC" ),
56+ (decimal .Decimal ("1.1234567891" ),"BIGNUMERIC" ),# scale > 9
57+ (decimal .Decimal ("12345678901234567890123456789.012345678" ),"NUMERIC" ),
58+ (
59+ decimal .Decimal ("12345678901234567890123456789012345678" ),
60+ "BIGNUMERIC" ,# larger than max NUMERIC value, despite precision <=38
61+ ),
5462 ]
55- if _BIGNUMERIC_SUPPORT :
56- expected_types .append (
57- (
58- decimal .Decimal ("1.1234567890123456789012345678901234567890" ),
59- "BIGNUMERIC" ,
60- )
61- )
6263
6364for value ,expected_type in expected_types :
6465msg = "value: {} expected_type: {}" .format (value ,expected_type )
@@ -71,6 +72,33 @@ def test_scalar_to_query_parameter(self):
7172self .assertEqual (named_parameter .type_ ,expected_type ,msg = msg )
7273self .assertEqual (named_parameter .value ,value ,msg = msg )
7374
75+ def test_decimal_to_query_parameter (self ):# TODO: merge with previous test
76+
77+ expected_types = [
78+ (decimal .Decimal ("9.9999999999999999999999999999999999999E+28" ),"NUMERIC" ),
79+ (decimal .Decimal ("1.0E+29" ),"BIGNUMERIC" ),# more than max value
80+ (decimal .Decimal ("1.123456789" ),"NUMERIC" ),
81+ (decimal .Decimal ("1.1234567891" ),"BIGNUMERIC" ),# scale > 9
82+ (decimal .Decimal ("12345678901234567890123456789.012345678" ),"NUMERIC" ),
83+ (
84+ decimal .Decimal ("12345678901234567890123456789012345678" ),
85+ "BIGNUMERIC" ,# larger than max size, even if precision <=38
86+ ),
87+ ]
88+
89+ for value ,expected_type in expected_types :
90+ msg = f"value:{ value } expected_type:{ expected_type } "
91+
92+ parameter = _helpers .scalar_to_query_parameter (value )
93+ self .assertIsNone (parameter .name ,msg = msg )
94+ self .assertEqual (parameter .type_ ,expected_type ,msg = msg )
95+ self .assertEqual (parameter .value ,value ,msg = msg )
96+
97+ named_parameter = _helpers .scalar_to_query_parameter (value ,name = "myvar" )
98+ self .assertEqual (named_parameter .name ,"myvar" ,msg = msg )
99+ self .assertEqual (named_parameter .type_ ,expected_type ,msg = msg )
100+ self .assertEqual (named_parameter .value ,value ,msg = msg )
101+
74102def test_scalar_to_query_parameter_w_unexpected_type (self ):
75103with self .assertRaises (exceptions .ProgrammingError ):
76104_helpers .scalar_to_query_parameter (value = {"a" :"dictionary" })
@@ -89,8 +117,9 @@ def test_array_to_query_parameter_valid_argument(self):
89117 ([123 ,- 456 ,0 ],"INT64" ),
90118 ([1.25 ,2.50 ],"FLOAT64" ),
91119 ([decimal .Decimal ("1.25" )],"NUMERIC" ),
120+ ([decimal .Decimal ("{d38}.{d38}" .format (d38 = "9" * 38 ))],"BIGNUMERIC" ),
92121 ([b"foo" ,b"bar" ],"BYTES" ),
93- ([u "foo" ,u "bar" ],"STRING" ),
122+ (["foo" ,"bar" ],"STRING" ),
94123 ([datetime .date (2017 ,4 ,1 ),datetime .date (2018 ,4 ,1 )],"DATE" ),
95124 ([datetime .time (12 ,34 ,56 ),datetime .time (10 ,20 ,30 )],"TIME" ),
96125 (
@@ -113,11 +142,6 @@ def test_array_to_query_parameter_valid_argument(self):
113142 ),
114143 ]
115144
116- if _BIGNUMERIC_SUPPORT :
117- expected_types .append (
118- ([decimal .Decimal ("{d38}.{d38}" .format (d38 = "9" * 38 ))],"BIGNUMERIC" )
119- )
120-
121145for values ,expected_type in expected_types :
122146msg = "value: {} expected_type: {}" .format (values ,expected_type )
123147parameter = _helpers .array_to_query_parameter (values )
@@ -134,7 +158,7 @@ def test_array_to_query_parameter_empty_argument(self):
134158_helpers .array_to_query_parameter ([])
135159
136160def test_array_to_query_parameter_unsupported_sequence (self ):
137- unsupported_iterables = [{10 ,20 ,30 },u "foo" ,b"bar" ,bytearray ([65 ,75 ,85 ])]
161+ unsupported_iterables = [{10 ,20 ,30 },"foo" ,b"bar" ,bytearray ([65 ,75 ,85 ])]
138162for iterable in unsupported_iterables :
139163with self .assertRaises (exceptions .ProgrammingError ):
140164_helpers .array_to_query_parameter (iterable )
@@ -144,7 +168,7 @@ def test_array_to_query_parameter_sequence_w_invalid_elements(self):
144168_helpers .array_to_query_parameter ([object (),2 ,7 ])
145169
146170def test_to_query_parameters_w_dict (self ):
147- parameters = {"somebool" :True ,"somestring" :u "a-string-value" }
171+ parameters = {"somebool" :True ,"somestring" :"a-string-value" }
148172query_parameters = _helpers .to_query_parameters (parameters )
149173query_parameter_tuples = []
150174for param in query_parameters :
@@ -154,7 +178,7 @@ def test_to_query_parameters_w_dict(self):
154178sorted (
155179 [
156180 ("somebool" ,"BOOL" ,True ),
157- ("somestring" ,"STRING" ,u "a-string-value" ),
181+ ("somestring" ,"STRING" ,"a-string-value" ),
158182 ]
159183 ),
160184 )
@@ -177,14 +201,14 @@ def test_to_query_parameters_w_dict_dict_param(self):
177201_helpers .to_query_parameters (parameters )
178202
179203def test_to_query_parameters_w_list (self ):
180- parameters = [True ,u "a-string-value" ]
204+ parameters = [True ,"a-string-value" ]
181205query_parameters = _helpers .to_query_parameters (parameters )
182206query_parameter_tuples = []
183207for param in query_parameters :
184208query_parameter_tuples .append ((param .name ,param .type_ ,param .value ))
185209self .assertSequenceEqual (
186210sorted (query_parameter_tuples ),
187- sorted ([(None ,"BOOL" ,True ), (None ,"STRING" ,u "a-string-value" )]),
211+ sorted ([(None ,"BOOL" ,True ), (None ,"STRING" ,"a-string-value" )]),
188212 )
189213
190214def test_to_query_parameters_w_list_array_param (self ):