@@ -89,18 +89,21 @@ def _generate_tzinfo_from_tzoffset(self, tzoffset_minutes):
89
89
# FROM Snowflake to Python Objects
90
90
#
91
91
def to_python_method (self , type_name , row_type ):
92
+ ctx = {
93
+ u'scale' : row_type ['scale' ],
94
+ }
92
95
try :
93
96
if self ._use_numpy :
94
97
return getattr (self , u'_{type_name}_numpy_to_python' .format (
95
- type_name = type_name )), None
98
+ type_name = type_name )), ctx
96
99
elif type_name == 'FIXED' and row_type ['scale' ] == 0 :
97
100
return self ._FIXED_INT_to_python , None
98
101
else :
99
102
return getattr (self , u'_{type_name}_to_python' .format (
100
- type_name = type_name )), None
103
+ type_name = type_name )), ctx
101
104
except KeyError :
102
105
# no type is defined
103
- return self ._str_to_snowflake , None
106
+ return self ._TEXT_to_python , None
104
107
105
108
def _FIXED_INT_to_python (self , value , * _ ):
106
109
return int (value )
@@ -144,10 +147,10 @@ def _DATE_numpy_to_python(self, value, *_):
144
147
"""
145
148
return numpy .datetime64 (int (value ), 'D' )
146
149
147
- def _extract_timestamp (self , value , col_desc , has_tz = False ):
150
+ def _extract_timestamp (self , value , ctx , has_tz = False ):
148
151
"""Extracts timstamp from a raw data
149
152
"""
150
- scale = col_desc [ 5 ]
153
+ scale = ctx [ 'scale' ]
151
154
try :
152
155
value1 = decimal .Decimal (value )
153
156
big_int = int (value1 .scaleb (scale )) # removed fraction
@@ -167,7 +170,7 @@ def _extract_timestamp(self, value, col_desc, has_tz=False):
167
170
except decimal .InvalidOperation :
168
171
return None , None , None
169
172
170
- def _pre_TIMESTAMP_TZ_to_python (self , value , col_desc ):
173
+ def _pre_TIMESTAMP_TZ_to_python (self , value , ctx ):
171
174
u"""
172
175
try to split value by space for handling new timestamp with timezone
173
176
encoding format which has timezone index separate from the timestamp
@@ -182,7 +185,7 @@ def _pre_TIMESTAMP_TZ_to_python(self, value, col_desc):
182
185
value = valueComponents [0 ]
183
186
184
187
tzoffset , microseconds , fraction_of_nanoseconds , nanoseconds = \
185
- self ._extract_timestamp (value , col_desc ,
188
+ self ._extract_timestamp (value , ctx ,
186
189
has_tz = (tzoffset_extracted is None ))
187
190
188
191
if tzoffset_extracted is not None :
@@ -198,34 +201,34 @@ def _pre_TIMESTAMP_TZ_to_python(self, value, col_desc):
198
201
t += tzinfo_value .utcoffset (t , is_dst = False )
199
202
return t .replace (tzinfo = tzinfo_value ), fraction_of_nanoseconds
200
203
201
- def _TIMESTAMP_TZ_to_python (self , value , col_desc , * _ ):
204
+ def _TIMESTAMP_TZ_to_python (self , value , ctx ):
202
205
"""
203
206
TIMESTAMP TZ to datetime
204
207
205
208
The timezone offset is piggybacked.
206
209
"""
207
- t , _ = self ._pre_TIMESTAMP_TZ_to_python (value , col_desc )
210
+ t , _ = self ._pre_TIMESTAMP_TZ_to_python (value , ctx )
208
211
return t
209
212
210
- def _TIMESTAMP_TZ_numpy_to_python (self , value , col_desc , * _ ):
213
+ def _TIMESTAMP_TZ_numpy_to_python (self , value , ctx ):
211
214
"""TIMESTAMP TZ to datetime
212
215
213
216
The timezone offset is piggybacked.
214
217
"""
215
218
t , fraction_of_nanoseconds = self ._pre_TIMESTAMP_TZ_to_python (
216
- value , col_desc )
219
+ value , ctx )
217
220
ts = int (time .mktime (t .timetuple ())) * 1000000000 + int (
218
221
fraction_of_nanoseconds )
219
222
return numpy .datetime64 (ts , 'ns' )
220
223
221
- def _pre_TIMESTAMP_LTZ_to_python (self , value , col_desc ):
224
+ def _pre_TIMESTAMP_LTZ_to_python (self , value , ctx ):
222
225
u""" TIMESTAMP LTZ to datetime
223
226
224
227
This takes consideration of the session parameter TIMEZONE if
225
228
available. If not, tzlocal is used
226
229
"""
227
230
tzoffset , microseconds , fraction_of_nanoseconds , nanoseconds = \
228
- self ._extract_timestamp (value , col_desc )
231
+ self ._extract_timestamp (value , ctx )
229
232
if tzoffset is None :
230
233
return None
231
234
try :
@@ -251,39 +254,39 @@ def _pre_TIMESTAMP_LTZ_to_python(self, value, col_desc):
251
254
t = time .gmtime (microseconds / float (1000000 ))
252
255
return t , fraction_of_nanoseconds
253
256
254
- def _TIMESTAMP_LTZ_to_python (self , value , col_desc , * _ ):
255
- t , _ = self ._pre_TIMESTAMP_LTZ_to_python (value , col_desc )
257
+ def _TIMESTAMP_LTZ_to_python (self , value , ctx ):
258
+ t , _ = self ._pre_TIMESTAMP_LTZ_to_python (value , ctx )
256
259
return t
257
260
258
- def _TIMESTAMP_LTZ_numpy_to_python (self , value , col_desc , * _ ):
261
+ def _TIMESTAMP_LTZ_numpy_to_python (self , value , ctx ):
259
262
t , fraction_of_nanoseconds = self ._pre_TIMESTAMP_LTZ_to_python (
260
- value , col_desc )
263
+ value , ctx )
261
264
ts = int (time .mktime (t .timetuple ())) * 1000000000 + int (
262
265
fraction_of_nanoseconds )
263
266
return numpy .datetime64 (ts , 'ns' )
264
267
265
268
_TIMESTAMP_to_python = _TIMESTAMP_LTZ_to_python
266
269
267
- def _pre_TIMESTAMP_NTZ_to_python (self , value , col_desc ):
270
+ def _pre_TIMESTAMP_NTZ_to_python (self , value , ctx ):
268
271
"""TIMESTAMP NTZ to datetime
269
272
270
273
No timezone info is attached.
271
274
"""
272
275
tzoffset , microseconds , fraction_of_nanoseconds , nanoseconds = \
273
- self ._extract_timestamp (value , col_desc )
276
+ self ._extract_timestamp (value , ctx )
274
277
275
278
if tzoffset is None :
276
279
return None , None , None
277
280
278
281
return nanoseconds , microseconds , fraction_of_nanoseconds
279
282
280
- def _TIMESTAMP_NTZ_to_python (self , value , col_desc , * _ ):
283
+ def _TIMESTAMP_NTZ_to_python (self , value , ctx ):
281
284
"""
282
285
TIMESTAMP NTZ to datetime
283
286
284
287
No timezone info is attached.
285
288
"""
286
- _ , microseconds , _ = self ._pre_TIMESTAMP_NTZ_to_python (value , col_desc )
289
+ _ , microseconds , _ = self ._pre_TIMESTAMP_NTZ_to_python (value , ctx )
287
290
if microseconds is None :
288
291
return None
289
292
@@ -292,23 +295,23 @@ def _TIMESTAMP_NTZ_to_python(self, value, col_desc, *_):
292
295
t = ZERO_EPOCH + timedelta (seconds = (microseconds / float (1000000 )))
293
296
return t
294
297
295
- def _TIMESTAMP_NTZ_numpy_to_python (self , value , col_desc , * _ ):
298
+ def _TIMESTAMP_NTZ_numpy_to_python (self , value , ctx ):
296
299
"""
297
300
TIMESTAMP NTZ to datetime64
298
301
299
302
No timezone info is attached.
300
303
"""
301
- nanoseconds , _ , _ = self ._pre_TIMESTAMP_NTZ_to_python (value , col_desc )
304
+ nanoseconds , _ , _ = self ._pre_TIMESTAMP_NTZ_to_python (value , ctx )
302
305
return numpy .datetime64 (nanoseconds , 'ns' )
303
306
304
- def _extract_time (self , value , col_desc ):
307
+ def _extract_time (self , value , ctx ):
305
308
u"""Extracts time from raw data
306
309
307
310
Returns a pair containing microseconds since midnight and nanoseconds
308
311
since the last whole-numebr second. The last 6 digits of microseconds
309
312
will be the same as the first 6 digits of nanoseconds.
310
313
"""
311
- scale = col_desc [ 5 ]
314
+ scale = ctx [ 'scale' ]
312
315
try :
313
316
value1 = decimal .Decimal (value )
314
317
big_int = int (value1 .scaleb (scale )) # removed fraction
@@ -321,13 +324,13 @@ def _extract_time(self, value, col_desc):
321
324
except decimal .InvalidOperation :
322
325
return None , None
323
326
324
- def _TIME_to_python (self , value , col_desc , * _ ):
327
+ def _TIME_to_python (self , value , ctx ):
325
328
"""
326
329
TIME to formatted string, SnowflakeDateTime, or datetime.time
327
330
328
331
No timezone is attached.
329
332
"""
330
- microseconds , _ = self ._extract_time (value , col_desc )
333
+ microseconds , _ = self ._extract_time (value , ctx )
331
334
ts = ZERO_EPOCH + timedelta (seconds = (microseconds / float (1000000 )))
332
335
return ts .time ()
333
336
@@ -338,13 +341,13 @@ def _VARIANT_to_python(self, value, *_):
338
341
339
342
_VARIANT_numpy_to_python = _VARIANT_to_python
340
343
341
- def _OBJECT_to_python (self , value , col_desc , * _ ):
342
- return self ._VARIANT_to_python (value , col_desc )
344
+ def _OBJECT_to_python (self , value , * _ ):
345
+ return self ._VARIANT_to_python (value )
343
346
344
347
_OBJECT_numpy_to_python = _OBJECT_to_python
345
348
346
- def _ARRAY_to_python (self , value , col_desc , * _ ):
347
- return self ._VARIANT_to_python (value , col_desc )
349
+ def _ARRAY_to_python (self , value , * _ ):
350
+ return self ._VARIANT_to_python (value )
348
351
349
352
_ARRAY_numpy_to_python = _ARRAY_to_python
350
353
0 commit comments