o
    RDiq                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlZd dlmZ ddlmZmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z' erd dl(m)Z)m*Z* zd dl(Z(W n e+y   dZ(Y nw zd dl,Z,W n e+y   dZ,Y nw dZ-e	d dZ.edddZ/e0d e
j1j2ddZ3dZ4ee5Z6i dddddddddd d!d d"d#d$d#d%d&d'd&d(d)d*d+d,d+d-d.d/d0d1d+d2d0d d dddddddddddd+d d3Z7eegef Z8dTd6d7Z9dUd8d9Z:dVd<d=Z;dWd>d?Z<dWd@dAZ=dWdBdCZ>dXdHdIZ?dYdLdMZ@dZdPdQZAG dRdS dSZBdS )[    )annotationsN)datedatetime)time)	timedeltatimezonetzinfo)partial)	getLogger)ceil)struct_time)TYPE_CHECKINGAnyCallableNoReturn)UTC   )	IS_BINARY
IS_NUMERIC)ER_NOT_SUPPORT_DATA_TYPE)ProgrammingError)interval_year_month_to_string)binary_to_pythonbinary_to_snowflake'sfdatetime_total_seconds_from_timedelta)bool_int64   secondsi  r   	000000000intFIXEDlongdecimalfloatREALstrTEXTunicodebytesBINARY	bytearrayboolBOOLEANr   nonetypeANYr   TIMESTAMP_NTZ
sfdatetimer   DATEr   TIMEr   r   )listtupleint8int16int32r   uint8uint16uint32uint64float16float32float64
datetime64quoted_namedtreturnc                 C  s0   | j dur| tjjdd}n| }|t  S )zfConverts datetime to epoch time in seconds.

    If Python > 3.3, you may use timestamp() method.
    Nr!   )r   
astimezonepytzr   replace
ZERO_EPOCHtotal_seconds)rE   dt0 rM   V/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/converter.pyconvert_datetime_to_epochV   s   
rO   c                 C  s   t | dddd S )Nf. 000)rO   rI   rE   rM   rM   rN   &_convert_datetime_to_epoch_nanosecondsb      rU   tmdt_tc                 C  s,   t | jd | jd  | j | jd d S )N  <   06drS   )r)   hourminutesecondmicrosecond)rW   rM   rM   rN   "_convert_time_to_epoch_nanosecondsf   s   r`   c                 C  s   t | t   S N)r#   ZERO_EPOCH_DATErK   rT   rM   rM   rN   _convert_date_to_epoch_secondsn   s   rc   c                 C     | t   dddS )Nz.3frQ   rR   rb   rK   rI   rT   rM   rM   rN   #_convert_date_to_epoch_millisecondsr   rV   rf   c                 C  rd   )Nz.9frQ   rR   re   rT   rM   rM   rN   "_convert_date_to_epoch_nanosecondsv   rV   rg   valuectxdicttuple[float, int]c                 C  sF   |d }|dkrt | d| d  nt | }t| |d |}||fS )z#Extracts timestamp from a raw data.scale   r   max_fraction)r'   _adjust_fraction_of_nanoseconds)rh   ri   rl   microsecondsfraction_of_nanosecondsrM   rM   rN   _extract_timestampz   s   &
rr   rn   rl   c                 C  sx   |dkrdS | d dkrt | | d  td d|   S t | | d  }|dkr,dS t t|| td d|   S )Nr   -	   )r#   	ZERO_FILLr)   )rh   rn   rl   fracrM   rM   rN   ro      s   " ro   tzoffset_minutesr   c                 C  
   t | S )z&Generates tzinfo object from tzoffset.)rH   FixedOffset)rw   rM   rM   rN   _generate_tzinfo_from_tzoffset   s   
rz   c                   @  s>  e Zd ZdddZdddZdddZdddZdddZdddZdddZ	dddZ
ddd Zdd!d"Zdd%d&Zdd'd(Zdd)d*Zdd+d,Zdd.d/Zdd0d1Zdd2d3Zdd5d6Zdd8d9Zdd:d;ZeZdd<d=Zd>d? Zdd@dAZddCdDZeZeZddEdFZddGdHZddIdJZ ddKdLZ!ddMdNZ"ddOdPZ#ddRdSZ$ddUdVZ%ddWdXZ&ddZd[Z'e&Z(e&Z)e&Z*e&Z+e&Z,dd]d^Z-e-Z.dd`daZ/ddbdcZ0ddddeZ1ddgdhZ2ddjdkZ3	ldddodpZ4ddrdsZ5ddudvZ6ddwdxZ7ddzd{Z8d|d} Z9dddZ:dddZ;e;Z<dddZ=e=Z>dddZ?dddZ@dddZAdddZBdddZCdddZDdddZEdddZFdddZGdddZHdddZIeIZJdd ZKdd ZLeKZMeKZNeKZOeKZPeKZQeKZReKZSeKZTeLZUeLZVdddZWdddZXdddZYdddZZe[dddZ\e[dddZ]e[dddZ^e[dddZ_e[	ddddZ`dS )SnowflakeConverterrF   Nonec                 K  s.   i | _ |ddotd u| _td| j d S )N	use_numpyFzuse_numpy: %s)_parametersgetnumpy
_use_numpyloggerdebug)selfkwargsrM   rM   rN   __init__   s   zSnowflakeConverter.__init__new_parametersrj   c                 C  s
   || _ d S ra   r~   )r   r   rM   rM   rN   set_parameters   s   
z!SnowflakeConverter.set_parametersparamr   rh   c                 C  s   || j |< d S ra   r   )r   r   rh   rM   rM   rN   set_parameter   s   z SnowflakeConverter.set_parameterdict[str, str | int | bool]c                 C  s   | j S ra   r   )r   rM   rM   rN   get_parameters      z!SnowflakeConverter.get_parametersr)   str | int | bool | Nonec                 C  s   | j |S ra   )r~   r   )r   r   rM   rM   rN   get_parameter      z SnowflakeConverter.get_parameterSnowflakeConverterTypec              	   C  s   |  }|ddurtd|d  |d< dd|d   |d< d| d	g}| jr3|d
d| d |D ]}z
t| ||W   S  tyJ   Y q5w td| dS )z FROM Snowflake to Python Objectsrl   N
   rn   0rt   	zero_fill_
_to_pythonr   _numpy_to_pythonz&No column converter found for type: %s)	copyr   r#   r   insertgetattrAttributeErrorr   warning)r   	type_namecolumnri   
convertersconvrM   rM   rN   to_python_method   s   z#SnowflakeConverter.to_python_methodri   dict[str, Any]r   c                 C  s   |d dkrt S tjS )Nrl   r   )r#   r&   Decimalr   ri   rM   rM   rN   _FIXED_to_python   s   z#SnowflakeConverter._FIXED_to_pythonc                 C  s   |d rt jS ddd}|S )	Nrl   rh   r)   rF   r   c                 S  s(   zt | W S  ty   t|  Y S w ra   )r   r   OverflowErrorr#   rh   rM   rM   rN   r      s
   z7SnowflakeConverter._FIXED_numpy_to_python.<locals>.conv)rh   r)   rF   r   r   rB   r   ri   r   rM   rM   rN   _FIXED_numpy_to_python   s   
z)SnowflakeConverter._FIXED_numpy_to_pythonc                 C     t jS ra   r   r   rM   rM   rN   _DECFLOAT_numpy_to_python   r   z,SnowflakeConverter._DECFLOAT_numpy_to_pythonc                 C  r   ra   )r&   r   r   rM   rM   rN   _DECFLOAT_to_python   r   z&SnowflakeConverter._DECFLOAT_to_pythonr   &dict[str, str | None] | dict[str, str]c                 C     t S ra   r'   r   r   rM   rM   rN   _REAL_to_python      z"SnowflakeConverter._REAL_to_pythonc                 C  r   ra   r   r   rM   rM   rN   _REAL_numpy_to_python   r   z(SnowflakeConverter._REAL_numpy_to_pythonc                 C     d S ra   rM   r   rM   rM   rN   _TEXT_to_python   r   z"SnowflakeConverter._TEXT_to_pythonc                 C  r   ra   )r   r   rM   rM   rN   _BINARY_to_python   r   z$SnowflakeConverter._BINARY_to_pythondict[str, str | None]c                 C     ddd}|S )	zConverts DATE to date.rh   r)   rF   r   c              
   S  s   zt t| d tjjd d W S  ttfy@ } z t	
d| ttt| d d }t|j|j|jW  Y d }~S d }~ww )NiQ r!   zFailed to convert: %sr   )r   fromtimestampr#   r   utcrI   r   OSError
ValueErrorr   r   rJ   r   yearmonthday)rh   etsrM   rM   rN   r      s   z0SnowflakeConverter._DATE_to_python.<locals>.convN)rh   r)   rF   r   rM   )r   r   r   rM   rM   rN   _DATE_to_python   s   
z"SnowflakeConverter._DATE_to_pythonc                 C     dd S )zEConverts DATE to datetime.

        No timezone is attached.
        c                 S     t t| dS )ND)r   rC   r#   )xrM   rM   rN   <lambda>       z:SnowflakeConverter._DATE_numpy_to_python.<locals>.<lambda>rM   r   rM   rM   rN   _DATE_numpy_to_python   s   z(SnowflakeConverter._DATE_numpy_to_pythonc                   s   |d  d	 fdd}|S )
zXConverts TIMESTAMP TZ to datetime.

        The timezone offset is piggybacked.
        rl   encoded_valuer)   rF   r   c                   s,   |   \}}tt|d }tj| |dS )N  )rh   rl   tz)splitrz   r#   r{   create_timestamp_from_string)r   rh   r   r   rl   rM   rN   r      s
   z8SnowflakeConverter._TIMESTAMP_TZ_to_python.<locals>.convN)r   r)   rF   r   rM   r   rM   r   rN   _TIMESTAMP_TZ_to_python   s   z*SnowflakeConverter._TIMESTAMP_TZ_to_pythontzinfo | UTCc                 C  s\   z|  d}|s
d}t|W S  tjjy-   td tdur't  Y S t	jj
 Y S w )z?Gets the session timezone or use the local computer's timezone.TIMEZONEr   zconverting to tzinfo failedN)r   rH   r   
exceptionsUnknownTimeZoneErrorr   r   tzlocalget_localzoner   r   )r   r   rM   rM   rN   _get_session_tz  s   

z"SnowflakeConverter._get_session_tz.tuple[datetime, int] | tuple[struct_time, int]c                 C  sp   t ||\}}|  }ztt|d }tjj|dd|}||fW S  ty7   t	
d t||f Y S w )zConverts TIMESTAMP LTZ to datetime.

        This takes consideration of the session parameter TIMEZONE if available. If not, tzlocal is used.
        r   Fis_dstzfOverflowError in converting from epoch time to timestamp_ltz: %s(ms). Falling back to use struct_time.)rr   r   rJ   r   rH   r   localizerG   r   r   r   r   	localtime)r   rh   ri   rp   rq   tzinfo_valuet0trM   rM   rN   _pre_TIMESTAMP_LTZ_to_python  s   	
z/SnowflakeConverter._pre_TIMESTAMP_LTZ_to_pythonc                 C  s    |   }|d }ttj||dS )Nrl   )rl   r   )r   r	   r{   r   )r   ri   r   rl   rM   rM   rN   _TIMESTAMP_LTZ_to_python*  s
   z+SnowflakeConverter._TIMESTAMP_LTZ_to_pythonc                 C  s   |d }t tj|dS )z<TIMESTAMP NTZ to datetime with no timezone info is attached.rl   r   )r	   r{   r   )r   ri   rl   rM   rM   rN   _TIMESTAMP_NTZ_to_python4  s   z+SnowflakeConverter._TIMESTAMP_NTZ_to_pythonc                 C  r   )	z>TIMESTAMP NTZ to datetime64 with no timezone info is attached.rh   r)   rF   numpy.datetime64c                 S  s    t t| d}t|dS )Nrt   ns)r#   r&   r   scalebr   rC   )rh   nanosecondsrM   rM   rN   r   =  s   z?SnowflakeConverter._TIMESTAMP_NTZ_numpy_to_python.<locals>.convN)rh   r)   rF   r   rM   r   rM   rM   rN   _TIMESTAMP_NTZ_numpy_to_python:  s   
z1SnowflakeConverter._TIMESTAMP_NTZ_numpy_to_pythonc                   s0   |d  ddd}d fd	d
} dkr|S |S )zXTIME to formatted string, SnowflakeDateTime, or datetime.time with no timezone attached.rl   rh   r)   rF   r   c                 S  s   t t| tjjd d S )Nr!   )r   r   r'   r   r   rI   r   r   rM   rM   rN   conv0G  s
   z1SnowflakeConverter._TIME_to_python.<locals>.conv0rX   c                   s0   t | d  d  }t|tjjd d S )Nr   rm   r!   )r'   r   r   r   r   rI   r   )rh   rp   r   rM   rN   r   N  s   z0SnowflakeConverter._TIME_to_python.<locals>.convrm   N)rh   r)   rF   r   )rh   r)   rF   rX   rM   )r   ri   r   r   rM   r   rN   _TIME_to_pythonC  s   
z"SnowflakeConverter._TIME_to_python
Any | Nonec                 C  r   ra   rM   r   rM   rM   rN   _VARIANT_to_pythonX  r   z%SnowflakeConverter._VARIANT_to_pythonc                 C  r   )Nc                 S  rx   ra   )jsonloadsvrM   rM   rN   r   `  s   
 z6SnowflakeConverter._VECTOR_to_python.<locals>.<lambda>rM   r   rM   rM   rN   _VECTOR_to_python_     z$SnowflakeConverter._VECTOR_to_pythonc                 C  r   )Nc                 S  s   | dv S )N)1TRUErM   r   rM   rM   rN   r   e  s    z7SnowflakeConverter._BOOLEAN_to_python.<locals>.<lambda>rM   r   rM   rM   rN   _BOOLEAN_to_pythonb     z%SnowflakeConverter._BOOLEAN_to_pythonc                 C  r   )Nc                 S  s   t t| S ra   )r   r#   r   rM   rM   rN   r   h  s    zCSnowflakeConverter._INTERVAL_YEAR_MONTH_to_python.<locals>.<lambda>rM   r   rM   rM   rN   _INTERVAL_YEAR_MONTH_to_pythong  r   z1SnowflakeConverter._INTERVAL_YEAR_MONTH_to_pythonc                 C  r   )Nc                 S  r   )NMr   timedelta64r#   r   rM   rM   rN   r   k  r   zISnowflakeConverter._INTERVAL_YEAR_MONTH_numpy_to_python.<locals>.<lambda>rM   r   rM   rM   rN   $_INTERVAL_YEAR_MONTH_numpy_to_pythonj  r   z7SnowflakeConverter._INTERVAL_YEAR_MONTH_numpy_to_pythonc                 C  r   )Nc                 S  s   t t| d dS )Ni  rp   )r   r#   r   rM   rM   rN   r   p  s    zASnowflakeConverter._INTERVAL_DAY_TIME_to_python.<locals>.<lambda>rM   r   rM   rM   rN   _INTERVAL_DAY_TIME_to_pythonm  r   z/SnowflakeConverter._INTERVAL_DAY_TIME_to_pythonc                 C  s$   |d d@ }|dkrdd S dd S )N	precision      c                 S  s   t t| d dS )Ni@B msr   r   rM   rM   rN   r   z  s    zGSnowflakeConverter._INTERVAL_DAY_TIME_numpy_to_python.<locals>.<lambda>c                 S  r   )Nr   r   r   rM   rM   rN   r   {  r   rM   )r   ri   lfprM   rM   rN   "_INTERVAL_DAY_TIME_numpy_to_pythonr  s   z5SnowflakeConverter._INTERVAL_DAY_TIME_numpy_to_python
str | Nonec                 C  s   |j j }t|S )zRReturns Snowflake data type for the value. This is used for qmark parameter style.)	__class____name__lowerPYTHON_TO_SNOWFLAKE_TYPEr   r   rh   r   rM   rM   rN   snowflake_type}  s   
z!SnowflakeConverter.snowflake_typer  c                 C  s$   |j j }t| d| d||S )zConverts Python data to snowflake data for qmark and numeric parameter style.

        The output is bound in a query in the server side.
        r   _to_snowflake_bindingsr  r  r  r   )r   r  rh   r   rM   rM   rN   to_snowflake_bindings  s   z(SnowflakeConverter.to_snowflake_bindingsc                 C     t |S ra   r)   r   r   rh   rM   rM   rN   _str_to_snowflake_bindings     z-SnowflakeConverter._str_to_snowflake_bindingsr   c                 C  s    t |}t|dk r|S t|S )Nl    `'r)rf   r#   rg   )r   rh   millisecondsrM   rM   rN   -_date_to_snowflake_bindings_in_bulk_insertion  s   z@SnowflakeConverter._date_to_snowflake_bindings_in_bulk_insertionr,   c                 C  s   t |dS )Nzutf-8)binasciihexlifydecoder  rM   rM   rN   _bytes_to_snowflake_bindings  s   z/SnowflakeConverter._bytes_to_snowflake_bindingsr/   c                 C  s   t | S ra   )r)   r  r  rM   rM   rN   _bool_to_snowflake_bindings  r   z.SnowflakeConverter._bool_to_snowflake_bindingsc                 G  r   ra   rM   r   rM   rM   rN   _nonetype_to_snowflake_bindings  r   z2SnowflakeConverter._nonetype_to_snowflake_bindingsc                 C  r  ra   )rf   r  rM   rM   rN   _date_to_snowflake_bindings  r   z.SnowflakeConverter._date_to_snowflake_bindingsrX   c                 C  r  ra   )r`   r  rM   rM   rN   _time_to_snowflake_bindings  r  z.SnowflakeConverter._time_to_snowflake_bindingsr   c                 C  sx   |  }|dkr| |\}}t|S |dkrt|S |dkr3| j|dd\}}t|dt| S td|td)	NTIMESTAMP_LTZr3   TIMESTAMP_TZT)is_utcz {:04d}zEBinding datetime object with Snowflake data type {} is not supported.msgerrno)upper_derive_offset_timestamprU   formatr#   r   r   )r   r  rh   r   r   offsetrM   rM   rN   _datetime_to_snowflake_bindings  s    
z2SnowflakeConverter._datetime_to_snowflake_bindingsFr   tuple[float, datetime]c                 C  sb   |j }|du r|s|  ntj}tjj|dd|}n|}||jdd	 d d }||fS )z:Derives TZ offset and timestamp from the datetime objects.NFr   r!   rZ   r   )
r   r   rH   r   r   r   rG   	utcoffsetrI   rK   )r   rh   r   r   r   r'  rM   rM   rN   r%    s   z+SnowflakeConverter._derive_offset_timestamptime.struct_timec                 C  s   |  |tt|S ra   )r(  r   r   r   mktime)r   r  rh   rM   rM   rN   "_struct_time_to_snowflake_bindings  s   z5SnowflakeConverter._struct_time_to_snowflake_bindingsr   c                 C  st   |  }|dkrtd|tdt|jd\}}t|d\}}||jd 7 }t|d |d  | |jd d S )	Nr6   zFBinding timedelta object with Snowflake data type {} is not supported.r!  rY   rZ      r[   rS   )	r$  r   r&  r   divmodr    daysr)   rp   )r   r  rh   hoursrminssecsrM   rM   rN    _timedelta_to_snowflake_bindings  s   $z3SnowflakeConverter._timedelta_to_snowflake_bindingsc                 C  s"   |j j }t| d| d|S )zConverts Python data to Snowflake data for pyformat/format style.

        The output is bound in a query in the client side.
        r   _to_snowflaker  r
  rM   rM   rN   to_snowflake  s   zSnowflakeConverter.to_snowflaker#   c                 C     t |S ra   )r#   r   rh   rM   rM   rN   _int_to_snowflake  r   z$SnowflakeConverter._int_to_snowflakec                 C  r8  ra   )r%   r9  rM   rM   rN   _long_to_snowflake  r   z%SnowflakeConverter._long_to_snowflaker'   c                 C  r8  ra   r   r9  rM   rM   rN   _float_to_snowflake  r   z&SnowflakeConverter._float_to_snowflakec                 C  r8  ra   r  r9  rM   rM   rN   _str_to_snowflake  r   z$SnowflakeConverter._str_to_snowflakec                 C  r8  ra   )r   r9  rM   rM   rN   _bytes_to_snowflake
  r   z&SnowflakeConverter._bytes_to_snowflakebool | bool_c                 C  r8  ra   r/   r9  rM   rM   rN   _bool_to_snowflake  r   z%SnowflakeConverter._bool_to_snowflakec                 C  r8  ra   r@  r9  rM   rM   rN   _bool__to_snowflake  r   z&SnowflakeConverter._bool__to_snowflakec                 C  r   ra   rM   r   rM   rM   rN   _nonetype_to_snowflake  r   z)SnowflakeConverter._nonetype_to_snowflaketdc                 C  r8  ra   r   )r   rD  rM   rM   rN   _total_seconds_from_timedelta  r   z0SnowflakeConverter._total_seconds_from_timedeltac                 C  s"  |j }|rjtj|kr$z||}W n tjjy#   |j|dd}Y nw t}|tkr,dnd}t|}tt	|d d\}}|j
rVdj|j|j|j|j|j|j|j
|||d
S dj|j|j|j|j|j|j|||d		S |j
rd
j|j|j|j|j|j|j|j
dS dj|j|j|j|j|j|jdS )NFr   +rs   rZ   zn{year:d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}.{microsecond:06d}{sign}{tzh:02d}:{tzm:02d})
r   r   r   r\   r]   r^   r_   signtzhtzmz\{year:d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}{sign}{tzh:02d}:{tzm:02d})	r   r   r   r\   r]   r^   rG  rH  rI  zU{year:d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}.{microsecond:06d})r   r   r   r\   r]   r^   r_   zC{year:d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d})r   r   r   r\   r]   r^   )r   rH   r   r*  r   AmbiguousTimeErrorZERO_TIMEDELTAr   r/  absr_   r&  r   r   r   r\   r]   r^   )r   rh   r   rD  rG  td_secshmrM   rM   rN   _datetime_to_snowflake  st   
z)SnowflakeConverter._datetime_to_snowflakec                 C  s   dj |j|j|jdS )z)Converts Date object to Snowflake object.z{year:d}-{month:02d}-{day:02d})r   r   r   )r&  r   r   r   r9  rM   rM   rN   _date_to_snowflakeb  s   z%SnowflakeConverter._date_to_snowflakec                 C  s    |j r|d|j  S |dS )Nz%H:%M:%S.%%06dz%H:%M:%S)r_   strftimer9  rM   rM   rN   _time_to_snowflakeh  s   
z%SnowflakeConverter._time_to_snowflakec                 C  sL   t tjd }tt|}tj|kr|||7 }|j	|d}| 
|S )NrZ   r!   )rz   r   r   r   r   r,  rH   r   r*  rI   rP  )r   rh   r   r   rM   rM   rN   _struct_time_to_snowflakem  s   

z,SnowflakeConverter._struct_time_to_snowflakec                 C  sV   t |jd\}}t |d\}}||jd 7 }|jr#dj||||jdS dj|||dS )NrY   rZ   r.  z6{hour:02d}:{minute:02d}:{second:02d}.{microsecond:06d})r\   r]   r^   r_   z${hour:02d}:{minute:02d}:{second:02d})r\   r]   r^   )r/  r    r0  rp   r&  )r   rh   r1  r2  r3  r4  rM   rM   rN   _timedelta_to_snowflakeu  s   
z*SnowflakeConverter._timedelta_to_snowflakedecimal.Decimalc                 C  s   t |tjr
t|S d S ra   )
isinstancer&   r   r)   r9  rM   rM   rN   _decimal_to_snowflake  s   z(SnowflakeConverter._decimal_to_snowflaker7   c                 C  s   dd dd |D D S )Nc                 S     g | ]}t |qS rM   )r{   quote).0v0rM   rM   rN   
<listcomp>  s    z9SnowflakeConverter._list_to_snowflake.<locals>.<listcomp>c                 S  rY  rM   )r{   escape)r[  r   rM   rM   rN   r]    s    rM   r9  rM   rM   rN   _list_to_snowflake  s   z%SnowflakeConverter._list_to_snowflakec                 C  s   |S ra   rM   r9  rM   rM   rN   __numpy_to_snowflake  r   z'SnowflakeConverter.__numpy_to_snowflakec                 C  r8  ra   r   r9  rM   rM   rN   _float16_to_snowflake  r   z(SnowflakeConverter._float16_to_snowflakec                 C  s   t |d S )Nz+00:00r  r9  rM   rM   rN   _datetime64_to_snowflake  r   z+SnowflakeConverter._datetime64_to_snowflakec                 C  r8  ra   r  r9  rM   rM   rN   _quoted_name_to_snowflake  r   z,SnowflakeConverter._quoted_name_to_snowflakeitemr   c                 C  sb   | drtd|d|d td| dr*td|d|d tdtd| )Nr6  z+Binding data in type ({}) is not supported.r   r!  r  r  zNo method is available: )endswithr   r&  findr   r   )r   rd  rM   rM   rN   __getattr__  s   

zSnowflakeConverter.__getattr__tuple[str, Any] | Anyc                 C  s   t |tr2t|dkr2|\}}|dv r+t|dddu r%| tj|}n5| |}n/| ||}n(t |t	t
fr?| |}nt |trOt |tsO| |}n| |}| ||}| |S )zNConvert value to a string representation in CSV-escaped format to INSERT INTO.   )r  r6   r   r   N)rW  r8   lenr   r7  rH   r   r   r  rX   r   r   r   r  r  escape_for_csv)r   rh   _typevalrM   rM   rN   to_csv_bindings  s   

z"SnowflakeConverter.to_csv_bindingsc                 C  sb   t | tr| S | d u st| st| r| S | }|dd}|dd}|dd}|dd}|S )	N\z\\
z\nz\r'z\')rW  r7   r   r   rI   )rh   resrM   rM   rN   r^    s   
zSnowflakeConverter.escapec                 C  sn   t | tr
d| S | d u rdS t | tr| rdS dS t| r%tt| S t| r1d| 	dS d|  dS )N,NULLr   FALSEzX'{}'asciirr  )
rW  r7   joinr/   r   r)   reprr   r&  r  r   rM   rM   rN   rZ    s   


zSnowflakeConverter.quotec                 C  sh   | d u rdS | s
dS |  ddks&|  ddks&|  ddks&|  ddkr2| dd} d|  dS | S )NrR   z"""r   rp  rt  ro  )rf  rI   r   rM   rM   rN   rk    s   z!SnowflakeConverter.escape_for_csvrl   tuple[int, int]c                 C  s   | d dk}|  d\}}}t|}|rt|nd}|dk r'|dd|  9 }n|dkr@|r8t|d|d   }n|d|d   }|rE| }||fS )a  Calculate the second and microsecond parts og a timestamp given as a string.

        The trick is that we always want to do floor division, but if the timestamp
        is negative then it is given as its inverse. So -0.000_000_009
        (which is 1969-12-31-23:59:59.999999991) should round down to 6
        fraction figures as Python doesn't support sub-microseconds.
        Ultimately for the aforementioned example we should return two integers 0 and -000_001.
        r   rs   rQ   rm   r   )	partitionr#   r   )rh   rl   negativelhsr   rhsr    rp   rM   rM   rN   get_seconds_microseconds  s   z+SnowflakeConverter.get_seconds_microsecondsNr   tzinfo | Nonec                 C  sN   t j| |d\}}|st|tjjd dt|d S tj||dt|d S )N)rh   rl   r!   r   )r   )r{   r  r   r   r   r   rI   r   )rh   rl   r   r    fractionrM   rM   rN   r     s   
z/SnowflakeConverter.create_timestamp_from_string)rF   r|   )r   rj   rF   r|   )r   r   rh   r   rF   r|   )rF   r   )r   r)   rF   r   )rF   r   )ri   r   rF   r   )r   r   rF   r   )rF   r   )r   r   rF   r|   )r   r   rF   r   )rF   r   )rF   r   )r   r   rF   r   )ri   r   rF   r   )rh   r   rF   r  )r  r)   rh   r   rF   r)   )rh   r)   rF   r)   )rh   r   rF   r)   )rh   r,   rF   r)   )rh   r/   rF   r)   )rh   rX   rF   r)   )r  r)   rh   r   rF   r)   )F)rh   r   r   r/   rF   r)  )r  r)   rh   r+  rF   r)   )r  r)   rh   r   rF   r)   )rh   r   rF   r   )rh   r#   rF   r#   )rh   r'   rF   r'   )rh   r,   rF   r,   )rh   r?  rF   r/   )rF   r/   )r   r   rF   r   )rD  r   rF   r#   )rh   r   rF   r)   )rh   r+  rF   r)   )rh   r   rF   r)   )rh   rV  rF   r  )rh   r7   rF   r7   )rF   r)   )rd  r)   rF   r   )rh   rh  rF   r  )rh   r)   rl   r#   rF   r{  ra   )rh   r)   rl   r#   r   r  rF   r   )ar  
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   _TIMESTAMP_to_pythonr   r   r   r   _OBJECT_to_python_ARRAY_to_pythonr   r   r   r   r   r  r  r  r  r  _int_to_snowflake_bindings_long_to_snowflake_bindings_float_to_snowflake_bindings_unicode_to_snowflake_bindings_decimal_to_snowflake_bindingsr   _bytearray_to_snowflake_bindingsr  r  r  r  r(  r%  r-  r5  r7  r:  r;  r<  r=  _unicode_to_snowflaker>  _bytearray_to_snowflakerA  rB  rC  rE  rP  rQ  rS  rT  rU  rX  r_  _tuple_to_snowflake'_SnowflakeConverter__numpy_to_snowflakera  _int8_to_snowflake_int16_to_snowflake_int32_to_snowflake_int64_to_snowflake_uint8_to_snowflake_uint16_to_snowflake_uint32_to_snowflake_uint64_to_snowflake_float32_to_snowflake_float64_to_snowflakerb  rc  rg  rn  staticmethodr^  rZ  rk  r  r   rM   rM   rM   rN   r{      s    





















	






























G








r{   )rE   r   rF   r'   )rE   r   rF   r)   )rW   rX   rF   r)   )rE   r   rF   r)   )rh   r)   ri   rj   rF   rk   )rh   r)   rn   r#   rl   r#   rF   r#   )rw   r#   rF   r   )C
__future__r   r  r&   r   r   r   r   rX   r   r   r   	functoolsr	   loggingr
   mathr   r   typingr   r   r   r   rH   r   compatr   r   	errorcoder   errorsr   interval_utilr   sfbinaryformatr   r   r4   r   r   r   r   ImportErrorr   BITS_FOR_TIMEZONErK  rb   r   r   rI   rJ   ru   r  r   r	  r   rO   rU   r`   rc   rf   rg   rr   ro   rz   r{   rM   rM   rM   rN   <module>   s   
	
$








