
    ɯei/                      d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dl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mZmZmZmZmZmZmZmZ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, ddl-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE ddlFmGZGmHZHmIZImJZJmKZKmLZL ddlMmNZN ddlOmPZP ddlQmRZRmSZS ddlTmUZU er d dlVmWZW d dlXmYZY ddlZm[Z[ ddl\m]Z]m^Z^ ddl_m`Z`  e dej                  j<                        Za e de!eedf   eebef   f         Zc eed      ZeeNseej                  d        	 dd!lgmhZh d"aid%Zmemd&z   Znemd'z   Zoemd(z   Zpemd)z   Zqemd*z   Zr esemeneoepeqerg      Zt ej                  d+ej                  ,      Zwd-Zxd.Zyg d/Zz G d0 d1ebe      Z{ G d2 d3e      Z| G d4 d5      Z}dBd6Z~ G d7 d8e      Z G d9 d:ej                   eec         Z G d; d<eeedf            Z G d= d>eeebef            Zd? Z G d@ dAe      Zy# ej$ r Zkeej                  d#ek        d$aiY dZk[kdZk[kww xY w)C    )annotationsN)Enum)	getLogger)Lock)TracebackType)IOTYPE_CHECKINGAnyCallableDictGenericIteratorLiteral
NamedTupleNoReturnSequenceTupleTypeVarUnionoverload)Self)create_batches_from_response)	ResultSet   )compatget_file_transfer_type)REQUEST_ID_STATEMENT_PARAM_NAME,_snowflake_max_parallelism_for_file_transfer_TrackedQueryCancellationTimeris_uuid4)BindUploadAgentBindUploadError)CMD_TYPE_DOWNLOADCMD_TYPE_UPLOADFIELD_NAME_TO_ID.PARAMETER_PYTHON_CONNECTOR_QUERY_RESULT_FORMATFileTransferTypeQueryStatus)	ER_CURSOR_IS_CLOSEDER_FAILED_PROCESSING_PYFORMAT%ER_FAILED_TO_REWRITE_MULTI_ROW_INSERTER_INVALID_VALUEER_NO_ARROW_RESULTER_NO_PYARROWER_NO_PYARROW_SNOWSQLER_NOT_POSITIVE_SIZEER_UNSUPPORTED_METHOD)DatabaseErrorErrorIntegrityErrorInterfaceErrorNotSupportedErrorProgrammingError)installed_pandas)SQLSTATE_FEATURE_NOT_SUPPORTED)TelemetryDataTelemetryField)get_time_millis)	DataFrame)Table)SnowflakeConnection)SnowflakeFileTransferAgentSnowflakeProgressPercentage)ResultBatchT)boundFetchRow.zFailed to import pyarrow or pandas. Cannot use pandas fetch API. Please install snowflake-connector-python with the `pandas` extra to use these features.)PyArrowIteratorTzZFailed to import ArrowResult. No Apache Arrow result set format can be used. ImportError: Fi 0     i   i   i   i   z!desc(?:ribe)?\s+([\w_]+)\s*;?\s*$flagsP      )r   r               
   c                      e Zd ZdZdZdZy)_NanoarrowUsagefollow_session_parameterenable_nanoarrowdisable_nanoarrowN)__name__
__module____qualname__FOLLOW_SESSION_PARAMETERENABLE_NANOARROWDISABLE_NANOARROW     \/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/connector/cursor.pyrS   rS      s    9)+r^   rS   c                  f    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   edd       Zy)ResultMetadatastrnameint	type_code
int | Nonedisplay_sizeinternal_size	precisionscaleboolis_nullablec           
         t         |j                  d      r|d   j                         n|d   j                            } | |d   |d|d   |d   |d   |d         S )	zVInitializes a ResultMetadata object from the column description in the query response.extTypeNametyperc   Nlengthri   rj   nullable)r&   getupper)clscolre   s      r_   from_columnzResultMetadata.from_column   sx     % 77=) M"((*[&&(	
	 KML
O
 	
r^   N)ru   dict[str, Any])rW   rX   rY   __annotations__classmethodrv   r]   r^   r_   ra   ra      s<    
IN
 
r^   ra   c                     e Zd ZdZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zd ZddZddZ	e
dd       Ze
dd	       Ze
dd
       Ze
dd       Ze
dd       Ze
dd       Ze
dd       Ze
dd       Ze
dd       Zy)ResultMetadataV2a  ResultMetadataV2 represents the type information of a single column.

    It is a replacement for ResultMetadata that contains additional attributes, currently
    `vector_dimension` and `fields`. This class will be unified with ResultMetadata in the
    near future.
    Nc
                    || _         || _        || _        || _        || _        || _        || _        || _        |	| _        y N)	_name
_type_code_is_nullable_display_size_internal_size
_precision_scale_vector_dimension_fields)
selfrc   re   rl   rg   rh   ri   rj   vector_dimensionfieldss
             r_   __init__zResultMetadataV2.__init__   sG     
#')+#!1r^   c                   |j                  d      r|d   j                         n|d   j                         }|j                  d      }d}|=|dv r*|d   D cg c]  }t        j                  ddi|       }}nt	        d| d       | |d   t
        |   |d	   d|d
   |d   |d   |j                  d      |	      S c c}w )zInitializes a ResultMetadataV2 object from the column description in the query response.
        This differs from ResultMetadata in that it has newly-added fields which cannot be added to
        ResultMetadata since it is a named tuple.
        rn   ro   r   N>   MAPARRAYOBJECTVECTORrc   z3Field parsing is not supported for columns of type .rq   rp   ri   rj   vectorDimension)rr   rs   r{   rv   
ValueErrorr&   )rt   ru   col_typer   processed_fieldsfs         r_   rv   zResultMetadataV2.from_column   s    ww}% $$&V""$ 	 "=A?? !]$ %00&$1D!1DE$  $
 !I(STU  KX&
OMLGG%&

 
	
$s    B?c           	         t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                        S )z{Initializes a ResultMetadata object from a ResultMetadataV2 object.

        This method is for internal use only.
        )ra   r~   r   r   r   r   r   r   r   s    r_   _to_result_metadata_v1z'ResultMetadataV2._to_result_metadata_v1   sH     JJOOOOKK
 	
r^   c                    d| j                    d| j                   dd| j                   d| j                   dz   dz   dz   dz   S )	NzResultMetadataV2(name=z,type_code=,zis_nullable=z,display_size=z@internal_size={self._internal_size},precision={self._precision},z>scale={self._scale},vector_dimension={self._vector_dimension},zfields={self.fields}))r~   r   r   r   r   s    r_   __str__zResultMetadataV2.__str__
  sh    $TZZLDOO;LANT../~d>P>P=QQRSTPQ OO &	&	
r^   c                   t        || j                        sy| j                  |j                  k(  xr | j                  |j                  k(  xr | j                  |j                  k(  xr | j
                  |j
                  k(  xr | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S NF)
isinstance	__class__r~   r   r   r   r   r   r   r   r   )r   others     r_   __eq__zResultMetadataV2.__eq__  s    %0 JJ%++% .5#3#33.!!U%7%77. ""e&9&99. ##u';';;	.
 5#3#33. u||+. &&%*A*AA. -
	
r^   c                    | j                   S r}   )r~   r   s    r_   rc   zResultMetadataV2.name#  s    zzr^   c                    | j                   S r}   )r   r   s    r_   re   zResultMetadataV2.type_code'      r^   c                    | j                   S r}   )r   r   s    r_   rl   zResultMetadataV2.is_nullable+  s       r^   c                    | j                   S r}   )r   r   s    r_   rh   zResultMetadataV2.internal_size/  s    """r^   c                    | j                   S r}   )r   r   s    r_   rg   zResultMetadataV2.display_size3      !!!r^   c                    | j                   S r}   )r   r   s    r_   ri   zResultMetadataV2.precision7  r   r^   c                    | j                   S r}   )r   r   s    r_   rj   zResultMetadataV2.scale;      {{r^   c                    | j                   S r}   )r   r   s    r_   r   z!ResultMetadataV2.vector_dimension?  s    %%%r^   c                    | j                   S r}   )r   r   s    r_   r   zResultMetadataV2.fieldsC  s    ||r^   )NNNNNN)rc   rb   re   rd   rl   rk   rg   rf   rh   rf   ri   rf   rj   rf   r   rf   r   list[ResultMetadataV2] | None)ru   rw   returnr{   )r   rb   r   rk   r   rd   r   rf   )r   r   )rW   rX   rY   __doc__r   ry   rv   r   r   r   propertyrc   re   rl   rh   rg   ri   rj   r   r   r]   r^   r_   r{   r{      sP    $($( $ '+04  	
 ! "   % ., "
 "
H
 

      ! ! # # " "     & &  r^   r{   c                 n    t        d       t        j                  d       t        j                  d       y)zTHandler for signal. When called, it will raise SystemExit with exit code FORCE_EXIT.z
Force exitz
Force exitr   N)printloggerinfosysexit)_s    r_   exit_handlerr   H  s!    	.
KKHHQKr^   c                      e Zd ZdZdZdZy)ResultStater   rM   rN   N)rW   rX   rY   DEFAULTVALIDRESETr]   r^   r_   r   r   O  s    GEEr^   r   c                  l   e Zd Z ej                  dej
                        Z ej                  d      Z ej                  dej
                  ej                  z  ej                  z        Z
 ej                  dej
                  ej                  z  ej                  z        ZedTd       Z	 	 	 	 dUdZdVdZeej$                  dWd	              ZedXd
       ZedYd       ZedZd       Zed[d       ZedZd       Zed\d       Zed        Zed\d       Zed\d       Zed\d       Zed\d       Zed\d       Zed\d       Z ed\d       Z!ed\d       Z"ed]d       Z#e#jH                  dVd       Z#ed^d       Z%ed_d       Z&e&jH                  d`d       Z&edWd       Z'edVd       Z(e)dad        Z*e)dbd!       Z* e+       fdcd"Z*ddd#Z,dWd$Z-	 	 	 	 	 	 	 	 	 	 de	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dfd'Z.	 dg	 	 	 	 	 dhd(Z/e)d%d%d%d&d&d)d%d%e0jb                  d%d%e0jb                  d)d%d&d&d&d%d)d&d&d%d%d%f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 did*       Z2e)d%d%d%d&d&d)d%d%e0jb                  d%d%e0jb                  d)d%d&d&d)d%d)d&d&d%d%d%f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 djd+       Z2d%d%d%d&d&d)d%d%e0jb                  d%d%e0jb                  d)d%d&d&d&d%d)d&d&d%d%d&d%f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dkd,Z2dld-Z3dmd.Z4dnd/Z5dod0Z6dpd1Z7dqd2Z8drd3Z9dVd4Z:dVd5Z;dsd6Z<dtd7Z=e)dud8       Z>e)dvd9       Z>dwdxd:Z>dyd;Z?dzd<Z@d{d=ZA	 	 	 	 	 	 	 	 d|d>ZBej$                  d}d?       ZCd~d@ZDdgddAZEddBZFddCZGdVdDZHdgdVdEZIdddFZJdwddGZKddHZLdVdIZM	 	 	 	 	 	 ddJZNddKZO	 	 	 	 	 	 	 	 ddLZPddMZQddNZR	 d	 	 	 	 	 	 	 	 	 ddOZS	 d	 	 	 	 	 	 	 	 	 ddPZT	 dw	 	 	 	 	 ddQZU	 d	 	 	 	 	 	 	 	 	 ddRZV	 	 	 	 	 	 ddSZWy%)SnowflakeCursorBasez^insert\s+intorI   z/\*.*\*/z.*VALUES\s*(\(.*\)).*z>alter\s+session\s+set\s+(\w*?)\s*=\s*\'?([^\']+?)\'?\s*(?:;|$)c                    t        |       S )zDecide whether a SQL is a file transfer and return its type.

        None is returned if the SQL isn't a file transfer so that this function can be
        used in an if-statement.
        r   )sqls    r_   r   z*SnowflakeCursorBase.get_file_transfer_typee  s     &c**r^   c                   || _         t        j                  | _        g | _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        t        j                         | _        g | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t6        j8                  | _        d| _        d| _        d| _         tC               | _"        d| _#        |jH                  | _%        d| _&        d| _'        d| _(        d| _)        | jU                          y)zInits a SnowflakeCursor with a connection.

        Args:
            connection: The connection that created this cursor.
        NFr   )+_connectionr4   default_errorhandler_errorhandlermessages	_timebomb_description_sfqid	_sqlstate_total_rowcount_sequence_counter_request_id_is_file_transfercollectionsdeque_multi_statement_resultIdsmulti_statement_savedIds_timestamp_output_format_timestamp_ltz_output_format_timestamp_ntz_output_format_timestamp_tz_output_format_date_output_format_time_output_format	_timezone_binary_output_format_result_result_setr   r   _result_statequery_query_result_format
_arraysizer   _lock_canceling_first_chunk_timelog_max_query_length_log_max_query_length_inner_cursor_prefetch_hook_stats_data
_rownumberreset)r   
connections     r_   r   zSnowflakeCursorBase.__init__n  sH    1;
 && 	  	  	 <@"&!!#-1!&BMBSBSBU'35%(,%,0),0)+/(#' #' %)"@D-1*5*=*=!%
04!#v!%%/%D%D"9=" 	 '+

r^   c                    	 | j                          y # t        j                  $ rI}t        j	                         t
        j                  k  rt        j                  |       Y d }~y Y d }~y d }~ww xY wr}   )closer   BASE_EXCEPTION_CLASSr   getEffectiveLevelloggingINFOr   )r   es     r_   __del__zSnowflakeCursorBase.__del__  sM    	JJL** 	'')W\\9A :	s    A/:A**A/c                     y)zEDecides whether results from helper functions are returned as a dict.Nr]   r   s    r_   _use_dict_resultz$SnowflakeCursorBase._use_dict_result  s     	r^   c                v    | j                   y | j                   D cg c]  }|j                          c}S c c}w r}   )r   r   )r   metas     r_   descriptionzSnowflakeCursorBase.description  s4    $:>:K:KL$++-LLLs   6c                    | j                   S )zmReturn the new format of result metadata for a query.

        This method is for internal use only.
        )r   r   s    r_   _description_internalz)SnowflakeCursorBase._description_internal  s        r^   c                <    | j                   dk\  r| j                   S d S Nr   )r   r   s    r_   rowcountzSnowflakeCursorBase.rowcount  s     '+';';q'@t##JdJr^   c                t    | j                   t        dddd      S t        j                  | j                         S )a  Returns detailed rows affected statistics for DML operations.

        Returns a NamedTuple with fields:
        - num_rows_inserted: Number of rows inserted
        - num_rows_deleted: Number of rows deleted
        - num_rows_updated: Number of rows updated
        - num_dml_duplicates: Number of duplicates in DML statement

        Returns None on each position if no DML stats are available - this includes DML operations where no rows were
            affected as well as other type of SQL statements (e.g. DDL, DQL).
        N)r   QueryResultStats	from_dictr   s    r_   statszSnowflakeCursorBase.stats  s8     ##D$d;;))$*:*:;;r^   c                <    | j                   dk\  r| j                   S d S r   )r   r   s    r_   	rownumberzSnowflakeCursorBase.rownumber  s    "&//Q"6t@D@r^   c                    | j                   S r}   )r   r   s    r_   sfqidzSnowflakeCursorBase.sfqid  r   r^   c                    | j                   S r}   )r   r   s    r_   sqlstatezSnowflakeCursorBase.sqlstate      ~~r^   c                    | j                   S r}   )r   r   s    r_   timestamp_output_formatz+SnowflakeCursorBase.timestamp_output_format  s    ,,,r^   c                J    | j                   r| j                   S | j                  S r}   )r   r   r   s    r_   timestamp_ltz_output_formatz/SnowflakeCursorBase.timestamp_ltz_output_format  -     00 --	
 ..	
r^   c                J    | j                   r| j                   S | j                  S r}   )r   r   r   s    r_   timestamp_tz_output_formatz.SnowflakeCursorBase.timestamp_tz_output_format  s-     // ,,	
 ..	
r^   c                J    | j                   r| j                   S | j                  S r}   )r   r   r   s    r_   timestamp_ntz_output_formatz/SnowflakeCursorBase.timestamp_ntz_output_format  r  r^   c                    | j                   S r}   )r   r   s    r_   date_output_formatz&SnowflakeCursorBase.date_output_format      '''r^   c                    | j                   S r}   )r   r   s    r_   time_output_formatz&SnowflakeCursorBase.time_output_format
  r  r^   c                    | j                   S r}   )r   r   s    r_   timezonezSnowflakeCursorBase.timezone  r  r^   c                    | j                   S r}   )r   r   s    r_   binary_output_formatz(SnowflakeCursorBase.binary_output_format  s    )))r^   c                    | j                   S r}   )r   r   s    r_   	arraysizezSnowflakeCursorBase.arraysize  r   r^   c                $    t        |      | _        y r}   )rd   r   r   values     r_   r   zSnowflakeCursorBase.arraysize  s    e*r^   c                    | j                   S r}   )r   r   s    r_   r   zSnowflakeCursorBase.connection  s    r^   c                    | j                   S r}   )r   r   s    r_   errorhandlerz SnowflakeCursorBase.errorhandler"  r   r^   c                X    t         j                  d|       |t        d      || _        y )Nzsetting errorhandler: %sz!Invalid errorhandler is specified)r   debugr8   r   r"  s     r_   r&  z SnowflakeCursorBase.errorhandler&  s*    /7="#FGG"r^   c                6    t        | d      xr | j                  S )z"Whether the command is PUT or GET.r   )hasattrr   r   s    r_   is_file_transferz$SnowflakeCursorBase.is_file_transfer-  s     t01Ld6L6LLr^   c                     y)zYSnowflake does not support lastrowid in which case None should be returned as per PEP249.Nr]   r   s    r_   	lastrowidzSnowflakeCursorBase.lastrowid2  s     r^   c                     y r}   r]   )r   procnames     r_   callproczSnowflakeCursorBase.callproc7  s    03r^   c                     y r}   r]   )r   r/  argss      r_   r0  zSnowflakeCursorBase.callproc:  s    58r^   c           
         | j                   j                  rdnd}d| ddj                  t        t	        |            D cg c]  }| c}       d}| j                  ||       |S c c}w )zCall a stored procedure.

        Args:
            procname: The stored procedure to be called.
            args: Parameters to be passed into the stored procedure.

        Returns:
            The input parameters.
        z%s?zCALL (z, ))r   is_pyformatjoinrangelenexecute)r   r/  r2  marker_formatr   commands         r_   r0  zSnowflakeCursorBase.callproc=  sj     !% 0 0 < <#H:Qtyys4yAQ)RA-)RSTTUV 	 	Wd# *Ss    	A'c                    	 | j                         ry| j                  5  | j                  d       d| _        | j                  dd= 	 ddd       y# 1 sw Y   yxY w# t
        $ r Y yw xY w)zcCloses the cursor object.

        Returns whether the cursor was closed during this call.
        FTclosingN)	is_closedr   r   r   r   	Exceptionr   s    r_   r   zSnowflakeCursorBase.closeN  sj    
		~~%% 

4
(#' MM!$	  
  		s3   A A *A	A AA A 	A*)A*c                V    | j                   d u xs | j                   j                         S r}   )r   rA  r   s    r_   rA  zSnowflakeCursorBase.is_closed^  s'    4'G4+;+;+E+E+GGr^   NFc                
     j                   d d = |=t        |t              s-t        j                   j
                   t        dt        d       t        smt        j                  d       |	t        di}nM|j                  t              }t        |      j                         dk(  r j                          n|	d|t        <    j                   j#                          _        |vt&        |v rn|t&           }t)        |      st+        d| d      t-        j.                  t        |      d	       _        |j3                         }|j5                  t&               nt-        j6                          _        t        j                  d
 j0                          t        j                  d j9                               |	|	 _        nt=              d u _        t        j                  d j:                   j:                  nd       |r|dkD  r|n j                   j>                  }|NtA        | jB                  g       _"         jD                  jG                          t        j                  d|       nd  _"        tI        jJ                  tH        jL                         fd}	 tN        k(  s$tI        jH                  tH        jL                  |       di i}	  j                   jQ                   j$                   j0                  ||tS         j:                        |||||
||      }	 r$tI        jH                  tH        jL                          jD                  0 jD                  jW                          t        j                  d       	 d|v rd|d   v r|d   j                  dtY                     }|D ]  }d|d   v r|d    _-        d|d   v r|d    _.        'd|d   v r|d    _/        9d|d   v r|d    _0        Kd|d   v r|d    _1        ]d|d   v r|d    _2        od|d   v r|d    _3        d |d   v s|d    _4          j                   jk                  |D ci c]  }|d   |d    c}        _6        d! _        |S # t*        $ r t        j                  d       Y w xY w# t*        tT        f$ r t        j                  d       Y w xY w# 	 r$tI        jH                  tH        jL                         n*# t*        tT        f$ r t        j                  d       Y nw xY w jD                  0 jD                  jW                          t        j                  d       w w xY wc c}w )"Nz>The data type of statement params is invalid. It must be dict.msgerrnoz7Cannot use arrow result format, fallback to json formatJSONARROWz
requestId z is not a valid UUID4.rO   )versionzRequest id: zrunning query [%s]zis_file_transfer: %sNoner   zstarted timebomb in %ssc                 F   	 t        j                   t         j                  t               	 j
                  6j
                  j                          t        j                  d       d _        j                         r+	 t        j                   t         j                         t        t        # t        t        f$ r Y w xY w# t        t        f$ r Y t        w xY w# r;	 t        j                   t         j                         w # t        t        f$ r Y w w xY ww xY w)Ncancelled timebomb in finally)signalSIGINTr   r   	TypeErrorr   cancelr   r(  "_SnowflakeCursorBase__cancel_queryKeyboardInterrupt)r   original_sigintr   r   s    r_   interrupt_handlerz>SnowflakeCursorBase._execute_helper.<locals>.interrupt_handler  s    fmm\:>>-NN))+LL!@A%)DN##E*"fmm_E $###! 	*  '	2 ## #fmm_E&	2  #sS   (B2 AC! $C 2CCCC!D %$D
	D 
DD DD z<Failed to set SIGINT handler. Not in main thread. Ignored...data)
binding_paramsbinding_stager+  statement_paramsis_internaldescribe_only_no_results	_no_retrytimeoutdataframe_astz>Failed to reset SIGINT handler. Not in main thread. Ignored...rM  
parametersTIMESTAMP_OUTPUT_FORMATrc   r#  TIMESTAMP_NTZ_OUTPUT_FORMATTIMESTAMP_LTZ_OUTPUT_FORMATTIMESTAMP_TZ_OUTPUT_FORMATDATE_OUTPUT_FORMATTIME_OUTPUT_FORMATTIMEZONEBINARY_OUTPUT_FORMATr   )7r   r   dictr4   errorhandler_wrapperr   r8   r-   CAN_USE_ARROW_RESULT_FORMATr   r(  r'   rr   rb   rs   check_can_use_arrow_resultsetr   _next_sequence_counterr   r   r!   r   uuidUUIDr   copypopuuid4_format_query_for_logr   r   network_timeoutr    rR  r   startrN  	getsignalrO  r   	cmd_queryrk   rP  rQ  listr   r   r   r   r   r   r   r   _update_parametersr   )r   r   r^  rY  rW  rX  rZ  r[  r\  _is_put_getr]  r_  result_format_val
request_idreal_timeoutrU  retr`  kvprT  s   ``                  @r_   _execute_helperz#SnowflakeCursorBase._execute_helpera  s    MM!'
;KT0R&& [-	 +LLRS'BF$  %5$8$8B%! ()//1W<668&. %%ST "&!1!1!H!H!J
 (/3CC)*IJJJ' :j\9O!PQQ#yyZ!DD  0446  !@A  $zz|D|D$4$4#567)4+E+Ee+LM"%0D" &<E%B$%ND""&*&<&<&HD""f	
 7Q;GD4D4D4T4T 	 #;d11E7DN NN  "LL2LA!DN **6==9	$*	"l2fmm->?
  &rl	>"",,&&  -+!%d&<&<!=!1'+'#$+ - C "MM&--A
 ~~)%%'<=S=\S[8Vtv>J  =,6
:46wKD12bj@8:7D52bj@8:7D51RZ?79'{D4)RZ7/1'{D,)RZ7/1'{D,2f:-%'[DN+r&z913GD.!=$ //0:;16AgJ&; 
!#
y  	LLQ	2 	* W"MM&--A	* W ~~)%%'<= *4 <s\   '-R
 AS )&R/ #U-
R,+R,/$SSU*&TU*$T*'U*)T**A U*c           	     6   | j                   j                  ||       }|bt        |      dk(  rT| j                  t        j
                  | j                  j                  rt        j                  nt        j                         t        j                         t        j                  k  r.t        j                  d| j!                  |       d| d| d       | j                  j                  r|$| j                  j                  st        |      dkD  r||z  }|S |}|S )Nr   z
binding: [z] with input=[z], processed=[])r   _process_params_pyformatr:  _log_telemetry_job_datar<   EMPTY_SEQ_INTERPOLATIONr   _interpolate_empty_sequencesr;   TRUEFALSEr   r   r   DEBUGr(  rs  )r   r=  paramsprocessed_paramsr   s        r_   _preprocess_pyformat_queryz.SnowflakeCursorBase._preprocess_pyformat_query  s	     ++DDVTR#f+"2((66 CC "&&&,, ##%6LLT77@A B%h './q2 OO88 ,<<$%)..E  Er^   Tc                     y r}   r]   r   r=  r  _bind_stager^  _exec_asyncr]  	_do_reset_put_callback_put_azure_callback_put_callback_output_stream_get_callback_get_azure_callback_get_callback_output_stream_show_progress_bar_statement_params_is_internal_describe_onlyr\  rz  _raise_put_get_error_force_put_overwrite_skip_upload_on_content_matchfile_streamnum_statements_dataframe_asts                             r_   r;  zSnowflakeCursorBase.execute=  s    8 r^   c                     y r}   r]   r  s                             r_   r;  zSnowflakeCursorBase.execute[  s    8 !$r^   c                
   |rd}t         j                  d       | j                         r-t        j                  | j
                  | t        dt        d       |r| j                          |r|j                  d      nd}|s/|rt         j                  d|       nt         j                  d       y	t         j                  d
| j                  |             |xs
 t               }|i |d|i}||||||||d}| j                  j                  r|s| j                  ||      }ns|}|r||d<   ni|Ht!        |t"        t$        f      s2d| t&        d}t        j                  | j
                  | t(        |       | j                  j+                  ||       |d<   t,        j/                  |      }|rRd|j1                  d       }t         j                  ddj3                  d |j5                  d      D              |       |} | j6                  |fi |} d| v rd| d   v r| d   d   nd	| _        t         j                  d| j:                          d| v rd| d   v r| d   d   nd	| _        t         j                  d       t?               | _         d| v r<d| d   v r5| j@                  | d   d   z
  }!| jC                  tD        jF                  |!       | d   rt         j                  d       | d   }"| jH                  jK                  |      D ]X  }|j1                  d      jM                         }#|j1                  d      }$| j                  jN                  jQ                  |#|$       Z d|"v r| jS                  |"       | S g | _*        d |"v xr |"d    d!v | _+        t         j                  d"| jX                         | jX                  r{| j[                  || ||	|
||||||xs |"j]                  d#d$      |||"j]                  d%      &      }%|%j_                          |%ja                         }"d'|"v rtc        |"d'         nd(| _2        |r#d	| j
                  jf                  | j8                  <   |r#d| v rd)| d   v r| d   d)   | _2        |"S d(| _2        |"S | ji                  |"       | S d| v rd)| d   v r| d   d)   nd(| _2        t         j                  |        | d*   }&| j]                  d+d(      }'| jj                  r| jj                  jl                  r	d,|&v rd-|& }&d| v r|&| d   j]                  d.d      z  }&|&to        |'      | j<                  | j8                  |d/}(|'d0k(  })|)rtp        nt(        }*t        j                  | j
                  | |*|(       | S )1a  Executes a command/query.

        Args:
            command: The SQL command to be executed.
            params: Parameters to be bound into the SQL statement.
            _bind_stage: Path in temporary stage where binding parameters are uploaded as CSV files.
            timeout: Number of seconds after which to abort the query.
            _exec_async: Whether to execute this query asynchronously.
            _no_retry: Whether or not to retry on known errors.
            _do_reset: Whether or not the result set needs to be reset before executing query.
            _put_callback: Function to which PUT command should call back to.
            _put_azure_callback: Function to which an Azure PUT command should call back to.
            _put_callback_output_stream: The output stream a PUT command's callback should report on.
            _get_callback: Function to which GET command should call back to.
            _get_azure_callback: Function to which an Azure GET command should call back to.
            _get_callback_output_stream: The output stream a GET command's callback should report on.
            _show_progress_bar: Whether or not to show progress bar.
            _statement_params: Extra information that should be sent to Snowflake with query. This dict will not be
                modified by the connector.
            _is_internal: This flag indicates whether the query is issued internally by the connector.
            _describe_only: If true, the query will not be executed but return the schema/description of this query.
            _no_results: This flag tells the back-end to not return the result, just fire the query and return the
                response returned by Snowflake's server.
            _use_ijson: This flag doesn't do anything as ijson support has ended.
            _is_put_get: Force decision of this SQL query being a PUT, or GET command. This is detected otherwise.
            _raise_put_get_error: Whether to raise PUT and GET errors.
            _force_put_overwrite: If the SQL query is a PUT, then this flag can force overwriting of an already
                existing file on stage.
            _skip_upload_on_content_match: If the SQL query is a PUT with overwrite enabled, then this flag will skip upload
                if the file contents match to ease concurrent uploads.
            file_stream: File-like object to be uploaded with PUT
            num_statements: Query level parameter submitted in _statement_params constraining exact number of
            statements being submitted (or 0 if submitting an uncounted number) when using a multi-statement query.
            _force_qmark_paramstyle: Force the use of qmark paramstyle regardless of the connection's paramstyle.
            _dataframe_ast: Base64-encoded dataframe request abstract syntax tree.

        Returns:
            The cursor itself, or None if some error happened, or the response returned
            by Snowflake if the _no_results flag is on.
        Tzexecuting SQL/commandzCursor is closed in execute.rE   	
 zdataframe ast: [%s]z%execute: no query is given to executeNzquery: [%s]MULTI_STATEMENT_COUNT)r^  rY  rZ  r[  r\  rz  r]  r_  rX  z#Binding parameters must be a list: rW  zdescribe table r   z#query was rewritten: org=%s, new=%s c              3  <   K   | ]  }|j                           y wr}   )strip).0lines     r_   	<genexpr>z.SnowflakeCursorBase.execute.<locals>.<genexpr>  s     D$D   
rV  queryIdzsfqid: sqlStatezquery execution donesendResultTimesuccessSUCCESSrM   	resultIdsr=  )UPLOADDOWNLOADzPUT OR GET: %s	overwriteF	threshold)put_callbackput_azure_callbackput_callback_output_streamget_callbackget_azure_callbackget_callback_output_streamshow_progress_barraise_put_get_errorforce_put_overwriteskip_upload_on_content_matchsource_from_streammultipart_thresholdrowsetr   totalmessagecodezSQL execution canceledzdSQL execution was cancelled by the client due to a timeout. Error message received from the server: errorMessage)rF  rG  r  r	  r   100072)9r   r(  rA  r4   rj  r   r6   r*   r   r  warningrs  ri  r   r7  r  r   rx  tupler+   r8   _process_params_qmarksDESC_TABLE_REmatchgroupr8  splitr  r   r	  r   r=   r   r  r<   TIME_CONSUME_FIRST_RESULTALTER_SESSION_REfinditerrs   	converterset_parameter_init_multi_statement_resultsr   r   r+  _create_file_transfer_agentrr   r;  resultr:  r   _async_sfqids_init_result_and_metar   executedrd   r5   )+r   r=  r  r  r^  r  r]  r  r  r  r  r  r  r  r  r  r  r  r\  rz  r  r  r  r  r  _force_qmark_paramstyler  kwargsr   
errorvaluemquery1r~  time_consume_first_resultrV  paramr#  sf_file_transfer_agenterrr  errvalueis_integrity_errorerror_classs+                                              r_   r;  zSnowflakeCursorBase.executey  s   J K,->>&&6ATU	 JJL.5'--	*22NCFG]D$>$>w$GH-7 %!#!'!  1'+&&"+	"
 ''0G33GVDE E*5'%j$.O!DVHM!>"J ../? ,0+;+;+R+RD,'( &&qwwqzl3FLL5D%++d2CDD
 E"d""53F3 }c&k!9 K	" 	
 	wtzzl+, }s6{!: K
# 	
 	+,!0!2 S=-V<&&V5E)FF & ((88:S y>LL#v;D**33E: G
((*
  **88F	G d"224802-%.$%6 &4	? O <D" LL)4+@+@A$$)-)I)I!.':/J!.':/J&8(<(< )4xxU31N'2(,(= *J *&" '..0-446>F$>Ns4>':TV$=A--dkk: }CK)? K( $
   $
 &&t,F A )/#'S[:PFG$VX   LLi.C7762&DNN++,3??BeE  }s6{~r::T NNH    -?.DTK&&tk8Tr^   c                0    d|d<    | j                   |i |S )a  Convenience function to execute a query without waiting for results (asynchronously).

        This function takes the same arguments as execute, please refer to that function
        for documentation. Please note that PUT and GET statements are not supported by this method.
        Tr  )r;  r   r2  r  s      r_   execute_asyncz!SnowflakeCursorBase.execute_asyncy  s$     !%}t||T,V,,r^   c                    dx|d<   |d<    | j                   |i | | j                  y| j                  D cg c]  }|j                          c}S c c}w )zObtain the schema of the result without executing the query.

        This function takes the same arguments as execute, please refer to that function
        for documentation.

        Returns:
            The schema of the result.
        Tr  r  N)r;  r   r   )r   r2  r  r   s       r_   describezSnowflakeCursorBase.describe  s_     =A@ 6.#9d%f%$:>:K:KL$++-LLLs   Ac                R    dx|d<   |d<    | j                   |i | | j                  S )aE  Obtain the schema of the result without executing the query.

        This function takes the same arguments as execute, please refer to that function
        for documentation.

        This function is for internal use only

        Returns:
            The schema of the result, in the new result metadata format.
        Tr  r  )r;  r   r  s      r_   _describe_internalz&SnowflakeCursorBase._describe_internal  s9     =A@ 6.#9d%f%   r^   c                8    | j                   j                  |      S r}   )r   rs  r   r   s     r_   rs  z)SnowflakeCursorBase._format_query_for_log  s    55e<<r^   c                6    d|v xr t        |d         t        v S )NstatementTypeId)rd   STATEMENT_TYPE_ID_DML_SETr   rV  s     r_   _is_dmlzSnowflakeCursorBase._is_dml  s)    % JD*+,0II	
r^   c                   | j                  |      }|j                  dd      | _        t        j	                  d| j                         | j
                  dk(  r|s|j                  d      
|d   | _        |d   D cg c]  }t        j                  |       c}| _        t        | | j                  || j                        }|s/| j                  s#t        j	                  d|d   j                         t        | || j                  j                  xs | j                  j                  | j                  j                         | _        d| _        t&        j(                  | _        |j                  d	d       | _        t        j	                  d
| j.                         |rd|v rt1        |d         dkD  rd}t3        | j                        D ]F  \  }}|j4                  dv s|j4                  j7                  d      s0|t9        |d   d   |         z  }H | j
                  dk(  r|| _        y | xj
                  |z  c_        y y y y c c}w )NqueryResultFormatjsonzQuery result format: %sr   r  rowtypez$Number of results in first chunk: %sr   r  zExecution DML stats: %sr  )znumber of rows updatedz#number of multi-joined rows updatedznumber of rows deletedznumber of rows inserted)r  rr   r   r   r(  r   r{   rv   r   r   r+  r  r   r   client_fetch_threadsclient_prefetch_threadsclient_fetch_use_mpr   r   r   r   r   r   r  r:  	enumeraterc   
startswithrd   )r   rV  is_dmlru   result_chunksupdated_rowsidxdescs           r_   r  z)SnowflakeCursorBase._init_result_and_meta  s   d#$(HH-@&$I!.0I0IJ2%f'9J9V#'=D  :>i5
25((-5
 5$++T43D3D
 $//LL6a8H8Q8Q %11 87700
 (..  88GT2.

; h$&3tH~+>+BL&t'8'89 @	T99 !  YY))*CD CXq(9#(>$??L@ ##r)'3$$$4$ ,C&695
s   <I c                l   | j                  t        j                  t        j                         |d   j                  d      | _        t        j                  | j                        | _	        | j                  r-t        j                  | j                  | t        dt        d       | j!                          y )Nr  r   zVPUT/GET commands are not supported for multi-statement queries and cannot be executed.rE  )r  r<   MULTI_STATEMENTr;   r  r  r   r   r   r   r   r4   rj  r   r8   r-   nextsetr  s     r_   r  z1SnowflakeCursorBase._init_multi_statement_results  s    $$^%C%C]EWEWX(,[(9(?(?(D%*5*;*;))+
' !!&& s-	 	r^   c                    t         sT| j                  j                  dk(  r	d}t        }nd}t        }t        j                  | j                  | t        ||d       y y )NSnowSQLzHCurrently SnowSQL doesn't support the result set in Apache Arrow format.zHThe result set in Apache Arrow format is not supported for the platform.rE  )	rk  r   applicationr0   r.   r4   rj  r   r8   r   rF  rG  s      r_   rl  z1SnowflakeCursorBase.check_can_use_arrow_resultset  sZ     +++y8`-`*&& "	 +r^   c                t    t         s2d}t        }t        j                  | j                  | t
        ||d       y y )NzOptional dependency: 'pandas' is not installed, please see the following link for install instructions: https://docs.snowflake.com/en/user-guide/python-connector-pandas.html#installationrE  )r9   r/   r4   rj  r   r8   r  s      r_   check_can_use_pandasz(SnowflakeCursorBase.check_can_use_pandas  sB    s  "E&& "	  r^   c                   d| d}| j                   j                  j                  |d      }d|v rd|d   v r|d   d   nd| _        d|v rd|d   v r|d   d   nd| _        t
        j                  d	| j                         |j                  d
      r$|j                  d      }| j                  |       | S t
        j                  d       t
        j                  |       |d   }|j                  dd      }d|v r||d   j                  dd      z  }|t        |      | j                  | j                  d}t        j                  | j                  | t        |       | S )z0Query the result of a previously executed query.	/queries//resultrr   urlmethodrV  r  Nr  zsfqid=%sr  failedr  r  r   r  r  )rF  rG  r  r	  )r   restrequestr   r   r   r(  rr   r  rd   r4   rj  r   r8   )r   qidr  r~  rV  r  r  r  s           r_   query_resultz SnowflakeCursorBase.query_result  sb   #g&##++E+B }c&k!9 K	" 	 }s6{!: K
# 	
 	Z-779776?D&&t,"  LL"LLi.C7762&D}s6{~r::T NN	H &&'7 r^   c                   | j                          | j                  | j                          | j                  dk7  rt        | j	                  t
        j                  t        j                         | j                  j                         S )Narrow)rl  r   r   r7   r  r<   ARROW_FETCH_BATCHESr;   r  r   _fetch_arrow_batchesr   s    r_   fetch_arrow_batchesz'SnowflakeCursorBase.fetch_arrow_batches:  sp    **,*!$$/##$$..0B0B	
 4466r^   c                     y r}   r]   r   force_return_tables     r_   fetch_arrow_allz#SnowflakeCursorBase.fetch_arrow_allE  s    SVr^   c                     y r}   r]   r   s     r_   r"  z#SnowflakeCursorBase.fetch_arrow_allH  s    KNr^   c                   | j                          | j                  | j                          | j                  dk7  rt        | j	                  t
        j                  t        j                         | j                  j                  |      S )a;  
        Args:
            force_return_table: Set to True so that when the query returns zero rows,
                an empty pyarrow table will be returned with schema using the highest bit length for each column.
                Default value is False in which case None is returned in case of zero rows.
        r  )r!  )rl  r   r   r7   r  r<   ARROW_FETCH_ALLr;   r  r   _fetch_arrow_allr   s     r_   r"  z#SnowflakeCursorBase.fetch_arrow_allK  ss     	**,*!$$/##$$^%C%C]EWEWX00DV0WWr^   c                   | j                          | j                  | j                          | j                  dk7  rt        | j	                  t
        j                  t        j                          | j                  j                  di |S )zFetches a single Arrow Table.r  r]   )r  r   r   r7   r  r<   PANDAS_FETCH_BATCHESr;   r  r   _fetch_pandas_batchesr   r  s     r_   fetch_pandas_batchesz(SnowflakeCursorBase.fetch_pandas_batches[  sw    !!#*!$$/##$$//1C1C	
 6t55???r^   c                   | j                          | j                  | j                          | j                  dk7  rt        | j	                  t
        j                  t        j                          | j                  j                  di |S )a  
        Fetch Pandas dataframes in batches, where 'batch' refers to Snowflake Chunk.

        Returns:
            A pandas dataframe containing the cursors query results.

        Note:
            Timestamp types that are nested in structured types may not be accurately represented
            due to a limitation in the pyarrow to pandas conversion.
            See here for more information: https://github.com/apache/arrow/issues/4116
        r  r]   )r  r   r   r7   r  r<   PANDAS_FETCH_ALLr;   r  r   _fetch_pandas_allr*  s     r_   fetch_pandas_allz$SnowflakeCursorBase.fetch_pandas_allg  sy     	!!#*!$$/##$$++]-?-?	
 2t11;F;;r^   c                ~    d| d}| j                   j                  j                  |d      }|j                  d      S )Nr  z/abort-requestpostr  r  )r   r  r  rr   )r   r  r  r~  s       r_   abort_queryzSnowflakeCursorBase.abort_query}  s@    #n-##++F+Cwwy!!r^   c                   t         j                  d       |r|j                  d      nd}|st         j                  d       | S | j                  j                  |      rxd|vs|j                  d      dk(  r_| j                  j                  rt         j                  d       t        j                  | j                  d|      }| j                  j                  |      }|s-t        j                  | j                  | t         d	t"        d
       |j%                  d      }g }|D ]H  }t         j                  d|        |j'                  || j                  j)                  ||       z         J |j+                  |dj-                  |      d      } | j.                  |fi | | S t         j                  d       t1        |d         }	|D ]U  }
t1        |
      |	k7  sd|	 dt1        |
       d| t2        d
}t        j                  | j                  | t         |       | c S  t1        |      |	z  }d}|| j                  j4                  d   cxk\  rdkD  rGn nD	 | j                  j7                  |      }t9        | |      }|j;                          |j<                  }|rdntA        tC        t@        tE        |             } | j.                  |f||d| | S | jG                          d|vr|D ]  } | j.                  |f|dd|  | S t        jH                  d|      |dz   }| j                  j                  rE|j                  dd      s3|D cg c]  }| jK                  ||       }}dj-                  |      }d}n&|t1        |      z  }|D cg c]  }|D ]  }|  }}}|j                  d      t1        |      z  |d<    | j.                  ||fddi| | S # t>        $ r t         j                  d       Y cw xY wc c}w c c}}w )zGExecutes a command/query with the given set of parameters sequentially.zexecuting many SQLs/commandsr  NzHNo parameters provided to executemany, returning without doing anything.r  r   zrewriting INSERT queryr  z"Failed to rewrite multi-row insertrE  zparameter: r   zbulk insertr   z&Bulk data size don't match. expected: z, got: z, command: $CLIENT_STAGE_ARRAY_BINDING_THRESHOLDzDFailed to upload binds to stage, sending binds to Snowflake instead.)r  r  F)r  r  z;/s*$z; r  r  )&r   r(  r  r  INSERT_SQL_REr  rr   r   r7  resubCOMMENT_SQL_REINSERT_SQL_VALUES_REr4   rj  r   r6   r,   r  appendr  replacer8  r;  r:  r-   _session_parameters_write_params_to_byte_rowsr"   upload
stage_pathr#   rx  mapzipr   searchr  )r   r=  	seqparamsr  command_wo_commentsr  fmtvaluesr  row_sizerowerror_value	bind_size
bind_stagerowsbind_uploaderbinding_paramr  processed_queriesr   r`  s                        r_   executemanyzSnowflakeCursorBase.executemany  s    	34.5'--	*4NNZ K##G,F*fjj9I.Ja.O++ 56&(ffT-@-@"g&N#--334GH..&#G%J	 ggaj& ELL;ug!67MMd..GGtTT
 "//#sxx/?CW//]+y|,$ 
$C3x8+%KH: V$$'H:[	$C%5'
 22 OOT>;  $
$  	NX5	!
::> 		#II)T(7d(C%,,.%2%=%=
 'DDT3	?1K,L  $1zMS 

6) # OWNUeNvNO0 + yy'*2!D.++FJJ)55
 #,% 33GVD%! %  12#i.02;TJT%T%TT,2JJ7G,H3L -F#$ DLLB%B6BS + 12% Us   AO PP	P Pc                     y r}   r]   r   s    r_   fetchonezSnowflakeCursorBase.fetchone  s    r^   c                   | j                   | j                          | j                  ;| j                  /t        | j                        | _        t        j
                  | _        	 t        | j                  d      }t        |t              r!t        j                  | j                  | |       || xj                  dz  c_        |S # t        $ r)}| j                  t        j                  k(  r|Y d}~yd}~ww xY w)z}
        Fetches one row.

        Returns a dict if self._use_dict_result is True, otherwise
        returns tuple.
        Nr   )r   r   r   iterr   r   r   nextr   rB  r4   )errorhandler_wrapper_from_ready_exceptionr   r   rP  r   )r   _nextr  s      r_   	_fetchonezSnowflakeCursorBase._fetchone  s     *!<<D$4$4$@ 0 01DL!,!2!2D	t,E%+??$$
  1$L 	!![%8%88			s   %AC 	C7C22C7c                   || j                   }|dk  r>dj                  |      t        d}t        j                  | j
                  | t        |       g }|dkD  r3| j                         }|	 |S |j                  |       ||dz  }|dkD  r3|S )z%Fetches the number of specified rows.r   z5The number of rows is not zero or positive number: {}rE  r   )	r   formatr1   r4   rj  r   r8   rR  r:  )r   sizer  r~  rH  s        r_   	fetchmanyzSnowflakeCursorBase.fetchmany  s    <>>D!8 O&,-	J &&'7 Qh--/C{
 
	 JJsO	 Qh 
r^   c                V    g }	 | j                         }|	 |S |j                  |       ')zFetches all of the results.)rR  r:  )r   r~  rH  s      r_   fetchallzSnowflakeCursorBase.fetchall5  s4    --/C{
 JJsO	 r^   c                   | j                   | j                          | j                          | j                  rP| j                  | j                  d          t        j                  d| j                  j                                 | S y)a  
        Fetches the next set of results if the previously executed query was multi-statement so that subsequent calls
        to any of the fetch*() methods will return rows from the next query's set of results. Returns None if no more
        query results are available.
        Nr   z Retrieved results for query ID: )r   r   r   r  r   r   popleftr   s    r_   r  zSnowflakeCursorBase.nextset?  sw     *!

**d==a@AKK243R3R3Z3Z3\2]^ Kr^   c                .    t         j                  d       yzNot supported.nopNr   r(  )r   r   s     r_   setinputsizesz!SnowflakeCursorBase.setinputsizesQ  s    Ur^   c                0    ~t         j                  d       yrb  rd  )r   r   columns      r_   setoutputsizez!SnowflakeCursorBase.setoutputsizeU  s    Ur^   c           	     h    t        j                  | j                  | t        dt        t
        d       y )Nzscroll is not supported.)rF  rG  r  )r4   rj  r   r7   r2   r:   )r   r#  modes      r_   scrollzSnowflakeCursorBase.scrollZ  s+    ""OO1.:			
r^   c                V   |sd| _         | j                  t        j                  k7  rt        j                  | _        | j
                  d| _        | j                  *| j                  j                  |       d| _        d| _        d| _        | j                  j                  sd| _        yy)zResets the result set.r   Nr?  )r   r   r   r   r   r   r   r   r   r   _reuse_resultsr   )r   r@  s     r_   r   zSnowflakeCursorBase.resetf  s     #%D !4!44!,!2!2D<<#DL)$$W$5DL!%D"--#D .r^   c              #  <   K   	 | j                         }|y| w)zIteration over the result set.N)rR  )r   rW  s     r_   __iter__zSnowflakeCursorBase.__iter__x  s&     MMOE}K	 r  c                   | j                   dk\  rn| j                         s]t        j                  d|| j                         | j
                  5  | j                  j                  || j                         d d d        y y y # 1 sw Y   y xY w)Nr   zcanceled. %s, request_id: %s)r   rA  r   r(  r   r   r   _cancel_queryr  s     r_   __cancel_queryz"SnowflakeCursorBase.__cancel_query  s}    !!Q&t~~/?LL7@P@PQ%% H  ..ud6F6FGH H 0@&H Hs   'A??Bc           
        t               }	 | j                  j                  t        j                  t
        j                  j                  |j                  t
        j                  j                  | j                  t
        j                  j                  |i|| j                               y# t        $ r t        j                  dd       Y yw xY w)zEBuilds an instance of TelemetryData with the given field and logs it.)r  	timestampr   zACursor failed to log to telemetry. Connection object may be None.T)exc_infoN)r=   r   _log_telemetryr;   from_telemetry_data_dictr<   KEY_TYPEr#  	KEY_SFQIDr   	KEY_VALUEAttributeErrorr   r  )r   telemetry_fieldr#  tss       r_   r  z+SnowflakeCursorBase._log_telemetry_job_data  s     	++66&//557L7L&0066&0066
 !#//
  	NNS  	s   BB* * CCc                    | S )zContext manager.r]   r   s    r_   	__enter__zSnowflakeCursorBase.__enter__  s    r^   c                $    | j                          y)z(Context manager with commit or rollback.N)r   )r   exc_typeexc_valexc_tbs       r_   __exit__zSnowflakeCursorBase.__exit__  s     	

r^   c                     d fd}dd j                   j                          j                   j                          _         _        | _        y)zGets the results from previously ran query. This methods differs from ``SnowflakeCursor.query_result``
        in that it monitors the ``sfqid`` until it is no longer running, and then retrieves the results.
        c            	        d} d}	 j                   j                        \  }}j                   j                  |       j                   j                  |      snf|t        j
                  k(  r| dz  } | t        kD  rt        d      t        j                  dt        |   z         |t        t              dz
  k  r|dz  }|t        j                  k7  rYt        j                  d d|j                          j                   j!                  |d d|j                   dt               j"                  j%                  d	 d
       j"                  j&                  _        j"                  j(                  _        j"                  j*                  _        j"                  j,                  _        j"                  j.                  _        t0        j2                  _        d_        d_        j"                  j*                  dk(  rp j"                  j;                               rOd d}j<                  j>                  jA                  |d      }d|v rd|d   v rjC                  |d          yyyyy)zJMakes sure query has finished executing and once it has retrieves results.r   r   zdCannot retrieve data on the status of this query. No information returned from server for query '{}'g      ?zStatus of query 'z' is z, results are unavailable)error_message	error_clsz!select * from table(result_scan('z'))Nr  r  rr   r  rV  r  )"r   _get_query_status_cache_query_statusis_still_runningr)   NO_DATAASYNC_NO_DATA_MAX_RETRYr3   timesleepASYNC_RETRY_PATTERNr:  r  r   r   rc   _process_error_query_statusr   r;  r   r   r   r   r   r   r   r   r   r   r^  r   r  r  r  )	no_data_counterretry_pattern_posstatusstatus_respr  r~  _is_successful_multi_stmtr   r	  s	         r_   wait_until_readyzDSnowflakeCursorBase.get_results_from_sfqid.<locals>.wait_until_ready  sa   O !&*oo&G&G&N#33E6B77?[000#q(O&)@@+9  

-.?@@ %,?(@1(DE%*%# $ ,,,/weFKK=IJ;;$5eWE&++Ng"h+	 <  &&)J5'QT'UV--55DL(,(:(:(O(OD%#'#5#5#E#ED  $ 2 2 ? ?D#11==D!,!2!2DDO"&D!!11Q6;T""++-< "%0&&++33E3JS=[CK%?66s6{C &@=<6r^   c                    t        |       dk7  ry| d   }t        |t              r|dk(  S t        |t              r|ddik(  S y)Nr   Fr   )*Multiple statements executed successfully.zmultiple statement executionr  )r:  r   r  ri  )rL  rH  s     r_   r  zMSnowflakeCursorBase.get_results_from_sfqid.<locals>._is_successful_multi_stmt  sV    4yA~q'C#u%MMMC&24`   r^   Nr   rK  )rL  z	list[Any]r   rk   )r   get_query_status_throw_if_errorr   r   r   r   )r   r	  r  r  s   `` @r_   get_results_from_sfqidz*SnowflakeCursorBase.get_results_from_sfqid  sL    
/	Db	 	77	
 "^^DOO<.r^   c                    | j                   y| j                  t        j                  t        j
                         | j                   j                  S )aD  Get the previously executed query's ``ResultBatch`` s if available.

        If they are unavailable, in case nothing has been executed yet None will
        be returned.

        For a detailed description of ``ResultBatch`` s please see the docstring of:
        ``snowflake.connector.result_batches.ResultBatch``
        N)r   r  r<   GET_PARTITIONS_USEDr;   r  batchesr   s    r_   get_result_batchesz&SnowflakeCursorBase.get_result_batches  sF     #$$..0B0B	
 '''r^   c                   |r| j                          | j                  j                  j                  |d|t        |      }| j                  d|      }|j                          | j                  |j                                y)a  Downloads from the stage location to the target directory.

        Args:
            stage_location (str): The location of the stage to download from.
            target_directory (str): The destination directory to download into.
            options (dict[str, Any]): The download options.
            _do_reset (bool, optional): Whether to reset the cursor before
                downloading, by default we will reset the cursor.
        Nstage_locationlocal_file_nametarget_directorycommand_typeoptionsr  )	r   r   _file_operation_parserparse_file_operationr$   r  r;  r  r  )r   r  r  r  r  r~  file_transfer_agents          r_   	_downloadzSnowflakeCursorBase._download  s      JJL oo44II) -* J 
 #>>
 	##%""#6#=#=#?@r^   c                
   |r| j                          | j                  j                  j                  ||dt        |      }| j                  d|d      }|j                          | j                  |j                                y)a  Uploads the local file to the stage location.

        Args:
            local_file_name (str): The local file to be uploaded.
            stage_location (str): The stage location to upload the local file to.
            options (dict[str, Any]): The upload options.
            _do_reset (bool, optional): Whether to reset the cursor before
                uploading, by default we will reset the cursor.
        Nr  r  F)r  	r   r   r  r  r%   r  r;  r  r  )r   r  r  r  r  r~  r  s          r_   _uploadzSnowflakeCursorBase._upload(  s    " JJL oo44II)+!( J 
 #>> % ? 

 	##%""#6#=#=#?@r^   c                    | j                   j                  j                  |ddt        dd      }| j                   j                  j                  ||      S )aN  Downloads from the stage location as a stream.

        Args:
            stage_location (str): The location of the stage to download from.
            decompress (bool, optional): Whether to decompress the file, by
                default we do not decompress.

        Returns:
            IO[bytes]: A stream to read from.
        NTr  r  r  r  r  has_source_from_stream)r   r  r  r$   _stream_downloaderdownload_as_stream)r   r  
decompressr~  s       r_   _download_streamz$SnowflakeCursorBase._download_streamN  sU     oo44II) !*#' J 
 11DDS*UUr^   c                   |r| j                          | j                  j                  j                  |ddt        ||      }| j                  d||d      }|j                          | j                  |j                                y)a  Uploads content in the input stream to the stage location.

        Args:
            input_stream (IO[bytes]): A stream to read from.
            stage_location (str): The location of the stage to upload to.
            options (dict[str, Any]): The upload options.
            _do_reset (bool, optional): Whether to reset the cursor before
                uploading, by default we will reset the cursor.
        Nr  r  F)r  r  r  )r   input_streamr  r  r  r~  r  s          r_   _upload_streamz"SnowflakeCursorBase._upload_streamh  s    " JJL oo44II) !(#/ J 
 #>>+ %	 ? 
 	##%""#6#=#=#?@r^   c          	         ddl m}  || ||f| j                  j                  | j                  j                  | j                  j
                  t        | j                        | j                  j                  d|S )Nr   )rA   )use_s3_regional_urliobound_tpe_limitunsafe_file_write*snowflake_server_dop_cap_for_file_transfer,reraise_error_in_file_transfer_work_function)r  rA   r   )enable_stage_s3_privatelink_for_us_east_1r  r  r   -_reraise_error_in_file_transfer_work_function)r   r=  r~  r  rA   s        r_   r  z/SnowflakeCursorBase._create_file_transfer_agent  s~     	D)
 !% 0 0 Z Z"..@@"..@@7c  8 :>9I9I9w9w
 
 	
r^   )r   rb   r   zFileTransferType | None)r   r@   r   rK  r  r   )r   list[ResultMetadata])r   list[ResultMetadataV2]r   )r   zQueryResultStats | None)r   
str | Noner   )r   r@   )r   r   )r#  zCallable | Noner   rK  )r/  rb   r   r  )r/  rb   r2  rD   r   rD   )r/  rb   )r   bool | None)
r   NNNFFFNFN)r   rb   r^  rd   rY  dict[str, str] | NonerW  z!tuple | dict[str, dict[str, str]]rX  r  rZ  rk   r[  rk   r\  rk   r]  rk   r_  r  r   rw   r}   )r=  rb   r  %Sequence[Any] | dict[Any, Any] | Noner   rb   )4r=  rb   r  r  r  r  r^  rf   r  rk   r]  rk   r  rk   r  rB   r  rB   r  IO[str]r  rB   r  rB   r  r  r  rk   r  r  r  rk   r  rk   r\  Literal[False]rz  r  r  rk   r  rk   r  rk   r  IO[bytes] | Noner  rf   r  r  r   zSelf | None)4r=  rb   r  r  r  r  r^  rf   r  rk   r]  rk   r  rk   r  rB   r  rB   r  r  r  rB   r  rB   r  r  r  rk   r  r  r  rk   r  rk   r\  Literal[True]rz  r  r  rk   r  rk   r  rk   r  r  r  rf   r  r  r   dict[str, Any] | None)6r=  rb   r  r  r  r  r^  rf   r  rk   r]  rk   r  rk   r  rB   r  rB   r  r  r  rB   r  rB   r  r  r  rk   r  r  r  rk   r  rk   r\  rk   rz  r  r  rk   r  rk   r  rk   r  r  r  rf   r  rk   r  r  r   zSelf | dict[str, Any] | None)r2  r
   r  r
   r   rw   )r2  r
   r  r
   r   r  )r2  r
   r  r
   r   r  )r   rb   r   rb   )rV  dict[Any, Any]r   rk   )rV  r  r   rK  )rV  ri  r   rK  )r  rb   r   SnowflakeCursor)r   zIterator[Table])r!  r  r   Table | None)r!  r  r   r?   )F)r!  rk   r   r  )r  r
   r   zIterator[DataFrame])r  r
   r   r>   )r  rb   r   rk   )r=  rb   rC  zSequence[Any] | dict[str, Any]r  r
   r   r  )r   rF   )r   z'dict[str, Any] | tuple[Any, ...] | None)r[  rf   r   list[FetchRow])r   r  )r   zSnowflakeCursor | None)relative)rj  rb   r   rK  )r@  rk   r   rK  )r   z Iterator[dict] | Iterator[tuple])r|  r<   r#  r
   r   rK  )r   r   )r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | Noner   rK  )r	  rb   r   rK  )r   zlist[ResultBatch] | None)T)
r  rb   r  rb   r  rw   r  rk   r   rK  )
r  rb   r  rb   r  rw   r  rk   r   rK  )r  rb   r  rk   r   	IO[bytes])
r  r  r  rb   r  rw   r  rk   r   rK  )r=  rb   r~  rw   r   rA   )XrW   rX   rY   r6  compile
IGNORECASEr5  r8  	MULTILINEDOTALLr9  r  staticmethodr   r   r   r   abcabstractmethodr   r   r   r  r  r  r	  r  r  r  r  r  r  r  r  r  r   setterr   r&  r+  r-  r   r0  r  r   rA  r  r  r   stdoutr;  r  r  r  rs  r  r  r  rl  r  r  r  r"  r+  r/  r2  rP  rR  rX  r\  r^  r  re  rh  rk  r   ro  rR  r  r  r  r  r  r  r  r  r  r  r]   r^   r_   r   r   U  s@
    BJJ0FMRZZ,N%2:: "--",,">"J "rzzImmbll*RYY6
 + +='= 
=~    M M ! ! K K < <  A A     - - 
 
 
 
 
 
 ( ( ( (   * *   % %     " " # # M M   3 38 8+07 " H 26<@$(!#!$(vv v 0	v
 :v "v v v v v "v 
vv 9="" 6" 
	"H  9="&"!59;?/2zz59;?/2zz#'37"$&+#'%)%*.3(,%)%)5 6  	
     3 9 &- 3 9 &- !  1!" #$ %& $'( !)* #+, #-. (,/0 &12 #34 #56 
7 :  9="&"!59;?/2zz59;?/2zz#'37"$%)#'%)%*.3(,%)%)5$$ 6$  	$
 $ $ $ $ 3$ 9$ &-$ 3$ 9$ &-$ !$  1!$" #$$ %$& #'$( !)$* #+$, #-$. (,/$0 &1$2 #3$4 #5$6 
7$ $@ 9="&"!59;?/2zz59;?/2zz#'37"$!#'%)%*.3(,%)(-%)7~~ 6~  	~
 ~ ~ ~ ~ 3~ 9~ &-~ 3~ 9~ &-~ !~  1!~" #~$ %~& '~( !)~* #+~, #-~. (,/~0 &1~2 #3~4 "&5~6 #7~8 
&9~@-M !=
05d$*$#J	7 V VN NX 
@<,"
uu 2u 	u
 
un 	 <4$


$$H-69	., & %	
 
H/T(* "A"A "A  	"A
 "A 
"AR $A$A $A  	$A
 $A 
$AN 7<V!V/3V	V> &A&A &A  	&A
 &A 
&AP

 
 
$
r^   r   c                  *    e Zd ZdZedd       ZddZy)r  au  Implementation of Cursor object that is returned from Connection.cursor() method.

    Attributes:
        description: A list of namedtuples about metadata for all columns.
        rowcount: The number of records updated or selected. If not clear, -1 is returned.
        rownumber: The current 0-based index of the cursor in the result set or None if the index cannot be
            determined.
        sfqid: Snowflake query id in UUID form. Include this in the problem report to the customer support.
        sqlstate: Snowflake SQL State code.
        timestamp_output_format: Snowflake timestamp_output_format for timestamps.
        timestamp_ltz_output_format: Snowflake output format for LTZ timestamps.
        timestamp_tz_output_format: Snowflake output format for TZ timestamps.
        timestamp_ntz_output_format: Snowflake output format for NTZ timestamps.
        date_output_format: Snowflake output format for dates.
        time_output_format: Snowflake output format for times.
        timezone: Snowflake timezone.
        binary_output_format: Snowflake output format for binary fields.
        arraysize: The default number of rows fetched by fetchmany.
        connection: The connection object by which the cursor was created.
        errorhandle: The class that handles error handling.
        is_file_transfer: Whether, or not the current command is a put, or get.
    c                     yr   r]   r   s    r_   r   z SnowflakeCursor._use_dict_result  s    r^   c                f    | j                         }|t        |t              st        d|       |S Nz fetchone got unexpected result: )rX  r   r  rP  r   rH  s     r_   rR  zSnowflakeCursor.fetchone  s4    nnz#u5>seDEE
r^   Nr   )r   ztuple[Any, ...] | NonerW   rX   rY   r   r   r   rR  r]   r^   r_   r  r    s     .  r^   r  c                  *    e Zd ZdZedd       ZddZy)
DictCursorz)Cursor returning results in a dictionary.c                     y)NTr]   r   s    r_   r   zDictCursor._use_dict_result  s    r^   c                f    | j                         }|t        |t              st        d|       |S r  )rX  r   ri  rP  r  s     r_   rR  zDictCursor.fetchone  s4    nnz#t4>seDEE
r^   Nr   )r   r  r  r]   r^   r_   r  r    s    3 r^   r  c                   | dk(  r"t        j                  dt        d       t        S | dk(  rKdt        j
                  v rt        j                  dt        d       t        j                  dt        d       y t        dt        d	|       )
NNanoarrowUsagez}snowflake.connector.cursor.NanoarrowUsage has been deprecated and will be removed in the future, please stop using the class.rM   )
stacklevelNANOARROW_USAGEz}Environment variable NANOARROW_USAGE has been deprecated and will be removed in the future, please stop setting the variable.zsnowflake.connector.cursor.NANOARROW_USAGE has been deprecated and will be removed in the future, please stop using the variable.zmodule z has no attribute )warningswarnDeprecationWarningrS   osenvironr{  rW   )rc   s    r_   __getattr__r    s    +		
   

*MM4"	 	.		
 
78,.@I
JJr^   c                  \    e Zd ZU dZdZded<   dZded<   dZded<   dZded<   e	d	d       Z
y)
r  z
    Statistics for rows affected by a DML operation.
    None value expresses particular statistic being unknown - not returned by the backend service.

    Added in the first place to expose DML data of CTAS statements - SNOW-295953
    Nrf   num_rows_insertednum_rows_deletednum_rows_updatednum_dml_duplicatesc           	          | |j                  dd       |j                  dd       |j                  dd       |j                  dd             S )NnumRowsInsertednumRowsDeletednumRowsUpdatednumDmlDuplicates)r  r  r  r  )rr   )rt   
stats_dicts     r_   r  zQueryResultStats.from_dict  sK    (nn->E'^^,<dC'^^,<dC)~~.@$G	
 	
r^   )r  zdict[str, int]r   r  )rW   rX   rY   r   r  rx   r  r  r  ry   r  r]   r^   r_   r  r    sG     %)z(#'j'#'j'%)
)
 
r^   r  )r   r   )
__future__r   r  r   r   r  r6  rN  r   r  rn  r  enumr   r   	threadingr   typesr   typingr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   typing_extensionsr    snowflake.connector.result_batchr   snowflake.connector.result_setr   r  r   	_sql_utilr   _utilsr   r   r    r!   bind_upload_agentr"   r#   	constantsr$   r%   r&   r'   r(   r)   	errorcoder*   r+   r,   r-   r.   r/   r0   r1   r2   errorsr3   r4   r5   r6   r7   r8   r  r9   r  r:   	telemetryr;   r<   	time_utilr=   pandasr>   pyarrowr?   r   r@   r  rA   rB   result_batchrC   rD   rb   rF   rW   r   r(  nanoarrow_arrow_iteratorrG   rk  ImportErrorr   r  STATEMENT_TYPE_ID_DMLSTATEMENT_TYPE_ID_INSERTSTATEMENT_TYPE_ID_UPDATESTATEMENT_TYPE_ID_DELETESTATEMENT_TYPE_ID_MERGE$STATEMENT_TYPE_ID_MULTI_TABLE_INSERT	frozensetr  r  r  r  LOG_MAX_QUERY_LENGTHr  r  rS   ra   r{   r   r   ABCr   r  r  ri  r  r  r  r]   r^   r_   <module>r     su   " 
   	 	  
           $ # I 4  -  @ 
 
 
  & 4 4 & / *C{//0:U5c?DcN+J%KL	8	 
LL	(9"&  058 058 058 /%7 '<u'D $%   ,	  

?r}}U  , ,c4 ,
Z 
>N Nb$ P
#''78#4 P
f2 )%S/:  F$T#s(^4 K8
z 
M<  (
NN
defdgh #(	(s    H6 6I;II