snowflake-connector-python 4.7.0__tar.gz → 4.7.2__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.0 → snowflake_connector_python-4.7.2}/DESCRIPTION.md +13 -2
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/PKG-INFO +21 -8
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/pyproject.toml +10 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/setup.cfg +7 -5
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_auth.py +11 -3
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_okta.py +11 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_auth.py +31 -9
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_oauth_base.py +58 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_code.py +1 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/okta.py +29 -2
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection.py +16 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/constants.py +7 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_transfer_agent.py +70 -46
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +5 -2
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +5 -2
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +6 -2
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +1 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +1 -3
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +4 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/network.py +22 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/platform_detection.py +30 -10
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sqlstate.py +1 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssl_wrap_socket.py +124 -3
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/util_text.py +6 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/PKG-INFO +21 -8
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/requires.txt +10 -5
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/NOTICE +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/README.md +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/SECURITY.md +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/setup.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_connection.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_cursor.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_network.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_batch.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_set.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cursor.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,18 +7,29 @@ https://docs.snowflake.com/
|
|
|
7
7
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
8
8
|
|
|
9
9
|
# Release Notes
|
|
10
|
-
- v4.7.
|
|
10
|
+
- v4.7.2(Aug 6,2026)
|
|
11
|
+
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
12
|
+
- Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
|
|
13
|
+
- 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).
|
|
14
|
+
- 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.
|
|
15
|
+
- 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).
|
|
16
|
+
- 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.
|
|
17
|
+
|
|
18
|
+
- v4.7.1(Jul 15,2026)
|
|
19
|
+
- Added support for Python 3.14t (free-threaded).
|
|
20
|
+
- **Note:** Python 3.14t CI testing excludes `win_arm64` (no `cryptography` wheels available) and `mitmproxy` proxy tests on all platforms (transitive dependencies `aioquic`/`pylsqpack` lack free-threaded-compatible wheels).
|
|
21
|
+
- Improved verification of TLS connections (SNOW-3675579).
|
|
11
22
|
- Fixed `python-connector.log` not rotating on Windows, and every record being logged twice, when easy logging is enabled via `config.toml` (SNOW-3680325).
|
|
12
23
|
- **Note:** As part of this fix, easy logging no longer calls `logging.basicConfig()` and therefore no longer configures the root logger. `python-connector.log` now captures only the `snowflake.connector`, `botocore`, and `boto3`.
|
|
13
24
|
- Improved URL validation reliability by replacing the hand-rolled regex in `is_valid_url()` with `urllib.parse.urlparse` (SNOW-3392651).
|
|
14
25
|
- Fixed OAuth infinite loop when tokens expire by ensuring `reauthenticate()` calls `_request_tokens()` directly instead of looping through `prepare()`. Token cache is now read exactly once per connection, and `_store_tokens()` preserves macOS Keychain ACL by never calling `remove()`. The async OAuth `reauthenticate()` now runs the synchronous OAuth flow on a worker thread instead of blocking the event loop.
|
|
15
26
|
- Fixed OAuth scope handling for Snowflake custom OAuth: when refresh tokens are enabled, the connector no longer appends the OIDC `offline_access` scope for token endpoints on `*.snowflakecomputing.com` or `*.snowflakecomputing.cn`, which caused `invalid_scope` errors. Snowflake custom OAuth expects `refresh_token` in scope instead. External IdP behavior is unchanged.
|
|
16
27
|
- Fixed input validation for `scale` metadata in Arrow result set processing for `TIME`, `TIMESTAMP_NTZ`, `TIMESTAMP_LTZ`, and `TIMESTAMP_TZ` columns (SNOW-3388299).
|
|
17
|
-
- Removed pandas upper bound dependency constraint on the `[pandas]` extra to allow installation of pandas 3.0.0 and later.
|
|
18
28
|
- Fixed S3 storage client to correctly handle 307/308 (method-preserving) and 301/302 (GET/HEAD only) redirects by disabling automatic redirect following and re-signing each request with AWS SigV4 credentials for the redirect target. The region is updated from the `x-amz-bucket-region` response header on each redirect. Redirects are capped at 5 hops.
|
|
19
29
|
- 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.
|
|
20
30
|
- 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.
|
|
21
31
|
- 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).
|
|
32
|
+
- 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).
|
|
22
33
|
|
|
23
34
|
- v4.6.0(May 28,2026)
|
|
24
35
|
- 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.2
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -27,6 +27,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
27
27
|
Classifier: Programming Language :: Python :: 3.12
|
|
28
28
|
Classifier: Programming Language :: Python :: 3.13
|
|
29
29
|
Classifier: Programming Language :: Python :: 3.14
|
|
30
|
+
Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
|
|
30
31
|
Classifier: Programming Language :: SQL
|
|
31
32
|
Classifier: Topic :: Database
|
|
32
33
|
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
@@ -61,10 +62,10 @@ Requires-Dist: botocore>=1.24; extra == "boto"
|
|
|
61
62
|
Provides-Extra: azure
|
|
62
63
|
Requires-Dist: azure-identity>=1.16; extra == "azure"
|
|
63
64
|
Provides-Extra: development
|
|
64
|
-
Requires-Dist: Cython; extra == "development"
|
|
65
|
+
Requires-Dist: Cython>=3.1; extra == "development"
|
|
65
66
|
Requires-Dist: azure-identity>=1.16; extra == "development"
|
|
66
67
|
Requires-Dist: coverage; extra == "development"
|
|
67
|
-
Requires-Dist: mitmproxy>=12.0.0; python_version >= "3.12" and extra == "development"
|
|
68
|
+
Requires-Dist: mitmproxy>=12.0.0; (python_version >= "3.12" and python_version < "3.14") and extra == "development"
|
|
68
69
|
Requires-Dist: more-itertools; extra == "development"
|
|
69
70
|
Requires-Dist: numpy<=2.4.3; extra == "development"
|
|
70
71
|
Requires-Dist: pendulum!=2.1.1; extra == "development"
|
|
@@ -78,9 +79,10 @@ Requires-Dist: pytest-xdist; extra == "development"
|
|
|
78
79
|
Requires-Dist: pytzdata; extra == "development"
|
|
79
80
|
Requires-Dist: responses; extra == "development"
|
|
80
81
|
Provides-Extra: pandas
|
|
81
|
-
Requires-Dist: pandas
|
|
82
|
-
Requires-Dist: pandas
|
|
83
|
-
Requires-Dist: pyarrow
|
|
82
|
+
Requires-Dist: pandas<3.0.0,>=1.0.0; python_version < "3.13" and extra == "pandas"
|
|
83
|
+
Requires-Dist: pandas<3.0.0,>=2.1.2; python_version >= "3.13" and extra == "pandas"
|
|
84
|
+
Requires-Dist: pyarrow<24,>=14.0.1; python_version >= "3.14" and extra == "pandas"
|
|
85
|
+
Requires-Dist: pyarrow>=14.0.1; python_version < "3.14" and extra == "pandas"
|
|
84
86
|
Provides-Extra: secure-local-storage
|
|
85
87
|
Requires-Dist: keyring<26.0.0,>=23.1.0; extra == "secure-local-storage"
|
|
86
88
|
Dynamic: license-file
|
|
@@ -95,18 +97,29 @@ https://docs.snowflake.com/
|
|
|
95
97
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
96
98
|
|
|
97
99
|
# Release Notes
|
|
98
|
-
- v4.7.
|
|
100
|
+
- v4.7.2(Aug 6,2026)
|
|
101
|
+
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
102
|
+
- Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
|
|
103
|
+
- 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).
|
|
104
|
+
- 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.
|
|
105
|
+
- 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).
|
|
106
|
+
- 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.
|
|
107
|
+
|
|
108
|
+
- v4.7.1(Jul 15,2026)
|
|
109
|
+
- Added support for Python 3.14t (free-threaded).
|
|
110
|
+
- **Note:** Python 3.14t CI testing excludes `win_arm64` (no `cryptography` wheels available) and `mitmproxy` proxy tests on all platforms (transitive dependencies `aioquic`/`pylsqpack` lack free-threaded-compatible wheels).
|
|
111
|
+
- Improved verification of TLS connections (SNOW-3675579).
|
|
99
112
|
- Fixed `python-connector.log` not rotating on Windows, and every record being logged twice, when easy logging is enabled via `config.toml` (SNOW-3680325).
|
|
100
113
|
- **Note:** As part of this fix, easy logging no longer calls `logging.basicConfig()` and therefore no longer configures the root logger. `python-connector.log` now captures only the `snowflake.connector`, `botocore`, and `boto3`.
|
|
101
114
|
- Improved URL validation reliability by replacing the hand-rolled regex in `is_valid_url()` with `urllib.parse.urlparse` (SNOW-3392651).
|
|
102
115
|
- Fixed OAuth infinite loop when tokens expire by ensuring `reauthenticate()` calls `_request_tokens()` directly instead of looping through `prepare()`. Token cache is now read exactly once per connection, and `_store_tokens()` preserves macOS Keychain ACL by never calling `remove()`. The async OAuth `reauthenticate()` now runs the synchronous OAuth flow on a worker thread instead of blocking the event loop.
|
|
103
116
|
- Fixed OAuth scope handling for Snowflake custom OAuth: when refresh tokens are enabled, the connector no longer appends the OIDC `offline_access` scope for token endpoints on `*.snowflakecomputing.com` or `*.snowflakecomputing.cn`, which caused `invalid_scope` errors. Snowflake custom OAuth expects `refresh_token` in scope instead. External IdP behavior is unchanged.
|
|
104
117
|
- Fixed input validation for `scale` metadata in Arrow result set processing for `TIME`, `TIMESTAMP_NTZ`, `TIMESTAMP_LTZ`, and `TIMESTAMP_TZ` columns (SNOW-3388299).
|
|
105
|
-
- Removed pandas upper bound dependency constraint on the `[pandas]` extra to allow installation of pandas 3.0.0 and later.
|
|
106
118
|
- Fixed S3 storage client to correctly handle 307/308 (method-preserving) and 301/302 (GET/HEAD only) redirects by disabling automatic redirect following and re-signing each request with AWS SigV4 credentials for the redirect target. The region is updated from the `x-amz-bucket-region` response header on each redirect. Redirects are capped at 5 hops.
|
|
107
119
|
- 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.
|
|
108
120
|
- 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.
|
|
109
121
|
- 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).
|
|
122
|
+
- 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).
|
|
110
123
|
|
|
111
124
|
- v4.6.0(May 28,2026)
|
|
112
125
|
- Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
|
|
@@ -4,7 +4,9 @@ requires = [
|
|
|
4
4
|
# and may be stricter than the version required in `setup.py`
|
|
5
5
|
"setuptools>=40.6.0",
|
|
6
6
|
"wheel",
|
|
7
|
-
|
|
7
|
+
# cython>=3.1 is required for the `freethreading_compatible` directive
|
|
8
|
+
# used by src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx
|
|
9
|
+
"cython>=3.1",
|
|
8
10
|
]
|
|
9
11
|
|
|
10
12
|
[tool.cibuildwheel]
|
|
@@ -12,6 +14,13 @@ test-skip = "*"
|
|
|
12
14
|
manylinux-x86_64-image = "manylinux2014"
|
|
13
15
|
environment = {AUDITWHEEL_PLAT="manylinux2014_$(uname -m)"}
|
|
14
16
|
build-verbosity = 1
|
|
17
|
+
# Opt in to free-threaded CPython wheel builds (cp313t, cp314t, ...).
|
|
18
|
+
# Without this, cibuildwheel silently skips every `cp*t-*` target even when
|
|
19
|
+
# the matrix and CIBW_BUILD env var ask for them. Requires cibuildwheel>=2.20.
|
|
20
|
+
# Paired with the `freethreading_compatible` Cython directive in
|
|
21
|
+
# src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx
|
|
22
|
+
# so the produced wheel actually keeps the GIL disabled at import time.
|
|
23
|
+
enable = ["cpython-freethreading"]
|
|
15
24
|
|
|
16
25
|
[tool.cibuildwheel.linux]
|
|
17
26
|
archs = ["x86_64", "aarch64"]
|
|
@@ -25,6 +25,7 @@ classifiers =
|
|
|
25
25
|
Programming Language :: Python :: 3.12
|
|
26
26
|
Programming Language :: Python :: 3.13
|
|
27
27
|
Programming Language :: Python :: 3.14
|
|
28
|
+
Programming Language :: Python :: Free Threading :: 2 - Beta
|
|
28
29
|
Programming Language :: SQL
|
|
29
30
|
Topic :: Database
|
|
30
31
|
Topic :: Scientific/Engineering :: Information Analysis
|
|
@@ -88,10 +89,10 @@ boto =
|
|
|
88
89
|
azure =
|
|
89
90
|
azure-identity>=1.16
|
|
90
91
|
development =
|
|
91
|
-
Cython
|
|
92
|
+
Cython>=3.1
|
|
92
93
|
azure-identity>=1.16
|
|
93
94
|
coverage
|
|
94
|
-
mitmproxy>=12.0.0; python_version >= '3.12'
|
|
95
|
+
mitmproxy>=12.0.0; python_version >= '3.12' and python_version < '3.14'
|
|
95
96
|
more-itertools
|
|
96
97
|
numpy<=2.4.3
|
|
97
98
|
pendulum!=2.1.1
|
|
@@ -105,9 +106,10 @@ development =
|
|
|
105
106
|
pytzdata
|
|
106
107
|
responses
|
|
107
108
|
pandas =
|
|
108
|
-
pandas>=1.0.0; python_version < '3.13'
|
|
109
|
-
pandas>=2.1.2; python_version >= '3.13'
|
|
110
|
-
pyarrow>=14.0.1
|
|
109
|
+
pandas>=1.0.0,<3.0.0; python_version < '3.13'
|
|
110
|
+
pandas>=2.1.2,<3.0.0; python_version >= '3.13'
|
|
111
|
+
pyarrow>=14.0.1,<24; python_version >= '3.14'
|
|
112
|
+
pyarrow>=14.0.1; python_version < '3.14'
|
|
111
113
|
secure-local-storage =
|
|
112
114
|
keyring>=23.1.0,<26.0.0
|
|
113
115
|
|
|
@@ -29,12 +29,16 @@ from ...errors import (
|
|
|
29
29
|
from ...network import (
|
|
30
30
|
ACCEPT_TYPE_APPLICATION_SNOWFLAKE,
|
|
31
31
|
CONTENT_TYPE_APPLICATION_JSON,
|
|
32
|
+
CREDENTIAL_REJECTION_GS_CODES,
|
|
32
33
|
ID_TOKEN_INVALID_LOGIN_REQUEST_GS_CODE,
|
|
33
34
|
OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE,
|
|
34
35
|
PYTHON_CONNECTOR_USER_AGENT,
|
|
35
36
|
ReauthenticationRequest,
|
|
36
37
|
)
|
|
37
|
-
from ...sqlstate import
|
|
38
|
+
from ...sqlstate import (
|
|
39
|
+
SQLSTATE_AUTHORIZATION_FAILURE,
|
|
40
|
+
SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
41
|
+
)
|
|
38
42
|
from ...token_cache import TokenType
|
|
39
43
|
from ._no_auth import AuthNoAuth
|
|
40
44
|
|
|
@@ -334,8 +338,12 @@ class Auth(AuthSync):
|
|
|
334
338
|
port=self._rest._port,
|
|
335
339
|
message=ret["message"],
|
|
336
340
|
),
|
|
337
|
-
"errno":
|
|
338
|
-
"sqlstate":
|
|
341
|
+
"errno": int(errno),
|
|
342
|
+
"sqlstate": (
|
|
343
|
+
SQLSTATE_AUTHORIZATION_FAILURE
|
|
344
|
+
if str(errno) in CREDENTIAL_REJECTION_GS_CODES
|
|
345
|
+
else SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
|
|
346
|
+
),
|
|
339
347
|
},
|
|
340
348
|
)
|
|
341
349
|
else:
|
|
@@ -212,7 +212,7 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
|
|
|
212
212
|
) -> dict[Any, Any]:
|
|
213
213
|
logger.debug("step 4: query IDP URL snowflake app to get SAML " "response")
|
|
214
214
|
timeout_time = time.time() + conn.login_timeout if conn.login_timeout else None
|
|
215
|
-
response_html =
|
|
215
|
+
response_html = None
|
|
216
216
|
origin_sso_url = sso_url
|
|
217
217
|
while timeout_time is None or time.time() < timeout_time:
|
|
218
218
|
try:
|
|
@@ -225,6 +225,12 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
|
|
|
225
225
|
HTTP_HEADER_ACCEPT: "*/*",
|
|
226
226
|
}
|
|
227
227
|
remaining_timeout = timeout_time - time.time() if timeout_time else None
|
|
228
|
+
if remaining_timeout is not None and remaining_timeout <= 0:
|
|
229
|
+
# Obtaining the one time token consumed the whole login budget.
|
|
230
|
+
# The HTTP layer rejects a non-positive timeout with an opaque
|
|
231
|
+
# ValueError, so stop here and report the timeout that actually
|
|
232
|
+
# happened.
|
|
233
|
+
break
|
|
228
234
|
response_html = await conn.rest.fetch(
|
|
229
235
|
"get",
|
|
230
236
|
sso_url,
|
|
@@ -237,6 +243,10 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
|
|
|
237
243
|
break
|
|
238
244
|
except RefreshTokenError:
|
|
239
245
|
logger.debug("step4: refresh token for re-authentication")
|
|
246
|
+
if response_html is None:
|
|
247
|
+
# Every way out of the loop above without a response means the
|
|
248
|
+
# login_timeout budget ran out.
|
|
249
|
+
AuthByOktaSync._handle_login_timeout(conn)
|
|
240
250
|
return response_html
|
|
241
251
|
|
|
242
252
|
async def _step5(
|
|
@@ -51,8 +51,10 @@ from ..errors import (
|
|
|
51
51
|
from ..network import (
|
|
52
52
|
ACCEPT_TYPE_APPLICATION_SNOWFLAKE,
|
|
53
53
|
CONTENT_TYPE_APPLICATION_JSON,
|
|
54
|
+
CREDENTIAL_REJECTION_GS_CODES,
|
|
54
55
|
ID_TOKEN_INVALID_LOGIN_REQUEST_GS_CODE,
|
|
55
56
|
OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE,
|
|
57
|
+
OAUTH_ACCESS_TOKEN_INVALID_GS_CODE,
|
|
56
58
|
PYTHON_CONNECTOR_USER_AGENT,
|
|
57
59
|
ReauthenticationRequest,
|
|
58
60
|
)
|
|
@@ -61,12 +63,15 @@ from ..platform_detection import detect_platforms
|
|
|
61
63
|
from ..session_manager import BaseHttpConfig, HttpConfig
|
|
62
64
|
from ..session_manager import SessionManager as SyncSessionManager
|
|
63
65
|
from ..session_manager import SessionManagerFactory
|
|
64
|
-
from ..sqlstate import
|
|
66
|
+
from ..sqlstate import (
|
|
67
|
+
SQLSTATE_AUTHORIZATION_FAILURE,
|
|
68
|
+
SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
69
|
+
)
|
|
65
70
|
from ..token_cache import TokenCache, TokenKey, TokenType
|
|
66
71
|
from ..util_text import expand_tilde
|
|
67
72
|
from ..version import VERSION
|
|
73
|
+
from ._oauth_base import AuthByOAuthBase
|
|
68
74
|
from .no_auth import AuthNoAuth
|
|
69
|
-
from .oauth import AuthByOAuth
|
|
70
75
|
|
|
71
76
|
if TYPE_CHECKING:
|
|
72
77
|
from . import AuthByPlugin
|
|
@@ -419,11 +424,24 @@ class Auth:
|
|
|
419
424
|
sqlstate=SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
420
425
|
)
|
|
421
426
|
)
|
|
422
|
-
elif (
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
+
elif (
|
|
428
|
+
errno
|
|
429
|
+
in (
|
|
430
|
+
OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE,
|
|
431
|
+
OAUTH_ACCESS_TOKEN_INVALID_GS_CODE,
|
|
432
|
+
)
|
|
433
|
+
) and isinstance(auth_instance, AuthByOAuthBase):
|
|
434
|
+
# A presented OAuth access token was rejected as expired (390318)
|
|
435
|
+
# or invalid (390303) - both are OAuth-scoped codes in GS.
|
|
436
|
+
# Reauthenticate (via refresh token or interactive) instead of
|
|
437
|
+
# hard-failing; reauthenticate() also evicts the stale token from
|
|
438
|
+
# the cache on terminal failure so it is not replayed.
|
|
439
|
+
#
|
|
440
|
+
# The guard is a positive isinstance(AuthByOAuthBase): only OAuth
|
|
441
|
+
# v2 authenticators (authorization-code, client-credentials) can
|
|
442
|
+
# renew a token. This excludes OAuth v1.0 (AuthByOAuth), whose
|
|
443
|
+
# user-supplied token cannot be renewed (SNOW-2329031), and keeps
|
|
444
|
+
# any non-OAuth authenticator out of the reauth retry.
|
|
427
445
|
raise ReauthenticationRequest(
|
|
428
446
|
ProgrammingError(
|
|
429
447
|
msg=ret["message"],
|
|
@@ -460,8 +478,12 @@ class Auth:
|
|
|
460
478
|
port=self._rest._port,
|
|
461
479
|
message=ret["message"],
|
|
462
480
|
),
|
|
463
|
-
"errno":
|
|
464
|
-
"sqlstate":
|
|
481
|
+
"errno": int(errno),
|
|
482
|
+
"sqlstate": (
|
|
483
|
+
SQLSTATE_AUTHORIZATION_FAILURE
|
|
484
|
+
if str(errno) in CREDENTIAL_REJECTION_GS_CODES
|
|
485
|
+
else SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
|
|
486
|
+
),
|
|
465
487
|
},
|
|
466
488
|
)
|
|
467
489
|
else:
|
|
@@ -118,6 +118,23 @@ class _OAuthTokensMixin:
|
|
|
118
118
|
if key:
|
|
119
119
|
self._token_cache.remove(key)
|
|
120
120
|
|
|
121
|
+
def _invalidate_access_token(self) -> None:
|
|
122
|
+
"""Clear a confirmed-invalid access token from memory and cache.
|
|
123
|
+
|
|
124
|
+
Prevents a poisoned cached access token from being replayed on the next
|
|
125
|
+
connection (the symptom that made disabling the credential cache the only
|
|
126
|
+
workaround). Only call this on a *terminal* rejection, i.e. when it will
|
|
127
|
+
NOT be followed by a store of a fresh token: a lone remove() is safe, but
|
|
128
|
+
the remove-then-store pattern destroys macOS Keychain ACL entries. On a
|
|
129
|
+
successful reauth the new token is written via _store_tokens(), which
|
|
130
|
+
overwrites the stale one ACL-safely without a remove().
|
|
131
|
+
"""
|
|
132
|
+
self._access_token = None
|
|
133
|
+
if self._token_cache:
|
|
134
|
+
key = self._get_access_token_cache_key()
|
|
135
|
+
if key:
|
|
136
|
+
self._token_cache.remove(key)
|
|
137
|
+
|
|
121
138
|
def _store_tokens(
|
|
122
139
|
self, access_token: str | None = None, refresh_token: str | None = None
|
|
123
140
|
) -> None:
|
|
@@ -308,6 +325,10 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
|
|
|
308
325
|
password=None,
|
|
309
326
|
)
|
|
310
327
|
if access_token is None:
|
|
328
|
+
# Terminal rejection: we could not obtain a new access token, so the
|
|
329
|
+
# stale one must not linger in the cache to be replayed next time.
|
|
330
|
+
# This is a lone remove() (no subsequent store), so it is ACL-safe.
|
|
331
|
+
self._invalidate_access_token()
|
|
311
332
|
self._handle_failure(
|
|
312
333
|
conn=conn,
|
|
313
334
|
ret={
|
|
@@ -338,7 +359,43 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
|
|
|
338
359
|
logger.info("OAuth access token is already available in cache")
|
|
339
360
|
return
|
|
340
361
|
|
|
341
|
-
# No cached token
|
|
362
|
+
# No cached access token, but a cached refresh token may still be usable
|
|
363
|
+
# (loaded into memory above). Try to exchange it for a new access token
|
|
364
|
+
# BEFORE falling back to interactive auth, so a fresh process can refresh
|
|
365
|
+
# silently without a browser prompt. Gated on refresh_token_enabled, so
|
|
366
|
+
# behavior is unchanged when refresh tokens are disabled.
|
|
367
|
+
if self._refresh_token_enabled and self._refresh_token:
|
|
368
|
+
logger.debug(
|
|
369
|
+
"no cached OAuth access token; attempting silent refresh using "
|
|
370
|
+
"the cached refresh token"
|
|
371
|
+
)
|
|
372
|
+
try:
|
|
373
|
+
self._do_refresh_token(conn=conn)
|
|
374
|
+
except Exception as exc:
|
|
375
|
+
# A silent refresh at connection setup must never hard-fail the
|
|
376
|
+
# connection. _get_refresh_token_response() surfaces transport
|
|
377
|
+
# failures (e.g. a transient network error or an urllib3
|
|
378
|
+
# exception reaching the token endpoint) through _handle_failure,
|
|
379
|
+
# which raises. Swallow it here and fall back to interactive auth,
|
|
380
|
+
# which can still recover - this is the whole point of a proactive
|
|
381
|
+
# refresh. Note this differs from reauthenticate(), where raising
|
|
382
|
+
# mid-session is the correct behavior.
|
|
383
|
+
logger.debug(
|
|
384
|
+
"silent refresh raised %s; falling back to interactive "
|
|
385
|
+
"authentication",
|
|
386
|
+
exc,
|
|
387
|
+
)
|
|
388
|
+
if self._access_token is not None:
|
|
389
|
+
logger.info(
|
|
390
|
+
"obtained a new OAuth access token via the cached refresh token"
|
|
391
|
+
)
|
|
392
|
+
return
|
|
393
|
+
logger.debug(
|
|
394
|
+
"silent refresh did not yield an access token; falling back to "
|
|
395
|
+
"interactive authentication"
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
# No usable cached tokens - request fresh tokens via browser
|
|
342
399
|
access_token, refresh_token = self._request_tokens(
|
|
343
400
|
conn=conn,
|
|
344
401
|
authenticator=authenticator,
|
|
@@ -431,7 +431,7 @@ You can close this window now and go back where you started from.
|
|
|
431
431
|
parsed_host = urllib.parse.urlparse(url).hostname
|
|
432
432
|
except ValueError:
|
|
433
433
|
return False
|
|
434
|
-
return parsed_host is not None and parsed_host == host
|
|
434
|
+
return parsed_host is not None and parsed_host == host.lower()
|
|
435
435
|
|
|
436
436
|
return _matches_host(authentication_url) and _matches_host(token_request_url)
|
|
437
437
|
|
|
@@ -15,7 +15,7 @@ from ..constants import (
|
|
|
15
15
|
HTTP_HEADER_USER_AGENT,
|
|
16
16
|
)
|
|
17
17
|
from ..errorcode import ER_IDP_CONNECTION_ERROR, ER_INCORRECT_DESTINATION
|
|
18
|
-
from ..errors import DatabaseError, Error, RefreshTokenError
|
|
18
|
+
from ..errors import DatabaseError, Error, OperationalError, RefreshTokenError
|
|
19
19
|
from ..network import CONTENT_TYPE_APPLICATION_JSON, PYTHON_CONNECTOR_USER_AGENT
|
|
20
20
|
from ..sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
|
|
21
21
|
from . import Auth
|
|
@@ -276,7 +276,7 @@ class AuthByOkta(AuthByPlugin):
|
|
|
276
276
|
) -> dict[Any, Any]:
|
|
277
277
|
logger.debug("step 4: query IDP URL snowflake app to get SAML " "response")
|
|
278
278
|
timeout_time = time.time() + conn.login_timeout if conn.login_timeout else None
|
|
279
|
-
response_html =
|
|
279
|
+
response_html = None
|
|
280
280
|
origin_sso_url = sso_url
|
|
281
281
|
while timeout_time is None or time.time() < timeout_time:
|
|
282
282
|
try:
|
|
@@ -289,6 +289,12 @@ class AuthByOkta(AuthByPlugin):
|
|
|
289
289
|
HTTP_HEADER_ACCEPT: "*/*",
|
|
290
290
|
}
|
|
291
291
|
remaining_timeout = timeout_time - time.time() if timeout_time else None
|
|
292
|
+
if remaining_timeout is not None and remaining_timeout <= 0:
|
|
293
|
+
# Obtaining the one time token consumed the whole login budget.
|
|
294
|
+
# The HTTP layer rejects a non-positive timeout with an opaque
|
|
295
|
+
# ValueError, so stop here and report the timeout that actually
|
|
296
|
+
# happened.
|
|
297
|
+
break
|
|
292
298
|
response_html = conn.rest.fetch(
|
|
293
299
|
"get",
|
|
294
300
|
sso_url,
|
|
@@ -301,8 +307,29 @@ class AuthByOkta(AuthByPlugin):
|
|
|
301
307
|
break
|
|
302
308
|
except RefreshTokenError:
|
|
303
309
|
logger.debug("step4: refresh token for re-authentication")
|
|
310
|
+
if response_html is None:
|
|
311
|
+
# Every way out of the loop above without a response means the
|
|
312
|
+
# login_timeout budget ran out.
|
|
313
|
+
AuthByOkta._handle_login_timeout(conn)
|
|
304
314
|
return response_html
|
|
305
315
|
|
|
316
|
+
@staticmethod
|
|
317
|
+
def _handle_login_timeout(conn: SnowflakeConnection) -> None:
|
|
318
|
+
Error.errorhandler_wrapper(
|
|
319
|
+
conn._rest._connection,
|
|
320
|
+
None,
|
|
321
|
+
OperationalError,
|
|
322
|
+
{
|
|
323
|
+
"msg": (
|
|
324
|
+
f"Timed out after {conn.login_timeout} second(s) waiting for "
|
|
325
|
+
"the identity provider to return a SAML response. Consider "
|
|
326
|
+
"increasing login_timeout."
|
|
327
|
+
),
|
|
328
|
+
"errno": ER_IDP_CONNECTION_ERROR,
|
|
329
|
+
"sqlstate": SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
330
|
+
},
|
|
331
|
+
)
|
|
332
|
+
|
|
306
333
|
def _step5(
|
|
307
334
|
self,
|
|
308
335
|
conn: SnowflakeConnection,
|
|
@@ -2025,7 +2025,22 @@ class SnowflakeConnection:
|
|
|
2025
2025
|
):
|
|
2026
2026
|
# IDToken and OAuth auth need to authenticate through
|
|
2027
2027
|
# SSO if its credential has expired
|
|
2028
|
-
self._reauthenticate()
|
|
2028
|
+
result = self._reauthenticate()
|
|
2029
|
+
# AuthByIdToken re-establishes the session inside reauthenticate()
|
|
2030
|
+
# (it swaps to browser auth and re-runs _authenticate). The OAuth
|
|
2031
|
+
# authenticators only obtain a fresh access token, so we must
|
|
2032
|
+
# re-post the login here to actually establish a session with the
|
|
2033
|
+
# new token - otherwise the connection is left without a session
|
|
2034
|
+
# token and the first query fails with 250002 (connection closed).
|
|
2035
|
+
# prepare() short-circuits on the in-memory token (tokens load from
|
|
2036
|
+
# cache only once per connection), so this does not loop back into
|
|
2037
|
+
# another refresh.
|
|
2038
|
+
if (
|
|
2039
|
+
type(auth_instance) in (AuthByOauthCode, AuthByOauthCredentials)
|
|
2040
|
+
and isinstance(result, dict)
|
|
2041
|
+
and result.get("success")
|
|
2042
|
+
):
|
|
2043
|
+
self._authenticate(auth_instance)
|
|
2029
2044
|
else:
|
|
2030
2045
|
self._authenticate(auth_instance)
|
|
2031
2046
|
|
|
@@ -430,7 +430,13 @@ S3_MIN_PART_SIZE = 5 * 1024**2
|
|
|
430
430
|
S3_MAX_PARTS = 10000
|
|
431
431
|
|
|
432
432
|
S3_CHUNK_SIZE = 8388608 # boto3 default
|
|
433
|
-
|
|
433
|
+
|
|
434
|
+
# Azure Block Blob multipart upload limits
|
|
435
|
+
# https://learn.microsoft.com/en-us/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs
|
|
436
|
+
AZURE_CHUNK_SIZE = 8 * megabyte # kept consistent with S3_DEFAULT_CHUNK_SIZE
|
|
437
|
+
AZURE_MAX_BLOCKS = 50000
|
|
438
|
+
AZURE_MAX_BLOCK_SIZE = 4000 * megabyte
|
|
439
|
+
AZURE_MAX_OBJECT_SIZE = AZURE_MAX_BLOCKS * AZURE_MAX_BLOCK_SIZE
|
|
434
440
|
|
|
435
441
|
# https://requests.readthedocs.io/en/latest/user/advanced/#timeouts
|
|
436
442
|
REQUEST_CONNECTION_TIMEOUT = 10
|