snowflake-connector-python 4.7.4__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.4 → snowflake_connector_python-4.7.5}/DESCRIPTION.md +5 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/PKG-INFO +6 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_connection.py +21 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_network.py +2 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_result_batch.py +5 -5
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/connection.py +55 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/connection_diagnostic.py +5 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/constants.py +55 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/cursor.py +87 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/errors.py +19 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/network.py +6 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/result_batch.py +138 -13
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/session_manager.py +61 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ssl_wrap_socket.py +114 -2
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/storage_client.py +22 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/wif_util.py +17 -3
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/PKG-INFO +6 -1
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/NOTICE +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/README.md +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/SECURITY.md +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/pyproject.toml +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/setup.cfg +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/setup.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_host_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_cursor.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_result_set.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_okta.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_oauth_base.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth_code.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → 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.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
- {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,10 +7,15 @@ 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
|
+
|
|
10
13
|
- v4.7.4(Sep 16,2026)
|
|
11
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).
|
|
12
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).
|
|
13
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.
|
|
14
19
|
|
|
15
20
|
- v4.7.3(Sep 3,2026)
|
|
16
21
|
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
@@ -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
|
|
@@ -97,10 +97,15 @@ 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
|
+
|
|
100
103
|
- v4.7.4(Sep 16,2026)
|
|
101
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).
|
|
102
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).
|
|
103
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.
|
|
104
109
|
|
|
105
110
|
- v4.7.3(Sep 3,2026)
|
|
106
111
|
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
@@ -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:
|
|
@@ -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,
|
|
@@ -826,7 +827,7 @@ class SnowflakeRestful(SnowflakeRestfulSync):
|
|
|
826
827
|
Error.errorhandler_wrapper(
|
|
827
828
|
self._connection,
|
|
828
829
|
None,
|
|
829
|
-
|
|
830
|
+
NonRetryableTlsError,
|
|
830
831
|
{
|
|
831
832
|
"msg": msg,
|
|
832
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"),
|
|
@@ -76,6 +76,7 @@ from .constants import (
|
|
|
76
76
|
_CONNECTIVITY_ERR_MSG,
|
|
77
77
|
_DOMAIN_NAME_MAP,
|
|
78
78
|
_OAUTH_DEFAULT_SCOPE,
|
|
79
|
+
ENV_VAR_MIN_TLS_VERSION,
|
|
79
80
|
ENV_VAR_PARTNER,
|
|
80
81
|
OCSP_ROOT_CERTS_DICT_LOCK_TIMEOUT_DEFAULT_NO_TIMEOUT,
|
|
81
82
|
PARAMETER_AUTOCOMMIT,
|
|
@@ -92,6 +93,7 @@ from .constants import (
|
|
|
92
93
|
PARAMETER_TIMEZONE,
|
|
93
94
|
OCSPMode,
|
|
94
95
|
QueryStatus,
|
|
96
|
+
get_min_tls_version,
|
|
95
97
|
)
|
|
96
98
|
from .converter import SnowflakeConverter
|
|
97
99
|
from .crl import CRLConfig
|
|
@@ -119,7 +121,13 @@ from .errorcode import (
|
|
|
119
121
|
ER_NO_USER,
|
|
120
122
|
ER_NOT_IMPLICITY_SNOWFLAKE_DATATYPE,
|
|
121
123
|
)
|
|
122
|
-
from .errors import
|
|
124
|
+
from .errors import (
|
|
125
|
+
DatabaseError,
|
|
126
|
+
Error,
|
|
127
|
+
NonRetryableTlsError,
|
|
128
|
+
OperationalError,
|
|
129
|
+
ProgrammingError,
|
|
130
|
+
)
|
|
123
131
|
from .log_configuration import EasyLoggingConfigPython
|
|
124
132
|
from .network import (
|
|
125
133
|
DEFAULT_AUTHENTICATOR,
|
|
@@ -741,6 +749,44 @@ class SnowflakeConnection:
|
|
|
741
749
|
self._file_operation_parser = FileOperationParser(self)
|
|
742
750
|
self._stream_downloader = StreamDownloader(self)
|
|
743
751
|
|
|
752
|
+
def _validate_min_tls_version(self) -> None:
|
|
753
|
+
"""Reject a malformed ``SNOWFLAKE_MIN_TLS_VERSION`` before any I/O.
|
|
754
|
+
|
|
755
|
+
The floor is otherwise resolved lazily, during the first TLS handshake,
|
|
756
|
+
where a bad value surfaces as a bare ``ValueError`` raised from deep
|
|
757
|
+
inside the HTTP stack. Checking it here turns that into an ordinary
|
|
758
|
+
connection-time ``ProgrammingError`` naming the variable.
|
|
759
|
+
|
|
760
|
+
``ssl_wrap_socket`` keeps its own strict parse rather than trusting this
|
|
761
|
+
check: the variable is read per handshake and can change after
|
|
762
|
+
``connect()``, and not every TLS connection originates from a
|
|
763
|
+
``SnowflakeConnection``.
|
|
764
|
+
"""
|
|
765
|
+
try:
|
|
766
|
+
get_min_tls_version()
|
|
767
|
+
except ValueError as exc:
|
|
768
|
+
raise ProgrammingError(msg=str(exc), errno=ER_INVALID_VALUE) from exc
|
|
769
|
+
|
|
770
|
+
# A botocore hook that could not be installed means AWS SDK requests are
|
|
771
|
+
# not honoring the floor. Report it to callers who actually configured one
|
|
772
|
+
# rather than at import time, which would break users who did not.
|
|
773
|
+
from . import ssl_wrap_socket
|
|
774
|
+
|
|
775
|
+
hook_error = ssl_wrap_socket.BOTOCORE_MIN_TLS_HOOK_ERROR
|
|
776
|
+
if (
|
|
777
|
+
hook_error is not None
|
|
778
|
+
and os.environ.get(ENV_VAR_MIN_TLS_VERSION, "").strip()
|
|
779
|
+
):
|
|
780
|
+
raise ProgrammingError(
|
|
781
|
+
msg=(
|
|
782
|
+
f"{ENV_VAR_MIN_TLS_VERSION} is set, but the minimum TLS version "
|
|
783
|
+
f"cannot be enforced for AWS SDK requests: {hook_error}. Pin a "
|
|
784
|
+
f"compatible botocore version, or unset the variable to accept "
|
|
785
|
+
f"botocore's own TLS floor."
|
|
786
|
+
),
|
|
787
|
+
errno=ER_INVALID_VALUE,
|
|
788
|
+
)
|
|
789
|
+
|
|
744
790
|
def _validate_account(self, account_str):
|
|
745
791
|
if not is_valid_account_identifier(account_str):
|
|
746
792
|
Error.errorhandler_wrapper(
|
|
@@ -1171,6 +1217,7 @@ class SnowflakeConnection:
|
|
|
1171
1217
|
def connect(self, **kwargs) -> None:
|
|
1172
1218
|
"""Establishes connection to Snowflake."""
|
|
1173
1219
|
logger.debug("connect")
|
|
1220
|
+
self._validate_min_tls_version()
|
|
1174
1221
|
if len(kwargs) > 0:
|
|
1175
1222
|
self.__config(**kwargs)
|
|
1176
1223
|
|
|
@@ -2083,6 +2130,13 @@ class SnowflakeConnection:
|
|
|
2083
2130
|
password_callback=self._password_callback,
|
|
2084
2131
|
session_parameters=self._session_parameters,
|
|
2085
2132
|
)
|
|
2133
|
+
except NonRetryableTlsError:
|
|
2134
|
+
# A TLS failure that cannot succeed on a retry (version floor the peer
|
|
2135
|
+
# can't meet, untrusted certificate, hostname mismatch). Re-raise it
|
|
2136
|
+
# so the caller sees the diagnosis; the retry loop below would burn
|
|
2137
|
+
# the login timeout and then replace it with a generic
|
|
2138
|
+
# "could not connect" message that points at the firewall instead.
|
|
2139
|
+
raise
|
|
2086
2140
|
except OperationalError as e:
|
|
2087
2141
|
logger.debug(
|
|
2088
2142
|
"Operational Error raised at authentication"
|
|
@@ -18,6 +18,7 @@ import certifi
|
|
|
18
18
|
import OpenSSL
|
|
19
19
|
|
|
20
20
|
from .compat import IS_WINDOWS, urlparse
|
|
21
|
+
from .constants import get_min_tls_version
|
|
21
22
|
from .cursor import SnowflakeCursor
|
|
22
23
|
from .session_manager import SessionManager, SessionManagerFactory
|
|
23
24
|
from .url_util import extract_top_level_domain_from_hostname
|
|
@@ -239,6 +240,10 @@ class ConnectionDiagnostic:
|
|
|
239
240
|
conn.recv(4096).decode("utf-8")
|
|
240
241
|
|
|
241
242
|
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
|
243
|
+
# This context is hand-built rather than obtained from the HTTP
|
|
244
|
+
# stack, so it does not inherit the connector's TLS floor; apply
|
|
245
|
+
# it here so the diagnostic probes what real connections would do.
|
|
246
|
+
context.minimum_version = get_min_tls_version()
|
|
242
247
|
context.load_verify_locations(certifi.where())
|
|
243
248
|
# Best-effort: enable partial-chain when supported
|
|
244
249
|
_partial_flag = getattr(ssl, "VERIFY_X509_PARTIAL_CHAIN", 0)
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
+
import os
|
|
5
|
+
import ssl
|
|
4
6
|
from collections import defaultdict
|
|
5
7
|
from enum import Enum, auto, unique
|
|
8
|
+
from functools import lru_cache
|
|
6
9
|
from typing import TYPE_CHECKING, Any, Callable, DefaultDict, NamedTuple
|
|
7
10
|
|
|
8
11
|
from .options import pyarrow as pa
|
|
@@ -466,10 +469,62 @@ ENV_VAR_PARTNER = "SF_PARTNER"
|
|
|
466
469
|
ENV_VAR_TEST_MODE = "SNOWFLAKE_TEST_MODE"
|
|
467
470
|
ENV_VAR_DISABLE_PLATFORM_DETECTION = "SNOWFLAKE_DISABLE_PLATFORM_DETECTION"
|
|
468
471
|
ENV_VAR_ENABLE_CUSTOM_REVOCATION_ERRORS = "SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS"
|
|
472
|
+
ENV_VAR_MIN_TLS_VERSION = "SNOWFLAKE_MIN_TLS_VERSION"
|
|
469
473
|
|
|
470
474
|
# Boolean positive values (lowercased) for environment variable checks
|
|
471
475
|
ENV_VAR_BOOL_POSITIVE_VALUES_LOWERCASED = ["true"]
|
|
472
476
|
|
|
477
|
+
# Floor applied when ENV_VAR_MIN_TLS_VERSION is unset. Matches urllib3's own
|
|
478
|
+
# default (create_urllib3_context), so leaving the variable unset preserves the
|
|
479
|
+
# connector's historical behavior exactly.
|
|
480
|
+
DEFAULT_MIN_TLS_VERSION: ssl.TLSVersion = ssl.TLSVersion.TLSv1_2
|
|
481
|
+
|
|
482
|
+
# Accepted spellings, matched case-insensitively after trimming. Deliberately the
|
|
483
|
+
# same set the Go and JDBC drivers accept, so one value can be documented and
|
|
484
|
+
# deployed across drivers unchanged.
|
|
485
|
+
_MIN_TLS_VERSION_VALUES: dict[str, ssl.TLSVersion] = {
|
|
486
|
+
"1.2": ssl.TLSVersion.TLSv1_2,
|
|
487
|
+
"tlsv1.2": ssl.TLSVersion.TLSv1_2,
|
|
488
|
+
"1.3": ssl.TLSVersion.TLSv1_3,
|
|
489
|
+
"tlsv1.3": ssl.TLSVersion.TLSv1_3,
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
@lru_cache(maxsize=None)
|
|
494
|
+
def _parse_min_tls_version(raw: str) -> ssl.TLSVersion:
|
|
495
|
+
"""Parse a minimum-TLS-version string into an ``ssl.TLSVersion``.
|
|
496
|
+
|
|
497
|
+
Accepts ``1.2``, ``1.3``, ``TLSv1.2`` and ``TLSv1.3``, case-insensitively and
|
|
498
|
+
ignoring surrounding whitespace.
|
|
499
|
+
|
|
500
|
+
Raises:
|
|
501
|
+
ValueError: if the value is not a recognized TLS version. A minimum TLS
|
|
502
|
+
version is a security control, so an unrecognized value fails loudly
|
|
503
|
+
rather than silently falling back to a weaker floor.
|
|
504
|
+
|
|
505
|
+
Cached per distinct input string so that repeated handshakes don't re-parse.
|
|
506
|
+
"""
|
|
507
|
+
parsed = _MIN_TLS_VERSION_VALUES.get(raw.strip().lower())
|
|
508
|
+
if parsed is None:
|
|
509
|
+
raise ValueError(
|
|
510
|
+
f"Invalid {ENV_VAR_MIN_TLS_VERSION} value {raw!r}. "
|
|
511
|
+
f"Supported values: {', '.join(sorted(_MIN_TLS_VERSION_VALUES))}."
|
|
512
|
+
)
|
|
513
|
+
return parsed
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
def get_min_tls_version() -> ssl.TLSVersion:
|
|
517
|
+
"""Return the process-wide minimum TLS version.
|
|
518
|
+
|
|
519
|
+
Read from ENV_VAR_MIN_TLS_VERSION on every call (so the value is not frozen
|
|
520
|
+
at import time), falling back to DEFAULT_MIN_TLS_VERSION when unset or empty.
|
|
521
|
+
"""
|
|
522
|
+
raw = os.environ.get(ENV_VAR_MIN_TLS_VERSION, "").strip()
|
|
523
|
+
if not raw:
|
|
524
|
+
return DEFAULT_MIN_TLS_VERSION
|
|
525
|
+
return _parse_min_tls_version(raw)
|
|
526
|
+
|
|
527
|
+
|
|
473
528
|
_DOMAIN_NAME_MAP = {_DEFAULT_HOSTNAME_TLD: "GLOBAL", _CHINA_HOSTNAME_TLD: "CHINA"}
|
|
474
529
|
|
|
475
530
|
_CONNECTIVITY_ERR_MSG = (
|
|
@@ -35,7 +35,11 @@ from typing import (
|
|
|
35
35
|
|
|
36
36
|
from typing_extensions import Self
|
|
37
37
|
|
|
38
|
-
from snowflake.connector.result_batch import
|
|
38
|
+
from snowflake.connector.result_batch import (
|
|
39
|
+
MAX_INLINE_RESULT_RETRY,
|
|
40
|
+
create_batches_from_response,
|
|
41
|
+
is_inline_result_incomplete,
|
|
42
|
+
)
|
|
39
43
|
from snowflake.connector.result_set import ResultSet
|
|
40
44
|
|
|
41
45
|
from . import compat
|
|
@@ -57,8 +61,11 @@ from .constants import (
|
|
|
57
61
|
QueryStatus,
|
|
58
62
|
)
|
|
59
63
|
from .errorcode import (
|
|
64
|
+
ER_CONNECTION_IS_CLOSED,
|
|
60
65
|
ER_CURSOR_IS_CLOSED,
|
|
61
66
|
ER_FAILED_PROCESSING_PYFORMAT,
|
|
67
|
+
ER_FAILED_TO_CONNECT_TO_DB,
|
|
68
|
+
ER_FAILED_TO_RENEW_SESSION,
|
|
62
69
|
ER_FAILED_TO_REWRITE_MULTI_ROW_INSERT,
|
|
63
70
|
ER_INVALID_VALUE,
|
|
64
71
|
ER_NO_ARROW_RESULT,
|
|
@@ -1099,12 +1106,18 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
|
|
|
1099
1106
|
if _exec_async:
|
|
1100
1107
|
self.connection._async_sfqids[self._sfqid] = None
|
|
1101
1108
|
if _no_results:
|
|
1109
|
+
# SNOW-4109042: skip recovery here. execute_async / _no_results
|
|
1110
|
+
# returns before building a ResultSet; callers fetch rows later
|
|
1111
|
+
# via query_result / get_results_from_sfqid, which re-GET and
|
|
1112
|
+
# run the same incomplete-inline recovery.
|
|
1102
1113
|
self._total_rowcount = (
|
|
1103
1114
|
ret["data"]["total"]
|
|
1104
1115
|
if "data" in ret and "total" in ret["data"]
|
|
1105
1116
|
else -1
|
|
1106
1117
|
)
|
|
1107
1118
|
return data
|
|
1119
|
+
if self._is_inline_chunk_incomplete(data):
|
|
1120
|
+
data = self._refetch(data)
|
|
1108
1121
|
self._init_result_and_meta(data)
|
|
1109
1122
|
else:
|
|
1110
1123
|
self._total_rowcount = (
|
|
@@ -1194,6 +1207,77 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
|
|
|
1194
1207
|
and int(data["statementTypeId"]) in STATEMENT_TYPE_ID_DML_SET
|
|
1195
1208
|
)
|
|
1196
1209
|
|
|
1210
|
+
def _is_inline_chunk_incomplete(self, data: dict[Any, Any]) -> bool:
|
|
1211
|
+
"""Whether the inline first chunk is short of the server-declared size.
|
|
1212
|
+
|
|
1213
|
+
DML and file-transfer responses are ignored: their ``total`` is not a
|
|
1214
|
+
promise about returned rows. Truncated HTTP JSON bodies are handled
|
|
1215
|
+
separately in ``network.py``.
|
|
1216
|
+
"""
|
|
1217
|
+
if (
|
|
1218
|
+
not isinstance(data, dict)
|
|
1219
|
+
or not self._sfqid
|
|
1220
|
+
or self._is_dml(data)
|
|
1221
|
+
or self.is_file_transfer
|
|
1222
|
+
):
|
|
1223
|
+
return False
|
|
1224
|
+
return is_inline_result_incomplete(data, data.get("queryResultFormat", "json"))
|
|
1225
|
+
|
|
1226
|
+
def _should_reraise_refetch_error(self, err: Error) -> bool:
|
|
1227
|
+
"""True when a recovery GET failure must surface, not become keep-original.
|
|
1228
|
+
|
|
1229
|
+
Transport / HTTP-retryable failures keep the truncated payload so the
|
|
1230
|
+
existing ``252013`` drain checks still fire. Closed-connection, session
|
|
1231
|
+
renew, and programming errors are the real failure and must not be
|
|
1232
|
+
masked as an incomplete-result OperationalError later.
|
|
1233
|
+
"""
|
|
1234
|
+
if isinstance(err, (ProgrammingError, InterfaceError)):
|
|
1235
|
+
return True
|
|
1236
|
+
return err.errno in (
|
|
1237
|
+
ER_CONNECTION_IS_CLOSED,
|
|
1238
|
+
ER_CURSOR_IS_CLOSED,
|
|
1239
|
+
ER_FAILED_TO_CONNECT_TO_DB,
|
|
1240
|
+
ER_FAILED_TO_RENEW_SESSION,
|
|
1241
|
+
)
|
|
1242
|
+
|
|
1243
|
+
def _refetch(self, data: dict[Any, Any]) -> dict[Any, Any]:
|
|
1244
|
+
"""Re-GET ``/queries/{sfqid}/result`` while the inline first chunk is short.
|
|
1245
|
+
|
|
1246
|
+
Callers enter after detecting incompleteness, so the incomplete check
|
|
1247
|
+
runs after each GET (exit when recovered, continue while short).
|
|
1248
|
+
"""
|
|
1249
|
+
for attempt in range(MAX_INLINE_RESULT_RETRY):
|
|
1250
|
+
logger.warning(
|
|
1251
|
+
"Incomplete inline result chunk for sfqid=%s; "
|
|
1252
|
+
"re-fetching query result (%s retry(s) left)",
|
|
1253
|
+
self._sfqid,
|
|
1254
|
+
MAX_INLINE_RESULT_RETRY - attempt,
|
|
1255
|
+
)
|
|
1256
|
+
url = f"/queries/{self._sfqid}/result"
|
|
1257
|
+
try:
|
|
1258
|
+
ret = self._connection.rest.request(url=url, method="get")
|
|
1259
|
+
except Error as err:
|
|
1260
|
+
if self._should_reraise_refetch_error(err):
|
|
1261
|
+
raise
|
|
1262
|
+
logger.warning(
|
|
1263
|
+
"Re-fetch of query result for sfqid=%s failed; "
|
|
1264
|
+
"keeping the original response",
|
|
1265
|
+
self._sfqid,
|
|
1266
|
+
exc_info=True,
|
|
1267
|
+
)
|
|
1268
|
+
return data
|
|
1269
|
+
if not ret.get("success") or not isinstance(ret.get("data"), dict):
|
|
1270
|
+
logger.warning(
|
|
1271
|
+
"Re-fetch of query result for sfqid=%s did not succeed; "
|
|
1272
|
+
"keeping the original response",
|
|
1273
|
+
self._sfqid,
|
|
1274
|
+
)
|
|
1275
|
+
return data
|
|
1276
|
+
data = ret["data"]
|
|
1277
|
+
if not self._is_inline_chunk_incomplete(data):
|
|
1278
|
+
return data
|
|
1279
|
+
return data
|
|
1280
|
+
|
|
1197
1281
|
def _init_result_and_meta(self, data: dict[Any, Any]) -> None:
|
|
1198
1282
|
is_dml = self._is_dml(data)
|
|
1199
1283
|
self._query_result_format = data.get("queryResultFormat", "json")
|
|
@@ -1323,6 +1407,8 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
|
|
|
1323
1407
|
|
|
1324
1408
|
if ret.get("success"):
|
|
1325
1409
|
data = ret.get("data")
|
|
1410
|
+
if self._is_inline_chunk_incomplete(data):
|
|
1411
|
+
data = self._refetch(data)
|
|
1326
1412
|
self._init_result_and_meta(data)
|
|
1327
1413
|
else:
|
|
1328
1414
|
logger.debug("failed")
|
|
@@ -461,6 +461,25 @@ class RevocationCheckError(OperationalError):
|
|
|
461
461
|
)
|
|
462
462
|
|
|
463
463
|
|
|
464
|
+
class NonRetryableTlsError(OperationalError):
|
|
465
|
+
"""A TLS failure that cannot succeed on a retry.
|
|
466
|
+
|
|
467
|
+
Raised for handshake failures whose cause is a property of the endpoint or of
|
|
468
|
+
the local configuration rather than a transient network fault -- a protocol
|
|
469
|
+
version floor the peer cannot meet, an untrusted certificate, a hostname
|
|
470
|
+
mismatch. Retrying cannot change the outcome.
|
|
471
|
+
|
|
472
|
+
It exists as its own type so the authentication layer can re-raise it
|
|
473
|
+
directly instead of feeding it into its retry-until-timeout loop, which would
|
|
474
|
+
otherwise replace this error's diagnosis with a generic "could not connect"
|
|
475
|
+
message. Transient handshake faults (ECONNRESET, unexpected EOF) are *not*
|
|
476
|
+
raised as this type and remain retryable.
|
|
477
|
+
|
|
478
|
+
Still an ``OperationalError`` carrying the same errno, so existing handlers
|
|
479
|
+
keep working.
|
|
480
|
+
"""
|
|
481
|
+
|
|
482
|
+
|
|
464
483
|
# internal errors
|
|
465
484
|
class InternalServerError(Error):
|
|
466
485
|
"""Exception for 500 HTTP code for retry."""
|
|
@@ -75,6 +75,7 @@ from .errors import (
|
|
|
75
75
|
HttpError,
|
|
76
76
|
InternalServerError,
|
|
77
77
|
MethodNotAllowed,
|
|
78
|
+
NonRetryableTlsError,
|
|
78
79
|
OperationalError,
|
|
79
80
|
OtherHTTPRetryableError,
|
|
80
81
|
ProgrammingError,
|
|
@@ -122,6 +123,10 @@ Monkey patch for PyOpenSSL Socket wrapper
|
|
|
122
123
|
"""
|
|
123
124
|
ssl_wrap_socket.inject_into_urllib3()
|
|
124
125
|
|
|
126
|
+
# botocore builds its own SSL contexts on the real urllib3, so the patch above
|
|
127
|
+
# does not reach AWS SDK requests. Hook their TLS floor separately.
|
|
128
|
+
ssl_wrap_socket.inject_min_tls_version_into_botocore()
|
|
129
|
+
|
|
125
130
|
# known applications
|
|
126
131
|
APPLICATION_SNOWSQL = "SnowSQL"
|
|
127
132
|
|
|
@@ -1235,7 +1240,7 @@ class SnowflakeRestful:
|
|
|
1235
1240
|
Error.errorhandler_wrapper(
|
|
1236
1241
|
self._connection,
|
|
1237
1242
|
None,
|
|
1238
|
-
|
|
1243
|
+
NonRetryableTlsError,
|
|
1239
1244
|
{
|
|
1240
1245
|
"msg": msg,
|
|
1241
1246
|
"errno": ER_FAILED_TO_REQUEST,
|