snowflake-connector-python 4.2.0__tar.gz → 4.3.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.2.0 → snowflake_connector_python-4.3.0}/DESCRIPTION.md +11 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/MANIFEST.in +1 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/PKG-INFO +12 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/README.md +3 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/_utils.py +60 -2
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/README.md +88 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/__init__.py +0 -4
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_connection.py +25 -13
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/arrow_context.py +8 -4
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/_auth.py +4 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/_oauth_base.py +21 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/keypair.py +5 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/oauth_code.py +5 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/oauth_credentials.py +3 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/connection.py +37 -10
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/constants.py +1 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter.py +3 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/cursor.py +51 -9
- snowflake_connector_python-4.3.0/src/snowflake/connector/interval_util.py +26 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +14 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +13 -7
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +4 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +3 -3
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +2 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +9 -3
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ocsp_asn1crypto.py +1 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ocsp_snowflake.py +36 -11
- snowflake_connector_python-4.3.0/src/snowflake/connector/os_details.py +88 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/result_batch.py +68 -13
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/result_set.py +26 -5
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/telemetry.py +1 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/test_util.py +2 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_collections.py +8 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_version.py +16 -3
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/connection.py +6 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +1 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +6 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +8 -8
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +6 -8
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +2 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +1 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +2 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/http2/connection.py +4 -4
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +9 -11
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/response.py +276 -103
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/request.py +11 -14
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +16 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +11 -8
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/PKG-INFO +12 -2
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +2 -0
- snowflake_connector_python-4.2.0/src/snowflake/connector/interval_util.py +0 -17
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/NOTICE +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/SECURITY.md +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/pyproject.toml +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/setup.cfg +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/setup.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_cursor.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_network.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_result_batch.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_result_set.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_auth.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_okta.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/network.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
- {snowflake_connector_python-4.2.0 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,10 +7,20 @@ 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.3.0(February 12,2026)
|
|
11
|
+
- Ensured proper list conversion - the converter runs to_snowflake on all list elements.
|
|
12
|
+
- Made the parameter `server_session_keep_alive` in `SnowflakeConnection` skip checking for pending async queries, providing faster connection close times especially when many async queries are executed.
|
|
13
|
+
- Fix string representation of INTERVAL YEAR and INTERVAL MONTH types.
|
|
14
|
+
- Log a warning when using http protocol for OAuth urls.
|
|
15
|
+
- Deprecated support for custom revocation error classes in OCSP response cache deserialization. By default, only `RevocationCheckError` exceptions are deserialized from OCSP cache. Custom exception classes can be temporarily enabled by setting the `SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS` environment variable to `true` or `1`, but this support will be removed in a future release.
|
|
16
|
+
- Bumped up vendored `urllib3` to `2.6.3`
|
|
17
|
+
- Added `force_microseconds_precision` to `cursor.fetch_arrow_all` and `cursor.fetch_pandas_all` to avoid PyArrow schema incosistency between batches.
|
|
18
|
+
|
|
10
19
|
- v4.2.0(January 07,2026)
|
|
11
20
|
- Added `SnowflakeCursor.stats` property to expose granular DML statistics (rows inserted, deleted, updated, and duplicates) for operations like CTAS where `rowcount` is insufficient.
|
|
12
21
|
- Added support for injecting SPCS service identifier token (`SPCS_TOKEN`) into login requests when present in SPCS containers.
|
|
13
|
-
- Introduced shared library for extended telemetry to identify and prepare testing platform for native rust extensions.
|
|
22
|
+
- Introduced shared library([source code](https://github.com/snowflakedb/universal-driver/tree/main/sf_mini_core)) for extended telemetry to identify and prepare testing platform for native rust extensions.
|
|
23
|
+
- Added `private_key_passphrase` connection parameter for key pair authentication with encrypted private keys.
|
|
14
24
|
|
|
15
25
|
- v4.1.1(December 12,2025)
|
|
16
26
|
- Relaxed pandas dependency requirements for Python below 3.12.
|
|
@@ -4,6 +4,7 @@ include LICENSE.txt
|
|
|
4
4
|
include NOTICE
|
|
5
5
|
include pyproject.toml
|
|
6
6
|
include src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt
|
|
7
|
+
include src/snowflake/connector/aio/README.md
|
|
7
8
|
recursive-include src/snowflake/connector py.typed *.py *.pyx *.js
|
|
8
9
|
recursive-include src/snowflake/connector/vendored LICENSE*
|
|
9
10
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.3.0
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -93,10 +93,20 @@ https://docs.snowflake.com/
|
|
|
93
93
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
94
94
|
|
|
95
95
|
# Release Notes
|
|
96
|
+
- v4.3.0(February 12,2026)
|
|
97
|
+
- Ensured proper list conversion - the converter runs to_snowflake on all list elements.
|
|
98
|
+
- Made the parameter `server_session_keep_alive` in `SnowflakeConnection` skip checking for pending async queries, providing faster connection close times especially when many async queries are executed.
|
|
99
|
+
- Fix string representation of INTERVAL YEAR and INTERVAL MONTH types.
|
|
100
|
+
- Log a warning when using http protocol for OAuth urls.
|
|
101
|
+
- Deprecated support for custom revocation error classes in OCSP response cache deserialization. By default, only `RevocationCheckError` exceptions are deserialized from OCSP cache. Custom exception classes can be temporarily enabled by setting the `SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS` environment variable to `true` or `1`, but this support will be removed in a future release.
|
|
102
|
+
- Bumped up vendored `urllib3` to `2.6.3`
|
|
103
|
+
- Added `force_microseconds_precision` to `cursor.fetch_arrow_all` and `cursor.fetch_pandas_all` to avoid PyArrow schema incosistency between batches.
|
|
104
|
+
|
|
96
105
|
- v4.2.0(January 07,2026)
|
|
97
106
|
- Added `SnowflakeCursor.stats` property to expose granular DML statistics (rows inserted, deleted, updated, and duplicates) for operations like CTAS where `rowcount` is insufficient.
|
|
98
107
|
- Added support for injecting SPCS service identifier token (`SPCS_TOKEN`) into login requests when present in SPCS containers.
|
|
99
|
-
- Introduced shared library for extended telemetry to identify and prepare testing platform for native rust extensions.
|
|
108
|
+
- Introduced shared library([source code](https://github.com/snowflakedb/universal-driver/tree/main/sf_mini_core)) for extended telemetry to identify and prepare testing platform for native rust extensions.
|
|
109
|
+
- Added `private_key_passphrase` connection parameter for key pair authentication with encrypted private keys.
|
|
100
110
|
|
|
101
111
|
- v4.1.1(December 12,2025)
|
|
102
112
|
- Relaxed pandas dependency requirements for Python below 3.12.
|
|
@@ -103,6 +103,8 @@ To ensure the authenticity and integrity of the Python package, follow the steps
|
|
|
103
103
|
Verified OK
|
|
104
104
|
````
|
|
105
105
|
|
|
106
|
-
##
|
|
106
|
+
## Notes
|
|
107
107
|
|
|
108
108
|
This library currently does not support GCP regional endpoints. Please ensure that any workloads using through this library do not require support for regional endpoints on GCP. If you have questions about this, please contact [Snowflake Support](https://community.snowflake.com/s/article/How-To-Submit-a-Support-Case-in-Snowflake-Lodge).
|
|
109
|
+
|
|
110
|
+
The driver uses Rust library called sf_mini_core, you can find its source code [here](https://github.com/snowflakedb/universal-driver/tree/main/sf_mini_core)
|
|
@@ -7,6 +7,7 @@ import os
|
|
|
7
7
|
import platform
|
|
8
8
|
import string
|
|
9
9
|
import threading
|
|
10
|
+
import time
|
|
10
11
|
from enum import Enum
|
|
11
12
|
from inspect import stack
|
|
12
13
|
from pathlib import Path
|
|
@@ -136,11 +137,23 @@ def get_spcs_token() -> str | None:
|
|
|
136
137
|
return None
|
|
137
138
|
|
|
138
139
|
|
|
140
|
+
class _NanoarrowLoader:
|
|
141
|
+
def __init__(self):
|
|
142
|
+
self._error: Exception | None = None
|
|
143
|
+
|
|
144
|
+
def set_load_error(self, err: Exception):
|
|
145
|
+
self._error = err
|
|
146
|
+
|
|
147
|
+
def get_load_error(self) -> str:
|
|
148
|
+
return str(self._error)
|
|
149
|
+
|
|
150
|
+
|
|
139
151
|
class _CoreLoader:
|
|
140
152
|
def __init__(self):
|
|
141
153
|
self._version: bytes | None = None
|
|
142
154
|
self._error: Exception | None = None
|
|
143
155
|
self._path: str | None = None
|
|
156
|
+
self._load_time: float | None = None
|
|
144
157
|
|
|
145
158
|
@staticmethod
|
|
146
159
|
def _detect_os() -> str:
|
|
@@ -229,7 +242,7 @@ class _CoreLoader:
|
|
|
229
242
|
return "libsf_mini_core.so"
|
|
230
243
|
|
|
231
244
|
@staticmethod
|
|
232
|
-
def _get_core_path()
|
|
245
|
+
def _get_core_path():
|
|
233
246
|
"""Get the path to the minicore library for the current platform."""
|
|
234
247
|
subdir = _CoreLoader._get_platform_subdir()
|
|
235
248
|
lib_name = _CoreLoader._get_lib_name()
|
|
@@ -253,20 +266,49 @@ class _CoreLoader:
|
|
|
253
266
|
core = ctypes.CDLL(str(lib_path))
|
|
254
267
|
return core
|
|
255
268
|
|
|
269
|
+
def get_present_binaries(self) -> str:
|
|
270
|
+
present_binaries = []
|
|
271
|
+
try:
|
|
272
|
+
minicore_files = importlib.resources.files("snowflake.connector.minicore")
|
|
273
|
+
# Iterate through all items in the minicore module
|
|
274
|
+
for item in minicore_files.iterdir():
|
|
275
|
+
# Skip non-platform directories like __pycache__
|
|
276
|
+
if item.is_dir() and not item.name.startswith("__"):
|
|
277
|
+
# This is a platform subdirectory
|
|
278
|
+
platform_name = item.name
|
|
279
|
+
try:
|
|
280
|
+
# List all files in this subdirectory
|
|
281
|
+
for binary_file in item.iterdir():
|
|
282
|
+
if binary_file.is_file():
|
|
283
|
+
# Store as "platform/filename"
|
|
284
|
+
present_binaries.append(
|
|
285
|
+
f"{platform_name}/{binary_file.name}"
|
|
286
|
+
)
|
|
287
|
+
except Exception as e:
|
|
288
|
+
logger.debug(f"Error listing binaries in {platform_name}: {e}")
|
|
289
|
+
except Exception as e:
|
|
290
|
+
logger.debug(f"Error populating present binaries: {e}")
|
|
291
|
+
|
|
292
|
+
return ",".join(present_binaries)
|
|
293
|
+
|
|
256
294
|
def _is_core_disabled(self) -> bool:
|
|
257
295
|
value = str(os.getenv("SNOWFLAKE_DISABLE_MINICORE", None)).lower()
|
|
258
296
|
return value in ["1", "true"]
|
|
259
297
|
|
|
260
298
|
def _load(self) -> None:
|
|
299
|
+
start_time = time.perf_counter()
|
|
261
300
|
try:
|
|
262
301
|
path = self._get_core_path()
|
|
302
|
+
self._path = str(path)
|
|
263
303
|
core = self._load_minicore(path)
|
|
264
304
|
self._register_functions(core)
|
|
265
305
|
self._version = core.sf_core_full_version()
|
|
266
306
|
self._error = None
|
|
267
|
-
self._path = str(path)
|
|
268
307
|
except Exception as err:
|
|
269
308
|
self._error = err
|
|
309
|
+
end_time = time.perf_counter()
|
|
310
|
+
# Store load time in milliseconds (with sub-millisecond precision)
|
|
311
|
+
self._load_time = (end_time - start_time) * 1000
|
|
270
312
|
|
|
271
313
|
def load(self):
|
|
272
314
|
"""Spawn a separate thread to load the minicore library (non-blocking)."""
|
|
@@ -291,8 +333,13 @@ class _CoreLoader:
|
|
|
291
333
|
def get_file_name(self) -> str:
|
|
292
334
|
return self._path
|
|
293
335
|
|
|
336
|
+
def get_load_time(self) -> float | None:
|
|
337
|
+
"""Return the time it took to load the minicore binary in milliseconds."""
|
|
338
|
+
return self._load_time
|
|
339
|
+
|
|
294
340
|
|
|
295
341
|
_core_loader = _CoreLoader()
|
|
342
|
+
_nanoarrow_loader = _NanoarrowLoader()
|
|
296
343
|
|
|
297
344
|
|
|
298
345
|
def build_minicore_usage_for_session() -> dict[str, str | None]:
|
|
@@ -308,5 +355,16 @@ def build_minicore_usage_for_telemetry() -> dict[str, str | None]:
|
|
|
308
355
|
"OS": OPERATING_SYSTEM,
|
|
309
356
|
"OS_VERSION": OS_VERSION,
|
|
310
357
|
"CORE_LOAD_ERROR": _core_loader.get_load_error(),
|
|
358
|
+
"CORE_BINARIES_PRESENT": _core_loader.get_present_binaries(),
|
|
359
|
+
"CORE_LOAD_TIME": _core_loader.get_load_time(),
|
|
311
360
|
**build_minicore_usage_for_session(),
|
|
312
361
|
}
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def build_nanoarrow_usage_for_telemetry() -> dict[str, str | None]:
|
|
365
|
+
return {
|
|
366
|
+
"OS": OPERATING_SYSTEM,
|
|
367
|
+
"OS_VERSION": OS_VERSION,
|
|
368
|
+
"NANOARROW_LOAD_ERROR": _nanoarrow_loader.get_load_error(),
|
|
369
|
+
"ISA": ISA,
|
|
370
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Notice
|
|
2
|
+
|
|
3
|
+
**This component is a Preview feature provided for experimental purposes only.
|
|
4
|
+
It is provided "AS IS" and without warranty of any kind. This module is not
|
|
5
|
+
supported by Snowflake Support. Use of this code is at your own risk and it
|
|
6
|
+
is not intended for production environments.**
|
|
7
|
+
|
|
8
|
+
## Features NOT Supported
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
- ❌ `conn.errorhandler` (get/set) - no support for async errorhandlers
|
|
12
|
+
- ❌ `enable_connection_diag=True` - no connection diagnostic
|
|
13
|
+
- ❌ `authenticator='PAT_WITH_EXTERNAL_SESSION'` - not supported
|
|
14
|
+
- ❌ `mfa_callback` / `password_callback` - not supported
|
|
15
|
+
- ❌ `_probe_connection=True` - no connection diagnostic
|
|
16
|
+
- ❌ Raw binary response handling - not supported
|
|
17
|
+
- ❌ CRL (Certificate Revocation List) - not supported (only OCSP is supported)
|
|
18
|
+
|
|
19
|
+
## Installation & Import
|
|
20
|
+
|
|
21
|
+
Using aio version requires additional installation of `aiohttp` dependency.
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
# Same package, different import
|
|
25
|
+
from snowflake.connector.aio import connect, SnowflakeConnection, DictCursor
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## Connection Patterns
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
# Pattern 1: Async context manager (recommended)
|
|
34
|
+
async with connect(user='...', password='...', account='...') as conn:
|
|
35
|
+
# Use connection
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# Pattern 2: Direct await
|
|
40
|
+
conn = await connect(user='...', password='...', account='...')
|
|
41
|
+
await conn.close()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Pattern 3: Manual
|
|
45
|
+
conn = SnowflakeConnection(user='...', password='...', account='...')
|
|
46
|
+
await conn.connect()
|
|
47
|
+
await conn.close()
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## Basic Operations Comparison
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
| Operation | Sync | Async |
|
|
55
|
+
|-----------|------|-------|
|
|
56
|
+
| **Connect** | `conn = connect(...)` | `conn = await connect(...)` |
|
|
57
|
+
| **Create cursor** | `cur = conn.cursor()` | `cur = conn.cursor()` *(same)* |
|
|
58
|
+
| **Execute** | `cur.execute(sql)` | `await cur.execute(sql)` |
|
|
59
|
+
| **Fetch one** | `cur.fetchone()` | `await cur.fetchone()` |
|
|
60
|
+
| **Fetch many** | `cur.fetchmany(n)` | `await cur.fetchmany(n)` |
|
|
61
|
+
| **Fetch all** | `cur.fetchall()` | `await cur.fetchall()` |
|
|
62
|
+
| **Iterate** | `for row in cur:` | `async for row in cur:` |
|
|
63
|
+
| **Commit** | `conn.commit()` | `await conn.commit()` |
|
|
64
|
+
| **Rollback** | `conn.rollback()` | `await conn.rollback()` |
|
|
65
|
+
| **Close** | `conn.close()` | `await conn.close()` |
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
## Quick Examples
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
### Simple Query
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
import asyncio
|
|
76
|
+
from snowflake.connector.aio import connect
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
async def query_data():
|
|
80
|
+
async with connect(user='...', password='...', account='...') as conn:
|
|
81
|
+
async with conn.cursor() as cur:
|
|
82
|
+
await cur.execute("SELECT * FROM table WHERE id < %s", (100,))
|
|
83
|
+
async for row in cur:
|
|
84
|
+
print(row)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
asyncio.run(query_data())
|
|
88
|
+
```
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
# temporarily disable aio - SNOW-2905263
|
|
4
|
-
raise ImportError("aio is not supported in this version of the connector")
|
|
5
|
-
|
|
6
|
-
|
|
7
3
|
from functools import wraps
|
|
8
4
|
from typing import Any, Coroutine, Generator, Protocol, TypeVar, runtime_checkable
|
|
9
5
|
|
|
@@ -343,6 +343,7 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
343
343
|
|
|
344
344
|
elif self._authenticator == KEY_PAIR_AUTHENTICATOR:
|
|
345
345
|
private_key = self._private_key
|
|
346
|
+
private_key_passphrase = self._private_key_passphrase
|
|
346
347
|
|
|
347
348
|
if self._private_key_file:
|
|
348
349
|
private_key = _get_private_bytes_from_file(
|
|
@@ -352,6 +353,7 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
352
353
|
|
|
353
354
|
self.auth_class = AuthByKeyPair(
|
|
354
355
|
private_key=private_key,
|
|
356
|
+
private_key_passphrase=private_key_passphrase,
|
|
355
357
|
timeout=self.login_timeout,
|
|
356
358
|
backoff_generator=self._backoff_generator,
|
|
357
359
|
)
|
|
@@ -930,22 +932,32 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
930
932
|
|
|
931
933
|
if self.telemetry_enabled:
|
|
932
934
|
await self._telemetry.close(retry=retry)
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
):
|
|
937
|
-
logger.debug("No async queries seem to be running, deleting session")
|
|
938
|
-
try:
|
|
939
|
-
await self.rest.delete_session(retry=retry)
|
|
940
|
-
except Exception as e:
|
|
935
|
+
|
|
936
|
+
if not self._server_session_keep_alive:
|
|
937
|
+
if await self._all_async_queries_finished():
|
|
941
938
|
logger.debug(
|
|
942
|
-
"
|
|
939
|
+
"No async queries seem to be running, deleting session"
|
|
943
940
|
)
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
941
|
+
try:
|
|
942
|
+
await self.rest.delete_session(retry=retry)
|
|
943
|
+
except Exception as e:
|
|
944
|
+
logger.debug(
|
|
945
|
+
"Exception encountered in deleting session. ignoring...: %s",
|
|
946
|
+
e,
|
|
947
|
+
)
|
|
948
|
+
else:
|
|
949
|
+
logger.debug(
|
|
950
|
+
"There are {} async queries still running, not deleting session".format(
|
|
951
|
+
len(self._async_sfqids)
|
|
952
|
+
)
|
|
948
953
|
)
|
|
954
|
+
else:
|
|
955
|
+
logger.info(
|
|
956
|
+
"Parameter server_session_keep_alive was set to True - skipping session logout. "
|
|
957
|
+
"If there are any not-finished queries in the current session (session_id: %s) - "
|
|
958
|
+
"they will continue to live in Snowflake and consume credits until they finish. "
|
|
959
|
+
"To cancel them use Monitoring tab in Snowsight or plain SQL.",
|
|
960
|
+
self.session_id,
|
|
949
961
|
)
|
|
950
962
|
await self.rest.close()
|
|
951
963
|
self._rest = None
|
|
@@ -165,10 +165,14 @@ class ArrowConverterContext:
|
|
|
165
165
|
def DECFLOAT_to_numpy_float64(self, exponent: int, significand: bytes) -> float64:
|
|
166
166
|
return numpy.float64(self.DECFLOAT_to_decimal(exponent, significand))
|
|
167
167
|
|
|
168
|
-
def INTERVAL_YEAR_MONTH_to_str(self, months: int) -> str:
|
|
169
|
-
return interval_year_month_to_string(months)
|
|
170
|
-
|
|
171
|
-
def INTERVAL_YEAR_MONTH_to_numpy_timedelta(
|
|
168
|
+
def INTERVAL_YEAR_MONTH_to_str(self, months: int, scale: int) -> str:
|
|
169
|
+
return interval_year_month_to_string(months, scale)
|
|
170
|
+
|
|
171
|
+
def INTERVAL_YEAR_MONTH_to_numpy_timedelta(
|
|
172
|
+
self, months: int, scale: int
|
|
173
|
+
) -> timedelta64:
|
|
174
|
+
if scale == 1: # interval year
|
|
175
|
+
return numpy.timedelta64(months // 12, "Y")
|
|
172
176
|
return numpy.timedelta64(months, "M")
|
|
173
177
|
|
|
174
178
|
def INTERVAL_DAY_TIME_int_to_numpy_timedelta(self, nanos: int) -> timedelta64:
|
|
@@ -56,6 +56,7 @@ from ..network import (
|
|
|
56
56
|
PYTHON_CONNECTOR_USER_AGENT,
|
|
57
57
|
ReauthenticationRequest,
|
|
58
58
|
)
|
|
59
|
+
from ..os_details import get_os_details
|
|
59
60
|
from ..platform_detection import detect_platforms
|
|
60
61
|
from ..session_manager import BaseHttpConfig, HttpConfig
|
|
61
62
|
from ..session_manager import SessionManager as SyncSessionManager
|
|
@@ -159,6 +160,7 @@ class Auth:
|
|
|
159
160
|
platform_detection_timeout_seconds=platform_detection_timeout_seconds,
|
|
160
161
|
session_manager=session_manager.clone(max_retries=0),
|
|
161
162
|
),
|
|
163
|
+
"OS_DETAILS": get_os_details(),
|
|
162
164
|
**build_minicore_usage_for_session(),
|
|
163
165
|
},
|
|
164
166
|
},
|
|
@@ -633,8 +635,8 @@ def get_token_from_private_key(
|
|
|
633
635
|
from . import AuthByKeyPair
|
|
634
636
|
|
|
635
637
|
auth_instance = AuthByKeyPair(
|
|
636
|
-
private_key,
|
|
637
|
-
DAY_IN_SECONDS,
|
|
638
|
+
private_key=private_key,
|
|
639
|
+
lifetime_in_seconds=DAY_IN_SECONDS,
|
|
638
640
|
) # token valid for 24 hours
|
|
639
641
|
return auth_instance.prepare(account=account, user=user)
|
|
640
642
|
|
|
@@ -428,6 +428,27 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
|
|
|
428
428
|
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
|
|
429
429
|
}
|
|
430
430
|
|
|
431
|
+
@staticmethod
|
|
432
|
+
def _log_if_http_in_use(url: str) -> None:
|
|
433
|
+
"""Log a warning if the URL uses insecure HTTP protocol.
|
|
434
|
+
|
|
435
|
+
Args:
|
|
436
|
+
url: The URL to check for HTTP usage
|
|
437
|
+
"""
|
|
438
|
+
try:
|
|
439
|
+
parsed_url = urllib.parse.urlparse(url)
|
|
440
|
+
if parsed_url.scheme == "http":
|
|
441
|
+
logger.warning(
|
|
442
|
+
"OAuth URL uses insecure HTTP protocol: %s",
|
|
443
|
+
SecretDetector.mask_secrets(url),
|
|
444
|
+
)
|
|
445
|
+
except Exception as e:
|
|
446
|
+
logger.warning(
|
|
447
|
+
"Cannot parse URL: %s. %s",
|
|
448
|
+
SecretDetector.mask_secrets(url),
|
|
449
|
+
e,
|
|
450
|
+
)
|
|
451
|
+
|
|
431
452
|
@staticmethod
|
|
432
453
|
def _resolve_proxy_url(
|
|
433
454
|
connection: SnowflakeConnection, request_url: str
|
|
@@ -40,6 +40,7 @@ class AuthByKeyPair(AuthByPlugin):
|
|
|
40
40
|
def __init__(
|
|
41
41
|
self,
|
|
42
42
|
private_key: bytes | str | RSAPrivateKey,
|
|
43
|
+
private_key_passphrase: bytes | None = None,
|
|
43
44
|
lifetime_in_seconds: int = LIFETIME,
|
|
44
45
|
**kwargs,
|
|
45
46
|
) -> None:
|
|
@@ -72,6 +73,7 @@ class AuthByKeyPair(AuthByPlugin):
|
|
|
72
73
|
)
|
|
73
74
|
|
|
74
75
|
self._private_key: bytes | str | RSAPrivateKey | None = private_key
|
|
76
|
+
self._private_key_passphrase: bytes | None = private_key_passphrase
|
|
75
77
|
self._jwt_token = ""
|
|
76
78
|
self._jwt_token_exp = 0
|
|
77
79
|
self._lifetime = timedelta(
|
|
@@ -116,13 +118,14 @@ class AuthByKeyPair(AuthByPlugin):
|
|
|
116
118
|
try:
|
|
117
119
|
private_key = load_der_private_key(
|
|
118
120
|
data=self._private_key,
|
|
119
|
-
password=
|
|
121
|
+
password=self._private_key_passphrase,
|
|
120
122
|
backend=default_backend(),
|
|
121
123
|
)
|
|
122
124
|
except Exception as e:
|
|
123
125
|
raise ProgrammingError(
|
|
124
126
|
msg=f"Failed to load private key: {e}\nPlease provide a valid "
|
|
125
|
-
"
|
|
127
|
+
"rsa private key in DER format as bytes object. If the key is "
|
|
128
|
+
"encrypted, provide the passphrase via private_key_passphrase",
|
|
126
129
|
errno=ER_INVALID_PRIVATE_KEY,
|
|
127
130
|
)
|
|
128
131
|
|
|
@@ -79,6 +79,11 @@ class AuthByOauthCode(AuthByOAuthBase):
|
|
|
79
79
|
host,
|
|
80
80
|
connection,
|
|
81
81
|
)
|
|
82
|
+
# Warn if HTTP is used for OAuth URLs
|
|
83
|
+
if authentication_url:
|
|
84
|
+
self._log_if_http_in_use(authentication_url)
|
|
85
|
+
if token_request_url:
|
|
86
|
+
self._log_if_http_in_use(token_request_url)
|
|
82
87
|
|
|
83
88
|
super().__init__(
|
|
84
89
|
client_id=client_id,
|
|
@@ -31,6 +31,9 @@ class AuthByOauthCredentials(AuthByOAuthBase):
|
|
|
31
31
|
**kwargs,
|
|
32
32
|
) -> None:
|
|
33
33
|
self._validate_client_credentials_present(client_id, client_secret, connection)
|
|
34
|
+
# Warn if HTTP is used for OAuth token request URL
|
|
35
|
+
if token_request_url:
|
|
36
|
+
self._log_if_http_in_use(token_request_url)
|
|
34
37
|
super().__init__(
|
|
35
38
|
client_id=client_id,
|
|
36
39
|
client_secret=client_secret,
|
|
@@ -43,6 +43,7 @@ from ._utils import (
|
|
|
43
43
|
_DEFAULT_VALUE_SERVER_DOP_CAP_FOR_FILE_TRANSFER,
|
|
44
44
|
_VARIABLE_NAME_SERVER_DOP_CAP_FOR_FILE_TRANSFER,
|
|
45
45
|
build_minicore_usage_for_telemetry,
|
|
46
|
+
build_nanoarrow_usage_for_telemetry,
|
|
46
47
|
)
|
|
47
48
|
from .auth import (
|
|
48
49
|
FIRST_PARTY_AUTHENTICATORS,
|
|
@@ -232,6 +233,7 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
|
|
|
232
233
|
"passcode_in_password": (False, bool), # Snowflake MFA
|
|
233
234
|
"passcode": (None, (type(None), str)), # Snowflake MFA
|
|
234
235
|
"private_key": (None, (type(None), bytes, str, RSAPrivateKey)),
|
|
236
|
+
"private_key_passphrase": (None, (type(None), bytes)),
|
|
235
237
|
"private_key_file": (None, (type(None), str)),
|
|
236
238
|
"private_key_file_pwd": (None, (type(None), str, bytes)),
|
|
237
239
|
"token": (None, (type(None), str)), # OAuth/JWT/PAT/OIDC Token
|
|
@@ -682,6 +684,7 @@ class SnowflakeConnection:
|
|
|
682
684
|
|
|
683
685
|
# get the imported modules from sys.modules
|
|
684
686
|
self._log_telemetry_imported_packages()
|
|
687
|
+
self._log_nanoarrow_import()
|
|
685
688
|
self._log_minicore_import()
|
|
686
689
|
# check SNOW-1218851 for long term improvement plan to refactor ocsp code
|
|
687
690
|
atexit.register(self._close_at_exit)
|
|
@@ -1197,17 +1200,26 @@ class SnowflakeConnection:
|
|
|
1197
1200
|
logger.debug("closed")
|
|
1198
1201
|
if self.telemetry_enabled:
|
|
1199
1202
|
self._telemetry.close(retry=retry)
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
self.rest.delete_session(retry=retry)
|
|
1206
|
-
else:
|
|
1207
|
-
logger.debug(
|
|
1208
|
-
"There are {} async queries still running, not deleting session".format(
|
|
1209
|
-
len(self._async_sfqids)
|
|
1203
|
+
|
|
1204
|
+
if not self._server_session_keep_alive:
|
|
1205
|
+
if self._all_async_queries_finished():
|
|
1206
|
+
logger.debug(
|
|
1207
|
+
"No async queries seem to be running, deleting session"
|
|
1210
1208
|
)
|
|
1209
|
+
self.rest.delete_session(retry=retry)
|
|
1210
|
+
else:
|
|
1211
|
+
logger.debug(
|
|
1212
|
+
"There are {} async queries still running, not deleting session".format(
|
|
1213
|
+
len(self._async_sfqids)
|
|
1214
|
+
)
|
|
1215
|
+
)
|
|
1216
|
+
else:
|
|
1217
|
+
logger.info(
|
|
1218
|
+
"Parameter server_session_keep_alive was set to True - skipping session logout. "
|
|
1219
|
+
"If there are any not-finished queries in the current session (session_id: %s) - "
|
|
1220
|
+
"they will continue to live in Snowflake and consume credits until they finish. "
|
|
1221
|
+
"To cancel them use Monitoring tab in Snowsight or plain SQL.",
|
|
1222
|
+
self.session_id,
|
|
1211
1223
|
)
|
|
1212
1224
|
self.rest.close()
|
|
1213
1225
|
self._rest = None
|
|
@@ -1463,6 +1475,7 @@ class SnowflakeConnection:
|
|
|
1463
1475
|
|
|
1464
1476
|
elif self._authenticator == KEY_PAIR_AUTHENTICATOR:
|
|
1465
1477
|
private_key = self._private_key
|
|
1478
|
+
private_key_passphrase = self._private_key_passphrase
|
|
1466
1479
|
|
|
1467
1480
|
if self._private_key_file:
|
|
1468
1481
|
private_key = _get_private_bytes_from_file(
|
|
@@ -1472,6 +1485,7 @@ class SnowflakeConnection:
|
|
|
1472
1485
|
|
|
1473
1486
|
self.auth_class = AuthByKeyPair(
|
|
1474
1487
|
private_key=private_key,
|
|
1488
|
+
private_key_passphrase=private_key_passphrase,
|
|
1475
1489
|
timeout=self.login_timeout,
|
|
1476
1490
|
backoff_generator=self._backoff_generator,
|
|
1477
1491
|
)
|
|
@@ -2530,6 +2544,19 @@ class SnowflakeConnection:
|
|
|
2530
2544
|
)
|
|
2531
2545
|
)
|
|
2532
2546
|
|
|
2547
|
+
def _log_nanoarrow_import(self):
|
|
2548
|
+
ts = get_time_millis()
|
|
2549
|
+
self._log_telemetry(
|
|
2550
|
+
TelemetryData.from_telemetry_data_dict(
|
|
2551
|
+
from_dict={
|
|
2552
|
+
TelemetryField.KEY_TYPE.value: TelemetryField.NANOARROW_IMPORT.value,
|
|
2553
|
+
TelemetryField.KEY_VALUE.value: build_nanoarrow_usage_for_telemetry(),
|
|
2554
|
+
},
|
|
2555
|
+
timestamp=ts,
|
|
2556
|
+
connection=self,
|
|
2557
|
+
)
|
|
2558
|
+
)
|
|
2559
|
+
|
|
2533
2560
|
def _log_telemetry_imported_packages(self) -> None:
|
|
2534
2561
|
if self._log_imported_packages_in_telemetry:
|
|
2535
2562
|
# filter out duplicates caused by submodules
|
|
@@ -442,6 +442,7 @@ DAY_IN_SECONDS = 60 * 60 * 24
|
|
|
442
442
|
ENV_VAR_PARTNER = "SF_PARTNER"
|
|
443
443
|
ENV_VAR_TEST_MODE = "SNOWFLAKE_TEST_MODE"
|
|
444
444
|
ENV_VAR_DISABLE_PLATFORM_DETECTION = "SNOWFLAKE_DISABLE_PLATFORM_DETECTION"
|
|
445
|
+
ENV_VAR_ENABLE_CUSTOM_REVOCATION_ERRORS = "SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS"
|
|
445
446
|
|
|
446
447
|
# Boolean positive values (lowercased) for environment variable checks
|
|
447
448
|
ENV_VAR_BOOL_POSITIVE_VALUES_LOWERCASED = ["true"]
|
|
@@ -357,7 +357,8 @@ class SnowflakeConverter:
|
|
|
357
357
|
return lambda value: value in ("1", "TRUE")
|
|
358
358
|
|
|
359
359
|
def _INTERVAL_YEAR_MONTH_to_python(self, ctx: dict[str, Any]) -> Callable:
|
|
360
|
-
|
|
360
|
+
scale = ctx["scale"]
|
|
361
|
+
return lambda v: interval_year_month_to_string(int(v), scale)
|
|
361
362
|
|
|
362
363
|
def _INTERVAL_YEAR_MONTH_numpy_to_python(self, ctx: dict[str, Any]) -> Callable:
|
|
363
364
|
return lambda v: numpy.timedelta64(int(v), "M")
|
|
@@ -647,7 +648,7 @@ class SnowflakeConverter:
|
|
|
647
648
|
def _list_to_snowflake(self, value: list) -> list:
|
|
648
649
|
return [
|
|
649
650
|
SnowflakeConverter.quote(v0)
|
|
650
|
-
for v0 in [SnowflakeConverter.escape(v) for v in value]
|
|
651
|
+
for v0 in [SnowflakeConverter.escape(self.to_snowflake(v)) for v in value]
|
|
651
652
|
]
|
|
652
653
|
|
|
653
654
|
_tuple_to_snowflake = _list_to_snowflake
|