
    ɯei                    (   U 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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 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& 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l0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD ddlEmFZF ddlGmHZH ddlImJZJ ddlKmLZLmMZMmNZNmOZO ddlPmQZQmRZR ddlSmTZT ddlUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZh ddlimjZj ddlkmlZl ddlmmnZn dd lompZpmqZqmrZr dd!lsmtZtmuZumvZvmwZwmxZx dd"lymzZzm{Z{ dd#l|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZ dd$l/mZmZmZmZ dd%lmZ dd&lmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd'lmZmZmZmZ dd(lmZmZ dd)lmZmZmZ dd*lmZmZ dd+lmZ dd,lmZmZmZ dd-lmZ ejj                  d.k\  se	jl                  r e&d/ereq0      Zn
 e&d/er1      Zd2Zd3Zd4Z eH       Zdd5Z	 d	 	 	 	 	 dd8Zh d9Zi d:d ed      effd;d<efd=d<efd>d?efd@dAeeffdBd ed      effdCd ed      effdDd ed      effdEd ed      effdFd ed      effdGd ed      ee"ffdHdIefdJd ed      effdKd ed      effdLd ed      effdMd ed      effdNd ed      effi dOd ed      effdPd ed      effdQd ed      effdRd ed      effdSdTefdUd ed      effdVee fdWdXefdYd ed      effdZd ed      eee-ffd6d ed      effd7d ed      eeffd[d ed      effd\d ed      eeffd]e ed      effd^d ed      effd_d ed      effi d`d ed      ee   ffdad ed      e ffdbd ed      e ffdcd ed      e@ffddet ed      effdeet ed      effdfeu ed      effdgdXefdhdiefdjeZefdkd efdld ed      effdmd ed      effdnd ed      effdod ed      effdpd2efdqd ed      effi drdXefdsdXefdtd ed      effdu e       ejfdvdXefdwdXefdxd ed      effdyd ed      effdzdiefd{d ed      effd|diefd}epefd~dXefddXefddXefddiefddXefi ddXefddXefddXefddXefdd ed      effdd ed      effdd ed      effddiefddXefddXefddXefddiefdd ed      effdd ed      effdd ed      effddiefddXefi ddXefdd ed      effdd ed      effdd ed      effddXefddefddefddefddefdd<efddXefddXefddXefddiefddefddXefddXefe4e3efddXefdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effdd ed      effiZded<    ej                  d      Z ee/      D  cg c]  }  e ee/|             s|  c} D ]!  Z eej                  e   e ee/eΫ             #  eeѫ      Z G d de$      Z G d d      Z G d d      Z eի       Zyc c} w )    )annotationsN)as_completed)ThreadPoolExecutor)suppress)get_close_matches)cached_propertypartial)StringIO)	getLogger)Lock)TracebackType)AnyCallable	GeneratorIterableIterator
NamedTupleSequenceTypeVar)UUID)default_backend)serialization)RSAPrivateKey   )errors)QueryContextCache)/_DEFAULT_VALUE_SERVER_DOP_CAP_FOR_FILE_TRANSFER/_VARIABLE_NAME_SERVER_DOP_CAP_FOR_FILE_TRANSFER"build_minicore_usage_for_telemetry)FIRST_PARTY_AUTHENTICATORSAuthAuthByDefaultAuthByKeyPairAuthByOAuthAuthByOauthCodeAuthByOauthCredentials
AuthByOkta	AuthByPATAuthByPluginAuthByUsrPwdMfaAuthByWebBrowserAuthByWorkloadIdentity
AuthNoAuth)AuthByIdToken)exponential_backoff)BindUploadError)IS_LINUX
IS_WINDOWSquote	urlencode)CONFIG_MANAGER_get_default_connection_params)ConnectionDiagnostic)_CONNECTIVITY_ERR_MSG_DOMAIN_NAME_MAP_OAUTH_DEFAULT_SCOPEENV_VAR_PARTNER4OCSP_ROOT_CERTS_DICT_LOCK_TIMEOUT_DEFAULT_NO_TIMEOUTPARAMETER_AUTOCOMMIT!PARAMETER_CLIENT_PREFETCH_THREADS"PARAMETER_CLIENT_REQUEST_MFA_TOKEN#PARAMETER_CLIENT_SESSION_KEEP_ALIVE7PARAMETER_CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY+PARAMETER_CLIENT_STORE_TEMPORARY_CREDENTIAL"PARAMETER_CLIENT_TELEMETRY_ENABLED,PARAMETER_CLIENT_VALIDATE_DEFAULT_PARAMETERS3PARAMETER_ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1"PARAMETER_QUERY_CONTEXT_CACHE_SIZEPARAMETER_SERVICE_NAMEPARAMETER_TIMEZONEOCSPModeQueryStatusSnowflakeConverter)	CRLConfig)CRLCacheFactory)LOG_MAX_QUERY_LENGTHSnowflakeCursorSnowflakeCursorBase)CLIENT_NAMECLIENT_VERSIONPLATFORMPYTHON_VERSIONSNOWFLAKE_CONNECTOR_VERSION)FileOperationParserStreamDownloader)ER_CONNECTION_IS_CLOSEDER_FAILED_PROCESSING_PYFORMATER_FAILED_PROCESSING_QMARKER_FAILED_TO_CONNECT_TO_DBER_INVALID_BACKOFF_POLICYER_INVALID_VALUEER_INVALID_WIF_SETTINGSER_NO_ACCOUNT_NAMEER_NO_NUMPYER_NO_PASSWORD
ER_NO_USER#ER_NOT_IMPLICITY_SNOWFLAKE_DATATYPE)DatabaseErrorErrorOperationalErrorProgrammingError)EasyLoggingConfigPython)DEFAULT_AUTHENTICATOREXTERNAL_BROWSER_AUTHENTICATORKEY_PAIR_AUTHENTICATORNO_AUTH_AUTHENTICATOROAUTH_AUTHENTICATOROAUTH_AUTHORIZATION_CODEOAUTH_CLIENT_CREDENTIALSPAT_WITH_EXTERNAL_SESSIONPROGRAMMATIC_ACCESS_TOKEN
REQUEST_IDUSR_PWD_MFA_AUTHENTICATORWORKLOAD_IDENTITY_AUTHENTICATORReauthenticationRequestSnowflakeRestful)
HttpConfigProxySupportAdapterFactorySessionManagerSessionManagerFactory)SQLSTATE_CONNECTION_NOT_EXISTSSQLSTATE_FEATURE_NOT_SUPPORTED)TelemetryClientTelemetryDataTelemetryField)HeartBeatTimerget_time_millis)&extract_top_level_domain_from_hostname)construct_hostnameparse_accountsplit_statements)AttestationProvider)      	CursorCls)bounddefault)r      
   i   c                 .    t         rddlm}  | S ddlm} |S )Nr   )SnowflakeConverterIssue23517rK   )r2   converter_issue23517r   	converterrL   )r   rL   s     `/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/connector/connection.pyDefaultConverterClassr      s    F++1!!    private_key_fileprivate_key_file_pwdc                   |!t        |t              r|j                  d      }t        | d      5 }t	        j
                  |j                         |t                     }d d d        j                  t        j                  j                  t        j                  j                  t	        j                               }|S # 1 sw Y   axY w)Nutf-8rb)passwordbackend)encodingformatencryption_algorithm)
isinstancestrencodeopenr   load_pem_private_keyreadr   private_bytesEncodingDERPrivateFormatPKCS8NoEncryption)r   r   keyprivate_keypkbs        r   _get_private_bytes_from_filer      s     'J7KS,Q3::7C		% 
#88HHJ)#%

 
#
#''++**00*779 $ C J
 
s   /B??C>   qmarkr   numericpyformatdsnuser r   hostz	127.0.0.1porti  database
proxy_host
proxy_port
proxy_userproxy_passwordno_proxyprotocolhttps	warehouseregionaccountschemarole
session_idlogin_timeoutnetwork_timeoutsocket_timeoutexternal_browser_timeoutx   "platform_detection_timeout_secondsbackoff_policypasscode_in_passwordFpasscoder   tokentoken_file_pathauthenticatorworkload_identity_provider workload_identity_entra_resource$workload_identity_impersonation_pathmfa_callbackpassword_callback
auth_classapplicationinternal_application_nameinternal_application_versiondisable_ocsp_checksocsp_fail_openT!ocsp_root_certs_dict_lock_timeoutinject_client_pausesession_parameters
autocommitclient_session_keep_alive-client_session_keep_alive_heartbeat_frequencyclient_prefetch_threadsclient_fetch_threadsclient_fetch_use_mpnumpyocsp_response_cache_filenameconverter_classvalidate_default_parametersprobe_connection
paramstyletimezoneconsent_cache_id_tokenservice_namesupport_negative_yearlog_max_query_lengthdisable_request_pooling!client_store_temporary_credentialclient_request_mfa_tokenuse_openssl_onlyarrow_number_to_decimal)enable_stage_s3_privatelink_for_us_east_1reuse_resultsinterpolate_empty_sequencesenable_connection_diagconnection_diag_log_pathconnection_diag_whitelist_pathconnection_diag_allowlist_path"log_imported_packages_in_telemetrydisable_query_context_cachejson_result_force_utf8_decodingserver_session_keep_alive%enable_retry_reason_in_query_responsesession_tokenmaster_tokenmaster_validity_in_secondsdisable_console_logindebug_arrow_chunkdisable_saml_url_checkiobound_tpe_limitoauth_client_idoauth_client_secretoauth_credentials_in_bodyoauth_authorization_urlz%https://{host}:{port}/oauth/authorizeoauth_token_request_urlz)https://{host}:{port}/oauth/token-requestoauth_redirect_urizhttp://127.0.0.1oauth_socket_urioauth_scopeoauth_disable_pkceoauth_enable_refresh_tokens&oauth_enable_single_use_refresh_tokens,check_arrow_conversion_error_on_every_columnexternal_session_idunsafe_file_write"unsafe_skip_file_permissions_check,reraise_error_in_file_transfer_work_functioncert_revocation_check_mode"allow_certificates_without_crl_urlcrl_connection_timeout_mscrl_read_timeout_mscrl_cache_validity_hoursenable_crl_cacheenable_crl_file_cachecrl_cache_dircrl_cache_removal_delay_days crl_cache_cleanup_interval_hourscrl_cache_start_cleanupcrl_download_max_sizez.dict[str, tuple[Any, type | tuple[type, ...]]]DEFAULT_CONFIGURATIONz[\w\d_]+c                  &    e Zd ZU dZded<   ded<   y)TypeAndBindingz/Stores the type name and the Snowflake binding.r   type
str | NonebindingN)__name__
__module____qualname____doc____annotations__ r   r   r'  r'    s    9
Ir   r'  c                  	   e Zd ZdZ e       Z	 	 d	 	 	 	 	 ddZedd       Zedd       Z	edd       Z
ddZedd       Zedd	       Zedd
       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Z edd       Z!edd       Z"edd       Z#edd        Z$edd!       Z%edd"       Z&edd#       Z'edd$       Z(edd%       Z)edd&       Z*edd'       Z+edd(       Z,e,jZ                  dd)       Z,edd*       Z.e.jZ                  dd+       Z.edd,       Z/e/jZ                  dd-       Z/edd.       Z0e0jZ                  dd/       Z0edd0       Z1e1jZ                  dd1       Z1edd2       Z2edd3       Z3edd4       Z4edd5       Z5e5jZ                  dd6       Z5edd7       Z6edd8       Z7edd9       Z8ed:        Z9edd;       Z:e:jZ                  dd<       Z:edd=       Z;e;jZ                  dd>       Z;edd?       Z<edd@       Z=e=jZ                  ddA       Z=eddB       Z>edC        Z?eddD       Z@e@jZ                  ddE       Z@eddF       ZAedG        ZBedH        ZCedI        ZDe?jZ                  ddJ       ZEeddK       ZFeFjZ                  ddL       ZFeddM       ZGeddN       ZHeddO       ZIeIjZ                  ddP       ZIeddQ       ZJeKddR       ZLeJjZ                  ddS       ZJddTZMdddVZNddWZOddXZPddYZQddZZReSfdd[ZTd\dUeSf	 	 	 	 	 	 	 	 	 dd]ZUd\eSf	 	 	 	 	 	 	 dd^ZVdd_ZWeXdd`       ZYda ZZdb Z[	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddcZ\dd Z]ddeZ^ddfZ_	 	 	 	 ddgZ`	 	 	 	 	 	 ddhZa	 d	 	 	 	 	 ddiZb	 d	 	 	 	 	 ddjZc	 d	 	 	 	 	 ddkZdddlZeddmZfddnZgddoZhddpZiddqZjddrZkddsZlddtZm	 	 	 	 dduZnddvZoddwZp	 	 	 	 	 	 	 	 ddxZqddyZrddzZsd{ Ztd|euf	 	 	 	 	 	 	 	 	 dd}Zvdd~ZwddZxddZyddZzddZ{eXdd       Z|eXdd       Z}ddZ~d ZddZddZeXdd       Zy)SnowflakeConnectionaW  Implementation of the connection object for the Snowflake Database.

    Use connect(..) to get the object.

    Attributes:
        insecure_mode (deprecated): Whether or not the connection is in OCSP disabled mode. It means that the connection
            validates the TLS certificate but doesn't check revocation status with OCSP provider.
        disable_ocsp_checks: Whether or not the connection is in OCSP disabled mode. It means that the connection
            validates the TLS certificate but doesn't check revocation status with OCSP provider.
        ocsp_fail_open: Whether or not the connection is in fail open mode. Fail open mode decides if TLS certificates
            continue to be validated. Revoked certificates are blocked. Any other exceptions are disregarded.
        ocsp_root_certs_dict_lock_timeout: Timeout for the OCSP root certs dict lock in seconds. Default value is -1, which means no timeout.
        session_id: The session ID of the connection.
        user: The user name used in the connection.
        host: The host name the connection attempts to connect to.
        port: The port to communicate with on the host.
        region: Region name if not the default Snowflake Database deployment.
        proxy_host: The hostname used proxy server.
        proxy_port: Port on proxy server to communicate with.
        proxy_user: User name to login with on the proxy sever.
        proxy_password: Password to be used to authenticate with proxy server.
        account: Account name to be used to authenticate with Snowflake.
        database: Database to use on Snowflake.
        schema: Schema in use on Snowflake.
        warehouse: Warehouse to be used on Snowflake.
        role: Role in use on Snowflake.
        login_timeout: Login timeout in seconds. Login requests will not be retried after this timeout expires.
            Note that the login attempt may still take more than login_timeout seconds as an ongoing login request
            cannot be canceled even upon login timeout expiry. The login timeout only prevents further retries.
            If not specified, login_timeout is set to `snowflake.connector.auth.by_plugin.DEFAULT_AUTH_CLASS_TIMEOUT`.
            Note that the number of retries on login requests is still limited by
            `snowflake.connector.auth.by_plugin.DEFAULT_MAX_CON_RETRY_ATTEMPTS`.
        network_timeout: Network timeout in seconds. Network requests besides login requests will not be retried
            after this timeout expires. Overriden in cursor query execution if timeout is passed to cursor.execute.
            Note that an operation may still take more than network_timeout seconds for the same reason as above.
            If not specified, network_timeout is infinite.
        socket_timeout: Socket timeout in seconds. Sets both socket connect and read timeout.
        backoff_policy: Backoff policy to use for login and network requests. Must be a callable generator function.
            Standard linear and exponential backoff implementations are included in `snowflake.connector.backoff_policies`
            See the backoff_policies module for details and implementation examples.
        client_session_keep_alive_heartbeat_frequency: Heartbeat frequency to keep connection alive in seconds.
        client_prefetch_threads: Number of threads to download the result set.
        client_fetch_threads: Number of threads (or processes) to fetch staged query results.
            If not specified, reuses client_prefetch_threads value.
        client_fetch_use_mp: Enables multiprocessing for fetching query results in parallel.
        rest: Snowflake REST API object. Internal use only. Maybe removed in a later release.
        application: Application name to communicate with Snowflake as. By default, this is "PythonConnector".
        errorhandler: Handler used with errors. By default, an exception will be raised on error.
        converter_class: Handler used to convert data to Python native objects.
        validate_default_parameters: Validate database, schema, role and warehouse used on Snowflake.
        is_pyformat: Whether the current argument binding is pyformat or format.
        consent_cache_id_token: Consented cache ID token.
        enable_stage_s3_privatelink_for_us_east_1: when true, clients use regional s3 url to upload files.
        enable_connection_diag: when true, clients will generate a connectivity diagnostic report.
        connection_diag_log_path: path to location to create diag report with enable_connection_diag.
        connection_diag_whitelist_path: path to a whitelist.json file to test with enable_connection_diag - deprecated remove in future
        connection_diag_allowlist_path: path to a allowlist.json file to test with enable_connection_diag.
        json_result_force_utf8_decoding: When true, json result will be decoded in utf-8,
          when false, the encoding of the content is auto-detected. Default value is false.
          This parameter is only effective when the result format is JSON.
        server_session_keep_alive: When true, the connector does not destroy the session on the Snowflake server side
          before the connector shuts down. Default value is false.
        token_file_path: The file path of the token file. If both token and token_file_path are provided, the token in token_file_path will be used.
        unsafe_file_write: When true, files downloaded by GET will be saved with 644 permissions. Otherwise, files will be saved with safe - owner-only permissions: 600.
        check_arrow_conversion_error_on_every_column: When true, the error check after the conversion from arrow to python types will happen for every column in the row. This is a new behaviour which fixes the bug that caused the type errors to trigger silently when occurring at any place other than last column in a row. To revert the previous (faulty) behaviour, please set this flag to false.
    Nc           	        |j                  dd      | _        t        | j                        }|j                          t	               | _        d| _        t        j                  | _	        t	               | _
        g | _        i | _        i | _        d| _        d| _        i | _        t"        j%                  dt&        t(        t*               d| _        d| _        d| _        d| _        t4        j7                         D ]  \  }\  }}t9        | d| |        d| _        | }d	|vr| j=                         }	|	r|	|d	<   d
|v rMd}
t?        j@                  |
tB        d       d|v r!|d   |d
   k7  rt"        jE                  d       n
|d
   | _#        d| _$        d| _%        d| _&        |utO        tP        jR                        D ]Y  \  }}|jT                  dk(  s|jW                  |      tP        jR                  |<   tQ        jX                  | j                          n |?tP        d   }||vr(t        d| dt[        |j]                                      i ||   |}n|r
t_               }| ja                           | jb                  di | te        | j2                        | _3        d| _4        | jk                          | jm                          to        jp                  | jr                         tu        |       | _;        ty        |       | _=        y)aJ  Create a new SnowflakeConnection.

        Connections can be loaded from the TOML file located at
        snowflake.connector.constants.CONNECTIONS_FILE.

        When connection_name is supplied we will first load that connection
        and then override any other values supplied.

        When no arguments are given (other than connection_file_path) the
        default connection will be loaded first. Note that no overwriting is
        supported in this case.

        If overwriting values from the default connection is desirable, supply
        the name explicitly.
        r  F)"skip_config_file_permissions_checkr   TzLSnowflake Connector for Python Version: %s, Python Version: %s, Platform: %sN_r   insecure_modez_The 'insecure_mode' connection property is deprecated. Please use 'disable_ocsp_checks' instead   
stacklevelr   ziThe values for 'disable_ocsp_checks' and 'insecure_mode' differ. Using the value of 'disable_ocsp_checks.   connections)path)skip_file_permissions_checkzInvalid connection_name 'z', known ones are r0  )>get#_unsafe_skip_file_permissions_checkri   
create_logr   _lock_sequence_countersequence_counterrf   default_errorhandler_errorhandler_lock_convertermessages_async_sfqids_done_async_sfqids_client_param_telemetry_enabled_server_param_telemetry_enabled_session_parametersloggerinforV   rU   rT   _http_config_crl_config_session_manager_restr%  itemssetattrheartbeat_thread_detect_applicationwarningswarnDeprecationWarningwarning_disable_ocsp_checksr   query_context_cachequery_context_cache_size	enumerater5   _slicessection_replaceread_configlistkeysr6   *_SnowflakeConnection__set_error_attributesconnectr~   
_telemetryexpired _log_telemetry_imported_packages_log_minicore_importatexitregister_close_at_exitrW   _file_operation_parserrX   _stream_downloader)selfconnection_nameconnections_file_pathkwargseasy_loggingnamevaluer5  is_kwargs_emptyappwarn_messageisr;  s                 r   __init__zSnowflakeConnection.__init__<  s   * 4:::0%4
0 //3/W/W
 	!&*f# !"77#v.035/3,/4,@B /'	
 04-17;.2
 5 ; ; = 	-D*5!DAdV*e,	- !%$*&**,C(+}%f$|LMM" &/01VO5LL?
 -3?,C)=A ()% ,!."8"89 199-01

@U
0VN**1-"..484\4\  &(7Kk1//@ A''+K,<,<,>'?&@B  @O4??F35F##%v)$**5 	--/!!#++, ':$&?#"24"8r   c                    | j                   S NrZ  ro  s    r   r6  z!SnowflakeConnection.insecure_mode      (((r   c                    | j                   S r}  r~  r  s    r   r   z'SnowflakeConnection.disable_ocsp_checks  r  r   c                    | j                   S r}  )_ocsp_fail_openr  s    r   r   z"SnowflakeConnection.ocsp_fail_open      ###r   c                    | j                   rt        j                  S | j                  rt        j                  S t        j
                  S )z9OCSP mode. DISABLE_OCSP_CHECKS, FAIL_OPEN or FAIL_CLOSED.)r   rI   DISABLE_OCSP_CHECKSr   	FAIL_OPENFAIL_CLOSEDr  s    r   
_ocsp_modezSnowflakeConnection._ocsp_mode  s8    ##///  %%%'''r   c                r    | j                   s| j                  S | j                   j                  j                  S )zBCertificate revocation check mode: DISABLED, ENABLED, or ADVISORY.)rO  _cert_revocation_check_moder  ru  r  s    r   r  z.SnowflakeConnection.cert_revocation_check_mode  s1     333::@@@r   c                ^    | j                   s| j                  S | j                   j                  S )z>Whether to allow certificates without CRL distribution points.)rO  #_allow_certificates_without_crl_urlr  r  s    r   r  z6SnowflakeConnection.allow_certificates_without_crl_url  s+     ;;;BBBr   c                ^    | j                   s| j                  S | j                   j                  S )z5Connection timeout for CRL downloads in milliseconds.)rO  _crl_connection_timeout_msconnection_timeout_msr  s    r   r  z-SnowflakeConnection.crl_connection_timeout_ms  s+     222555r   c                ^    | j                   s| j                  S | j                   j                  S )z/Read timeout for CRL downloads in milliseconds.)rO  _crl_read_timeout_msread_timeout_msr  s    r   r  z'SnowflakeConnection.crl_read_timeout_ms  s+     ,,,///r   c                    | j                   s| j                  S | j                   j                  j                         dz  S )z!CRL cache validity time in hours.i  )rO  _crl_cache_validity_hourscache_validity_timetotal_secondsr  s    r   r  z,SnowflakeConnection.crl_cache_validity_hours  s9     11133AACdJJr   c                ^    | j                   s| j                  S | j                   j                  S )zWhether CRL caching is enabled.)rO  _enable_crl_cacher  r  s    r   r  z$SnowflakeConnection.enable_crl_cache  s+     )))000r   c                ^    | j                   s| j                  S | j                   j                  S )z(Whether file-based CRL cache is enabled.)rO  _enable_crl_file_cacher  r  s    r   r  z)SnowflakeConnection.enable_crl_file_cache  +     ...555r   c                    | j                   s| j                  S | j                   j                  syt        | j                   j                        S )zDirectory for CRL file cache.N)rO  _crl_cache_dirr   r   r  s    r   r   z!SnowflakeConnection.crl_cache_dir  sB     &&&--4##1122r   c                ^    | j                   s| j                  S | j                   j                  S )z.Days to keep expired CRL files before removal.)rO  _crl_cache_removal_delay_daysr!  r  s    r   r!  z0SnowflakeConnection.crl_cache_removal_delay_days  s+     555<<<r   c                ^    | j                   s| j                  S | j                   j                  S )z$CRL cache cleanup interval in hours.)rO  !_crl_cache_cleanup_interval_hoursr"  r  s    r   r"  z4SnowflakeConnection.crl_cache_cleanup_interval_hours  s+     999@@@r   c                ^    | j                   s| j                  S | j                   j                  S )z/Whether to start CRL cache cleanup immediately.)rO  _crl_cache_start_cleanupr#  r  s    r   r#  z+SnowflakeConnection.crl_cache_start_cleanup  s+     000777r   c                ^    | j                   s| j                  S | j                   j                  S )zMaximum CRL file size in bytes.)rO  _crl_download_max_sizer$  r  s    r   r$  z)SnowflakeConnection.crl_download_max_size  r  r   c                ^    | j                   s| j                  S | j                   j                  S )z;Whether to skip file permission checks for CRL cache files.)rO  _skip_file_permissions_checkr=  r  s    r   r=  z/SnowflakeConnection.skip_file_permissions_check"  s+     444;;;r   c                    | j                   S r}  )_session_idr  s    r   r   zSnowflakeConnection.session_id)      r   c                    | j                   S r}  )_userr  s    r   r   zSnowflakeConnection.user-      zzr   c                    | j                   S r}  )_hostr  s    r   r   zSnowflakeConnection.host1  r  r   c                ,    t        | j                        S r}  )int_portr  s    r   r   zSnowflakeConnection.port5  s    4::r   c                R    t        j                  dt        d       | j                  S )NzARegion has been deprecated and will be removed in the near futurer7  r8  )rV  rW  PendingDeprecationWarning_regionr  s    r   r   zSnowflakeConnection.region9  s#    O%		
 ||r   c                    | j                   S r}  )_proxy_hostr  s    r   r   zSnowflakeConnection.proxy_hostC  r  r   c                    | j                   S r}  )_proxy_portr  s    r   r   zSnowflakeConnection.proxy_portG  r  r   c                    | j                   S r}  )_proxy_userr  s    r   r   zSnowflakeConnection.proxy_userK  r  r   c                    | j                   S r}  )_proxy_passwordr  s    r   r   z"SnowflakeConnection.proxy_passwordO  r  r   c                    | j                   S r}  )	_no_proxyr  s    r   r   zSnowflakeConnection.no_proxyS      ~~r   c                    | j                   S r}  )_accountr  s    r   r   zSnowflakeConnection.accountW  s    }}r   c                    | j                   S r}  )	_databaser  s    r   r   zSnowflakeConnection.database[  r  r   c                    | j                   S r}  )_schemar  s    r   r   zSnowflakeConnection.schema_  s    ||r   c                    | j                   S r}  )
_warehouser  s    r   r   zSnowflakeConnection.warehousec  s    r   c                    | j                   S r}  )_roler  s    r   r   zSnowflakeConnection.roleg  r  r   c                H    | j                   t        | j                         S d S r}  )_login_timeoutr  r  s    r   r   z!SnowflakeConnection.login_timeoutk  s$    +/+>+>+Js4&&'TPTTr   c                H    | j                   t        | j                         S d S r}  )_network_timeoutr  r  s    r   r   z#SnowflakeConnection.network_timeouto  s$    -1-B-B-Ns4(()XTXXr   c                H    | j                   t        | j                         S d S r}  )_socket_timeoutr  r  s    r   r   z"SnowflakeConnection.socket_timeouts  s$    ,0,@,@,Ls4''(VRVVr   c                "    | j                         S r}  )_backoff_policyr  s    r   _backoff_generatorz&SnowflakeConnection._backoff_generatorw  s    ##%%r   c                    | j                   S r}  _client_session_keep_aliver  s    r   r   z-SnowflakeConnection.client_session_keep_alive{  s    ...r   c                    || _         y r}  r  ro  ru  s     r   r   z-SnowflakeConnection.client_session_keep_alive  s
    */'r   c                    | j                   S r}  )._client_session_keep_alive_heartbeat_frequencyr  s    r   r   zASnowflakeConnection.client_session_keep_alive_heartbeat_frequency  s    BBBr   c                2    || _         | j                          y r}  )r  7_validate_client_session_keep_alive_heartbeat_frequencyr  s     r   r   zASnowflakeConnection.client_session_keep_alive_heartbeat_frequency  s    >C;DDFr   c                    | j                   S r}  #_platform_detection_timeout_secondsr  s    r   r   z6SnowflakeConnection.platform_detection_timeout_seconds  s    777r   c                    || _         y r}  r  r  s     r   r   z6SnowflakeConnection.platform_detection_timeout_seconds  s
    380r   c                >    | j                   r| j                   S t        S r}  )_client_prefetch_threadsDEFAULT_CLIENT_PREFETCH_THREADSr  s    r   r   z+SnowflakeConnection.client_prefetch_threads  s'     ,, ))	
 1	
r   c                2    || _         | j                          y r}  )r  !_validate_client_prefetch_threadsr  s     r   r   z+SnowflakeConnection.client_prefetch_threads  s    (-%..0r   c                    | j                   S r}  )_client_fetch_threadsr  s    r   r   z(SnowflakeConnection.client_fetch_threads      )))r   c                J    |t        t        d|      t              }|| _        y )Nr   )minmaxMAX_CLIENT_FETCH_THREADSr  r  s     r   r   z(SnowflakeConnection.client_fetch_threads  s#    Au'?@E%*"r   c                    | j                   S r}  )_client_fetch_use_mpr  s    r   r   z'SnowflakeConnection.client_fetch_use_mp  r  r   c                    | j                   S r}  )rQ  r  s    r   restzSnowflakeConnection.rest  r  r   c                    | j                   S r}  )_applicationr  s    r   r   zSnowflakeConnection.application  s       r   c                    | j                   S r}  )rD  r  s    r   errorhandlerz SnowflakeConnection.errorhandler      !!!r   c                ,    |t        d      || _        y )NzNone errorhandler is specified)rh   rD  r  s     r   r  z SnowflakeConnection.errorhandler  s     ="#CDD"r   c                    | j                   S r}  )_converter_classr  s    r   r   z#SnowflakeConnection.converter_class  s    $$$r   c                    | j                   S r}  )_validate_default_parametersr  s    r   r   z/SnowflakeConnection.validate_default_parameters      000r   c                    | j                   dv S )N)r   r   )_paramstyler  s    r   is_pyformatzSnowflakeConnection.is_pyformat  s    #999r   c                    | j                   S r}  )_consent_cache_id_tokenr  s    r   r   z*SnowflakeConnection.consent_cache_id_token      +++r   c                H    t        | j                  xr | j                        S r}  )boolrI  rJ  r  s    r   telemetry_enabledz%SnowflakeConnection.telemetry_enabled  s&    00 544
 	
r   c                x    |rdnd| _         | j                   r#| j                  st        j                  d       y y y )NTFzTelemetry has been disabled by the session parameter CLIENT_TELEMETRY_ENABLED. Set session parameter CLIENT_TELEMETRY_ENABLED to true to enable telemetry.)rI  rJ  rL  rM  r  s     r   r  z%SnowflakeConnection.telemetry_enabled  s<    7<t%,0088KK_ 9 1r   c                    | j                   S r}  _service_namer  s    r   r   z SnowflakeConnection.service_name  r  r   c                    || _         y r}  r  r  s     r   r   z SnowflakeConnection.service_name  s
    "r   c                    | j                   S r}  )_log_max_query_lengthr  s    r   r   z(SnowflakeConnection.log_max_query_length  r  r   c                    | j                   S r}  _disable_request_poolingr  s    r   r   z+SnowflakeConnection.disable_request_pooling      ,,,r   c                &    |rd| _         y d| _         y NTFr  r  s     r   r   z+SnowflakeConnection.disable_request_pooling  s    05%5%r   c                     y)NTr0  r  s    r   r   z$SnowflakeConnection.use_openssl_only  s     r   c                    | j                   S r}  _arrow_number_to_decimalr  s    r   r   z+SnowflakeConnection.arrow_number_to_decimal  r  r   c                    | j                   S r}  *_enable_stage_s3_privatelink_for_us_east_1r  s    r   r   z=SnowflakeConnection.enable_stage_s3_privatelink_for_us_east_1  s    >>>r   c                &    |rd| _         y d| _         y r  r  r  s     r   r   z=SnowflakeConnection.enable_stage_s3_privatelink_for_us_east_1  s    BG$7U7r   c                    | j                   S r}  )_enable_connection_diagr  s    r   r   z*SnowflakeConnection.enable_connection_diag
  r  r   c                    | j                   S r}  )_connection_diag_log_pathr  s    r   r   z,SnowflakeConnection.connection_diag_log_path  s    ---r   c                R    t        j                  dt        d       | j                  S )z
        Old version of ``connection_diag_allowlist_path``.
        This used to be the original name, but snowflake backend
        deprecated whitelist for allowlist. This name will be
        deprecated in the future.
        z^connection_diag_whitelist_path has been deprecated, use connection_diag_allowlist_path insteadr7  r8  )rV  rW  rX  _connection_diag_whitelist_pathr  s    r   r   z2SnowflakeConnection.connection_diag_whitelist_path  s'     	l	

 333r   c                    | j                   S r}  )_connection_diag_allowlist_pathr  s    r   r   z2SnowflakeConnection.connection_diag_allowlist_path!  s    333r   c                    || _         y r}  r  r  s     r   arrow_number_to_decimal_setterz2SnowflakeConnection.arrow_number_to_decimal_setter%  s
    (-%r   c                    | j                   S r}  )_auth_classr  s    r   r   zSnowflakeConnection.auth_class)  r  r   c                H    t        |t              r|| _        y t        d      )N%auth_class must subclass AuthByPlugin)r   r)   r&  	TypeErrorr  s     r   r   zSnowflakeConnection.auth_class-  s     e\*$DCDDr   c                    | j                   S r}  )_disable_query_context_cacher  s    r   is_query_context_cache_disabledz3SnowflakeConnection.is_query_context_cache_disabled4  r  r   c                    | j                   S r}  )_iobound_tpe_limitr  s    r   r  z%SnowflakeConnection.iobound_tpe_limit8      &&&r   c                    | j                   S r}  _unsafe_file_writer  s    r   r  z%SnowflakeConnection.unsafe_file_write<  r/  r   c                    || _         y r}  r1  r  s     r   r  z%SnowflakeConnection.unsafe_file_write@  s
    "'r   c                    | j                   S r}  -_check_arrow_conversion_error_on_every_columnr  s    r   r  z@SnowflakeConnection.check_arrow_conversion_error_on_every_columnD  s    AAAr   c                    t        | j                         j                  d      j                         d   d         j	                  d      d   S )NzSELECT CURRENT_VERSION()r    )r   cursorexecutefetchallsplitr  s    r   snowflake_versionz%SnowflakeConnection.snowflake_versionH  sI     KKM!!"<=FFHKAN

%*Q 	r   c                    || _         y r}  r5  r  s     r   r  z@SnowflakeConnection.check_arrow_conversion_error_on_every_columnP  s
    =B:r   c                B   t         j                  d       t        |      dkD  r | j                  di | t	        j
                  |       | _        | j                  \t        | j                  t              rBt        | j                  t        t        f      s"dj                  d | j                  D              n| j                  }t        t               | j                   | j                   | j"                  | j$                  | j&                  |      | _        t+        j,                  | j(                        | _        | j0                  ri }t3        | j4                  | j6                  | j8                  | j:                  | j:                  n| j<                  | j                   | j"                  | j$                  | j&                  | j.                  j?                  d      		      }	 |jA                          | jC                          | jE                         |_"        	 |jO                          |jQ                          |r$tG        t        |            | jC                          tR        jU                  |        y# tF        $ r6 tI        jJ                         |d
<   t         jM                  d|d
    d       Y w xY w# tF        $ r6 tI        jJ                         |d<   t         jM                  d|d    d       Y w xY w# |jQ                          |rtG        t        |            w xY w)z$Establishes connection to Snowflake.re  r   N,c              3  2   K   | ]  }t        |        y wr}  )r   ).0xs     r   	<genexpr>z.SnowflakeConnection.connect.<locals>.<genexpr>]  s     3SV3s   )adapter_factoryuse_poolingr   r   r   r   r   F)rF  )	r   r   r   r   r   r   r   r   session_managerconnection_testz"Exception during connection test:
r8  	post_testz'Exception during post connection test:
r0  )+rL  debuglen_SnowflakeConnection__configrM   from_connectionrO  r   r   r   r   bytesjoinrx   ry   r   r   r   r   r   rN  r{   get_managerrP  r   r7   r   r   r   r   r   clonerun_test%_SnowflakeConnection__open_connectionr9  	Exception	traceback
format_excrY  run_post_testgenerate_report_connections_registryadd_connection)ro  rr  no_proxy_csv_strexceptions_dictconnection_diags        r   re  zSnowflakeConnection.connectT  s   Yv;?DMM#F#&/&?&?&E
 )t}}h7"4==3,?	 HH3T]]33  	 '68!999..%
 !6 A A$BSBS T&& O2YY)-)F)F ::F 77<<??????#22 $ 5 5 ; ; ; NO((*&&()-&
:--/  //1"#C$899""$ 	,,T2)  5>5I5I5K 12;OL]<^;__`c  /8/C/C/E,@Q\A]@^^_b  //1"#C$899 #s6    5I2 J4 2<J10J14<K30K6 2K33K6 6(LTc                   t        j                  | j                         	 t        j	                  |        | j
                  st        j                  d       y| j                          t        j                  d       | j                  r| j                  j                  |       | j                         r>| j                  s2t        j                  d       | j
                  j                  |       n7t        j                  dj                  t!        | j"                                     | j
                  j                          d| _        | j&                  r| j&                  j)                          | j*                  dd= t        j                  d       y# t,        $ r }t        j                  d|       Y d}~yd}~ww xY w)	zCloses the connection.z4Rest object has been destroyed, cannot close sessionNclosedretryz5No async queries seem to be running, deleting sessionz>There are {} async queries still running, not deleting sessionzSession is closedz<Exception encountered in closing connection. ignoring...: %s)rj  
unregisterrl  rY  remove_connectionr  rL  rJ  _cancel_heartbeatr  rf  close_all_async_queries_finished_server_session_keep_alivedelete_sessionr   rK  rG  rQ  r[  clear_cacherF  rT  )ro  ra  es      r   re  zSnowflakeConnection.close  sM    	$--.&	!33D999ST
 ""$ LL"%%%%E%200277TU		((u(5T[[D../
 IIOODJ''((446a LL,- 	LLNPQ 	s   6F D=F 	F?F::F?c                    | j                   du S )z.Checks whether the connection has been closed.N)r  r  s    r   	is_closedzSnowflakeConnection.is_closed  s    yyD  r   c           	        | j                   s(t        j                  | dt        dt        t
        d       t        |t              s&t        j                  | dt        d| t        d       	 | j                         j                  d|        y# t        $ r7}|j                  t        k(  rt        j                  d       Y d}~yY d}~yd}~ww xY w)z9Sets autocommit mode to True, or False. Defaults to True.NConnection is closedmsgerrnosqlstatezInvalid parameter: rp  rq  zALTER SESSION SET autocommit=z>Autocommit feature is not enabled for this connection. Ignored)r  rf   errorhandler_wrapperre   rY   r|   r   r  rh   r^   r9  r:  rr  r}   rL  rJ  )ro  moderj  s      r   r   zSnowflakeConnection.autocommit  s    yy&&14 >		 $%&& 07-		KKM!!$A$"HI 	zz;;W  <	s   ,"B 	C(C

Cc                B    | j                         j                  d       y)z Commits the current transaction.COMMITNr9  r:  r  s    r   commitzSnowflakeConnection.commit  s    h'r   c                B    | j                         j                  d       y)z#Rolls back the current transaction.ROLLBACKNrx  r  s    r   rollbackzSnowflakeConnection.rollback  s    j)r   c           	         t         j                  d       | j                  s(t        j                  | dt
        dt        t        d        ||       S )zPCreates a cursor object. Each statement will be executed in a new cursor object.r9  Nrn  ro  )rL  rJ  r  rf   rt  re   rY   r|   )ro  cursor_classs     r   r9  zSnowflakeConnection.cursor  sG    Xyy&&14 >		 D!!r   Fc                v    t        |      } | j                  |f||d|}t        |      }|r|S t               S )z]Executes a SQL text including multiple statements. This is a non-standard convenience method.)remove_commentsr~  )r
   execute_streamrb  )	ro  sql_textr  return_cursorsr~  rr  streamstream_generatorrets	            r   execute_stringz"SnowflakeConnection.execute_string  sR     (#.4..
$3,
RX
 #$$s0$&0r   c              +     K   t        ||      }|D cg c]
  }|d   s	| }}|D ]0  \  }}	| j                  |      }
 |
j                  |fd|	i| |
 2 yc c}w w)zNExecutes a stream of SQL statements. This is a non-standard convenient method.)r  r   )r~  _is_put_getN)r   r9  r:  )ro  r  r  r~  rr  split_statements_listrj  non_empty_statementssqlis_put_or_getcurs              r   r  z"SnowflakeConnection.execute_stream  s|      !1O!
 ,AIaAaDII"6 	C++<+8CCKKAA&AI	  Js   A 
AA=A c           	         t        t              D cg c]  }t        t        t        |            s|  c}D ]5  }|j	                  d      s|n|dd  }t        | |t        t        |             7 y c c}w )Nr5  r   )dirr   callablegetattr
startswithrS  )ro  methodmrt  s       r   __set_error_attributesz*SnowflakeConnection.__set_error_attributes$  se    !$V
9P0QF
 	4A LL-11QR5DD$ 23	4 
s
   A1A1c                    |j                         }t        j                  j                          d| d}|t        j
                  d<   t        j                  d|       t        j                  j                          y )Nzhttp://ocsp.z/ocsp_response_cache.json!SF_OCSP_RESPONSE_CACHE_SERVER_URLz OCSP Cache Server is updated: %s)	lowerr2  OCSP_ENV_LOCKacquireosenvironrL  rJ  release)rw  hostnameocsp_cache_servers      r   setup_ocsp_privatelinkz*SnowflakeConnection.setup_ocsp_privatelink,  sa    >>#))113*8*4MN:K

6779JK))113r   c                >   | j                  | j                  | j                        | _        t	        | j
                  | j                  | j                  | j                  | | j                        | _
        t        j                  d| j
                  | j                         dt        j                  v r't        j                  dt        j                  d          d| j
                  j                         v r+t         j#                  | j$                  | j
                         n#dt        j                  v rt        j                  d= | j&                  i | _        | j(                  | j(                  | j&                  t*        <   | j,                  | j,                  | j&                  t.        <   | j0                  rd| j&                  t2        <   | j4                  | j6                  | j&                  t8        <   | j:                  !| j=                         | j&                  t>        <   | j@                  r!| jC                         | j&                  tD        <   tG        | jH                        }| jJ                  r| jL                  r|j                  jO                  | jJ                  | jL                  | jP                         |j                  jS                         }t        j                  |       |r|jU                  d	      s%tW        jX                  | dtZ        d
t\        d       nt        j                  d       n| j^                  \ta        | j^                        tb        vr.te        ta        | j^                        tf              sti        d      | j^                  | _/        n| jj                  tl        k(  r3to        | jp                  | jr                  | jt                        | _/        n| jj                  tv        k(  r)tx        r| jz                  nd| j&                  t|        <   |j                  | j
                  | j                  | j&                         | j                  j                  Tt        | j$                  | j                  | j
                  | j                  | jr                  | jt                        | _/        nt        | j                  j                  | j$                  | j                  | j
                  | j                  | jr                  | jt                        | _/        n| jj                  t        k(  ra| j                  }| j                  r t        | j                  | j                        }tg        || jr                  | jt                        | _/        n&| jj                  t        k(  r3t        | j                  | jr                  | jt                        | _/        n| jj                  t        k(  rI| j                  r4| j                  dk(  r%t        j                  | j                        | _N        t        | j$                  | j                  | j                  | j
                  | j                  j                  | j
                  | j                        | j                  j                  | j
                  | j                        | j                  | j                  | j                  | j                   | jz                  r|j                         nd| j                  | j                  | j                        | _/        n| jj                  t        k(  r| j                  r4| j                  dk(  r%t        j                  | j                        | _N        t        | j$                  | j                  | j                  | j                  j                  | j
                  | j                        | j                  | j                  |       | _/        n| jj                  t        k(  rtx        r| j                  nd| j&                  t        <   | j&                  t           r1|j                  | j
                  | j                  | j&                         t        | jp                  | jH                  j                  | jr                  | jt                        | _/        n| jj                  t        k(  rt        | j                        | _/        n| jj                  t        k(  rAt               | _/        | j                  j                  | j                  | j                         no| jj                  t        k(  r*t        | j                  t              r$t        j                  | j                        | _m        | j                  sHtW        jX                  | dtZ        ddj                  t        j                                dt        d       | j                  rO| j                  t        j                  t        j                  fvr#tW        jX                  | dtZ        dt        d       t        | j                  | j                  | j                  | j                        | _/        n1t        | j$                  | jr                  | jt                        | _/        | j                  | j^                         d| _8        | j^                  j                          | j                          | j4                  r| j                          yy)zOpens a new network connection.)	use_numpyr   )r   r   r   r   
connectionrG  z"REST API object was created: %s:%sr  z6Custom OCSP Cache Server URL found in environment - %sz .privatelink.snowflakecomputing.NTsuccessz!Session and master tokens invalidrs  z/Session and master token validation successful.z1auth_class must be a child class of AuthByKeyPair)r   timeoutbackoff_generator)r   r   r   r   r  r  )id_tokenr   r   r   r   r  r  )r   r  r  )oauth_tokenr  r  r   )r   )r   r   )r   	client_idclient_secretr   authentication_urltoken_request_urlredirect_uriuriscopepkce_enabledtoken_cacherefresh_token_enabledr    enable_single_use_refresh_tokens)r   r  r  r  r  credentials_in_bodyr  )r   	mfa_tokenr  r  z1workload_identity_provider must be set to one of r@  z) when authenticator is WORKLOAD_IDENTITY.zQworkload_identity_impersonation_path is currently only supported for GCP and AWS.)providerr   entra_resourceimpersonation_path)r   r  r  )~r  _numpy_support_negative_yearr   rw   r   r   	_protocol_inject_client_pauserP  rQ  rL  rJ  r  r  r  r2  r  r   rK  _autocommitr=   	_timezonerH   r  rD   r   r  r@   r   r  rA   r   r  r>   r!   r  _session_token_master_tokenupdate_tokens_master_validity_in_seconds
_heartbeatr>  rf   rt  rh   r^   r   r(  r    
issubclassr#   r)  _authenticatorrj   r"   	_passwordr   r  rk   r1   "_client_store_temporary_credentialrB   read_temporary_credentialsr   r  r+   r.   rl   _private_key_private_key_filer   _private_key_file_pwdrn   r$   _tokenro   r  _oauth_scoper:   r   r%   _oauth_client_id_oauth_client_secret_oauth_authorization_url_oauth_token_request_url_oauth_redirect_uri_oauth_socket_uri_oauth_disable_pkceget_token_cache_oauth_enable_refresh_tokens_external_browser_timeout'_oauth_enable_single_use_refresh_tokensrp   r&   _oauth_credentials_in_bodyrt   _client_request_mfa_tokenr?   r*   r  rr   r(   rq   r-   set_pat_and_external_session_external_session_idru   r   _workload_identity_providerr   r   from_stringrO  all_string_valuesr_   %_workload_identity_impersonation_pathGCPAWSr,   !_workload_identity_entra_resourcer'   authenticate_with_retryreset_secretsinitialize_query_context_cache_add_heartbeat)ro  authheartbeat_retr   s       r   __open_connectionz%SnowflakeConnection.__open_connection5  s   ..kk9T9T / 
 &^^ $ 9 9 11

 	9499diiP."**<LLH

>?
 .1BB66t7G7GS2bjj@JJBC##+')D$'=A=M=MD$$%9:>>%;?>>D$$%78,,  $$%QR ))5// $$%HI ==I LLN $$G ''668 $$%FG
 DII4#5#5JJ$$##""00
 !JJ113MLL' (9(9)(D**$B!1	 NO *OO34<F)== $$WXX"&//$$(=="/!^^ ..&*&=&=#
 $$(FF AIT<<d ((? //IIII,, ::&&.&6$($4$4!%!YY!YY $ 2 2*.*A*A'DO '4!%!4!4$($4$4!%!YY!YY $ 2 2*.*A*A'DO $$(>>"//))">..22#K
 #0 + ..&*&=&=#
 $$(;;"- $ ..&*&=&=#
 $$(@@::4#4#4#:(<(C(C(TD%"1 $ 0 0"33"&";";'+'D'D'K'K!YYTYY (L ( '+&C&C&J&J!YYTYY 'K ' "&!9!9..++%)%=%=!=  BB ,,.!*.*K*K-1-K-K595a5a-#0 $$(@@::4#4#4#:(<(C(C(TD%"8 $ 0 0"33"&";";&*&C&C&J&J!YYTYY 'K ' ++(,(G(G#
# $$(AA 7?D22D (()KL ++,NO33				00
 #2!^^"ii11 ..&*&=&=	# $$(AA"+DKK"8$$(AA
 #-,

77KK!:!: $$(GGd>>D7J7V7V888D4 77..(%VWZW_W_`s  aF  aF  aH  XI  WJ  Js  $t%<	 >>88+//+// ..(#v%<	 #9!==++#'#I#I'+'Q'Q	# #- $ 0 0 ..&*&=&=# ((9!DNOO))+++-)) !	 *r   c                f   t         j                  d       d|v r
|d   | _        d|v r3|d   }t        j	                  |      sd| }t        |d      || _        d|v r
|d   | _        g dt        fd	|j                               D ]A  \  }}| j                  r|t        j                         vrft        |t        j                         d
d      }t        |      dkD  r|d   nd}t        j                   dj#                  ||rd| dnd      d       nt%        |t        |   d
         st        |   d
   }t        j                   dj#                  |t%        |t&              r+t)        t'        d |D                    j+                  dd      n|j,                  t/        |      j,                        d       t1        | d|z   |       D | j2                  r	 ddl}| j>                   ddl }	|	jB                  jD                  | _        n#| j>                  tF        vrt        dtH              | jJ                  r%t%        | jJ                  tL              stO        d      d|v r.d|vr*tQ        |jS                  d      | jT                        | _+        t         jY                  dt[        jR                  t]        | jV                        d       d        | jJ                  r&| jJ                  j^                  j`                  | _1        n| jb                  r| jb                  je                         }
|
tf        th        tj        tl        tn        tp        tr        tt        tv        tx        f
v r|
| _1        n0|
j{                  d!      rnt        d"| jb                   tH              |jS                  d#      }|r)t}        |      5 }|j                         | _@        ddd       tl        t        tt        tv        tx        tn        tp        h}| j                  r| j                  sD| j                  sD| jb                  |vr6t9        j:                  | dt
        d$d%j                  |       d&t        d       | j                  s| j                  rtj        | _1        g d'}|D ]W  }| j                  d|       | jb                  tt        k7  s,t9        j:                  | dt
        | d(tt         t        d       Y | j                  e| jb                  th        tl        tn        tp        tj        tv        tt        tx        fvr/| j                  s#t9        j:                  | dt
        d)t        d       | jT                  s=t%        | j                  t              s#t9        j:                  | dt
        d*t        d       | jT                  r(d&| jT                  v rt        | jT                        | _*        t%        | j                  t              rt%        | j                         t              s#t9        j:                  | dt
        d+t        d       | j                  rt         j                  d,       | j                  rt         j                  d-       yy# t6        $ r' t9        j:                  | dt
        dt<        d       Y w xY w# 1 sw Y   xY w).z,Sets up parameters in the connection object.__configrB  r   zInvalid application name: r   rs  r   )r   rB  r   c                    | d   vS )Nr   r0  )rj  	skip_lists    r   <lambda>z.SnowflakeConnection.__config.<locals>.<lambda>`  s    AaD	,A r   r   g?)ncutoffNz)'{}' is an unknown connection parameter{}z, did you mean 'z'?r   r   r8  z?'{}' connection parameter should be of type '{}', but is a '{}'c              3  4   K   | ]  }|j                     y wr}  )r+  )rB  rj  s     r   rD  z/SnowflakeConnection.__config.<locals>.<genexpr>t  s     )M!**)Ms   'r5  z9Numpy module is not installed. Cannot fetch data as numpyzInvalid paramstyle is specifiedr(  r   r   r   zConnecting to GLOBALz Snowflake domainzHTTPS://zUnknown authenticator: r   zFUser is empty, but it must be provided unless authenticator is one of z, .)r   r   r   z* was set but authenticator was not set to zPassword is emptyzAccount must be specifiedz+Backoff policy must be a generator functionzThis connection is in OCSP Fail Open Mode. TLS Certificates would be checked for validity and revocation status. Any other Certificate Revocation related exceptions or OCSP Responder failures would be disregarded in favor of connectivity.zThis connection runs with disabled OCSP checks. Revocation status of the certificate will not be checked against OCSP Responder.)WrL  rJ  rB  APPLICATION_REmatchrh   r  r  filterrR  r   r%  rc  r   rK  rV  rW  r   r   tupler   replacer+  r(  rS  r  r   ModuleNotFoundErrorrf   rt  ra   r  snowflake.connector	connectorr   SUPPORTED_PARAMSTYLESr^   r&  r)   r)  r   r>  r  r  rM  r9   r   type_ru  r  upperrj   rk   rl   rn   ro   rp   rt   ru   rr   rq   r  r   r   r  rm   r  r  r   rO  rc   r  r  __getattribute__r_   r   r  rb   r-   r`   r   r  r   r   r]   r   r   )ro  rr  ru  rp  rt  close_matchesguessaccepted_typesr   	snowflakeauth_tmpr   f!empty_user_allowed_authenticators#workload_identity_dependent_optionsdependent_optionr  s                   @r   r  zSnowflakeConnection.__configO  sA   Z '$*+=$>D!F"=)E!''.25':&3a88$)!(F2067T0UD-V	!"A6<<>R 	-KD%//499;;$5388:a%M 14M0BQ0FM!,DEMMCJJ %$4UG2">R $% $E+@+Fq+IJ%:4%@%CNMMY`` 
 $.ne#D !$E)Mn)M$M N V V$'!" &4%<%< K00
 $% D#*e,?	-B ;; #&(22==D%::"5=M  Jt/?/?$NCDDV#/

80DdmmT
-112XY]YcYc2dfnop  qB  C	
 "&"2"2"8"8">">D  **002H%.&#(()/))  '/#$$Z0&1$2E2E1FG*  !**%67o& '!ffh'
  !+%%$$-
) ""t':':II''/PP **$!ghlhqhq  sT  iU  hV  VW   X!+	   D$:$:&<#3/
 %H  ))A.>-?*@AM++/NN..(&6%77a  cB  bC  $D%<	  '''2',,*-3-	
 **$/.I	 }}Z%L&& 3>PQ	 ==SDMM1)$--8DM$..9  "HB
 && H6	 LL  ##LLc $Y ' 	**$Z!,		~' 's   Y3 7Z&3,Z#"Z#&Z0c           	        t         j                  d       ||
|t               d}|||d<   |||d<   |r||d<   |	r|	|d<   |||d<   |||d<   |
s| j                         }||d	<   |rd
nd}t         j	                         t
        j                  k  r-t         j                  d| j                  |d         |d   |       t        |i}| j                  j                  dt        |      z   |||
d||      }|di i}|j                  d      i |d<   |rf|d   }d|v r|d   
|d   | _        d|v r|d   
|d   | _        d|v r|d   
|d   | _        d|v r
|d   | _        d|v r|
s| j#                  |d          |S )z)Executes a query with a sequence counter.
_cmd_query)sqlText	asyncExec
sequenceIdquerySubmissionTimedataframeAst
parameters
isInternaldescribeOnly	bindStagebindingsqueryContextDTOsfsql_file_transfersfsqlz1sql=[%s], sequence_id=[%s], is_file_transfer=[%s]r  r  z/queries/v1/query-request?T)client_no_results_include_retry_params	_no_retryr  datafinalDatabaseNamefinalSchemaNamefinalWarehouseNamefinalRoleNamequeryContext)rL  rJ  r   get_query_contextgetEffectiveLevelloggingDEBUG_format_query_for_logrs   r  requestr4   r>  r  r  r  r  set_query_context)ro  r  rB  
request_idbinding_paramsbinding_stageis_file_transferstatement_paramsis_internaldescribe_onlyr  _update_current_objectr  r  dataframe_astr  r$  r  url_parametersr  s                       r   	cmd_queryzSnowflakeConnection.cmd_query6  s   $ 	\"$*#2#4	
 $#0D '!1D!,D#0D $ -D%-D113L&2D"#*:&##%6LLC**4	?;\" 	 %j1ii(9^+DD#"&   
 ;2,C776?"CK!v;D"d*t4G/H/T!%&9!: D(T2C-D-P#$56#t+5I0J0V"&';"<$&!/2
%k&&tN';<
r   c                :    | j                   j                  |       S )N)conn)r&  reauthenticater  s    r   _reauthenticatez#SnowflakeConnection._reauthenticate  s    ..D.99r   c                   	 | j                  |       y # t        $ rc}t        j                  d|       t	        |      t
        t        t        fv r| j                          n| j                  |       Y d }~y Y d }~y d }~ww xY w)Nz)ID token expired. Reauthenticating...: %s)	_authenticaterv   rL  rJ  r(  r.   r%   r&   r:  )ro  auth_instanceexs      r   r  z+SnowflakeConnection.authenticate_with_retry  ss    	2}-& 	2LLDbIM"&'  $$&""=11 '	2s    	B AA;;B c                @   |j                  | | j                  | j                  | j                  | j                  | j
                         t        |dd      | _        t        | j                        }|j                  j                          	 |j                  || j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  | j(                  | j*                         y # t,        $ r{}t.        j1                  dt3        |      j4                          	 	 |j7                  | j                  | j                  | j                  | j                  | j
                         |j                  || j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  | j(                  | j*                         np# t,        $ rd}|j8                  t:        k(  r1t<        |j>                  v r|xj>                  dt<         z  c_        ||t.        j1                  d       Y d }~>d }~ww xY wY d }~y d }~ww xY w)	N)r8  r   r   r   r   r   r   T)r=  r   r   r   r   r   r   r   r   r   r   r   z=Operational Error raised at authenticationfor authenticator: )r   r   r   r   r   
z2Continuing authenticator specific timeout handling) preparer  r   r   r   r  r  r  r!   r  
_retry_ctxset_start_timeauthenticater   r   r   r   	_passcode_passcode_in_password_mfa_callback_password_callbackrK  rg   rL  rJ  r(  r+  handle_timeoutrq  r\   r8   rp  )ro  r=  r  rj  auth_ops        r   r<  z!SnowflakeConnection._authenticate  s2   --**LL^^ 	 	
 (/3T(
$ DII  //12	+YY{{..YY%)%?%?!//"&"9"9#'#;#;     #	LL&&*=&9&B&B%CE !00&*&9&9%)%6%6 $!YY!% 1  %%&3 $!YY!%#{{"&..!YY!%-1-G-G%)%7%7*.*A*A+/+C+C &  ( }}(BB0AEE9#KKR0E/F+GGK%1,LL!UV G#	sE   BD 
J",JCH#"J#	J,AJJJJJc                    g }	 |D ]T  }t        | j                  j                  |      }|j                  dj	                  |      dz   j                  d             V 	 |S # t        t        f$ r}t        |d}~ww xY w)a'  Write csv-format rows of binding values as list of bytes string.

        Args:
            params: Binding parameters to bulk array insertion query with qmark/numeric format.
            cursor: SnowflakeCursor.

        Returns:
            List of bytes string corresponding to rows

        r@  r@  r   N)	mapr   to_csv_bindingsappendrO  r   rh   AttributeErrorr0   )ro  paramsresrowtempexcs         r   _write_params_to_byte_rowsz.SnowflakeConnection._write_params_to_byte_rows  s     	+ D4>>993?

CHHTNT199'BCD
 
 !.1 	+!s*	+s   AA   A;/A66A;c           	        t        |t              r7t        |      dk7  r#t        j                  | |t
        dt        d       |\  }}nq| j                  j                  |      }|Tt        j                  | |t
        dj                  |j                  j                  j                               t        d       t        || j                  j                  ||            S )Nr7  zqBinding parameters must be a list where one element is a single value or a pair of Snowflake datatype and a valuers  zxPython data type [{}] cannot be automatically mapped to Snowflake data type. Specify the snowflake data type explicitly.)r   r  rK  rf   rt  rh   r[   r   snowflake_typer   	__class__r+  r  rd   r'  to_snowflake_bindings)ro  r9  vrW  s       r   _get_snowflake_type_and_bindingz3SnowflakeConnection._get_snowflake_type_and_binding  s    
 a1v{**$ C "<		
 !"NA!^^::1=N%**$ & '-fQ[[-A-A-G-G-I&J!D	 NN00C
 	
r   c                   |sy i }t        | j                  |      }t        |      D ]  \  }}t        |t              r| j
                  j                  |      }t	        t        ||            }|d   j                  t        fd|D              r}||D 	cg c]  }	|	j                   c}	d|t        |dz         <    ||      \  }}
||
d|t        |dz         <    t        j                         t        j                  k  r>|j!                         D ]+  \  }}t        j#                  d||j%                  d             - |S c c}	w )Nr   c              3  <   K   | ]  }|j                   k(    y wr}  )r(  )rB  
param_data
first_types     r   rD  z=SnowflakeConnection._process_params_qmarks.<locals>.<genexpr>4  s     Vz*4Vs   )r(  ru  r   zidx: %s, type: %sr(  )r	   r[  r]  r   rb  r   rW  rL  r(  allr*  r   rL  r&  r'  r(  rR  rJ  r>  )ro  rP  r9  processed_paramsget_type_and_bindingidxrZ  rW  all_param_datar^  snowflake_bindingkr_  s               @r   _process_params_qmarksz*SnowflakeConnection._process_params_qmarks#  sC   
 &t'K'KVT' 	FC!T"!%!>!>q!A!%c*>&B!C+A.33
V~VV%/N*CQRZj00R2 S1W.
 5I4K1 1*.2 S1W.	$ ##%6(..0 D10!QUU6]CD Ss   Ec           	        || j                   ryi S t        |t              r| j                  |      S t        |t        t
        f      s|g}	 t        | j                  |      }t	        |      }t        j                  d|        |S # t        $ r0}t        j                  | |t        d| t        d       Y d}~yd}~ww xY w)aA  Process parameters for client-side parameter binding.

        Args:
            params: Either a sequence, or a dictionary of parameters, if anything else
                is given then it will be put into a list and processed that way.
            cursor: The SnowflakeCursor used to report errors if necessary.
        Nparameters: z'Failed processing pyformat-parameters; rs  )_interpolate_empty_sequencesr   dict_process_params_dictr  rb  rL  _process_single_paramrL  rJ  rT  rf   rt  rh   rZ   )ro  rP  r9  rQ  r  rj  s         r   _process_params_pyformatz,SnowflakeConnection._process_params_pyformatE  s     >00Ifd#,,V44 &5$-0F	d00&9C*CLL<u-.J 		&& DQCH:	 		s   :B 	C&B<<Cc           	         	 |j                         D ci c]  \  }}|| j                  |       }}}t        j                  d|        |S c c}}w # t        $ r0}t        j                  | |t        d| t        d       Y d }~y d }~ww xY w)Nri  z'Failed processing pyformat-parameters: rs  )	rR  rm  rL  rJ  rT  rf   rt  rh   rZ   )ro  rP  r9  rf  rZ  rQ  rj  s          r   rl  z(SnowflakeConnection._process_params_dictn  s    	@FO11d0033OCOLL<u-.J P  		&& DQCH:	 		s'   A AA A 	B&BBc                    | j                   j                  }| j                   j                  }| j                   j                  } | | ||                  S )am  Process a single parameter to Snowflake understandable form.

        This is a convenience function to replace repeated multiple calls with a single
        function call.

        It calls the following underlying functions in this order:
            1. self.converter.to_snowflake
            2. self.converter.escape
            3. self.converter.quote
        )r   to_snowflakeescaper3   )ro  paramrq  rr  _quotes        r   rm  z)SnowflakeConnection._process_single_param  sF     ~~22&&%%f\%0122r   c           	         t         j                  d||       t        t        t	        j
                               i}| j                  j                  dt        |      z   d|t        t        |      i      S )z9Cancels the query with the exact SQL query and requestId.z'_cancel_query sql=[%s], request_id=[%s]z/queries/v1/abort-request?r  )	rL  rJ  rs   r   uuiduuid4r  r*  r4   )ro  r  r,  r5  s       r   _cancel_queryz!SnowflakeConnection._cancel_query  s_    >ZP$c$**,&78yy  (9^+DD3C
O
 	
r   c                    | j                   5  | xj                  dz  c_        t        j                  d| j                         | j                  cddd       S # 1 sw Y   yxY w)z,Gets next sequence counter. Used internally.r   zsequence counter: %sN)rA  rB  rL  rJ  r  s    r   _next_sequence_counterz*SnowflakeConnection._next_sequence_counter  sO    (( 	)!!Q&!LL/1F1FG((	) 	) 	)s   AAA!c                T    | j                   r| j                  j                  |       yy)zLogs data to telemetry.N)r  rf  try_add_log_to_batch)ro  telemetry_datas     r   _log_telemetryz"SnowflakeConnection._log_telemetry  s"    !!OO00@ "r   c                   | j                   s| j                          t        j                  | j                        dfd}t        | j                  |      | _         | j                   j                          t        j                  d       yy)zAAdd a periodic heartbeat query in order to keep connection alive.c                 (            } | r |         y y r}  r0  )heartbeat_fnheartbeat_wrefs    r   beat_if_possiblez<SnowflakeConnection._add_heartbeat.<locals>.beat_if_possible  s    -/ N  r   zstarted heartbeatNreturnNone)
rT  r  weakref
WeakMethod_heartbeat_tickr   r   startrL  rJ  )ro  r  r  s     @r   r  z"SnowflakeConnection._add_heartbeat  st    $$HHJ$//0D0DEN#
 %3BB %D! !!'')LL,- %r   c                    | j                   rQ| j                   j                          | j                   j                          d| _         t        j	                  d       yy)zCancel a heartbeat thread.Nzstopped heartbeat)rT  cancelrO  rL  rJ  r  s    r   rd  z%SnowflakeConnection._cancel_heartbeat  sI      !!((*!!&&($(D!LL,-	 !r   c                    | j                         s0t        j                  d       | j                  j	                          yy)z3Execute a heartbeat if connection isn't closed yet.zheartbeating!N)rl  rL  rJ  r  r  r  s    r   r  z#SnowflakeConnection._heartbeat_tick  s-    ~~LL)II  "  r   c                \   t        | j                  j                  dz        }t        |dz        }t        | j                        | _        | j                  || _        | j                  S | j                  |kD  r|| _        | j                  S | j                  |k  r|| _        | j                  S )z3Validate and return heartbeat frequency in seconds.r   )r  r  r  r   r  )ro  real_maxreal_mins      r   r  zKSnowflakeConnection._validate_client_session_keep_alive_heartbeat_frequency  s    tyy;;a?@x!|$ ?B>>?
; ==EBJD? AAA ??(JBJD? AAA ??(JBJD?AAAr   c                    | j                   dk  rd| _        n| j                   t        kD  rt        | _        t        | j                         | _        | j                   S )Nr   r   )r   r  MAX_CLIENT_PREFETCH_THREADSr  r  s    r   r  z5SnowflakeConnection._validate_client_prefetch_threads  sN    ''1,,-D))),GG,GD)(+D,H,H(I%+++r   c                   | j                   5  | j                  j                  |       ddd       |j                         D ]  \  }}|| j                  |<   t
        |k(  r|| _        &t        |k(  r| j                  <|| _        Dt        |k(  r| j                  || _
        at        |k(  r|| _        rt        |k(  r|| _        t        |k(  r|| _        t"        |k(  s|| _         y# 1 sw Y   xY w)zUpdate session parameters.N)rE  r   set_parametersrR  rK  rC   rJ  r@   r   rA   r   rG   r   r>   r   rE   r   rF   r\  )ro  r  rt  ru  s       r   _update_parametersz&SnowflakeConnection._update_parameters  s    
 !! 	6NN))*5	6%++- 	6KD%-2D$$T*1T97<44< 1195:D2G4OFFN FKB'4/$)!2d:/4,DLAF>3t;05--	6	6 	6s   C))C2c                    dj                  d |j                  d      D              }t        |      | j                  k  r|S |d| j                   dz   S )Nr8  c              3  <   K   | ]  }|j                           y wr}  )strip)rB  lines     r   rD  z<SnowflakeConnection._format_query_for_log.<locals>.<genexpr>	  s     Btzz|Bs   r@  r   z...)rO  r<  rK  r   )ro  queryr  s      r   r)  z)SnowflakeConnection._format_query_for_log	  sY    hhBD0ABB 3x$333 	
 Q223e;	
r   c                    | S )zContext manager.r0  r  s    r   	__enter__zSnowflakeConnection.__enter__	  s    r   c                    | j                   j                  dd      s#|| j                          n| j                          | j	                          y)z1Context manager with commit or rollback teardown.
AUTOCOMMITFN)rK  r>  ry  r|  re  )ro  exc_typeexc_valexc_tbs       r   __exit__zSnowflakeConnection.__exit__	  s:     ''++L%@~

r   c                   	 t        j                  |       t        j	                  d| d       d}| j                         rt        j                  ddg iifS | j                  j                  dt        |      z   dd	
      }d|d   vrt        j                  |fS |d   d   }t        |      dkD  r|d   d   }t        |   }||fS # t        $ r t        d| d      w xY w)a<  Retrieves the status of query with sf_qid and returns it with the raw response.

        This is the underlying function used by the public get_status functions.

        Args:
            sf_qid: Snowflake query id of interest.

        Raises:
            ValueError: if sf_qid is not a valid UUID string.
        zInvalid UUID: 'r  zget_query_status sf_qid='NO_DATAr  queriesz/monitoring/queries/r>  r  )r  r  r   status)rv  r   
ValueErrorrL  rJ  rl  rJ   DISCONNECTEDr  r*  r3   FAILED_WITH_ERRORrK  )ro  sf_qidr  status_respr  
status_rets         r   _get_query_statusz%SnowflakeConnection._get_query_status	  s    	:IIf 	0:;>>++fy"o-FFFii''"U6]25 ( 
 K//00+==f%i0w<!QZ)F (
;&&!  	:vha899	:s   C Cc                    || j                   v r>| j                  |      s,| j                   j                  |d        d | j                  |<   y y y r}  )rG  is_still_runningpoprH  )ro  r  r  s      r   _cache_query_statusz'SnowflakeConnection._cache_query_status>	  sQ    T'''0E0Ej0Q"" /3D##F+	 1R'r   c                p    t        t              5  | j                  d       d d d        y # 1 sw Y   y xY w)NFr`  )r   rT  re  r  s    r   rl  z"SnowflakeConnection._close_at_exitF	  s-    i  	$JJUJ#	$ 	$ 	$s   ,5r   c           
        |xs i }|j                  di       }|j                  d      }|| j                  v r| j                  j                  |d        |j                  d      }|d}|r|d   j                  dd      nd}d }	d|v r-||r|d   j                  dd      ndz  }|j                  d	      }	t        j                  | d ||xs |t        |      |	|d
       y )Nr  r  messager   r   	errorCodeerrorMessagesqlState)rp  rq  rr  sfqid)r>  rG  r  rf   rt  r  )
ro  r  r  error_message	error_clsr  r  r  code	sql_states
             r   _process_error_query_statusz/SnowflakeConnection._process_error_query_statusJ	  s     "'Rvr*((9%T'''""640//),?G29wqz~~k2.r	[ Wwqz~~nb9"LG,I""/-T%		
	
r   c                R    | j                  |      \  }}| j                  ||       |S )zRetrieves the status of query with sf_qid.

        Query status is returned as a QueryStatus.

        Args:
            sf_qid: Snowflake query id of interest.

        Raises:
            ValueError: if sf_qid is not a valid UUID string.
        )r  r  )ro  r  r  r5  s       r   get_query_statusz$SnowflakeConnection.get_query_statusk	  s-     **62	  0r   c                    | j                  |      \  }}| j                  ||       | j                  |      r| j                  ||       |S )aH  Retrieves the status of query with sf_qid as a QueryStatus and raises an exception if the query terminated with an error.

        Query status is returned as a QueryStatus.

        Args:
            sf_qid: Snowflake query id of interest.

        Raises:
            ValueError: if sf_qid is not a valid UUID string.
        )r  r  is_an_errorr  )ro  r  r  r  s       r   get_query_status_throw_if_errorz3SnowflakeConnection.get_query_status_throw_if_errorz	  sL     #44V<  0F#,,V[Ar   c                R    | j                   st        | j                        | _        y y r}  )r,  r   r\  r[  r  s    r   r  z2SnowflakeConnection.initialize_query_context_cache	  s#    33'89V9V'WD$ 4r   c                P    | j                   ry | j                  j                         S r}  )r,  r[  serialize_to_dictr  s    r   r%  z%SnowflakeConnection.get_query_context	  s#    //''99;;r   c                T    | j                   s| j                  j                  |       y y r}  )r,  r[  deserialize_json_dict)ro  r  s     r   r+  z%SnowflakeConnection.set_query_context	  s$    33$$::4@ 4r   c                    | t         j                  t         j                  t         j                  t         j                  t         j
                  t         j                  fv S )z1Checks whether given status is currently running.)rJ   RUNNINGQUEUEDRESUMING_WAREHOUSEQUEUED_REPARING_WAREHOUSEBLOCKEDr  r  s    r   r  z$SnowflakeConnection.is_still_running	  sL     **11
 
 	
r   c                    | t         j                  t         j                  t         j                  t         j                  t         j
                  fv S )z?Checks whether given status means that there has been an error.)rJ   ABORTINGr  ABORTEDFAILED_WITH_INCIDENTr  r  s    r   r  zSnowflakeConnection.is_an_error	  sC       )),,$$
 
 	
r   c                     j                   syt        t         j                   j                                     }t	         j
                  t        |            }d	 	 	 	 d fdt        |d      5 fd|D        }t        |      D ]  }|j                         sd n |D ]  }|j                           	 ddd        S # 1 sw Y    S xY w)	zTChecks whether all async queries started by this Connection have finished executing.TFc                L    xs  j                  j                  |             S r}  )r  r  )sfq_idfound_unfinished_queryro  s    r   async_query_check_helperzQSnowflakeConnection._all_async_queries_finished.<locals>.async_query_check_helper	  s-     * T-B-B%%f-. r   async_query_check_)max_workersthread_name_prefixc              3  B   K   | ]  }j                  |        y wr}  )submit)rB  r  r  tpes     r   rD  zBSnowflakeConnection._all_async_queries_finished.<locals>.<genexpr>	  s     Xuszz":EBXs   N)r  r   r  r  )rG  rb  reversedrc  r  r   rK  r   r   resultr  )ro  r  num_workersfuturesr  r  r  r  s   `    @@@r   rf  z/SnowflakeConnection._all_async_queries_finished	  s     !!x 2 2 7 7 9:;$66GE!&			  #8L
 		XPWXG!'* 88:-1*  
		 *))		 *))s   7+C#CCc           	        t               }| j                  t        j                  t        j
                  j                  t        j                  j                  t        j                  j                  t               i||              y)ud  
                OS - meaningful value like Windows, Linux, Darwin/MacOS etc.
        OS_VERSION - meaningful version like kernel version for Linux/Darwin, etc. that your language provides
        ISA - instruction set architecture, like amd64/arm64.
        CORE_VERSION - result of sf_core_full_version call, if finished successfully.
        CORE_FILE_NAME - a string representing binary name that driver tried to load
        CORE_LOAD_ERROR - flag or error type included if there are any errors (can’t write a library to disk, can’t load it, can’t find symbols, etc).
                :return:
        	from_dict	timestampr  N)
r   r~  r   from_telemetry_data_dictr   KEY_TYPEru  CORE_IMPORT	KEY_VALUEr   )ro  tss     r   ri  z(SnowflakeConnection._log_minicore_import	  sg     22"++11>3M3M3S3S",,224V4X 		
r   c           
        | j                   rt        t        j                        D ch c])  }|j	                  d      s|j                  dd      d   + }}t               }| j                  t        j                  t        j                  j                  t        j                  j                  t        j                  j                  t        |      i||              y y c c}w )Nr5  r  r   )maxsplitr   r  )#_log_imported_packages_in_telemetryrb  sysmodulesr  r<  r   r~  r   r  r   r  ru  IMPORTED_PACKAGESr  r   )ro  rf  imported_modulesr  s       r   rh  z4SnowflakeConnection._log_telemetry_imported_packages	  s    33
 ckk* ||C( a(+   
 !"B66&//55~7W7W7]7]&0066<L8M !#	 4 s   .C c                   t         j                  d       | j                         rt         j                  d       y	 t         j                  d       | j                  j	                         }|j                  d      }t         j                  d|       t        |      S # t        $ r }t         j                  d|       Y d}~yd}~ww xY w)	zThis function tries to answer the question: Is this connection still good for sending queries?
        Attempts to validate the connections both on the TCP/IP and Session levels.z!validating connection and sessionz*connection is already closed and not validFz0trying to heartbeat into the session to validater  zsession still valid? %sz3session could not be validated due to exception: %sN)rL  rJ  rl  r  r  r>  r  rT  )ro  	hb_resultsession_validrj  s       r   is_validzSnowflakeConnection.is_valid	  s     	89>>LLEF	LLKL		,,.I%MM)4MLL2MB&& 	LLNPQR	s   A B 	C'CCc                     t         t        j                  j                         v rt        j                  t            S dt        j
                  v ryt        d dD              rydt        j
                  v ryy )N	streamlitc              3  @   K   | ]  }|t         j                  v   y wr}  )r  r  )rB  jpmods     r   rD  z:SnowflakeConnection._detect_application.<locals>.<genexpr>
  s!      
 ckk!
s   )	ipykerneljupyter_corejupyter_clientjupyter_notebook	snowbookssnowflake_notebook)r;   r  r  rc  r  r  r`  r0  r   r   rU  z'SnowflakeConnection._detect_application
  sa    bjjoo//::o..#++% 
H
 
 &#++%' &r   )NN)rp  r)  rq  zpathlib.Path | Noner  r  )r  r  )r  rI   )r  r)  )r  zbool | None)r  
int | None)r  zfloat | Noner  r  )r  r   )r  zstr | Iterable | None)r  r   r  )ru  z
None | intr  r  )r  zSnowflakeRestful | None)r  r   )ru  zCallable | Noner  r  )r  ztype[SnowflakeConverter])ru  r  r  r  )r  zAuthByPlugin | None)ru  r)   r  r  )ru  r  r  r  )T)ra  r  r  r  )r~  ztype[CursorCls]r  r   )
r  r   r  r  r  r  r~  rP   r  zIterable[SnowflakeCursor])r  r
   r  r  r~  rP   r  zGenerator[SnowflakeCursor])NNFNFFFTFNN)r  r   rB  r  r,  z	uuid.UUIDr-  z(None | tuple | dict[str, dict[str, str]]r.  r)  r/  r  r0  zdict[str, str] | Noner1  r  r2  r  r  r  r3  r  r  r  r  r  r4  r)  r  zdict[str, Any])r=  r)   )rP  zlist[tuple[Any | tuple]]r  zlist[bytes])r9  SnowflakeCursor | NonerZ  ztuple[str, Any] | Anyr  r'  r}  )rP  zSequence | Noner9  r  r  z dict[str, dict[str, str]] | None)rP  z+Any | Sequence[Any] | dict[Any, Any] | Noner9  r  r  z"tuple[Any] | dict[str, Any] | None)rP  zdict[Any, Any]r9  r  r  rk  )rs  r   r  r   )r  r   r,  r   r  zdict[str, bool | None])r  zdict[str, str | int | bool]r  r  )r  r   r  r   )r  r2  )r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | Noner  r  )r  r   r  z"tuple[QueryStatus, dict[str, Any]])r  r   r  rJ   r  r  )
r  r   r  rk  r  r   r  ztype[Exception]r  r  )r  r   r  rJ   )r  zdict | None)r  rk  r  r  )r  rJ   r  r  )r  z
None | str)r+  r,  r-  r.  r   r  r{  propertyr6  r   r   r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r=  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   setterr   r   r   r   r   r  r   r  r   r   r  r   r  r   r   r   r   r   r   r   r   r   r   r$  r   r,  r  r  r  r   r=  re  re  rl  r   ry  r|  rP   r9  r  r  rd  staticmethodr  rS  rL  r6  r:  r  r<  rU  r[  rg  rn  rl  rm  rx  rz  r~  r  rd  r  r  r  r  r)  r  r  r  r  rl  rh   r  r  r  r  r%  r+  r  r  rf  ri  rh  r  rU  r0  r   r   r2  r2    se
   AF FM '+59w9#w9  3w9
 
w9t ) ) ) ) $ $( A A C C 6 6 0 0 K K 1 1 6 6 3 3 = = A A 8 8 6 6 < <                         $ $             U U Y Y W W & & / / %%0 &0 C C 399G :G 8 8 (..9 /9 
 
 ##1 $1 * *   + !+
 ) )   ! ! " " # #
 % % 1 1 : : , , 
 
 	 	 " " # # * * - - ##A $A   - - ? ? /55S 6S , , . . 4 4 4 4 ##. $.     E E 1 1 ' ' ' ' ( ( B B   288C 9CE3N*X!>(* 6E "& !&#(711 1 	1
 &1 
#1& !&(7	  &	 
$$4 4 4X"teX DH$(!&26!#!'+"$(TT T 	T
 AT "T T 0T T T T !%T T T "T  
!Tl:2$BH.	,%
&%
 !%
 
	%
V *.     '   
*	  J *.';' '' 
,	'T HL$.D	$3 
)A
.$.#B(,6/6 
6>
, & %	
 
'>3$  %5

 
 	

 #
 

B"X<
A 	
 	
 
 
*@
,*$ ( (r   r2  c                  4    e Zd ZdZd ZddZddZd Zd	dZy)
_ConnectionsRegistryzThread-safe registry for tracking opened SnowflakeConnection instances.

    This class maintains a registry of active connections using weak references
    to avoid preventing garbage collection.
    c                T    t        j                         | _        t               | _        y)zFInitialize the connections registry with an empty registry and a lock.N)r  WeakSet_connectionsr   _lockr  s    r   r{  z_ConnectionsRegistry.__init__"
  s    -4__->V
r   c           	         | j                   5  | j                  j                  |       t        j	                  dt        |       dt        | j                                ddd       y# 1 sw Y   yxY w)zAdd a connection to the registry.

        Args:
            connection: The SnowflakeConnection instance to register.
        Connection z# added to pool. Total connections: N)r  r  addrL  rJ  idrK  ro  r  s     r   rZ  z#_ConnectionsRegistry.add_connection'
  sd     ZZ 	!!*-LLbn--PQTUYUfUfQgPhi	 	 	s   AA))A2c           	     :   | j                   5  | j                  j                  |       t        j	                  dt        |       dt        | j                                t        | j                        dk(  r| j                          ddd       y# 1 sw Y   yxY w)zRemove a connection from the registry.

        Args:
            connection: The SnowflakeConnection instance to unregister.
        r  z+ removed from registry. Total connections: r   N)r  r  discardrL  rJ  r  rK  _last_connection_handlerr  s     r   rc  z&_ConnectionsRegistry.remove_connection3
  s     ZZ 	0%%j1LLbn--XY\]a]n]nYoXpq 4$$%*--/	0 	0 	0s   A;BBc                ,    t        j                          y r}  )rN   stop_periodic_cleanupr  s    r   r  z-_ConnectionsRegistry._last_connection_handlerB
  s     	--/r   c                p    | j                   5  t        | j                        cd d d        S # 1 sw Y   y xY wr}  )r  rK  r  r  s    r   get_connection_countz)_ConnectionsRegistry.get_connection_countG
  s,    ZZ 	*t(()	* 	* 	*s   ,5N)r  r2  r  r  r  )	r+  r,  r-  r.  r{  rZ  rc  r  r  r0  r   r   r  r  
  s     

00
*r   r  )r  r(  r}  )r   z3str | bytes | os.PathLike[str] | os.PathLike[bytes]r   zbytes | str | Noner  rN  )
__future__r   rj  r'  r  pathlibrer  rU  typingrv  rV  r  concurrent.futuresr   concurrent.futures.threadr   
contextlibr   difflibr   	functoolsr   r	   ior
   r   	threadingr   typesr   r   r   r   r   r   r   r   r   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   -cryptography.hazmat.primitives.asymmetric.rsar   r   r   _query_context_cacher   _utilsr   r   r   r  r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   auth.idtokenr.   backoff_policiesr/   bind_upload_agentr0   compatr1   r2   r3   r4   config_managerr5   r6   connection_diagnosticr7   	constantsr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r   rL   crlrM   	crl_cacherN   r9  rO   rP   rQ   descriptionrR   rS   rT   rU   rV   direct_file_operation_utilsrW   rX   	errorcoderY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   log_configurationri   networkrj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rG  rx   ry   rz   r{   rr  r|   r}   	telemetryr~   r   r   	time_utilr   r   url_utilr   	util_textr   r   r   wif_utilr   version_infoTYPE_CHECKINGr   r  r  r  DEFAULT_BACKOFF_POLICYr   r   r  r(  r   r  floatr  rN  rb  rk  r%  r/  compiler  r  r  r  r  rS  r  r+  rL  r'  r2  r  rY  )r  s   0r   <module>rB     s:   "   	  	 
      + 8  % .    	 	 	  8 8 G  3 
     ( 1 . : : J 7     * *  & N N  O    M L 6      U E E 6 < J J )w&"6"6+>XI+>?I"#    ,. " 04I, , ^I	D4:s#$^I
RI^I S	^I [#	^I
 S3*^I T
C()^I 4$t*c*+^I 4$t*c*+^I 4$t*c*+^I td4j#./^I 	dS(#^I #^I  $dS)*!^I" td4j#&'#^I$ tDz3'(%^I& td4j#&''^I( TDJ$%)^I* 4$t*c*++^I, dT$Z-.-^I. 	dS/^I6 td4j#./7^I8 c
9^I: )	dU+;^IB -x8C^ID UDME^IF T
C()G^IH D4:uc=ABI^IJ T
C01K^IL TDJU#;<M^IN dT$Z%&O^IP 	dS% Q^IX +d4j#->?Y^IZ !4$t*6I)J"K[^I\ 'T
C/@(A]^I^ +TDJS	3J,K_^I` TDJ12a^Ib $dX 67c^Id 4$t*l34e^If K$t*c!23g^Ip  +T
C/@!Aq^Ir #^d4j#5F$Gs^It E4=u^Iv tTlw^Ix (<*y^I@ As8A^IB 4$t*d!34C^ID 4$t*d+,E^IF  $dT(:!;G^IH 4	dS6I^IP 3xQ^IR TDJ#45S^IT E4=U^IV eT]W^IX #TDJ+<$=Y^IZ -/1CD[^I\ "E4=]^I^ _^I` 4$t*c*+a^Ib T
C()c^Id tTle^If TDJ,-g^Ih dD\i^Ij 137k^Il t}m^It (%u^I| }^I~ ^IH t}I^IJ 02K^IT eT]U^IX "E4=Y^IZ udm[^I\ 	dS!]^Id %	dS'e^Il %	dS'm^It )+u^I| "$}^ID &(E^IL  "M^IT ,.U^I\ 	dS]^Id 	dSe^Il !	dS#m^It u^I| }^ID E^IL 	dSM^IT 	dSU^I^ 	dS_^Ih  "i^Ir / s^I| 3 }^IF -s3G^IH I^IR 
S^I\ ]^If "$g^In -/o^Ix 35y^I@ A^IJ K^IR )+S^IZ 476 35 !	dS# )	dT+  	dS" 	dS 	dU! T
D12dT$Z$67dT$Z-."	dS% '	dS) 	dT  	dSu^I E ^@	 K(  #6{	PVhwvv7N.O&	P :ACKK!1gfa&89: 
8	Z b ( b (JA.* .*d -. IC 
Qs    \5\