
    ɯeiq                       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rd dl(m)Z)m*Z* 	 d dl(Z(	 d dl,Z,dZ- e	d       Z. eddd      Z/ ej`                  d e
jb                        je                  d      Z3dZ4 e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   Z8d?d4Z9d@d5Z:dAd6Z;dBd7Z<dBd8Z=dBd9Z>dCd:Z?dDd;Z@dEd<ZA G d= d>      ZBy# e+$ r dZ(Y w xY w# e+$ r dZ,Y w xY w)F    )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_namec                    | j                   0| j                  t        j                        j	                  d      }n| }|t
        z
  j                         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)dtdt0s     _/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/connector/converter.pyconvert_datetime_to_epochrO   V   sG    
 
yymmDHH%--T-:*++--    c                B    t        |       dj                  dd      dz   S )Nf. 000)rO   rI   rL   s    rN   &_convert_datetime_to_epoch_nanosecondsrW   b   s$    '+A.77R@5HHrP   c                    t        | j                  dz  | j                  dz  z   | j                  z         | j                  dz   dz   S )N  <   06drU   )r*   hourminutesecondmicrosecond)tms    rN   "_convert_time_to_epoch_nanosecondsra   f   sF    BGGdNRYY^+bii78^^C 	"
	rP   c                D    t        | t        z
  j                                S N)r$   ZERO_EPOCH_DATErK   rV   s    rN   _convert_date_to_epoch_secondsre   n   s    2'6689:;rP   c                T    | t         z
  j                         dj                  dd      S )Nz.3frS   rT   rd   rK   rI   rV   s    rN   #_convert_date_to_epoch_millisecondsrh   r   (    O#224S9BB3KKrP   c                T    | t         z
  j                         dj                  dd      S )Nz.9frS   rT   rg   rV   s    rN   "_convert_date_to_epoch_nanosecondsrk   v   ri   rP   c                x    |d   }|dkD  rt        | d| dz          n
t        |       }t        | |d   |      }||fS )z#Extracts timestamp from a raw data.scale   r   max_fraction)r(   _adjust_fraction_of_nanoseconds)valuectxrm   microsecondsfraction_of_nanosecondss        rN   _extract_timestampru   z   sS    LE38195qE6A:./%,L=s>"E 000rP   c                    |dk(  ry| d   dk7  rt        | | d  t        d d|z
   z         S t        | | d        }|dk(  ryt        t        ||z
        t        d d|z
   z         S )Nr   -	   )r$   	ZERO_FILLr*   )rq   ro   rm   fracs       rN   rp   rp      s{    zQx35%>IkE	$::;;ueVW~Dqy3|d*+i!e).DDEErP   c                ,    t        j                  |       S )z&Generates tzinfo object from tzoffset.)rH   FixedOffset)tzoffset_minutess    rN   _generate_tzinfo_from_tzoffsetr~      s    ,--rP   c                  "   e Zd ZdIdZdJdZdKdZdLdZdMdZdNdZdOdZ	dOdZ
dOd	ZdOd
ZdPdZdQdZdRdZdQdZdSdZdQdZdOdZdTdZ	 	 dUdZdOdZeZdOdZd ZdOdZdVdZeZeZdOdZ	 	 	 	 dWdZdOdZ dOdZ!dOdZ"dOdZ#dXdZ$dYd Z%dZd!Z&d[d"Z'e&Z(e&Z)e&Z*e&Z+e&Z,d\d#Z-e-Z.d]d$Z/dId%Z0d[d&Z1d^d'Z2	 	 	 	 	 	 d_d(Z3	 d`	 	 	 	 	 dad)Z4	 	 	 	 	 	 dbd*Z5	 	 	 	 	 	 dcd+Z6ddd,Z7ded-Z8d. Z9dfd/Z:dZd0Z;e;Z<dgd1Z=e=Z>dhd2Z?did3Z@djd4ZAdkd5ZBdld6ZCd[d7ZDd^d8ZEdmd9ZFdnd:ZGdod;ZHdpd<ZIeIZJd= ZKd> ZLeKZMeKZNeKZOeKZPeKZQeKZReKZSeKZTeLZUeLZVdqd?ZWdqd@ZXdrdAZYdsdBZZe[dddC       Z\e[dqdD       Z]e[dZdE       Z^e[	 	 	 	 	 	 dtdF       Z_e[	 du	 	 	 	 	 	 	 dvdH       Z`yG)wSnowflakeConverterc                    i | _         |j                  dd      xr t        d u| _        t        j                  d| j                         y )N	use_numpyFzuse_numpy: %s)_parametersgetnumpy
_use_numpyloggerdebug)selfkwargss     rN   __init__zSnowflakeConverter.__init__   s8    8: **[%8NU$=N_doo6rP   c                    || _         y rc   r   )r   new_parameterss     rN   set_parametersz!SnowflakeConverter.set_parameters   s
    )rP   c                "    || j                   |<   y rc   r   )r   paramrq   s      rN   set_parameterz SnowflakeConverter.set_parameter   s    "'rP   c                    | j                   S rc   r   )r   s    rN   get_parametersz!SnowflakeConverter.get_parameters   s    rP   c                8    | j                   j                  |      S rc   )r   r   )r   r   s     rN   get_parameterz SnowflakeConverter.get_parameter   s    ##E**rP   c                \   |j                         }|j                  d      "t        d|d   z        |d<   dd|d   z
  z  |d<   d| d	g}| j                  r|j	                  d
d| d       |D ]  }	  t        | |      |      c S  t        j                  d|       y# t        $ r Y ;w xY w)z FROM Snowflake to Python Objectsrm   N
   ro   0rx   	zero_fill_
_to_pythonr   _numpy_to_pythonz&No column converter found for type: %s)	copyr   r$   r   insertgetattrAttributeErrorr   warning)r   	type_namecolumnrr   
convertersconvs         rN   to_python_methodz#SnowflakeConverter.to_python_method   s    kkm777'"%bCL&8"9C"a#g,&67C)J/0
??a1YK/?!@A 	D*wtT*3//	
 	?K " s   3B	B+*B+c                >    |d   dk(  rt         S t        j                  S )Nrm   r   )r$   r'   Decimalr   rr   s     rN   _FIXED_to_pythonz#SnowflakeConverter._FIXED_to_python   s    'la's<W__<rP   c                8    |d   rt         j                  S dd}|S )Nrm   c                b    	 t        j                  |       S # t        $ r t        |       cY S w xY wrc   )r   r   OverflowErrorr$   rq   s    rN   r   z7SnowflakeConverter._FIXED_numpy_to_python.<locals>.conv   s/    & ;;u--$ &u:%&s    ..)rq   r*   returnr   r   rC   r   rr   r   s      rN   _FIXED_numpy_to_pythonz)SnowflakeConverter._FIXED_numpy_to_python   s    w<== & KrP   c                "    t         j                  S rc   r   r   s     rN   _DECFLOAT_numpy_to_pythonz,SnowflakeConverter._DECFLOAT_numpy_to_python       }}rP   c                "    t         j                  S rc   )r'   r   r   s     rN   _DECFLOAT_to_pythonz&SnowflakeConverter._DECFLOAT_to_python   s    rP   c                    t         S rc   r(   r   r   s     rN   _REAL_to_pythonz"SnowflakeConverter._REAL_to_python   s    rP   c                "    t         j                  S rc   r   r   s     rN   _REAL_numpy_to_pythonz(SnowflakeConverter._REAL_numpy_to_python   r   rP   c                     y rc    r   s     rN   _TEXT_to_pythonz"SnowflakeConverter._TEXT_to_python       rP   c                    t         S rc   )r   r   s     rN   _BINARY_to_pythonz$SnowflakeConverter._BINARY_to_python   s    rP   c                    dd}|S )zConverts DATE to date.c                   	 t        j                  t        |       dz  t        j                        j                  d       j                         S # t        t        f$ rj}t        j                  d|       t        t        t        |       dz        z   }t        |j                  |j                  |j                        cY d }~S d }~ww xY w)NiQ r"   zFailed to convert: %sr    )r   fromtimestampr$   r   utcrI   r   OSError
ValueErrorr   r   rJ   r   yearmonthday)rq   etss      rN   r   z0SnowflakeConverter._DATE_to_python.<locals>.conv   s    	7**3u:+=x||LWDW)TV
 Z( 74a8)CJ,4O"PPBGGRXXrvv667s   AA C	AC>C	C	)rq   r*   r   r   r   )r   r   r   s      rN   _DATE_to_pythonz"SnowflakeConverter._DATE_to_python   s    
	7 rP   c                    d S )zEConverts DATE to datetime.

        No timezone is attached.
        c                @    t        j                  t        |       d      S )ND)r   rD   r$   )xs    rN   <lambda>z:SnowflakeConverter._DATE_numpy_to_python.<locals>.<lambda>   s    ))#a&#6 rP   r   r   s     rN   _DATE_numpy_to_pythonz(SnowflakeConverter._DATE_numpy_to_python   s
    
 76rP   c                    |d   dfd}|S )zXConverts TIMESTAMP TZ to datetime.

        The timezone offset is piggybacked.
        rm   c                    | j                         \  }}t        t        |      dz
        }t        j	                  ||      S )N  )rq   rm   tz)splitr~   r$   r   create_timestamp_from_string)encoded_valuerq   r   r	   rm   s       rN   r   z8SnowflakeConverter._TIMESTAMP_TZ_to_python.<locals>.conv   sG    %++-IE23CGdNCF%BB5V C  rP   )r   r*   r   r   r   )r   rr   r   rm   s      @rN   _TIMESTAMP_TZ_to_pythonz*SnowflakeConverter._TIMESTAMP_TZ_to_python   s    
 G	 rP   c                4   	 | j                  d      }|sd}t        j                  |      S # t        j                  j                  $ rN t
        j                  d       t        t        j                         cY S t        j                  j                  cY S w xY w)z?Gets the session timezone or use the local computer's timezone.TIMEZONEr   zconverting to tzinfo failed)r   rH   r   
exceptionsUnknownTimeZoneErrorr   r   tzlocalget_localzoner   r   )r   r   s     rN   _get_session_tzz"SnowflakeConverter._get_session_tz  s{    
	-##J/B==$$33 	-NN89",,..((,,,	-s   ), AB:BBc                F   t        ||      \  }}| j                         }	 t        t        |      z   }t        j
                  j                  |d      j                  |      }||fS # t        $ r/ t        j                  d       t        j                  |      |fcY S w xY 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.)ru   r   rJ   r   rH   r   localizerG   r   r   r   r   	localtime)r   rq   rr   rs   rt   tzinfo_valuet0ts           rN   _pre_TIMESTAMP_LTZ_to_pythonz/SnowflakeConverter._pre_TIMESTAMP_LTZ_to_python  s     1C5#0N--++-		Ii==B!!"U!3>>|LA--- 	ILLJ >>,/1HHH	Is   AA( (5B B c                d    | j                         }|d   }t        t        j                  ||      S )Nrm   )rm   r   )r   r
   r   r   )r   rr   r	   rm   s       rN   _TIMESTAMP_LTZ_to_pythonz+SnowflakeConverter._TIMESTAMP_LTZ_to_python*  s3    %%'G;;5V
 	
rP   c                B    |d   }t        t        j                  |      S )z<TIMESTAMP NTZ to datetime with no timezone info is attached.rm   )rm   )r
   r   r   )r   rr   rm   s      rN   _TIMESTAMP_NTZ_to_pythonz+SnowflakeConverter._TIMESTAMP_NTZ_to_python4  s    G)FFeTTrP   c                    dd}|S )z>TIMESTAMP NTZ to datetime64 with no timezone info is attached.c                    t        t        j                  |       j                  d            }t	        j
                  |d      S )Nrx   ns)r$   r'   r   scalebr   rD   )rq   nanosecondss     rN   r   z?SnowflakeConverter._TIMESTAMP_NTZ_numpy_to_python.<locals>.conv=  s3    gooe4;;A>?K##K66rP   )rq   r*   r   znumpy.datetime64r   r   s      rN   _TIMESTAMP_NTZ_numpy_to_pythonz1SnowflakeConverter._TIMESTAMP_NTZ_numpy_to_python:  s    	7 rP   c                4    |d   dd}dfd}dkD  r|S |S )zXTIME to formatted string, SnowflakeDateTime, or datetime.time with no timezone attached.rm   c                    t        j                  t        |       t        j                        j                  d       j                         S )Nr"   )r   r   r(   r   r   rI   r   r   s    rN   conv0z1SnowflakeConverter._TIME_to_python.<locals>.conv0G  s2    &&uU|X\\B%rP   c                    t        | d dz          }t        j                  |t        j                        j                  d       j                         S )Nr   rn   r"   )r(   r   r   r   r   rI   r   )rq   rs   rm   s     rN   r   z0SnowflakeConverter._TIME_to_python.<locals>.convN  sF     qE6A:!67L&&|X\\B%rP   rn   )rq   r*   r   r   )rq   r*   r   dt_tr   )r   rr   r   r   rm   s       @rN   _TIME_to_pythonz"SnowflakeConverter._TIME_to_pythonC  s)    G		 qyt+e+rP   c                     y rc   r   r   s     rN   _VARIANT_to_pythonz%SnowflakeConverter._VARIANT_to_pythonX  r   rP   c                    d S )Nc                ,    t        j                  |       S rc   )jsonloadsvs    rN   r   z6SnowflakeConverter._VECTOR_to_python.<locals>.<lambda>`  s    A rP   r   r   s     rN   _VECTOR_to_pythonz$SnowflakeConverter._VECTOR_to_python_  s    &&rP   c                    d S )Nc                
    | dv S )N)1TRUEr   r   s    rN   r   z7SnowflakeConverter._BOOLEAN_to_python.<locals>.<lambda>e  s    Um3 rP   r   r   s     rN   _BOOLEAN_to_pythonz%SnowflakeConverter._BOOLEAN_to_pythonb  s
     43rP   c                    d S )Nc                *    t        t        |             S rc   )r   r$   r  s    rN   r   zCSnowflakeConverter._INTERVAL_YEAR_MONTH_to_python.<locals>.<lambda>h  s    6s1v> rP   r   r   s     rN   _INTERVAL_YEAR_MONTH_to_pythonz1SnowflakeConverter._INTERVAL_YEAR_MONTH_to_pythong  s    >>rP   c                    d S )Nc                @    t        j                  t        |       d      S )NMr   timedelta64r$   r  s    rN   r   zISnowflakeConverter._INTERVAL_YEAR_MONTH_numpy_to_python.<locals>.<lambda>k  s    **3q637 rP   r   r   s     rN   $_INTERVAL_YEAR_MONTH_numpy_to_pythonz7SnowflakeConverter._INTERVAL_YEAR_MONTH_numpy_to_pythonj  s    77rP   c                    d S )Nc                2    t        t        |       dz        S )Ni  rs   )r   r$   r  s    rN   r   zASnowflakeConverter._INTERVAL_DAY_TIME_to_python.<locals>.<lambda>p  s    A$? rP   r   r   s     rN   _INTERVAL_DAY_TIME_to_pythonz/SnowflakeConverter._INTERVAL_DAY_TIME_to_pythonm  s     @?rP   c                (    |d   dz  }|dkD  rd S d S )N	precision      c                F    t        j                  t        |       dz  d      S )Ni@B msr  r  s    rN   r   zGSnowflakeConverter._INTERVAL_DAY_TIME_numpy_to_python.<locals>.<lambda>z  s    U..s1v/BDI rP   c                @    t        j                  t        |       d      S )Nr   r  r  s    rN   r   zGSnowflakeConverter._INTERVAL_DAY_TIME_numpy_to_python.<locals>.<lambda>{  s    **3q648 rP   r   )r   rr   lfps      rN   "_INTERVAL_DAY_TIME_numpy_to_pythonz5SnowflakeConverter._INTERVAL_DAY_TIME_numpy_to_pythonr  s(     +% 7II88rP   c                t    |j                   j                  j                         }t        j	                  |      S )zRReturns Snowflake data type for the value. This is used for qmark parameter style.)	__class____name__lowerPYTHON_TO_SNOWFLAKE_TYPEr   r   rq   r   s      rN   snowflake_typez!SnowflakeConverter.snowflake_type}  s+    OO,,224	'++I66rP   c                x    |j                   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)  rq   r   s       rN   to_snowflake_bindingsz(SnowflakeConverter.to_snowflake_bindings  sA    
 OO,,224	Cwtq+ABCE
 	
rP   c                    t        |      S rc   r*   r   r   rq   s      rN   _str_to_snowflake_bindingsz-SnowflakeConverter._str_to_snowflake_bindings  s    5zrP   c                N    t        |      }t        |      dk  r|S t        |      S )Nl    `'r)rh   r$   rk   )r   rq   millisecondss      rN   -_date_to_snowflake_bindings_in_bulk_insertionz@SnowflakeConverter._date_to_snowflake_bindings_in_bulk_insertion  s,    :5A |~-1%88rP   c                J    t        j                  |      j                  d      S )Nzutf-8)binasciihexlifydecoder0  s      rN   _bytes_to_snowflake_bindingsz/SnowflakeConverter._bytes_to_snowflake_bindings  s    &--g66rP   c                4    t        |      j                         S rc   )r*   r&  r0  s      rN   _bool_to_snowflake_bindingsz.SnowflakeConverter._bool_to_snowflake_bindings  s    5z!!rP   c                     y rc   r   r   s     rN   _nonetype_to_snowflake_bindingsz2SnowflakeConverter._nonetype_to_snowflake_bindings  r   rP   c                    t        |      S rc   )rh   r0  s      rN   _date_to_snowflake_bindingsz.SnowflakeConverter._date_to_snowflake_bindings  s     3599rP   c                    t        |      S rc   )ra   r0  s      rN   _time_to_snowflake_bindingsz.SnowflakeConverter._time_to_snowflake_bindings  s    1%88rP   c                L   |j                         }|dk(  r| j                  |      \  }}t        |      S |dk(  rt        |      S |dk(  r<| j                  |d      \  }}t        |      dj                  t	        |            z   S t        dj                  |      t              )	NTIMESTAMP_LTZr4   TIMESTAMP_TZT)is_utcz {:04d}zEBinding datetime object with Snowflake data type {} is not supported.msgerrno)upper_derive_offset_timestamprW   formatr$   r   r   )r   r)  rq   r   r   offsets         rN   _datetime_to_snowflake_bindingsz2SnowflakeConverter._datetime_to_snowflake_bindings  s     (--/_,007DAq9!<<.9%@@~-55eD5IIFA9!<y?O?OF@   #!!'!7. rP   c                <   |j                   }|S|s| j                         nt        j                  }t        j                  j                  |d      j                  |      }n|} |j                  |j                  d            j                         dz  dz   }||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   rq   rE  r	   r   rL  s         rN   rJ  z+SnowflakeConverter._derive_offset_timestamp  s     >39T))+txxF!!%!6AA&IA A!!!!))4)"89GGIBNQUUqyrP   c                r    | j                  |t        j                  t        j                  |                  S rc   )rM  r   r   r   mktime)r   r)  rq   s      rN   "_struct_time_to_snowflake_bindingsz5SnowflakeConverter._struct_time_to_snowflake_bindings  s0     33H224;;u3EF
 	
rP   c                2   |j                         }|dk7  r t        dj                  |      t              t	        |j
                  d      \  }}t	        |d      \  }}||j                  dz  z  }t        |dz  |dz  z   |z         |j                  dz   dz   S )	Nr7   zFBinding timedelta object with Snowflake data type {} is not supported.rF  rY   rZ      r[   rU   )	rI  r   rK  r   divmodr!   daysr*   rs   )r   r)  rq   hoursrminssecss          rN    _timedelta_to_snowflake_bindingsz3SnowflakeConverter._timedelta_to_snowflake_bindings  s     (--/V#"!!'!7. 
 EMM40
a}tb tby(4/0e6H6H5MNQVV	
rP   c                v    |j                   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(  s      rN   to_snowflakezSnowflakeConverter.to_snowflake  s9    
 OO,,224	:wtq=9:5AArP   c                    t        |      S rc   )r$   r   rq   s     rN   _int_to_snowflakez$SnowflakeConverter._int_to_snowflake      5zrP   c                    t        |      S rc   )r&   r`  s     rN   _long_to_snowflakez%SnowflakeConverter._long_to_snowflake      E{rP   c                    t        |      S rc   r   r`  s     rN   _float_to_snowflakez&SnowflakeConverter._float_to_snowflake      U|rP   c                    t        |      S rc   r/  r`  s     rN   _str_to_snowflakez$SnowflakeConverter._str_to_snowflake  rb  rP   c                    t        |      S rc   )r   r`  s     rN   _bytes_to_snowflakez&SnowflakeConverter._bytes_to_snowflake
  s    "5))rP   c                    t        |      S rc   r0   r`  s     rN   _bool_to_snowflakez%SnowflakeConverter._bool_to_snowflake  re  rP   c                    t        |      S rc   rn  r`  s     rN   _bool__to_snowflakez&SnowflakeConverter._bool__to_snowflake  re  rP   c                     y rc   r   r   s     rN   _nonetype_to_snowflakez)SnowflakeConverter._nonetype_to_snowflake  r   rP   c                    t        |      S rc   r   )r   tds     rN   _total_seconds_from_timedeltaz0SnowflakeConverter._total_seconds_from_timedelta  s    6r::rP   c                L   |j                   }|r"t        j                  |k7  r	 |j                  |      }nt        }|t        k\  rdnd}t        |      }t        t        |dz        d      \  }}|j                  radj                  |j                  |j                  |j                  |j                  |j                   |j"                  |j                  |||
      S dj                  |j                  |j                  |j                  |j                  |j                   |j"                  |||		      S |j                  r^d
j                  |j                  |j                  |j                  |j                  |j                   |j"                  |j                        S dj                  |j                  |j                  |j                  |j                  |j                   |j"                        S # t        j                  j
                  $ r |j                  |d      }Y w xY w)NFr   +rw   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^   ry  rz  r{  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   rO  r   AmbiguousTimeErrorZERO_TIMEDELTAr   rU  absr_   rK  r   r   r   r\   r]   r^   )r   rq   r   ru  ry  td_secshms           rN   _datetime_to_snowflakez)SnowflakeConverter._datetime_to_snowflake  s   ||xx<'E%//6B $.3CD=bAG#gm,b1DAq  A &++		 << << % 1 1  	", fZZkkIIZZ||||  
	    ( &++		 << << % 1 1  	 YfZZkkIIZZ||||  	m 99 E%//e/DBEs   G/ /0H#"H#c                f    dj                  |j                  |j                  |j                        S )z)Converts Date object to Snowflake object.z{year:d}-{month:02d}-{day:02d})r   r   r   )rK  r   r   r   r`  s     rN   _date_to_snowflakez%SnowflakeConverter._date_to_snowflakeb  s-    /665;;EII 7 
 	
rP   c                x    |j                   r|j                  d      |j                   z  S |j                  d      S )Nz%H:%M:%S.%%06dz%H:%M:%S)r_   strftimer`  s     rN   _time_to_snowflakez%SnowflakeConverter._time_to_snowflakeh  s5    >>"23e6G6GGG~~j))rP   c                   t        t        j                  dz        }t        j                  t        j
                  |            }t        j                  |k7  r||j                  |      z  }|j                  |      }| j                  |      S )NrZ   r"   )r~   r   r   r   r   rQ  rH   r   rO  rI   r  )r   rq   r   r   s       rN   _struct_time_to_snowflakez,SnowflakeConverter._struct_time_to_snowflakem  sp    5dmmr6IJ""4;;u#5688|#''**AII\I***1--rP   c                    t        |j                  d      \  }}t        |d      \  }}||j                  dz  z  }|j                  rdj	                  ||||j                        S dj	                  |||      S )NrY   rZ   rT  z6{hour:02d}:{minute:02d}:{second:02d}.{microsecond:06d})r\   r]   r^   r_   z${hour:02d}:{minute:02d}:{second:02d})r\   r]   r^   )rU  r!   rV  rs   rK  )r   rq   rW  rX  rY  rZ  s         rN   _timedelta_to_snowflakez*SnowflakeConverter._timedelta_to_snowflakeu  s    EMM40
a}tb OWW4%BTBT X   6<<tD = 
 	
rP   c                N    t        |t        j                        rt        |      S y rc   )
isinstancer'   r   r*   r`  s     rN   _decimal_to_snowflakez(SnowflakeConverter._decimal_to_snowflake  s    eW__-u:rP   c                    |D cg c]  }t         j                  |       c}D cg c]  }t         j                  |       c}S c c}w c c}w rc   )r   escapequote)r   rq   r  v0s       rN   _list_to_snowflakez%SnowflakeConverter._list_to_snowflake  sJ     >CC)003C
 $$R(
 	
C
s
   AA
c                    |S rc   r   r`  s     rN   __numpy_to_snowflakez'SnowflakeConverter.__numpy_to_snowflake  s    rP   c                    t        |      S rc   r   r`  s     rN   _float16_to_snowflakez(SnowflakeConverter._float16_to_snowflake  rh  rP   c                    t        |      dz   S )Nz+00:00r/  r`  s     rN   _datetime64_to_snowflakez+SnowflakeConverter._datetime64_to_snowflake  s    5zH$$rP   c                    t        |      S rc   r/  r`  s     rN   _quoted_name_to_snowflakez,SnowflakeConverter._quoted_name_to_snowflake  rb  rP   c           	     *   |j                  d      r2t        dj                  |d|j                  d             t              |j                  d      r2t        dj                  |d|j                  d             t              t        d|       )Nr]  z+Binding data in type ({}) is not supported.r   rF  r-  r+  zNo method is available: )endswithr   rK  findr   r   )r   items     rN   __getattr__zSnowflakeConverter.__getattr__  s    ==)"AHHTYY78 /	  ]]23"AHHTYY'?@A /	  7v>??rP   c                .   t        |t              rxt        |      dk(  rj|\  }}|dv rNt        |dd      /| j	                  t
        j                  j                  |            }n| j	                  |      }n| j                  ||      }n}t        |t        t        f      r| j	                  |      }nUt        |t              r"t        |t              s| j                  |      }n#| j                  |      }| j                  ||      }| j                  |      S )zNConvert value to a string representation in CSV-escaped format to INSERT INTO.   )rD  r7   r	   r   )r  r9   lenr   r^  rH   r   r   r-  r   r   r   r   r4  r)  escape_for_csv)r   rq   _typevals       rN   to_csv_bindingsz"SnowflakeConverter.to_csv_bindings  s    eU#E
aJE3003!,4++DHH,=,=c,BCC++C0C00<%$	!23''.E4(E81L HHO++E200>""3''rP   c                    t        | t              r| S | t        |       st        |       r| S | }|j	                  dd      }|j	                  dd      }|j	                  dd      }|j	                  dd      }|S )	N\z\\
z\nz\r'z\')r  r8   r   r   rI   )rq   ress     rN   r  zSnowflakeConverter.escape  ss    eT"L=Ju-51ALkk$'kk$&kk$&kk&*-
rP   c                   t        | t              rdj                  |       S | yt        | t              r| rdS dS t	        |       rt        t        |             S t        |       r dj                  | j                  d            S d|  dS )N,NULLr  FALSEzX'{}'asciir  )
r  r8   joinr0   r   r*   reprr   rK  r8  r   s    rN   r  zSnowflakeConverter.quote  s~    eT"88E?"=t$"6//tE{##u>>%,,w"7885'|rP   c                    | y| sy| j                  d      dk\  s<| j                  d      dk\  s(| j                  d      dk\  s| j                  d      dk\  r| j                  dd      } d|  dS | S )NrT   z"""r   r  r  r  )r  rI   r   s    rN   r  z!SnowflakeConverter.escape_for_csv  sw    =JJsOq zz$1$zz#!#zz$1$ MM#t,EugQ<LrP   c                    | d   dk(  }| j                  d      \  }}}t        |      }|rt        |      nd}|dk  r|dd|z
  z  z  }n'|dkD  r"|rt        |d|dz
  z  z        }n|d|dz
  z  z  }|r| }||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   rw   rS   rn   r   )	partitionr$   r   )rq   rm   negativelhsr   rhsr!   rs   s           rN   get_seconds_microsecondsz+SnowflakeConverter.get_seconds_microseconds  s     8s?ooc*Qc(#&s3xA19B1u9--LQY#L2%!)3D$DE+reai/@@(=L$$rP   Nc                   t         j                  | |      \  }}|sAt        j                  |t        j
                        j                  d       t        |      z   S t        j                  ||      t        |      z   S )N)rq   rm   r"   r  )r   )r   r  r   r   r   r   rI   r   )rq   rm   r   r!   fractions        rN   r   z/SnowflakeConverter.create_timestamp_from_string  s     /GGu H 
 ))'8<<@HH I x01 1 %%g"5	x8XXXrP   )r   None)r   dictr   r  )r   r   rq   r   r   r  )r   zdict[str, str | int | bool])r   r*   r   zstr | int | bool | None)r   SnowflakeConverterType)rr   dict[str, Any]r   r   )r   &dict[str, str | None] | dict[str, str]r   r   )r   r   )r   r  r   r  )r   zdict[str, str | None]r   r   )r   ztzinfo | UTC)r   z.tuple[datetime, int] | tuple[struct_time, int])r   r  r   
Any | None)rr   r  r   r   )rq   r   r   
str | None)r)  r*   rq   r   r   r*   )rq   r*   r   r*   )rq   r   r   r*   )rq   r-   r   r*   )rq   r0   r   r*   )rq   r   r   r*   )r)  r*   rq   r   r   r*   )F)rq   r   rE  r0   r   ztuple[float, datetime])r)  r*   rq   time.struct_timer   r*   )r)  r*   rq   r   r   r*   )rq   r   r   r   )rq   r$   r   r$   )rq   r(   r   r(   )rq   r-   r   r-   )rq   zbool | bool_r   r0   )r   r0   )r   r  r   r  )ru  r   r   r$   )rq   r   r   r*   )rq   r  r   r*   )rq   r   r   r*   )rq   zdecimal.Decimalr   r  )rq   r8   r   r8   )r   r*   )r  r*   r   r   )rq   ztuple[str, Any] | Anyr   r  )rq   r*   rm   r$   r   ztuple[int, int]rc   )rq   r*   rm   r$   r   ztzinfo | Noner   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-  r1  r4  _int_to_snowflake_bindings_long_to_snowflake_bindings_float_to_snowflake_bindings_unicode_to_snowflake_bindings_decimal_to_snowflake_bindingsr9   _bytearray_to_snowflake_bindingsr;  r=  r?  rA  rM  rJ  rR  r[  r^  ra  rd  rg  rj  _unicode_to_snowflakerl  _bytearray_to_snowflakero  rq  rs  rv  r  r  r  r  r  r  r  _tuple_to_snowflake'_SnowflakeConverter__numpy_to_snowflaker  _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_snowflaker  r  r  r  staticmethodr  r  r  r  r   r   rP   rN   r   r      s   7*( +"= "7 -I 
8	I.
 4U,* +)'494	4
?8@
	97


9 "<"<#= %?"%?"7 (D$":
9!*2	. /4'+	 
!
*:
	

!
*3
	
"B .* 2;EN
*
.


 - .....///11%@"(2 
 
    " %%% 
% %6  !YYY Y 
	Y YrP   r   )rL   r   r   r(   )rL   r   r   r*   )r`   r   r   r*   )rL   r   r   r*   )rq   r*   rr   r  r   ztuple[float, int])rq   r*   ro   r$   rm   r$   r   r$   )r}   r$   r   r	   )C
__future__r   r6  r'   r  r   r   r   r   r   r   r	   	functoolsr
   loggingr   mathr   r   typingr   r   r   r   rH   r   compatr   r   	errorcoder   errorsr   interval_utilr   sfbinaryformatr   r   r5   r   r   r   r   ImportErrorr   BITS_FOR_TIMEZONEr}  rd   r   r   rI   rJ   ry   r%  r   r'  r  rO   rW   ra   re   rh   rk   ru   rp   r~   r   r   rP   rN   <module>r     s9   "     # ! 0 0     9 9   ) / $ 8 A ?"  1%tQ"#X##Ax||4<<D<I
		8	!	7!
G! w! V	!
 
6! v! X! ! I! Y! ! ! /! F! F!  ?!!" #!$ !A! H "3%*- 	.I<LL1
F.
Q
Y Q
Yo  E  Gs$   E# E0 #E-,E-0E:9E: