snowflake-connector-python 4.7.1__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.1 → snowflake_connector_python-4.7.2}/DESCRIPTION.md +9 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/PKG-INFO +12 -2
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/pyproject.toml +10 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/setup.cfg +2 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_auth.py +11 -3
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_okta.py +11 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_auth.py +31 -9
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_oauth_base.py +58 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_code.py +1 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/okta.py +29 -2
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection.py +16 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/constants.py +7 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_transfer_agent.py +70 -46
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +5 -2
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +5 -2
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +6 -2
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +1 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +1 -3
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +4 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/network.py +22 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/platform_detection.py +30 -10
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sqlstate.py +1 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/util_text.py +6 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/PKG-INFO +12 -2
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/requires.txt +1 -1
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/NOTICE +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/README.md +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/SECURITY.md +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/setup.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_connection.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_cursor.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_network.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_batch.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_set.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cursor.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → 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.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,6 +7,14 @@ 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.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
|
+
|
|
10
18
|
- v4.7.1(Jul 15,2026)
|
|
11
19
|
- Added support for Python 3.14t (free-threaded).
|
|
12
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,6 +29,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
21
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.
|
|
22
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.
|
|
23
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).
|
|
24
33
|
|
|
25
34
|
- v4.6.0(May 28,2026)
|
|
26
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,7 +62,7 @@ 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
68
|
Requires-Dist: mitmproxy>=12.0.0; (python_version >= "3.12" and python_version < "3.14") and extra == "development"
|
|
@@ -96,6 +97,14 @@ https://docs.snowflake.com/
|
|
|
96
97
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
97
98
|
|
|
98
99
|
# Release Notes
|
|
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
|
+
|
|
99
108
|
- v4.7.1(Jul 15,2026)
|
|
100
109
|
- Added support for Python 3.14t (free-threaded).
|
|
101
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).
|
|
@@ -110,6 +119,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
110
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.
|
|
111
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.
|
|
112
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).
|
|
113
123
|
|
|
114
124
|
- v4.6.0(May 28,2026)
|
|
115
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,7 +89,7 @@ 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
95
|
mitmproxy>=12.0.0; python_version >= '3.12' and python_version < '3.14'
|
|
@@ -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
|
|
@@ -9,6 +9,7 @@ import os
|
|
|
9
9
|
import sys
|
|
10
10
|
import threading
|
|
11
11
|
from concurrent.futures.thread import ThreadPoolExecutor
|
|
12
|
+
from contextlib import ExitStack
|
|
12
13
|
from dataclasses import dataclass
|
|
13
14
|
from functools import partial
|
|
14
15
|
from logging import getLogger
|
|
@@ -21,6 +22,8 @@ from .compat import IS_WINDOWS
|
|
|
21
22
|
from .constants import (
|
|
22
23
|
AZURE_CHUNK_SIZE,
|
|
23
24
|
AZURE_FS,
|
|
25
|
+
AZURE_MAX_BLOCKS,
|
|
26
|
+
AZURE_MAX_OBJECT_SIZE,
|
|
24
27
|
CMD_TYPE_DOWNLOAD,
|
|
25
28
|
CMD_TYPE_UPLOAD,
|
|
26
29
|
GCS_FS,
|
|
@@ -186,24 +189,31 @@ def _update_progress(
|
|
|
186
189
|
return progress == 1.0
|
|
187
190
|
|
|
188
191
|
|
|
189
|
-
def _chunk_size_calculator(
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
192
|
+
def _chunk_size_calculator(
|
|
193
|
+
file_size: int,
|
|
194
|
+
default_chunk_size: int = S3_DEFAULT_CHUNK_SIZE,
|
|
195
|
+
max_parts: int = S3_MAX_PARTS,
|
|
196
|
+
min_part_size: int = S3_MIN_PART_SIZE,
|
|
197
|
+
max_object_size: int = S3_MAX_OBJECT_SIZE,
|
|
198
|
+
) -> int:
|
|
199
|
+
# Cloud providers cap the number of parts/blocks per object (S3: 10,000 parts,
|
|
200
|
+
# Azure: 50,000 blocks). This helper scales the chunk size up so the resulting
|
|
201
|
+
# number of parts stays within that limit; otherwise it keeps the default chunk size.
|
|
202
|
+
if file_size > max_object_size:
|
|
193
203
|
raise ValueError(
|
|
194
|
-
f"File size {file_size} exceeds the maximum file size {
|
|
204
|
+
f"File size {file_size} exceeds the maximum allowed file size {max_object_size}."
|
|
195
205
|
)
|
|
196
206
|
|
|
197
207
|
# num_parts = math.ceil(file_size / default_chunk_size)
|
|
198
|
-
# if num_parts is greater than the allowed
|
|
208
|
+
# if num_parts is greater than the allowed max_parts, we update our chunk_size, otherwise we use the default one
|
|
199
209
|
calculated_chunk_size = (
|
|
200
|
-
max(math.ceil(file_size /
|
|
201
|
-
if math.ceil(file_size /
|
|
202
|
-
else
|
|
210
|
+
max(math.ceil(file_size / max_parts), min_part_size)
|
|
211
|
+
if math.ceil(file_size / default_chunk_size) > max_parts
|
|
212
|
+
else default_chunk_size
|
|
203
213
|
)
|
|
204
|
-
if calculated_chunk_size !=
|
|
214
|
+
if calculated_chunk_size != default_chunk_size:
|
|
205
215
|
logger.debug(
|
|
206
|
-
f"Setting chunksize to {calculated_chunk_size} instead of the default {
|
|
216
|
+
f"Setting chunksize to {calculated_chunk_size} instead of the default {default_chunk_size}."
|
|
207
217
|
)
|
|
208
218
|
return calculated_chunk_size
|
|
209
219
|
|
|
@@ -462,9 +472,16 @@ class SnowflakeFileTransferAgent:
|
|
|
462
472
|
max_concurrency = min(
|
|
463
473
|
self._parallel, self._snowflake_server_dop_cap_for_file_transfer
|
|
464
474
|
)
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
475
|
+
thread_pools_exit_stack = ExitStack()
|
|
476
|
+
network_tpe = thread_pools_exit_stack.enter_context(
|
|
477
|
+
ThreadPoolExecutor(max_concurrency)
|
|
478
|
+
)
|
|
479
|
+
preprocess_tpe = thread_pools_exit_stack.enter_context(
|
|
480
|
+
ThreadPoolExecutor(iobound_tpe_limit)
|
|
481
|
+
)
|
|
482
|
+
postprocess_tpe = thread_pools_exit_stack.enter_context(
|
|
483
|
+
ThreadPoolExecutor(iobound_tpe_limit)
|
|
484
|
+
)
|
|
468
485
|
logger.debug(f"Chunk ThreadPoolExecutor size: {max_concurrency}")
|
|
469
486
|
cv_main_thread = threading.Condition() # to signal the main thread
|
|
470
487
|
cv_chunk_process = (
|
|
@@ -661,37 +678,38 @@ class SnowflakeFileTransferAgent:
|
|
|
661
678
|
f"An exception was raised in {repr(callback)}", exc_info=True
|
|
662
679
|
)
|
|
663
680
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
681
|
+
with thread_pools_exit_stack:
|
|
682
|
+
for file_client in files:
|
|
683
|
+
callback = partial(preprocess_done_cb, done_client=file_client)
|
|
684
|
+
if is_upload:
|
|
685
|
+
preprocess_tpe.submit(
|
|
686
|
+
function_and_callback_wrapper,
|
|
687
|
+
# Work fn
|
|
688
|
+
file_client.prepare_upload,
|
|
689
|
+
# Callback fn
|
|
690
|
+
callback,
|
|
691
|
+
file_client.meta,
|
|
692
|
+
)
|
|
693
|
+
else:
|
|
694
|
+
preprocess_tpe.submit(
|
|
695
|
+
function_and_callback_wrapper,
|
|
696
|
+
# Work fn
|
|
697
|
+
file_client.prepare_download,
|
|
698
|
+
# Callback fn
|
|
699
|
+
callback,
|
|
700
|
+
file_client.meta,
|
|
701
|
+
)
|
|
702
|
+
transfer_metadata.num_files_started += 1 # TODO: do we need this?
|
|
703
|
+
|
|
704
|
+
with cv_main_thread:
|
|
705
|
+
while transfer_metadata.num_files_completed < num_total_files:
|
|
706
|
+
cv_main_thread.wait()
|
|
707
|
+
# If both exception_caught_in_work and exception_caught_in_callback
|
|
708
|
+
# are present, the former will take precedence.
|
|
709
|
+
if exception_caught_in_work is not None:
|
|
710
|
+
raise exception_caught_in_work
|
|
711
|
+
if exception_caught_in_callback is not None:
|
|
712
|
+
raise exception_caught_in_callback
|
|
695
713
|
|
|
696
714
|
self._results = metas
|
|
697
715
|
|
|
@@ -709,7 +727,13 @@ class SnowflakeFileTransferAgent:
|
|
|
709
727
|
return SnowflakeAzureRestClient(
|
|
710
728
|
meta,
|
|
711
729
|
self._credentials,
|
|
712
|
-
|
|
730
|
+
_chunk_size_calculator(
|
|
731
|
+
meta.src_file_size,
|
|
732
|
+
default_chunk_size=AZURE_CHUNK_SIZE,
|
|
733
|
+
max_parts=AZURE_MAX_BLOCKS,
|
|
734
|
+
min_part_size=AZURE_CHUNK_SIZE,
|
|
735
|
+
max_object_size=AZURE_MAX_OBJECT_SIZE,
|
|
736
|
+
),
|
|
713
737
|
self._stage_info,
|
|
714
738
|
unsafe_file_write=self._unsafe_file_write,
|
|
715
739
|
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include "DateConverter.hpp"
|
|
2
2
|
|
|
3
3
|
#include <memory>
|
|
4
|
+
#include <mutex>
|
|
4
5
|
|
|
5
6
|
#include "Python/Helpers.hpp"
|
|
6
7
|
|
|
@@ -9,12 +10,14 @@ Logger* DateConverter::logger = new Logger("snowflake.connector.DateConverter");
|
|
|
9
10
|
|
|
10
11
|
py::UniqueRef& DateConverter::initPyDatetimeDate() {
|
|
11
12
|
static py::UniqueRef pyDatetimeDate;
|
|
12
|
-
|
|
13
|
+
// Serializes the lazy import for free-threaded builds
|
|
14
|
+
static std::once_flag onceFlag;
|
|
15
|
+
std::call_once(onceFlag, []() {
|
|
13
16
|
py::UniqueRef pyDatetimeModule;
|
|
14
17
|
py::importPythonModule("datetime", pyDatetimeModule);
|
|
15
18
|
py::importFromModule(pyDatetimeModule, "date", pyDatetimeDate);
|
|
16
19
|
Py_XINCREF(pyDatetimeDate.get());
|
|
17
|
-
}
|
|
20
|
+
});
|
|
18
21
|
return pyDatetimeDate;
|
|
19
22
|
}
|
|
20
23
|
|