snowflake-connector-python 4.4.0__tar.gz → 4.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/CONTRIBUTING.md +3 -3
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/DESCRIPTION.md +26 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/PKG-INFO +28 -5
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/README.md +2 -2
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/setup.cfg +1 -3
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/setup.py +66 -0
- snowflake_connector_python-4.6.0/src/snowflake/connector/_connection_identifier_shape.py +136 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/_utils.py +37 -15
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_connection.py +44 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_cursor.py +3 -4
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_network.py +39 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_pandas_tools.py +1 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_session_manager.py +0 -9
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_wif_util.py +76 -8
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/_auth.py +2 -2
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/keypair.py +41 -11
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/okta.py +3 -3
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/compat.py +2 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/config_manager.py +9 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/connection.py +104 -14
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/cursor.py +4 -8
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/network.py +44 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/ocsp_snowflake.py +14 -40
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/pandas_tools.py +1 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/platform_detection.py +17 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/telemetry.py +16 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/token_cache.py +42 -12
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/util_text.py +90 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/_base_connection.py +3 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -1
- snowflake_connector_python-4.6.0/src/snowflake/connector/vendored/urllib3/_version.py +24 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/connection.py +4 -4
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +23 -10
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +5 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +7 -8
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +1 -1
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +2 -2
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/fields.py +14 -14
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +8 -6
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/response.py +35 -22
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +8 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +11 -61
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +5 -11
- snowflake_connector_python-4.6.0/src/snowflake/connector/version.py +3 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/wif_util.py +116 -30
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake_connector_python.egg-info/PKG-INFO +28 -5
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake_connector_python.egg-info/requires.txt +0 -3
- snowflake_connector_python-4.4.0/src/snowflake/connector/vendored/urllib3/_version.py +0 -34
- snowflake_connector_python-4.4.0/src/snowflake/connector/version.py +0 -3
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/NOTICE +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/SECURITY.md +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/pyproject.toml +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_result_batch.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_result_set.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_auth.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_okta.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/_oauth_base.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/oauth_code.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/constants.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.4.0 → snowflake_connector_python-4.6.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -27,11 +27,11 @@ We require our contributors to sign a CLA, available at https://github.com/snowf
|
|
|
27
27
|
What is a development environment? It's a [virtualenv](https://virtualenv.pypa.io) that has all of necessary
|
|
28
28
|
dependencies installed with `snowflake-connector-python` installed as an editable package.
|
|
29
29
|
|
|
30
|
-
Setting up a development environment is super easy with this [one simple tox command](https://tox.wiki/en/
|
|
30
|
+
Setting up a development environment is super easy with this [one simple tox command](https://tox.wiki/en/legacy/example/devenv.html).
|
|
31
31
|
|
|
32
32
|
```shell
|
|
33
|
-
tox --devenv
|
|
34
|
-
.
|
|
33
|
+
tox --devenv venv310 -e py310
|
|
34
|
+
. venv310/bin/activate
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Note: we suggest using the lowest supported Python version for development.
|
|
@@ -7,7 +7,29 @@ https://docs.snowflake.com/
|
|
|
7
7
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
8
8
|
|
|
9
9
|
# Release Notes
|
|
10
|
-
- v4.
|
|
10
|
+
- v4.6.0(May 28,2026)
|
|
11
|
+
- Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
|
|
12
|
+
- Fixed sdist to only install the minicore binary matching the current platform (SNOW-3526469). Previous 4.x releases copied every platform's minicore `.so`/`.dylib`/`.dll` into the install prefix, breaking downstream packagers (e.g. Homebrew) whose audits reject foreign-arch binaries.
|
|
13
|
+
- Added one in-band telemetry record per successful login describing which connection-identifier fields the user supplied (`account_provided`, `account_with_region`, `account_org_provided`, `region_provided`, `host_provided`). No hostname or account value is included. This is gated by the existing server-side `CLIENT_TELEMETRY_ENABLED` parameter and can additionally be disabled locally by setting `SF_TELEMETRY_DISABLE_CONNECTION_SHAPE=true`. The telemetry collection is time-boxed and will be removed in a future release.
|
|
14
|
+
- Bumped up vendored `urllib3` to `2.7.0`
|
|
15
|
+
|
|
16
|
+
- v4.5.0(May 12,2026)
|
|
17
|
+
- Fixed `write_pandas` temp stage name collisions (SNOW-3481510). The old PRNG could produce identical name sequences in forked processes (e.g. Notebook kernels), causing `CREATE TEMPORARY STAGE` to fail with "Object already exists".
|
|
18
|
+
- Replaced third-party download URLs in CI scripts and Dockerfiles with Snowflake Artifactory to improve supply-chain security.
|
|
19
|
+
- Fixed a security bug in Okta SAML authentication where `_is_prefix_equal()` compared `url1`'s port against itself instead of `url2`'s port, allowing an attacker to redirect credentials to a different port on the same hostname. Also fixed the default port fallback to use `int` instead of `str` for correct comparison when one URL omits the port.
|
|
20
|
+
- Fixed `executemany` with `paramstyle="pyformat"` to correctly locate the VALUES clause using a balanced-parentheses parser instead of a greedy regex. This fixes incorrect behaviour with nested function calls such as SQLAlchemy `@compiles VARIANT` patterns (e.g. `PARSE_JSON(%(col)s)`) and subquery-form INSERTs (SNOW-298756).
|
|
21
|
+
- Added ECDSA key support (ES256, ES384, ES512) for key-pair authentication.
|
|
22
|
+
- Added HTTP 307/308 redirect status codes to the retryable set as defense-in-depth, with redirect-aware logging in both sync and async paths.
|
|
23
|
+
- Consolidated keyring token cache to use a single service name with hashed account keys, reducing macOS Keychain password prompts. Legacy entries are auto-migrated on first read.
|
|
24
|
+
- Added support for AWS outbound JWT token attestation for Workload Identity Federation (WIF). This can be enabled by setting the `SNOWFLAKE_ENABLE_AWS_WIF_OUTBOUND_TOKEN` environment variable to `true`. Note: This environment variable will be removed in a future release.
|
|
25
|
+
- Removed dynamic class deserialization from the OCSP response validation cache to prevent arbitrary code execution via crafted cache files (SNOW-2439940). The `SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS` environment variable is now a no-op.
|
|
26
|
+
- Updated SPCS token injection to gate on `SNOWFLAKE_RUNNING_INSIDE_SPCS` environment variable, trim whitespace, and remove configurable token path.
|
|
27
|
+
- GCP WIF attestation now uses hostname `metadata.google.internal` instead of the IPv4 link-local address, so it works on IPv6-only GCP VMs.
|
|
28
|
+
- Fixed a bug where `write_pandas()` with `auto_create_table=False` and `overwrite=True` would execute `CREATE TABLE IF NOT EXISTS`, which required unnecessary `OWNERSHIP` privilege on the table. Now only `TRUNCATE TABLE` is executed in this case. Note: users who relied on the table being implicitly created despite `auto_create_table=False` should set `auto_create_table=True` instead.
|
|
29
|
+
- Added validation of the `account` connection parameter so malformed identifiers (for example path-like values or labels outside letters, digits, `_`, and `-`) are rejected with `ProgrammingError` before login (SNOW-1902886).
|
|
30
|
+
- Added support for Azure Workload Identity Federation impersonation, allowing a managed identity to authenticate as a service principal.
|
|
31
|
+
|
|
32
|
+
- v4.4.0(March 25,2026)
|
|
11
33
|
- Bump the lower boundary of cryptography to 46.0.5 due to CVE-2026-26007.
|
|
12
34
|
- Added support for Python 3.14.
|
|
13
35
|
- Removed pyOpenSSL upper bound dependency constraint to allow installation of pyOpenSSL 26.0.0+, which includes a fix for GHSA-vp96-hxj8-p424.
|
|
@@ -17,6 +39,8 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
17
39
|
- Renamed the environment variable for skipping config file permission warnings from `SF_SKIP_WARNING_FOR_READ_PERMISSIONS_ON_CONFIG_FILE` to `SF_SKIP_TOKEN_FILE_PERMISSIONS_VERIFICATION`. The old variable is still supported but emits a deprecation warning.
|
|
18
40
|
- Fixed `unsafe_skip_file_permissions_check` flag not being respected when reading `connections.toml`.
|
|
19
41
|
- Fixed JSONDecodeError in result_batch._load() when fetching large result sets
|
|
42
|
+
- Fixed validation ordering for `client_session_keep_alive_heartbeat_frequency`.
|
|
43
|
+
|
|
20
44
|
|
|
21
45
|
- v4.3.0(February 12,2026)
|
|
22
46
|
- Ensured proper list conversion - the converter runs to_snowflake on all list elements.
|
|
@@ -72,6 +96,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
72
96
|
|
|
73
97
|
- v3.18.0(October 03,2025)
|
|
74
98
|
- Added support for pandas conversion for Day-time and Year-Month Interval types
|
|
99
|
+
* Fixed the return type of iterating over a cursor
|
|
75
100
|
|
|
76
101
|
- v3.17.4(September 22,2025)
|
|
77
102
|
- Added support for intermediate certificates as roots when they are stored in the trust store
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.6.0
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -22,7 +22,6 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
22
22
|
Classifier: Operating System :: OS Independent
|
|
23
23
|
Classifier: Programming Language :: Python :: 3
|
|
24
24
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
25
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
26
25
|
Classifier: Programming Language :: Python :: 3.10
|
|
27
26
|
Classifier: Programming Language :: Python :: 3.11
|
|
28
27
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -35,7 +34,7 @@ Classifier: Topic :: Software Development
|
|
|
35
34
|
Classifier: Topic :: Software Development :: Libraries
|
|
36
35
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
37
36
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
38
|
-
Requires-Python: >=3.
|
|
37
|
+
Requires-Python: >=3.10
|
|
39
38
|
Description-Content-Type: text/markdown
|
|
40
39
|
License-File: LICENSE.txt
|
|
41
40
|
License-File: NOTICE
|
|
@@ -48,7 +47,6 @@ Requires-Dist: requests<3.0.0,>=2.32.4
|
|
|
48
47
|
Requires-Dist: packaging
|
|
49
48
|
Requires-Dist: charset_normalizer<4,>=2
|
|
50
49
|
Requires-Dist: idna<4,>=3.7
|
|
51
|
-
Requires-Dist: urllib3<2.0.0,>=1.26.5; python_version < "3.10"
|
|
52
50
|
Requires-Dist: certifi>=2024.7.4
|
|
53
51
|
Requires-Dist: typing_extensions<5,>=4.3
|
|
54
52
|
Requires-Dist: filelock<4,>=3.5
|
|
@@ -94,7 +92,29 @@ https://docs.snowflake.com/
|
|
|
94
92
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
95
93
|
|
|
96
94
|
# Release Notes
|
|
97
|
-
- v4.
|
|
95
|
+
- v4.6.0(May 28,2026)
|
|
96
|
+
- Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
|
|
97
|
+
- Fixed sdist to only install the minicore binary matching the current platform (SNOW-3526469). Previous 4.x releases copied every platform's minicore `.so`/`.dylib`/`.dll` into the install prefix, breaking downstream packagers (e.g. Homebrew) whose audits reject foreign-arch binaries.
|
|
98
|
+
- Added one in-band telemetry record per successful login describing which connection-identifier fields the user supplied (`account_provided`, `account_with_region`, `account_org_provided`, `region_provided`, `host_provided`). No hostname or account value is included. This is gated by the existing server-side `CLIENT_TELEMETRY_ENABLED` parameter and can additionally be disabled locally by setting `SF_TELEMETRY_DISABLE_CONNECTION_SHAPE=true`. The telemetry collection is time-boxed and will be removed in a future release.
|
|
99
|
+
- Bumped up vendored `urllib3` to `2.7.0`
|
|
100
|
+
|
|
101
|
+
- v4.5.0(May 12,2026)
|
|
102
|
+
- Fixed `write_pandas` temp stage name collisions (SNOW-3481510). The old PRNG could produce identical name sequences in forked processes (e.g. Notebook kernels), causing `CREATE TEMPORARY STAGE` to fail with "Object already exists".
|
|
103
|
+
- Replaced third-party download URLs in CI scripts and Dockerfiles with Snowflake Artifactory to improve supply-chain security.
|
|
104
|
+
- Fixed a security bug in Okta SAML authentication where `_is_prefix_equal()` compared `url1`'s port against itself instead of `url2`'s port, allowing an attacker to redirect credentials to a different port on the same hostname. Also fixed the default port fallback to use `int` instead of `str` for correct comparison when one URL omits the port.
|
|
105
|
+
- Fixed `executemany` with `paramstyle="pyformat"` to correctly locate the VALUES clause using a balanced-parentheses parser instead of a greedy regex. This fixes incorrect behaviour with nested function calls such as SQLAlchemy `@compiles VARIANT` patterns (e.g. `PARSE_JSON(%(col)s)`) and subquery-form INSERTs (SNOW-298756).
|
|
106
|
+
- Added ECDSA key support (ES256, ES384, ES512) for key-pair authentication.
|
|
107
|
+
- Added HTTP 307/308 redirect status codes to the retryable set as defense-in-depth, with redirect-aware logging in both sync and async paths.
|
|
108
|
+
- Consolidated keyring token cache to use a single service name with hashed account keys, reducing macOS Keychain password prompts. Legacy entries are auto-migrated on first read.
|
|
109
|
+
- Added support for AWS outbound JWT token attestation for Workload Identity Federation (WIF). This can be enabled by setting the `SNOWFLAKE_ENABLE_AWS_WIF_OUTBOUND_TOKEN` environment variable to `true`. Note: This environment variable will be removed in a future release.
|
|
110
|
+
- Removed dynamic class deserialization from the OCSP response validation cache to prevent arbitrary code execution via crafted cache files (SNOW-2439940). The `SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS` environment variable is now a no-op.
|
|
111
|
+
- Updated SPCS token injection to gate on `SNOWFLAKE_RUNNING_INSIDE_SPCS` environment variable, trim whitespace, and remove configurable token path.
|
|
112
|
+
- GCP WIF attestation now uses hostname `metadata.google.internal` instead of the IPv4 link-local address, so it works on IPv6-only GCP VMs.
|
|
113
|
+
- Fixed a bug where `write_pandas()` with `auto_create_table=False` and `overwrite=True` would execute `CREATE TABLE IF NOT EXISTS`, which required unnecessary `OWNERSHIP` privilege on the table. Now only `TRUNCATE TABLE` is executed in this case. Note: users who relied on the table being implicitly created despite `auto_create_table=False` should set `auto_create_table=True` instead.
|
|
114
|
+
- Added validation of the `account` connection parameter so malformed identifiers (for example path-like values or labels outside letters, digits, `_`, and `-`) are rejected with `ProgrammingError` before login (SNOW-1902886).
|
|
115
|
+
- Added support for Azure Workload Identity Federation impersonation, allowing a managed identity to authenticate as a service principal.
|
|
116
|
+
|
|
117
|
+
- v4.4.0(March 25,2026)
|
|
98
118
|
- Bump the lower boundary of cryptography to 46.0.5 due to CVE-2026-26007.
|
|
99
119
|
- Added support for Python 3.14.
|
|
100
120
|
- Removed pyOpenSSL upper bound dependency constraint to allow installation of pyOpenSSL 26.0.0+, which includes a fix for GHSA-vp96-hxj8-p424.
|
|
@@ -104,6 +124,8 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
104
124
|
- Renamed the environment variable for skipping config file permission warnings from `SF_SKIP_WARNING_FOR_READ_PERMISSIONS_ON_CONFIG_FILE` to `SF_SKIP_TOKEN_FILE_PERMISSIONS_VERIFICATION`. The old variable is still supported but emits a deprecation warning.
|
|
105
125
|
- Fixed `unsafe_skip_file_permissions_check` flag not being respected when reading `connections.toml`.
|
|
106
126
|
- Fixed JSONDecodeError in result_batch._load() when fetching large result sets
|
|
127
|
+
- Fixed validation ordering for `client_session_keep_alive_heartbeat_frequency`.
|
|
128
|
+
|
|
107
129
|
|
|
108
130
|
- v4.3.0(February 12,2026)
|
|
109
131
|
- Ensured proper list conversion - the converter runs to_snowflake on all list elements.
|
|
@@ -159,6 +181,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
159
181
|
|
|
160
182
|
- v3.18.0(October 03,2025)
|
|
161
183
|
- Added support for pandas conversion for Day-time and Year-Month Interval types
|
|
184
|
+
* Fixed the return type of iterating over a cursor
|
|
162
185
|
|
|
163
186
|
- v3.17.4(September 22,2025)
|
|
164
187
|
- Added support for intermediate certificates as roots when they are stored in the trust store
|
|
@@ -15,7 +15,7 @@ using the Snowflake JDBC or ODBC drivers.
|
|
|
15
15
|
|
|
16
16
|
The connector has **no** dependencies on JDBC or ODBC.
|
|
17
17
|
It can be installed using ``pip`` on Linux, Mac OSX, and Windows platforms
|
|
18
|
-
where Python 3.
|
|
18
|
+
where Python 3.10.0 (or higher) is installed.
|
|
19
19
|
|
|
20
20
|
Snowflake Documentation is available at:
|
|
21
21
|
https://docs.snowflake.com/
|
|
@@ -42,7 +42,7 @@ Find the `snowflake_connector_python*.whl` package in the `./dist` directory.
|
|
|
42
42
|
### In Docker
|
|
43
43
|
Or use our Dockerized build script `ci/build_docker.sh` and find the built wheel files in `dist/repaired_wheels`.
|
|
44
44
|
|
|
45
|
-
Note: `ci/build_docker.sh` can be used to compile only certain versions, like this: `ci/build_docker.sh "3.
|
|
45
|
+
Note: `ci/build_docker.sh` can be used to compile only certain versions, like this: `ci/build_docker.sh "3.10 3.11"`
|
|
46
46
|
|
|
47
47
|
## Code hygiene and other utilities
|
|
48
48
|
These tools are integrated into `tox` to allow us to easily set them up universally on any computer.
|
|
@@ -20,7 +20,6 @@ classifiers =
|
|
|
20
20
|
Operating System :: OS Independent
|
|
21
21
|
Programming Language :: Python :: 3
|
|
22
22
|
Programming Language :: Python :: 3 :: Only
|
|
23
|
-
Programming Language :: Python :: 3.9
|
|
24
23
|
Programming Language :: Python :: 3.10
|
|
25
24
|
Programming Language :: Python :: 3.11
|
|
26
25
|
Programming Language :: Python :: 3.12
|
|
@@ -41,7 +40,7 @@ project_urls =
|
|
|
41
40
|
Changelog=https://github.com/snowflakedb/snowflake-connector-python/blob/main/DESCRIPTION.md
|
|
42
41
|
|
|
43
42
|
[options]
|
|
44
|
-
python_requires = >=3.
|
|
43
|
+
python_requires = >=3.10
|
|
45
44
|
packages = find_namespace:
|
|
46
45
|
install_requires =
|
|
47
46
|
asn1crypto>0.24.0,<2.0.0
|
|
@@ -53,7 +52,6 @@ install_requires =
|
|
|
53
52
|
packaging
|
|
54
53
|
charset_normalizer>=2,<4
|
|
55
54
|
idna>=3.7,<4
|
|
56
|
-
urllib3>=1.26.5,<2.0.0; python_version < '3.10'
|
|
57
55
|
certifi>=2024.7.4
|
|
58
56
|
typing_extensions>=4.3,<5
|
|
59
57
|
filelock>=3.5,<4
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
+
import platform
|
|
5
|
+
import shutil
|
|
4
6
|
import sys
|
|
5
7
|
import warnings
|
|
6
8
|
|
|
7
9
|
from setuptools import Extension, setup
|
|
10
|
+
from setuptools.command.build_py import build_py
|
|
8
11
|
from setuptools.command.egg_info import egg_info
|
|
9
12
|
|
|
10
13
|
CONNECTOR_SRC_DIR = os.path.join("src", "snowflake", "connector")
|
|
@@ -192,8 +195,71 @@ class SetDefaultInstallationExtras(egg_info):
|
|
|
192
195
|
self.distribution.install_requires += boto_extras
|
|
193
196
|
|
|
194
197
|
|
|
198
|
+
def _minicore_native_subdir():
|
|
199
|
+
"""Return the minicore/<platform> subdir matching the current interpreter.
|
|
200
|
+
|
|
201
|
+
Mirrors snowflake.connector._utils._CoreLoader._get_platform_subdir so the
|
|
202
|
+
build-time pruner and the runtime loader always agree on the layout.
|
|
203
|
+
Returns None when the platform is not recognised (leave tree untouched).
|
|
204
|
+
"""
|
|
205
|
+
system = platform.system().lower()
|
|
206
|
+
machine = platform.machine().lower()
|
|
207
|
+
if machine in ("x86_64", "amd64"):
|
|
208
|
+
arch = "x86_64"
|
|
209
|
+
elif machine in ("aarch64", "arm64"):
|
|
210
|
+
arch = "aarch64"
|
|
211
|
+
elif machine == "ppc64":
|
|
212
|
+
arch = "ppc64"
|
|
213
|
+
else:
|
|
214
|
+
return None
|
|
215
|
+
|
|
216
|
+
if system == "linux":
|
|
217
|
+
libc, _ = platform.libc_ver()
|
|
218
|
+
libc_family = "glibc" if libc == "glibc" else "musl"
|
|
219
|
+
return f"linux_{arch}_{libc_family}"
|
|
220
|
+
if system == "darwin":
|
|
221
|
+
return f"macos_{arch}"
|
|
222
|
+
if system == "windows":
|
|
223
|
+
return f"windows_{arch}"
|
|
224
|
+
if system == "aix":
|
|
225
|
+
return f"aix_{arch}"
|
|
226
|
+
return None
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class PlatformBuildPy(build_py):
|
|
230
|
+
"""Strip non-native minicore/<platform>/ dirs from the built distribution.
|
|
231
|
+
|
|
232
|
+
The sdist ships minicore binaries for every supported platform. At
|
|
233
|
+
build-time we keep only the one matching the current interpreter so wheels
|
|
234
|
+
and downstream sdist consumers (pip install, Homebrew, conda-forge,
|
|
235
|
+
nixpkgs) end up with a clean single-platform layout.
|
|
236
|
+
"""
|
|
237
|
+
|
|
238
|
+
def run(self):
|
|
239
|
+
super().run()
|
|
240
|
+
self._prune_minicore()
|
|
241
|
+
|
|
242
|
+
def _prune_minicore(self):
|
|
243
|
+
minicore_build_dir = os.path.join(
|
|
244
|
+
self.build_lib, "snowflake", "connector", "minicore"
|
|
245
|
+
)
|
|
246
|
+
if not os.path.isdir(minicore_build_dir):
|
|
247
|
+
return
|
|
248
|
+
keep = _minicore_native_subdir()
|
|
249
|
+
if keep is None:
|
|
250
|
+
return
|
|
251
|
+
for entry in os.listdir(minicore_build_dir):
|
|
252
|
+
full = os.path.join(minicore_build_dir, entry)
|
|
253
|
+
if not os.path.isdir(full) or entry.startswith("__"):
|
|
254
|
+
continue
|
|
255
|
+
if entry == keep:
|
|
256
|
+
continue
|
|
257
|
+
shutil.rmtree(full)
|
|
258
|
+
|
|
259
|
+
|
|
195
260
|
# Update command classes
|
|
196
261
|
cmd_class["egg_info"] = SetDefaultInstallationExtras
|
|
262
|
+
cmd_class["build_py"] = PlatformBuildPy
|
|
197
263
|
|
|
198
264
|
setup(
|
|
199
265
|
version=version,
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Capture user-supplied connection-identifier provenance for in-band telemetry.
|
|
3
|
+
|
|
4
|
+
The shape captured here is consumed by ``SnowflakeConnection._log_connection_identifier_shape``
|
|
5
|
+
and emitted as a single ``client_connection_identifier_shape`` telemetry event
|
|
6
|
+
per successful login. The capture function inspects the raw kwargs passed to
|
|
7
|
+
``SnowflakeConnection.__config`` before any normalization (host inference,
|
|
8
|
+
account stripping of ``.global``, region extraction from dotted account) runs,
|
|
9
|
+
so the shape reflects user intent rather than the final post-normalization
|
|
10
|
+
state of the connection.
|
|
11
|
+
|
|
12
|
+
Removal of this module and the emission it backs is tracked in SNOW-3548350
|
|
13
|
+
(target: 2026-11-30).
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from typing import Any, Mapping
|
|
19
|
+
|
|
20
|
+
from .telemetry import TelemetryField
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(frozen=True)
|
|
24
|
+
class ConnectionIdentifierShape:
|
|
25
|
+
"""Provenance of connection-identifier fields the user supplied.
|
|
26
|
+
|
|
27
|
+
All fields describe what the user supplied at the moment of input — they
|
|
28
|
+
reflect intent, not the final post-normalization state of the connection.
|
|
29
|
+
|
|
30
|
+
- ``account_provided``: the user explicitly set the ``account`` parameter
|
|
31
|
+
(via ``connect(account=...)``, kwargs, or ``connections.toml`` merged
|
|
32
|
+
into kwargs before ``__config`` runs).
|
|
33
|
+
- ``account_with_region``: the raw account string the user typed contained
|
|
34
|
+
a dot (e.g. ``"myacct.us-east-1"``), signaling the deprecated
|
|
35
|
+
``account.region`` embedded form. Set only on the raw input.
|
|
36
|
+
- ``account_org_provided``: the raw account string carried a dash in its
|
|
37
|
+
account portion (e.g. ``"myorg-myacct"``), signaling the org-prefixed
|
|
38
|
+
form. Region-portion dashes (e.g. the ``-east-`` in
|
|
39
|
+
``"myacct.us-east-1"``) are intentionally not counted; only the portion
|
|
40
|
+
before the first ``.`` is examined.
|
|
41
|
+
- ``region_provided``: the user explicitly set the ``region`` parameter as
|
|
42
|
+
a distinct kwarg. A region embedded inside a dotted account string is
|
|
43
|
+
NOT ``region_provided``; that's ``account_with_region``.
|
|
44
|
+
- ``host_provided``: the user explicitly set the ``host`` parameter.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
account_provided: bool = False
|
|
48
|
+
account_with_region: bool = False
|
|
49
|
+
account_org_provided: bool = False
|
|
50
|
+
region_provided: bool = False
|
|
51
|
+
host_provided: bool = False
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _is_user_supplied_string(value: Any) -> bool:
|
|
55
|
+
"""A kwarg counts as user-supplied iff it's a non-empty string. Non-string
|
|
56
|
+
truthy values (e.g. an accidentally-passed ``True`` / ``int``) are not
|
|
57
|
+
treated as provided here — the regular ``__config`` validation will warn
|
|
58
|
+
or error on them later, and shape capture is best kept conservative."""
|
|
59
|
+
return isinstance(value, str) and value != ""
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def record_input_shape(kwargs: Mapping[str, Any]) -> ConnectionIdentifierShape:
|
|
63
|
+
"""Capture the connection-identifier shape from the raw kwargs that
|
|
64
|
+
``SnowflakeConnection.__config`` receives.
|
|
65
|
+
|
|
66
|
+
Must be invoked before any normalization (the ``setattr`` loop in
|
|
67
|
+
``__config``, the ``construct_hostname`` call for host inference, or any
|
|
68
|
+
``parse_account`` stripping) — otherwise inferred values are
|
|
69
|
+
indistinguishable from user-supplied ones and ``host_provided`` /
|
|
70
|
+
``account_provided`` are no longer trustworthy.
|
|
71
|
+
"""
|
|
72
|
+
account = kwargs.get("account")
|
|
73
|
+
region = kwargs.get("region")
|
|
74
|
+
host = kwargs.get("host")
|
|
75
|
+
|
|
76
|
+
account_provided = _is_user_supplied_string(account)
|
|
77
|
+
account_with_region = False
|
|
78
|
+
account_org_provided = False
|
|
79
|
+
if account_provided:
|
|
80
|
+
# Only a dot at position > 0 splits the string into account / region;
|
|
81
|
+
# a leading dot (pathological input like ``.us-east-1``) leaves the
|
|
82
|
+
# whole string as the account portion. Mirrors gosnowflake's
|
|
83
|
+
# ``recordAccountShape`` (internal/config/dsn.go), which gates on
|
|
84
|
+
# ``i > 0`` so the dash search runs against the full raw value when
|
|
85
|
+
# there is no real account/region split.
|
|
86
|
+
dot_index = account.find(".")
|
|
87
|
+
if dot_index > 0:
|
|
88
|
+
account_with_region = True
|
|
89
|
+
account_portion = account[:dot_index]
|
|
90
|
+
else:
|
|
91
|
+
account_portion = account
|
|
92
|
+
# ``Contains(accountPortion, "-")`` in Go — any dash anywhere in the
|
|
93
|
+
# account portion (including position 0) flips the flag. The
|
|
94
|
+
# region-tail dashes are excluded by virtue of being outside
|
|
95
|
+
# ``account_portion``, not by a position check.
|
|
96
|
+
account_org_provided = "-" in account_portion
|
|
97
|
+
|
|
98
|
+
return ConnectionIdentifierShape(
|
|
99
|
+
account_provided=account_provided,
|
|
100
|
+
account_with_region=account_with_region,
|
|
101
|
+
account_org_provided=account_org_provided,
|
|
102
|
+
region_provided=_is_user_supplied_string(region),
|
|
103
|
+
host_provided=_is_user_supplied_string(host),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def build_shape_telemetry_message(shape: ConnectionIdentifierShape) -> dict[str, str]:
|
|
108
|
+
"""Build the wire-format payload for the ``client_connection_identifier_shape``
|
|
109
|
+
in-band telemetry event from a captured ``ConnectionIdentifierShape``.
|
|
110
|
+
|
|
111
|
+
Hoisted out of the sync / async ``_log_connection_identifier_shape``
|
|
112
|
+
emitters so both branches stay in lockstep — the five payload keys
|
|
113
|
+
(``account_provided``, ``account_with_region``, ``account_org_provided``,
|
|
114
|
+
``region_provided``, ``host_provided``) and their stringified-lowercase
|
|
115
|
+
boolean values are byte-identical across sibling drivers and must remain
|
|
116
|
+
so. Changing this builder is the only place that affects the wire format.
|
|
117
|
+
|
|
118
|
+
Booleans are stringified as lowercase ``"true"`` / ``"false"`` (matching
|
|
119
|
+
JSON-style boolean text) for cross-driver parity with gosnowflake's
|
|
120
|
+
``strconv.FormatBool`` and the JDBC / Node.js siblings.
|
|
121
|
+
|
|
122
|
+
TODO(SNOW-3548350): remove with the telemetry emission
|
|
123
|
+
(target: 2026-11-30).
|
|
124
|
+
"""
|
|
125
|
+
return {
|
|
126
|
+
TelemetryField.KEY_TYPE.value: TelemetryField.CONNECTION_IDENTIFIER_SHAPE.value,
|
|
127
|
+
TelemetryField.KEY_ACCOUNT_PROVIDED.value: str(shape.account_provided).lower(),
|
|
128
|
+
TelemetryField.KEY_ACCOUNT_WITH_REGION.value: str(
|
|
129
|
+
shape.account_with_region
|
|
130
|
+
).lower(),
|
|
131
|
+
TelemetryField.KEY_ACCOUNT_ORG_PROVIDED.value: str(
|
|
132
|
+
shape.account_org_provided
|
|
133
|
+
).lower(),
|
|
134
|
+
TelemetryField.KEY_REGION_PROVIDED.value: str(shape.region_provided).lower(),
|
|
135
|
+
TelemetryField.KEY_HOST_PROVIDED.value: str(shape.host_provided).lower(),
|
|
136
|
+
}
|
|
@@ -10,7 +10,7 @@ import threading
|
|
|
10
10
|
import time
|
|
11
11
|
from enum import Enum
|
|
12
12
|
from inspect import stack
|
|
13
|
-
from
|
|
13
|
+
from secrets import choice
|
|
14
14
|
from threading import Timer
|
|
15
15
|
from uuid import UUID
|
|
16
16
|
|
|
@@ -109,30 +109,29 @@ def get_application_path() -> str:
|
|
|
109
109
|
return "unknown"
|
|
110
110
|
|
|
111
111
|
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
_SPCS_ENV_VAR = "SNOWFLAKE_RUNNING_INSIDE_SPCS"
|
|
113
|
+
_SPCS_TOKEN_PATH = "/snowflake/session/spcs_token"
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
def get_spcs_token() -> str | None:
|
|
117
|
-
"""Return the SPCS token
|
|
117
|
+
"""Return the SPCS token if running inside an SPCS container, or None.
|
|
118
118
|
|
|
119
|
-
The
|
|
120
|
-
|
|
119
|
+
The token is only read when the SNOWFLAKE_RUNNING_INSIDE_SPCS environment
|
|
120
|
+
variable is set. The file at /snowflake/session/spcs_token is read as
|
|
121
|
+
UTF-8 text and leading/trailing whitespace is stripped.
|
|
121
122
|
|
|
122
|
-
Any
|
|
123
|
-
will not cause authentication to fail.
|
|
123
|
+
Any read failure is logged as a warning and None is returned.
|
|
124
124
|
"""
|
|
125
|
-
|
|
125
|
+
if not os.environ.get(_SPCS_ENV_VAR):
|
|
126
|
+
return None
|
|
126
127
|
try:
|
|
127
|
-
|
|
128
|
-
return None
|
|
129
|
-
with open(path, encoding="utf-8") as f:
|
|
128
|
+
with open(_SPCS_TOKEN_PATH, encoding="utf-8") as f:
|
|
130
129
|
token = f.read().strip()
|
|
131
130
|
if not token:
|
|
132
131
|
return None
|
|
133
132
|
return token
|
|
134
|
-
except Exception as exc:
|
|
135
|
-
logger.
|
|
133
|
+
except Exception as exc:
|
|
134
|
+
logger.warning("Failed to read SPCS token from %s: %s", _SPCS_TOKEN_PATH, exc)
|
|
136
135
|
return None
|
|
137
136
|
|
|
138
137
|
|
|
@@ -184,14 +183,35 @@ class _CoreLoader:
|
|
|
184
183
|
else:
|
|
185
184
|
return "unknown"
|
|
186
185
|
|
|
186
|
+
@staticmethod
|
|
187
|
+
def _libc_ver() -> tuple[str, str]:
|
|
188
|
+
"""Return (libc_name, libc_version) from the platform."""
|
|
189
|
+
return platform.libc_ver()
|
|
190
|
+
|
|
187
191
|
@staticmethod
|
|
188
192
|
def _detect_libc() -> str:
|
|
189
193
|
"""Detect libc type on Linux (glibc vs musl)."""
|
|
190
|
-
lib, _ =
|
|
194
|
+
lib, _ = _CoreLoader._libc_ver()
|
|
191
195
|
if lib == "glibc":
|
|
192
196
|
return "glibc"
|
|
193
197
|
return "musl"
|
|
194
198
|
|
|
199
|
+
@staticmethod
|
|
200
|
+
def get_libc_version() -> str | None:
|
|
201
|
+
"""Return libc version from :func:`platform.libc_ver`, or None if unknown."""
|
|
202
|
+
_, version = _CoreLoader._libc_ver()
|
|
203
|
+
if not version:
|
|
204
|
+
return None
|
|
205
|
+
stripped = version.strip()
|
|
206
|
+
return stripped or None
|
|
207
|
+
|
|
208
|
+
@staticmethod
|
|
209
|
+
def get_libc_family() -> str | None:
|
|
210
|
+
"""Return libc family for Linux (glibc or musl), otherwise None."""
|
|
211
|
+
if _CoreLoader._detect_os() != "linux":
|
|
212
|
+
return None
|
|
213
|
+
return _CoreLoader._detect_libc()
|
|
214
|
+
|
|
195
215
|
@staticmethod
|
|
196
216
|
def _get_platform_subdir() -> str:
|
|
197
217
|
"""Get the platform-specific subdirectory name."""
|
|
@@ -330,6 +350,8 @@ def build_minicore_usage_for_session() -> dict[str, str | None]:
|
|
|
330
350
|
"ISA": ISA,
|
|
331
351
|
"CORE_VERSION": _core_loader.get_core_version(),
|
|
332
352
|
"CORE_FILE_NAME": _core_loader.get_file_name(),
|
|
353
|
+
"LIBC_FAMILY": _CoreLoader.get_libc_family(),
|
|
354
|
+
"LIBC_VERSION": _CoreLoader.get_libc_version(),
|
|
333
355
|
}
|
|
334
356
|
|
|
335
357
|
|
|
@@ -24,9 +24,14 @@ from snowflake.connector import (
|
|
|
24
24
|
ProgrammingError,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
+
from .._connection_identifier_shape import (
|
|
28
|
+
ConnectionIdentifierShape,
|
|
29
|
+
build_shape_telemetry_message,
|
|
30
|
+
)
|
|
27
31
|
from .._query_context_cache import QueryContextCache
|
|
28
32
|
from ..compat import IS_LINUX, quote, urlencode
|
|
29
33
|
from ..config_manager import CONFIG_MANAGER, _get_default_connection_params
|
|
34
|
+
from ..connection import _DISABLE_CONNECTION_SHAPE_ENV
|
|
30
35
|
from ..connection import DEFAULT_CONFIGURATION as DEFAULT_CONFIGURATION_SYNC
|
|
31
36
|
from ..connection import SnowflakeConnection as SnowflakeConnectionSync
|
|
32
37
|
from ..connection import _get_private_bytes_from_file
|
|
@@ -451,6 +456,7 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
451
456
|
not in (
|
|
452
457
|
AttestationProvider.GCP,
|
|
453
458
|
AttestationProvider.AWS,
|
|
459
|
+
AttestationProvider.AZURE,
|
|
454
460
|
)
|
|
455
461
|
):
|
|
456
462
|
Error.errorhandler_wrapper(
|
|
@@ -458,7 +464,7 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
458
464
|
None,
|
|
459
465
|
ProgrammingError,
|
|
460
466
|
{
|
|
461
|
-
"msg": "workload_identity_impersonation_path is currently only supported for GCP and
|
|
467
|
+
"msg": "workload_identity_impersonation_path is currently only supported for GCP, AWS, and AZURE.",
|
|
462
468
|
"errno": ER_INVALID_WIF_SETTINGS,
|
|
463
469
|
},
|
|
464
470
|
)
|
|
@@ -782,6 +788,42 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
782
788
|
)
|
|
783
789
|
)
|
|
784
790
|
|
|
791
|
+
async def _log_connection_identifier_shape(self) -> None:
|
|
792
|
+
"""Async counterpart to ``SnowflakeConnectionSync._log_connection_identifier_shape``.
|
|
793
|
+
|
|
794
|
+
The sync implementation reaches for ``self._log_telemetry`` directly,
|
|
795
|
+
which is overridden as an awaitable on the async class — so the sync
|
|
796
|
+
method's call to ``self._log_telemetry(...)`` would return an
|
|
797
|
+
unawaited coroutine here. This override mirrors the sync logic and
|
|
798
|
+
awaits the emission instead.
|
|
799
|
+
|
|
800
|
+
TODO(SNOW-3548350): remove with the telemetry emission
|
|
801
|
+
(target: 2026-11-30).
|
|
802
|
+
"""
|
|
803
|
+
# See sync sibling for the strict (no ``strip``) semantics.
|
|
804
|
+
if os.environ.get(_DISABLE_CONNECTION_SHAPE_ENV, "").lower() == "true":
|
|
805
|
+
logger.debug(
|
|
806
|
+
"connection-identifier-shape telemetry disabled via %s",
|
|
807
|
+
_DISABLE_CONNECTION_SHAPE_ENV,
|
|
808
|
+
)
|
|
809
|
+
return
|
|
810
|
+
shape: ConnectionIdentifierShape | None = getattr(
|
|
811
|
+
self, "_connection_identifier_shape", None
|
|
812
|
+
)
|
|
813
|
+
if shape is None:
|
|
814
|
+
logger.debug(
|
|
815
|
+
"connection-identifier-shape telemetry skipped: shape not captured"
|
|
816
|
+
)
|
|
817
|
+
return
|
|
818
|
+
ts = get_time_millis()
|
|
819
|
+
await self._log_telemetry(
|
|
820
|
+
TelemetryData.from_telemetry_data_dict(
|
|
821
|
+
from_dict=build_shape_telemetry_message(shape),
|
|
822
|
+
timestamp=ts,
|
|
823
|
+
connection=self,
|
|
824
|
+
)
|
|
825
|
+
)
|
|
826
|
+
|
|
785
827
|
async def _next_sequence_counter(self) -> int:
|
|
786
828
|
"""Gets next sequence counter. Used internally."""
|
|
787
829
|
async with self._lock_sequence_counter:
|
|
@@ -1098,6 +1140,7 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
1098
1140
|
await self.__open_connection()
|
|
1099
1141
|
self._telemetry = TelemetryClient(self._rest)
|
|
1100
1142
|
await self._log_telemetry_imported_packages()
|
|
1143
|
+
await self._log_connection_identifier_shape()
|
|
1101
1144
|
|
|
1102
1145
|
def cursor(self, cursor_class: type[CursorCls] = SnowflakeCursor) -> CursorCls:
|
|
1103
1146
|
logger.debug("cursor")
|
|
@@ -57,6 +57,7 @@ from snowflake.connector.errors import BindUploadError, DatabaseError
|
|
|
57
57
|
from snowflake.connector.file_transfer_agent import SnowflakeProgressPercentage
|
|
58
58
|
from snowflake.connector.telemetry import TelemetryData, TelemetryField
|
|
59
59
|
from snowflake.connector.time_util import get_time_millis
|
|
60
|
+
from snowflake.connector.util_text import extract_values_clause
|
|
60
61
|
|
|
61
62
|
from .._utils import REQUEST_ID_STATEMENT_PARAM_NAME, is_uuid4
|
|
62
63
|
|
|
@@ -765,8 +766,8 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
765
766
|
# accumulate results to mock the result from a single insert statement as formatted below
|
|
766
767
|
logger.debug("rewriting INSERT query")
|
|
767
768
|
command_wo_comments = re.sub(self.COMMENT_SQL_RE, "", command)
|
|
768
|
-
|
|
769
|
-
if
|
|
769
|
+
fmt = extract_values_clause(command_wo_comments)
|
|
770
|
+
if fmt is None:
|
|
770
771
|
Error.errorhandler_wrapper(
|
|
771
772
|
self.connection,
|
|
772
773
|
self,
|
|
@@ -776,8 +777,6 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
776
777
|
"errno": ER_FAILED_TO_REWRITE_MULTI_ROW_INSERT,
|
|
777
778
|
},
|
|
778
779
|
)
|
|
779
|
-
|
|
780
|
-
fmt = m.group(1)
|
|
781
780
|
values = []
|
|
782
781
|
for param in seqparams:
|
|
783
782
|
logger.debug(f"parameter: {param}")
|