snowflake-connector-python 4.7.3__tar.gz → 4.7.5__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.7.3 → snowflake_connector_python-4.7.5}/DESCRIPTION.md +13 -3
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/PKG-INFO +16 -6
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/README.md +2 -5
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/setup.cfg +2 -2
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_connection.py +21 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_cursor.py +22 -17
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_network.py +4 -2
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_result_batch.py +9 -6
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_result_set.py +26 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth_code.py +6 -1
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth_credentials.py +6 -1
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_oauth_base.py +171 -26
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/connection.py +55 -1
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/connection_diagnostic.py +5 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/constants.py +55 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/cursor.py +109 -16
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/errorcode.py +1 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/errors.py +19 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/network.py +11 -2
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/result_batch.py +192 -8
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/result_set.py +60 -2
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/session_manager.py +61 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ssl_wrap_socket.py +114 -2
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/storage_client.py +22 -1
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/wif_util.py +17 -3
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/PKG-INFO +16 -6
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/NOTICE +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/SECURITY.md +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/pyproject.toml +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/setup.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_host_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_okta.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth_code.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,11 +7,22 @@ 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.7.5(Sep 18,2026)
|
|
11
|
+
- Follow-up to the v4.7.4 incomplete-result fix (SNOW-4109042): when a successful query-request has an incomplete inline first chunk, the connector re-fetches the finished query once via `GET /queries/{qid}/result` before building the result set. JSON treats empty or shorter-than-declared inline rowsets as incomplete; Arrow only treats a missing/empty `rowsetBase64` as incomplete so the execute hot path does not decode IPC. If the result GET fails (transport error or `success: false`), the original payload is kept; if the GET succeeds but is still incomplete, that response is used. In either incomplete case the existing rowcount/total checks still raise `OperationalError` errno `252013` when the result is drained (no silent EOF). On the sync path, a remote result chunk whose body holds fewer rows than its declared `rowCount` is re-downloaded once before that check raises, so a truncated-but-valid chunk download can recover without silent data loss. Asynchronous (`snowflake.connector.aio`) remote-chunk re-download is unchanged.
|
|
12
|
+
|
|
13
|
+
- v4.7.4(Sep 16,2026)
|
|
14
|
+
- Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
|
|
15
|
+
- Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
|
|
16
|
+
- Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
|
|
17
|
+
- Added the `SNOWFLAKE_MIN_TLS_VERSION` environment variable (`1.2`, `1.3`, `TLSv1.2` or `TLSv1.3`, defaulting to TLS 1.2) to raise the minimum TLS version on every outbound connection a synchronous connector makes: the Snowflake API, stage transfers, OCSP/CRL fetches, platform detection, IdP requests, AWS SDK requests (workload identity STS calls and the platform-detection identity probe) and Azure AD token requests made by `azure-identity`. An unrecognized value is rejected at connect time. The variable name and accepted values match the Go and JDBC drivers. Asynchronous (`snowflake.connector.aio`) connections are not yet covered.
|
|
18
|
+
- Fixed a TLS handshake failure that cannot succeed on a retry — a minimum-version mismatch, an untrusted certificate, a hostname mismatch — being reported by `connect()` as a generic `250001: Could not connect to Snowflake backend after N attempt(s)` alongside a firewall-troubleshooting hint. The network layer already identified and named such failures, but the authentication layer retried them until the login timeout expired and then replaced the diagnosis. They now surface as `NonRetryableTlsError` (a subclass of `OperationalError` keeping the same errno, so existing handlers are unaffected) naming the underlying cause, and are no longer retried. Transient handshake faults (`ECONNRESET`, unexpected EOF) remain retryable.
|
|
19
|
+
|
|
10
20
|
- v4.7.3(Sep 3,2026)
|
|
11
21
|
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
12
22
|
- Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
|
|
13
23
|
- Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
|
|
14
24
|
- Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
|
|
25
|
+
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
15
26
|
- Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
|
|
16
27
|
- DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
|
|
17
28
|
- The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
|
|
@@ -25,15 +36,15 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
25
36
|
- Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
|
|
26
37
|
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
27
38
|
- Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
|
|
28
|
-
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
29
39
|
|
|
30
|
-
- v4.7.2(Aug
|
|
40
|
+
- v4.7.2(Aug 7,2026)
|
|
31
41
|
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
32
42
|
- Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
|
|
33
43
|
- Fixed large-file PUT uploads to internal Azure stages failing against the Azure 50,000-block-per-blob limit. The Azure multipart chunk size is now scaled up dynamically for very large files (mirroring the existing S3 behavior), and the default Azure chunk size was raised from 4 MB to 8 MB (consistent with S3) for better throughput (SNOW-3839943).
|
|
34
44
|
- Fixed OAuth cached-credential connections failing with `250001 Invalid OAuth access token` when the cached token was invalid (GS code `390303`); the connector now reauthenticates silently (via refresh token if available, otherwise browser) instead of hard-failing. Also fixed fresh processes holding only a cached refresh token going straight to an interactive browser prompt instead of attempting a silent refresh first.
|
|
35
45
|
- Fixed Okta/SAML authentication reporting an exhausted `login_timeout` as `250003: Failed to execute request: Attempted to set connect timeout to <negative value>`. Obtaining the one-time token in step 4 can overshoot the login deadline, which made the remaining budget negative; it was then passed to the HTTP layer, which rejected it with an opaque `ValueError`. A timed-out SAML login now raises `250006` with a message naming `login_timeout`. Running out of budget while retrying on `RefreshTokenError` reports the same error instead of failing later with an `AttributeError` on an empty response (SNOW-3891419).
|
|
36
46
|
- Fixed OAuth authorization code flow failing for accounts with uppercase letters in the account name. `urlparse().hostname` always returns lowercase, but the host was compared case-sensitively in `_is_snowflake_as_idp`, causing Snowflake-as-IdP detection to return `False` and raising error 251013 (`client_id is empty`) even for connections that don't require a client ID.
|
|
47
|
+
- Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
|
|
37
48
|
|
|
38
49
|
- v4.7.1(Jul 15,2026)
|
|
39
50
|
- Added support for Python 3.14t (free-threaded).
|
|
@@ -49,7 +60,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
49
60
|
- Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
|
|
50
61
|
- Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
|
|
51
62
|
- Fixed a bug where a fully-qualified DDL statement (e.g. `CREATE VIEW db.schema.obj`) on a session with no current schema would populate the connector's cached `_schema`/`_database` from the referenced object's namespace. This made `get_current_schema()` diverge from the server's `CURRENT_SCHEMA()` and mis-qualified Snowpark temp objects (SNOW-3665226).
|
|
52
|
-
- Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
|
|
53
63
|
|
|
54
64
|
- v4.6.0(May 28,2026)
|
|
55
65
|
- Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 4.7.
|
|
3
|
+
Version: 4.7.5
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -70,8 +70,8 @@ Requires-Dist: more-itertools; extra == "development"
|
|
|
70
70
|
Requires-Dist: numpy<=2.4.3; extra == "development"
|
|
71
71
|
Requires-Dist: pendulum!=2.1.1; extra == "development"
|
|
72
72
|
Requires-Dist: pexpect; extra == "development"
|
|
73
|
-
Requires-Dist: pytest<
|
|
74
|
-
Requires-Dist: pytest-asyncio; extra == "development"
|
|
73
|
+
Requires-Dist: pytest<9,>=8.4; extra == "development"
|
|
74
|
+
Requires-Dist: pytest-asyncio<2,>=1.4.0; extra == "development"
|
|
75
75
|
Requires-Dist: pytest-cov; extra == "development"
|
|
76
76
|
Requires-Dist: pytest-rerunfailures<16.0; extra == "development"
|
|
77
77
|
Requires-Dist: pytest-timeout; extra == "development"
|
|
@@ -97,11 +97,22 @@ https://docs.snowflake.com/
|
|
|
97
97
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
98
98
|
|
|
99
99
|
# Release Notes
|
|
100
|
+
- v4.7.5(Sep 18,2026)
|
|
101
|
+
- Follow-up to the v4.7.4 incomplete-result fix (SNOW-4109042): when a successful query-request has an incomplete inline first chunk, the connector re-fetches the finished query once via `GET /queries/{qid}/result` before building the result set. JSON treats empty or shorter-than-declared inline rowsets as incomplete; Arrow only treats a missing/empty `rowsetBase64` as incomplete so the execute hot path does not decode IPC. If the result GET fails (transport error or `success: false`), the original payload is kept; if the GET succeeds but is still incomplete, that response is used. In either incomplete case the existing rowcount/total checks still raise `OperationalError` errno `252013` when the result is drained (no silent EOF). On the sync path, a remote result chunk whose body holds fewer rows than its declared `rowCount` is re-downloaded once before that check raises, so a truncated-but-valid chunk download can recover without silent data loss. Asynchronous (`snowflake.connector.aio`) remote-chunk re-download is unchanged.
|
|
102
|
+
|
|
103
|
+
- v4.7.4(Sep 16,2026)
|
|
104
|
+
- Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
|
|
105
|
+
- Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
|
|
106
|
+
- Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
|
|
107
|
+
- Added the `SNOWFLAKE_MIN_TLS_VERSION` environment variable (`1.2`, `1.3`, `TLSv1.2` or `TLSv1.3`, defaulting to TLS 1.2) to raise the minimum TLS version on every outbound connection a synchronous connector makes: the Snowflake API, stage transfers, OCSP/CRL fetches, platform detection, IdP requests, AWS SDK requests (workload identity STS calls and the platform-detection identity probe) and Azure AD token requests made by `azure-identity`. An unrecognized value is rejected at connect time. The variable name and accepted values match the Go and JDBC drivers. Asynchronous (`snowflake.connector.aio`) connections are not yet covered.
|
|
108
|
+
- Fixed a TLS handshake failure that cannot succeed on a retry — a minimum-version mismatch, an untrusted certificate, a hostname mismatch — being reported by `connect()` as a generic `250001: Could not connect to Snowflake backend after N attempt(s)` alongside a firewall-troubleshooting hint. The network layer already identified and named such failures, but the authentication layer retried them until the login timeout expired and then replaced the diagnosis. They now surface as `NonRetryableTlsError` (a subclass of `OperationalError` keeping the same errno, so existing handlers are unaffected) naming the underlying cause, and are no longer retried. Transient handshake faults (`ECONNRESET`, unexpected EOF) remain retryable.
|
|
109
|
+
|
|
100
110
|
- v4.7.3(Sep 3,2026)
|
|
101
111
|
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
102
112
|
- Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
|
|
103
113
|
- Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
|
|
104
114
|
- Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
|
|
115
|
+
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
105
116
|
- Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
|
|
106
117
|
- DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
|
|
107
118
|
- The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
|
|
@@ -115,15 +126,15 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
115
126
|
- Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
|
|
116
127
|
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
117
128
|
- Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
|
|
118
|
-
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
119
129
|
|
|
120
|
-
- v4.7.2(Aug
|
|
130
|
+
- v4.7.2(Aug 7,2026)
|
|
121
131
|
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
122
132
|
- Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
|
|
123
133
|
- Fixed large-file PUT uploads to internal Azure stages failing against the Azure 50,000-block-per-blob limit. The Azure multipart chunk size is now scaled up dynamically for very large files (mirroring the existing S3 behavior), and the default Azure chunk size was raised from 4 MB to 8 MB (consistent with S3) for better throughput (SNOW-3839943).
|
|
124
134
|
- Fixed OAuth cached-credential connections failing with `250001 Invalid OAuth access token` when the cached token was invalid (GS code `390303`); the connector now reauthenticates silently (via refresh token if available, otherwise browser) instead of hard-failing. Also fixed fresh processes holding only a cached refresh token going straight to an interactive browser prompt instead of attempting a silent refresh first.
|
|
125
135
|
- Fixed Okta/SAML authentication reporting an exhausted `login_timeout` as `250003: Failed to execute request: Attempted to set connect timeout to <negative value>`. Obtaining the one-time token in step 4 can overshoot the login deadline, which made the remaining budget negative; it was then passed to the HTTP layer, which rejected it with an opaque `ValueError`. A timed-out SAML login now raises `250006` with a message naming `login_timeout`. Running out of budget while retrying on `RefreshTokenError` reports the same error instead of failing later with an `AttributeError` on an empty response (SNOW-3891419).
|
|
126
136
|
- Fixed OAuth authorization code flow failing for accounts with uppercase letters in the account name. `urlparse().hostname` always returns lowercase, but the host was compared case-sensitively in `_is_snowflake_as_idp`, causing Snowflake-as-IdP detection to return `False` and raising error 251013 (`client_id is empty`) even for connections that don't require a client ID.
|
|
137
|
+
- Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
|
|
127
138
|
|
|
128
139
|
- v4.7.1(Jul 15,2026)
|
|
129
140
|
- Added support for Python 3.14t (free-threaded).
|
|
@@ -139,7 +150,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
139
150
|
- Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
|
|
140
151
|
- Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
|
|
141
152
|
- Fixed a bug where a fully-qualified DDL statement (e.g. `CREATE VIEW db.schema.obj`) on a session with no current schema would populate the connector's cached `_schema`/`_database` from the referenced object's namespace. This made `get_current_schema()` diverge from the server's `CURRENT_SCHEMA()` and mis-qualified Snowpark temp objects (SNOW-3665226).
|
|
142
|
-
- Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
|
|
143
153
|
|
|
144
154
|
- v4.6.0(May 28,2026)
|
|
145
155
|
- Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
# Snowflake Connector for Python
|
|
2
2
|
|
|
3
|
-
[!
|
|
4
|
-
[
|
|
5
|
-
[](https://pypi.python.org/pypi/snowflake-connector-python/)
|
|
6
|
-
[](http://www.apache.org/licenses/LICENSE-2.0.txt)
|
|
7
|
-
[](https://github.com/psf/black)
|
|
3
|
+
> [!IMPORTANT]
|
|
4
|
+
> A new version of the driver is being developed in [snowflakedb/drivers](https://github.com/snowflakedb/drivers) and is currently in public preview. See the [documentation](https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-universal-core) for more information.
|
|
8
5
|
|
|
9
6
|
This package includes the Snowflake Connector for Python, which conforms to the [Python DB API 2.0](https://www.python.org/dev/peps/pep-0249/) specification.
|
|
10
7
|
|
|
@@ -23,6 +23,7 @@ from snowflake.connector import (
|
|
|
23
23
|
OperationalError,
|
|
24
24
|
ProgrammingError,
|
|
25
25
|
)
|
|
26
|
+
from snowflake.connector.errors import NonRetryableTlsError
|
|
26
27
|
|
|
27
28
|
from .._connection_identifier_shape import (
|
|
28
29
|
ConnectionIdentifierShape,
|
|
@@ -38,6 +39,7 @@ from ..connection import _get_private_bytes_from_file
|
|
|
38
39
|
from ..constants import (
|
|
39
40
|
_CONNECTIVITY_ERR_MSG,
|
|
40
41
|
_OAUTH_DEFAULT_SCOPE,
|
|
42
|
+
ENV_VAR_MIN_TLS_VERSION,
|
|
41
43
|
PARAMETER_AUTOCOMMIT,
|
|
42
44
|
PARAMETER_CLIENT_PREFETCH_THREADS,
|
|
43
45
|
PARAMETER_CLIENT_REQUEST_MFA_TOKEN,
|
|
@@ -570,6 +572,11 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
570
572
|
password_callback=self._password_callback,
|
|
571
573
|
session_parameters=self._session_parameters,
|
|
572
574
|
)
|
|
575
|
+
except NonRetryableTlsError:
|
|
576
|
+
# See the sync counterpart: a TLS failure that a retry cannot fix must
|
|
577
|
+
# surface with its diagnosis rather than be replaced by the generic
|
|
578
|
+
# "could not connect" message the retry loop below ends with.
|
|
579
|
+
raise
|
|
573
580
|
except OperationalError as e:
|
|
574
581
|
logger.debug(
|
|
575
582
|
"Operational Error raised at authentication"
|
|
@@ -1110,6 +1117,20 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
1110
1117
|
async def connect(self, **kwargs) -> None:
|
|
1111
1118
|
"""Establishes connection to Snowflake."""
|
|
1112
1119
|
logger.debug("connect")
|
|
1120
|
+
self._validate_min_tls_version()
|
|
1121
|
+
# Validating the value here must not be read as enforcing it: the async
|
|
1122
|
+
# stack builds its TLS contexts through aiohttp, which the connector's
|
|
1123
|
+
# urllib3 interception never sees, so the floor is not applied to async
|
|
1124
|
+
# handshakes. Say so rather than let a successful connect imply otherwise.
|
|
1125
|
+
# Not raised, because the variable is process-wide -- failing here would
|
|
1126
|
+
# break async connections in any process that set it for the sync path.
|
|
1127
|
+
if os.environ.get(ENV_VAR_MIN_TLS_VERSION, "").strip():
|
|
1128
|
+
logger.warning(
|
|
1129
|
+
"%s is set but is not enforced on asynchronous connections; their "
|
|
1130
|
+
"TLS handshakes may negotiate a lower version. Use a synchronous "
|
|
1131
|
+
"connection where the minimum must be guaranteed.",
|
|
1132
|
+
ENV_VAR_MIN_TLS_VERSION,
|
|
1133
|
+
)
|
|
1113
1134
|
if len(kwargs) > 0:
|
|
1114
1135
|
self.__config(**kwargs)
|
|
1115
1136
|
else:
|
|
@@ -379,6 +379,10 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
379
379
|
self,
|
|
380
380
|
result_chunks,
|
|
381
381
|
self._connection.client_prefetch_threads,
|
|
382
|
+
# SNOW-4109042: a DML reuses "total" for the rows the statement
|
|
383
|
+
# affected, which says nothing about the rows in its result set, so
|
|
384
|
+
# only a query's total is a promise worth holding the back-end to.
|
|
385
|
+
total_row_count=None if is_dml else data.get("total"),
|
|
382
386
|
)
|
|
383
387
|
self._rownumber = -1
|
|
384
388
|
self._result_state = ResultState.VALID
|
|
@@ -922,24 +926,25 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
922
926
|
if self._result is None and self._result_set is not None:
|
|
923
927
|
self._result: ResultSetIterator = await self._result_set._create_iter()
|
|
924
928
|
self._result_state = ResultState.VALID
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
Error.errorhandler_wrapper_from_ready_exception(
|
|
931
|
-
self._connection,
|
|
932
|
-
self,
|
|
933
|
-
_next,
|
|
934
|
-
)
|
|
935
|
-
if _next is not None:
|
|
936
|
-
self._rownumber += 1
|
|
937
|
-
return _next
|
|
938
|
-
except TypeError as err:
|
|
929
|
+
if self._result is None:
|
|
930
|
+
# SNOW-4109042: a missing result iterator is the only reason to report
|
|
931
|
+
# end-of-results here -- a cursor that was reset has no rows left to
|
|
932
|
+
# hand out. Errors raised while iterating a real result set must reach
|
|
933
|
+
# the caller instead of looking like a result set that ran out.
|
|
939
934
|
if self._result_state == ResultState.DEFAULT:
|
|
940
|
-
raise
|
|
941
|
-
|
|
942
|
-
|
|
935
|
+
raise TypeError("'NoneType' object is not an iterator")
|
|
936
|
+
return None
|
|
937
|
+
|
|
938
|
+
_next = await self._result.get_next()
|
|
939
|
+
if isinstance(_next, Exception):
|
|
940
|
+
Error.errorhandler_wrapper_from_ready_exception(
|
|
941
|
+
self._connection,
|
|
942
|
+
self,
|
|
943
|
+
_next,
|
|
944
|
+
)
|
|
945
|
+
if _next is not None:
|
|
946
|
+
self._rownumber += 1
|
|
947
|
+
return _next
|
|
943
948
|
|
|
944
949
|
async def fetchmany(self, size: int | None = None) -> list[FetchRow]:
|
|
945
950
|
"""Fetches the number of specified rows."""
|
|
@@ -42,6 +42,7 @@ from ..errors import (
|
|
|
42
42
|
Error,
|
|
43
43
|
ForbiddenError,
|
|
44
44
|
HttpError,
|
|
45
|
+
NonRetryableTlsError,
|
|
45
46
|
OperationalError,
|
|
46
47
|
ProgrammingError,
|
|
47
48
|
RefreshTokenError,
|
|
@@ -79,6 +80,7 @@ from ..network import (
|
|
|
79
80
|
is_econnreset_exception,
|
|
80
81
|
is_login_request,
|
|
81
82
|
is_retryable_http_code,
|
|
83
|
+
is_unexpected_eof_exception,
|
|
82
84
|
)
|
|
83
85
|
from ..secret_detector import SecretDetector
|
|
84
86
|
from ..sqlstate import (
|
|
@@ -816,7 +818,7 @@ class SnowflakeRestful(SnowflakeRestfulSync):
|
|
|
816
818
|
finally:
|
|
817
819
|
raw_ret.close() # ensure response is closed
|
|
818
820
|
except (aiohttp.ClientSSLError, aiohttp.ClientConnectorSSLError) as se:
|
|
819
|
-
if is_econnreset_exception(se):
|
|
821
|
+
if is_econnreset_exception(se) or is_unexpected_eof_exception(se):
|
|
820
822
|
raise RetryRequest(se.os_error)
|
|
821
823
|
msg = f"Hit non-retryable SSL error, {str(se)}.\n{_CONNECTIVITY_ERR_MSG}"
|
|
822
824
|
logger.debug(msg)
|
|
@@ -825,7 +827,7 @@ class SnowflakeRestful(SnowflakeRestfulSync):
|
|
|
825
827
|
Error.errorhandler_wrapper(
|
|
826
828
|
self._connection,
|
|
827
829
|
None,
|
|
828
|
-
|
|
830
|
+
NonRetryableTlsError,
|
|
829
831
|
{
|
|
830
832
|
"msg": msg,
|
|
831
833
|
"errno": ER_FAILED_TO_REQUEST,
|
|
@@ -32,7 +32,10 @@ from snowflake.connector.result_batch import DownloadMetrics
|
|
|
32
32
|
from snowflake.connector.result_batch import JSONResultBatch as JSONResultBatchSync
|
|
33
33
|
from snowflake.connector.result_batch import RemoteChunkInfo
|
|
34
34
|
from snowflake.connector.result_batch import ResultBatch as ResultBatchSync
|
|
35
|
-
from snowflake.connector.result_batch import
|
|
35
|
+
from snowflake.connector.result_batch import (
|
|
36
|
+
_create_nanoarrow_iterator,
|
|
37
|
+
inline_first_chunk_rowcount,
|
|
38
|
+
)
|
|
36
39
|
from snowflake.connector.secret_detector import SecretDetector
|
|
37
40
|
|
|
38
41
|
if TYPE_CHECKING:
|
|
@@ -60,8 +63,7 @@ def create_batches_from_response(
|
|
|
60
63
|
column_converters: list[tuple[str, SnowflakeConverterType]] = []
|
|
61
64
|
arrow_context: ArrowConverterContext | None = None
|
|
62
65
|
rowtypes = data["rowtype"]
|
|
63
|
-
|
|
64
|
-
first_chunk_len = total_len
|
|
66
|
+
first_chunk_len = inline_first_chunk_rowcount(data)
|
|
65
67
|
rest_of_chunks: list[ResultBatch] = []
|
|
66
68
|
if _format == "json":
|
|
67
69
|
|
|
@@ -138,8 +140,6 @@ def create_batches_from_response(
|
|
|
138
140
|
)
|
|
139
141
|
for c in chunks
|
|
140
142
|
]
|
|
141
|
-
for c in rest_of_chunks:
|
|
142
|
-
first_chunk_len -= c.rowcount
|
|
143
143
|
if _format == "json":
|
|
144
144
|
first_chunk = JSONResultBatch.from_data(
|
|
145
145
|
data.get("rowset"),
|
|
@@ -333,6 +333,7 @@ class JSONResultBatch(ResultBatch, JSONResultBatchSync):
|
|
|
333
333
|
async with TimerContextManager() as parse_metric:
|
|
334
334
|
parsed_data = self._parse(downloaded_data)
|
|
335
335
|
self._metrics[DownloadMetrics.parse.value] = parse_metric.get_timing_millis()
|
|
336
|
+
self._check_rowcount(len(parsed_data))
|
|
336
337
|
return iter(parsed_data)
|
|
337
338
|
|
|
338
339
|
async def _load(self, content: bytes, encoding: str) -> list:
|
|
@@ -451,4 +452,6 @@ class ArrowResultBatch(ResultBatch, ArrowResultBatchSync):
|
|
|
451
452
|
else:
|
|
452
453
|
return await self._get_arrow_iter(connection=connection)
|
|
453
454
|
else:
|
|
454
|
-
return
|
|
455
|
+
return self._iter_checked_rows(
|
|
456
|
+
await self._create_iter(iter_unit=iter_unit, connection=connection)
|
|
457
|
+
)
|
|
@@ -29,6 +29,7 @@ from snowflake.connector.aio._result_batch import (
|
|
|
29
29
|
from snowflake.connector.constants import IterUnit
|
|
30
30
|
from snowflake.connector.options import pandas
|
|
31
31
|
from snowflake.connector.result_set import ResultSet as ResultSetSync
|
|
32
|
+
from snowflake.connector.result_set import check_total_rowcount
|
|
32
33
|
|
|
33
34
|
from .. import NotSupportedError
|
|
34
35
|
from ..errors import Error
|
|
@@ -57,6 +58,7 @@ class ResultSetIterator:
|
|
|
57
58
|
) -> None:
|
|
58
59
|
self._is_fetch_all = kw.pop("is_fetch_all", False)
|
|
59
60
|
self._cursor = kw.pop("cursor", None)
|
|
61
|
+
self._total_row_count = kw.pop("total_row_count", None)
|
|
60
62
|
self._first_batch_iter = first_batch_iter
|
|
61
63
|
self._unfetched_batches = unfetched_batches
|
|
62
64
|
self._final = final
|
|
@@ -104,9 +106,22 @@ class ResultSetIterator:
|
|
|
104
106
|
)
|
|
105
107
|
rets.extend(batch)
|
|
106
108
|
await self._final()
|
|
109
|
+
check_total_rowcount(len(rets), self._total_row_count)
|
|
107
110
|
return rets
|
|
108
111
|
|
|
109
112
|
async def generator(self):
|
|
113
|
+
"""Yields every row, then verifies the count the back-end declared.
|
|
114
|
+
|
|
115
|
+
SNOW-4109042: the check sits past the last ``yield`` on purpose, so a
|
|
116
|
+
consumer that stops early abandons this generator before reaching it.
|
|
117
|
+
"""
|
|
118
|
+
rows_yielded = 0
|
|
119
|
+
async for value in self._generate():
|
|
120
|
+
rows_yielded += 1
|
|
121
|
+
yield value
|
|
122
|
+
check_total_rowcount(rows_yielded, self._total_row_count)
|
|
123
|
+
|
|
124
|
+
async def _generate(self):
|
|
110
125
|
if self._is_fetch_all:
|
|
111
126
|
|
|
112
127
|
tasks = await self._download_all_batches()
|
|
@@ -172,12 +187,14 @@ class ResultSet(ResultSetSync):
|
|
|
172
187
|
cursor: SnowflakeCursor,
|
|
173
188
|
result_chunks: list[JSONResultBatch] | list[ArrowResultBatch],
|
|
174
189
|
prefetch_thread_num: int,
|
|
190
|
+
total_row_count: int | None = None,
|
|
175
191
|
) -> None:
|
|
176
192
|
super().__init__(
|
|
177
193
|
cursor,
|
|
178
194
|
result_chunks,
|
|
179
195
|
prefetch_thread_num,
|
|
180
196
|
use_mp=False, # async code depends on aio rather than multiprocessing
|
|
197
|
+
total_row_count=total_row_count,
|
|
181
198
|
)
|
|
182
199
|
self.batches = cast(
|
|
183
200
|
Union[list[JSONResultBatch], list[ArrowResultBatch]], self.batches
|
|
@@ -215,6 +232,14 @@ class ResultSet(ResultSetSync):
|
|
|
215
232
|
for num, batch in enumerate(unfetched_batches):
|
|
216
233
|
logger.debug(f"result batch {num + 1} has id: {batch.id}")
|
|
217
234
|
|
|
235
|
+
# SNOW-4109042: only row iteration yields one item per row; a table or
|
|
236
|
+
# pandas unit yields whole tables, so there is nothing to count there.
|
|
237
|
+
total_row_count = (
|
|
238
|
+
self._total_row_count
|
|
239
|
+
if kwargs.get("iter_unit", IterUnit.ROW_UNIT) == IterUnit.ROW_UNIT
|
|
240
|
+
else None
|
|
241
|
+
)
|
|
242
|
+
|
|
218
243
|
return ResultSetIterator(
|
|
219
244
|
first_batch_iter,
|
|
220
245
|
unfetched_batches,
|
|
@@ -222,6 +247,7 @@ class ResultSet(ResultSetSync):
|
|
|
222
247
|
self.prefetch_thread_num,
|
|
223
248
|
cursor=self._cursor,
|
|
224
249
|
is_fetch_all=is_fetch_all,
|
|
250
|
+
total_row_count=total_row_count,
|
|
225
251
|
**kwargs,
|
|
226
252
|
)
|
|
227
253
|
|
|
@@ -68,7 +68,12 @@ class AuthByOauthCode(AuthByPluginAsync, AuthByOauthCodeSync):
|
|
|
68
68
|
AuthByOauthCodeSync.reset_secrets(self)
|
|
69
69
|
|
|
70
70
|
async def prepare(self, **kwargs: Any) -> None:
|
|
71
|
-
|
|
71
|
+
# Sync prepare may open a browser, block on the callback socket, POST to
|
|
72
|
+
# the IdP via urllib3, and sleep on token-request retries.
|
|
73
|
+
loop = asyncio.get_running_loop()
|
|
74
|
+
await loop.run_in_executor(
|
|
75
|
+
None, lambda: AuthByOauthCodeSync.prepare(self, **kwargs)
|
|
76
|
+
)
|
|
72
77
|
|
|
73
78
|
async def reauthenticate(
|
|
74
79
|
self, conn: SnowflakeConnection, **kwargs: Any
|
|
@@ -51,7 +51,12 @@ class AuthByOauthCredentials(AuthByPluginAsync, AuthByOauthCredentialsSync):
|
|
|
51
51
|
AuthByOauthCredentialsSync.reset_secrets(self)
|
|
52
52
|
|
|
53
53
|
async def prepare(self, **kwargs: Any) -> None:
|
|
54
|
-
|
|
54
|
+
# Sync prepare POSTs to the IdP via urllib3 and may sleep on token-request
|
|
55
|
+
# retries, which would stall the asyncio event loop.
|
|
56
|
+
loop = asyncio.get_running_loop()
|
|
57
|
+
await loop.run_in_executor(
|
|
58
|
+
None, lambda: AuthByOauthCredentialsSync.prepare(self, **kwargs)
|
|
59
|
+
)
|
|
55
60
|
|
|
56
61
|
async def reauthenticate(
|
|
57
62
|
self, conn: SnowflakeConnection, **kwargs: Any
|