snowflake-connector-python 4.7.2__tar.gz → 4.7.4__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.2 → snowflake_connector_python-4.7.4}/DESCRIPTION.md +27 -2
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/PKG-INFO +30 -5
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/README.md +25 -5
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/setup.cfg +2 -2
- snowflake_connector_python-4.7.4/src/snowflake/connector/_host_util.py +106 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_utils.py +16 -4
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_connection.py +10 -18
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_cursor.py +29 -20
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_network.py +4 -1
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_ocsp_snowflake.py +1 -6
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_result_batch.py +22 -7
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_result_set.py +26 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth_code.py +6 -1
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth_credentials.py +6 -1
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_workload_identity.py +2 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_oauth_base.py +171 -26
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/workload_identity.py +74 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/cache.py +31 -2
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/connection.py +39 -19
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/constants.py +17 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/cursor.py +32 -18
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/errorcode.py +3 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/externals_utils/externals_setup.py +12 -4
- snowflake_connector_python-4.7.4/src/snowflake/connector/logging_utils/filters.py +160 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/network.py +9 -3
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ocsp_asn1crypto.py +11 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ocsp_snowflake.py +105 -32
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/result_batch.py +80 -9
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/result_set.py +60 -2
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/secret_detector.py +82 -7
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/util_text.py +5 -6
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +24 -8
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/PKG-INFO +30 -5
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
- snowflake_connector_python-4.7.2/src/snowflake/connector/logging_utils/filters.py +0 -72
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/NOTICE +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/SECURITY.md +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/pyproject.toml +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/setup.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_okta.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth_code.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,13 +7,39 @@ 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.4(Sep 16,2026)
|
|
11
|
+
- Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
|
|
12
|
+
- Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
|
|
13
|
+
- Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
|
|
14
|
+
|
|
15
|
+
- v4.7.3(Sep 3,2026)
|
|
16
|
+
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
17
|
+
- Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
|
|
18
|
+
- Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
|
|
19
|
+
- Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
|
|
20
|
+
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
21
|
+
- Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
|
|
22
|
+
- DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
|
|
23
|
+
- The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
|
|
24
|
+
- SQL text is masked before it is written to DEBUG logs: `_format_query_for_log()` runs the query through `SecretDetector`, covering the cursor and connection paths on both sync and async. The cancel-query log paths use the same masking (SNOW-3675590).
|
|
25
|
+
- Deferred the SQL-masking cost to log emit-time: query DEBUG lines pass a lazy `_format_query_for_log_lazy()` wrapper whose `__str__` masks only when a handler emits the record (SNOW-3675590).
|
|
26
|
+
- Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
|
|
27
|
+
- The `WORKLOAD_IDENTITY` authenticator runs only against recognized Snowflake hosts: the connection host is normalized and suffix-anchored against `snowflakecomputing.com`, `.cn`, and `.mil` before the workload-identity flow proceeds. The `SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES` environment variable additively extends the recognized-host list (SNOW-3675580).
|
|
28
|
+
- Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
|
|
29
|
+
- When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
|
|
30
|
+
- A PrivateLink OCSP cache URL is derived only for hosts that consist of hostname characters, include a `.privatelink.` label, and end at `snowflakecomputing.com`, `.cn`, or `.mil`. Other hosts use the public default cache URL; set `SF_OCSP_RESPONSE_CACHE_SERVER_URL` to use a different cache server.
|
|
31
|
+
- Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
|
|
32
|
+
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
33
|
+
- Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
|
|
34
|
+
|
|
35
|
+
- v4.7.2(Aug 7,2026)
|
|
11
36
|
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
12
37
|
- 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
38
|
- 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
39
|
- 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
40
|
- 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
41
|
- 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.
|
|
42
|
+
- 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).
|
|
17
43
|
|
|
18
44
|
- v4.7.1(Jul 15,2026)
|
|
19
45
|
- Added support for Python 3.14t (free-threaded).
|
|
@@ -29,7 +55,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
29
55
|
- 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.
|
|
30
56
|
- 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.
|
|
31
57
|
- 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).
|
|
33
58
|
|
|
34
59
|
- v4.6.0(May 28,2026)
|
|
35
60
|
- 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.4
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -70,8 +70,8 @@ Requires-Dist: more-itertools; extra == "development"
|
|
|
70
70
|
Requires-Dist: numpy<=2.4.3; extra == "development"
|
|
71
71
|
Requires-Dist: pendulum!=2.1.1; extra == "development"
|
|
72
72
|
Requires-Dist: pexpect; extra == "development"
|
|
73
|
-
Requires-Dist: pytest<
|
|
74
|
-
Requires-Dist: pytest-asyncio; extra == "development"
|
|
73
|
+
Requires-Dist: pytest<9,>=8.4; extra == "development"
|
|
74
|
+
Requires-Dist: pytest-asyncio<2,>=1.4.0; extra == "development"
|
|
75
75
|
Requires-Dist: pytest-cov; extra == "development"
|
|
76
76
|
Requires-Dist: pytest-rerunfailures<16.0; extra == "development"
|
|
77
77
|
Requires-Dist: pytest-timeout; extra == "development"
|
|
@@ -97,13 +97,39 @@ https://docs.snowflake.com/
|
|
|
97
97
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
98
98
|
|
|
99
99
|
# Release Notes
|
|
100
|
-
- v4.7.
|
|
100
|
+
- v4.7.4(Sep 16,2026)
|
|
101
|
+
- Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
|
|
102
|
+
- Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
|
|
103
|
+
- Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
|
|
104
|
+
|
|
105
|
+
- v4.7.3(Sep 3,2026)
|
|
106
|
+
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
107
|
+
- Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
|
|
108
|
+
- Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
|
|
109
|
+
- Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
|
|
110
|
+
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
111
|
+
- Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
|
|
112
|
+
- DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
|
|
113
|
+
- The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
|
|
114
|
+
- SQL text is masked before it is written to DEBUG logs: `_format_query_for_log()` runs the query through `SecretDetector`, covering the cursor and connection paths on both sync and async. The cancel-query log paths use the same masking (SNOW-3675590).
|
|
115
|
+
- Deferred the SQL-masking cost to log emit-time: query DEBUG lines pass a lazy `_format_query_for_log_lazy()` wrapper whose `__str__` masks only when a handler emits the record (SNOW-3675590).
|
|
116
|
+
- Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
|
|
117
|
+
- The `WORKLOAD_IDENTITY` authenticator runs only against recognized Snowflake hosts: the connection host is normalized and suffix-anchored against `snowflakecomputing.com`, `.cn`, and `.mil` before the workload-identity flow proceeds. The `SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES` environment variable additively extends the recognized-host list (SNOW-3675580).
|
|
118
|
+
- Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
|
|
119
|
+
- When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
|
|
120
|
+
- A PrivateLink OCSP cache URL is derived only for hosts that consist of hostname characters, include a `.privatelink.` label, and end at `snowflakecomputing.com`, `.cn`, or `.mil`. Other hosts use the public default cache URL; set `SF_OCSP_RESPONSE_CACHE_SERVER_URL` to use a different cache server.
|
|
121
|
+
- Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
|
|
122
|
+
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
123
|
+
- Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
|
|
124
|
+
|
|
125
|
+
- v4.7.2(Aug 7,2026)
|
|
101
126
|
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
102
127
|
- 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
128
|
- 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
129
|
- 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
130
|
- 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
131
|
- 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.
|
|
132
|
+
- 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).
|
|
107
133
|
|
|
108
134
|
- v4.7.1(Jul 15,2026)
|
|
109
135
|
- Added support for Python 3.14t (free-threaded).
|
|
@@ -119,7 +145,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
119
145
|
- 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.
|
|
120
146
|
- 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.
|
|
121
147
|
- 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).
|
|
123
148
|
|
|
124
149
|
- v4.6.0(May 28,2026)
|
|
125
150
|
- Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
# Snowflake Connector for Python
|
|
2
2
|
|
|
3
|
-
[!
|
|
4
|
-
[
|
|
5
|
-
[](https://pypi.python.org/pypi/snowflake-connector-python/)
|
|
6
|
-
[](http://www.apache.org/licenses/LICENSE-2.0.txt)
|
|
7
|
-
[](https://github.com/psf/black)
|
|
3
|
+
> [!IMPORTANT]
|
|
4
|
+
> A new version of the driver is being developed in [snowflakedb/drivers](https://github.com/snowflakedb/drivers) and is currently in public preview. See the [documentation](https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-universal-core) for more information.
|
|
8
5
|
|
|
9
6
|
This package includes the Snowflake Connector for Python, which conforms to the [Python DB API 2.0](https://www.python.org/dev/peps/pep-0249/) specification.
|
|
10
7
|
|
|
@@ -53,6 +50,29 @@ These tools are integrated into `tox` to allow us to easily set them up universa
|
|
|
53
50
|
and we would like to have an overall coverage data file created for them.
|
|
54
51
|
* **flake8**: (Deprecated) Similar to `fix_lint`, but only runs `flake8` checks.
|
|
55
52
|
|
|
53
|
+
## Log secret masking
|
|
54
|
+
|
|
55
|
+
By default, the connector masks secrets (tokens, passwords, cloud credentials,
|
|
56
|
+
private keys) in records emitted by `snowflake.connector` loggers and by the
|
|
57
|
+
third-party loggers it uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`,
|
|
58
|
+
`aioboto3`, and vendored `urllib3`). Masking applies even when logging is
|
|
59
|
+
configured with `logging.basicConfig`, not only when Easy Logging
|
|
60
|
+
(`save_logs = true` in `config.toml`) is enabled. The same opt-out covers
|
|
61
|
+
those trees: they also interpolate the message and clear `record.args`.
|
|
62
|
+
|
|
63
|
+
To disable masking, set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING` to `true`.
|
|
64
|
+
The connector reads this on every log record, so it is an escape hatch if
|
|
65
|
+
masking is incompatible with a log pipeline (for example one that depends
|
|
66
|
+
on structured `record.args`). Setting it **before** importing
|
|
67
|
+
`snowflake.connector` also skips installing the masking hook:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
export SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The masker interpolates each log record and clears `record.args`. Leave
|
|
74
|
+
masking enabled unless you need that escape hatch.
|
|
75
|
+
|
|
56
76
|
## Disable telemetry
|
|
57
77
|
|
|
58
78
|
By default, the Snowflake Connector for Python collects telemetry data to improve the product.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2012-2023 Snowflake Computing Inc. All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
"""Host normalization and recognition shared by every subsystem that turns a
|
|
7
|
+
connection host into the authority of a URL the connector builds itself.
|
|
8
|
+
|
|
9
|
+
Kept subsystem-agnostic so that WORKLOAD_IDENTITY attestation and OCSP cache-URL
|
|
10
|
+
derivation match hosts identically; a second, slightly different rule in either
|
|
11
|
+
place is what this module exists to prevent. The suffix list itself lives in
|
|
12
|
+
``constants`` so the data stays next to the connector's other TLD constants.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Iterable
|
|
18
|
+
|
|
19
|
+
from .constants import _SNOWFLAKE_ALLOWED_HOST_SUFFIXES
|
|
20
|
+
|
|
21
|
+
# Maps only ASCII A-Z to a-z.
|
|
22
|
+
#
|
|
23
|
+
# Deliberately not str.lower(): full Unicode case folding maps some characters
|
|
24
|
+
# into ASCII, so a host containing U+212A KELVIN SIGN folds
|
|
25
|
+
# "snowfla<U+212A>ecomputing.com" into "snowflakecomputing.com" and would match a
|
|
26
|
+
# recognized suffix while DNS still resolves the original, unrelated name.
|
|
27
|
+
# Leaving non-ASCII untouched lets is_ldh_host reject it instead.
|
|
28
|
+
_ASCII_LOWERCASE_TABLE = str.maketrans(
|
|
29
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Characters legal in a DNS hostname label, plus '_': account labels
|
|
33
|
+
# legitimately contain one.
|
|
34
|
+
_LDH_CHARACTERS = frozenset("abcdefghijklmnopqrstuvwxyz0123456789-_")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def normalize_host(host: str | None) -> str:
|
|
38
|
+
"""Normalizes a host (or a configured host suffix) into the single string that
|
|
39
|
+
every subsequent check and every derived URL must use.
|
|
40
|
+
|
|
41
|
+
Trims, lower-cases ASCII only, drops everything from the first ':' onward,
|
|
42
|
+
then strips exactly one trailing '.' (FQDN form).
|
|
43
|
+
|
|
44
|
+
The port must be dropped before the trailing dot: a host in FQDN form
|
|
45
|
+
carrying an explicit port ("acct.snowflakecomputing.com.:443") still has the
|
|
46
|
+
dot immediately before the colon, and removing the dot first would leave it
|
|
47
|
+
attached to the label and match no suffix.
|
|
48
|
+
"""
|
|
49
|
+
if not host:
|
|
50
|
+
return ""
|
|
51
|
+
normalized = host.strip().translate(_ASCII_LOWERCASE_TABLE)
|
|
52
|
+
if ":" in normalized:
|
|
53
|
+
normalized = normalized.split(":", 1)[0]
|
|
54
|
+
if normalized.endswith("."):
|
|
55
|
+
normalized = normalized[:-1]
|
|
56
|
+
return normalized
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def is_ldh_host(normalized_host: str) -> bool:
|
|
60
|
+
"""Whether an already-normalized host is made only of characters legal in a
|
|
61
|
+
DNS hostname: every dot-separated label non-empty and drawn from
|
|
62
|
+
``[a-z0-9_-]``.
|
|
63
|
+
|
|
64
|
+
This is an allow-list, not a list of forbidden delimiters, and that
|
|
65
|
+
distinction is load-bearing. A host is only safe to interpolate into a URL
|
|
66
|
+
authority if it cannot carry a character that some URL parser treats as
|
|
67
|
+
ending the host, and enumerating such characters does not work: parsers
|
|
68
|
+
variously terminate the authority at a space, ';', "'", a percent-escape, or
|
|
69
|
+
a full-width look-alike of '.', '#' or '?'. Since a host whose trailing
|
|
70
|
+
labels are a recognized Snowflake domain can still begin with an unrelated
|
|
71
|
+
name, a parser that stops early resolves that unrelated name instead.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
normalized_host: output of :func:`normalize_host`.
|
|
75
|
+
"""
|
|
76
|
+
if not normalized_host:
|
|
77
|
+
return False
|
|
78
|
+
return all(
|
|
79
|
+
label and _LDH_CHARACTERS.issuperset(label)
|
|
80
|
+
for label in normalized_host.split(".")
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def has_recognized_snowflake_suffix(
|
|
85
|
+
normalized_host: str,
|
|
86
|
+
extra_suffixes: Iterable[str] | None = None,
|
|
87
|
+
) -> bool:
|
|
88
|
+
"""Whether an already-normalized host ends at one of the recognized Snowflake
|
|
89
|
+
suffixes, matched on a label boundary so that only a listed suffix and its
|
|
90
|
+
subdomains qualify. The bare apex is accepted by the equality branch.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
normalized_host: output of :func:`normalize_host`.
|
|
94
|
+
extra_suffixes: additional already-normalized suffixes to accept.
|
|
95
|
+
Additive only: callers cannot use this to disable the built-in list.
|
|
96
|
+
"""
|
|
97
|
+
if not normalized_host:
|
|
98
|
+
return False
|
|
99
|
+
suffixes: tuple[str, ...] = _SNOWFLAKE_ALLOWED_HOST_SUFFIXES
|
|
100
|
+
if extra_suffixes:
|
|
101
|
+
suffixes = (*suffixes, *extra_suffixes)
|
|
102
|
+
return any(
|
|
103
|
+
normalized_host == suffix or normalized_host.endswith(f".{suffix}")
|
|
104
|
+
for suffix in suffixes
|
|
105
|
+
if suffix
|
|
106
|
+
)
|
|
@@ -9,7 +9,7 @@ import string
|
|
|
9
9
|
import threading
|
|
10
10
|
import time
|
|
11
11
|
from enum import Enum
|
|
12
|
-
from inspect import
|
|
12
|
+
from inspect import currentframe
|
|
13
13
|
from secrets import choice
|
|
14
14
|
from threading import Timer
|
|
15
15
|
from uuid import UUID
|
|
@@ -101,12 +101,24 @@ class _TrackedQueryCancellationTimer(Timer):
|
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
def get_application_path() -> str:
|
|
104
|
-
"""Get the path of the application script using the connector.
|
|
104
|
+
"""Get the path of the application script using the connector.
|
|
105
|
+
|
|
106
|
+
Walks frame.f_back directly instead of using inspect.stack(), which
|
|
107
|
+
reads and parses the source file of every frame on the call stack.
|
|
108
|
+
That per-frame disk I/O made connect() take hundreds of milliseconds
|
|
109
|
+
on deep call stacks (see SNOW-3691001 / GH-2908).
|
|
110
|
+
"""
|
|
111
|
+
frame = currentframe()
|
|
105
112
|
try:
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
if frame is None:
|
|
114
|
+
return "unknown"
|
|
115
|
+
while frame.f_back is not None:
|
|
116
|
+
frame = frame.f_back
|
|
117
|
+
return frame.f_code.co_filename
|
|
108
118
|
except Exception:
|
|
109
119
|
return "unknown"
|
|
120
|
+
finally:
|
|
121
|
+
del frame
|
|
110
122
|
|
|
111
123
|
|
|
112
124
|
_SPCS_ENV_VAR = "SNOWFLAKE_RUNNING_INSIDE_SPCS"
|
|
@@ -120,7 +120,6 @@ else:
|
|
|
120
120
|
|
|
121
121
|
|
|
122
122
|
class SnowflakeConnection(SnowflakeConnectionSync):
|
|
123
|
-
OCSP_ENV_LOCK = asyncio.Lock()
|
|
124
123
|
|
|
125
124
|
def __init__(
|
|
126
125
|
self,
|
|
@@ -233,20 +232,17 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
233
232
|
)
|
|
234
233
|
logger.debug("REST API object was created: %s:%s", self.host, self.port)
|
|
235
234
|
|
|
235
|
+
# The PrivateLink OCSP cache URL is now derived per-connection inside
|
|
236
|
+
# OCSPServer from this connection's hostname (SNOW-3675581); the driver
|
|
237
|
+
# does not write SF_OCSP_RESPONSE_CACHE_SERVER_URL to the process
|
|
238
|
+
# environment. An operator-set value is still honored (and takes
|
|
239
|
+
# precedence) -- log it if present.
|
|
236
240
|
if "SF_OCSP_RESPONSE_CACHE_SERVER_URL" in os.environ:
|
|
237
241
|
logger.debug(
|
|
238
242
|
"Custom OCSP Cache Server URL found in environment - %s",
|
|
239
243
|
os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"],
|
|
240
244
|
)
|
|
241
245
|
|
|
242
|
-
if ".privatelink.snowflakecomputing." in self.host.lower():
|
|
243
|
-
await SnowflakeConnection.setup_ocsp_privatelink(
|
|
244
|
-
self.application, self.host
|
|
245
|
-
)
|
|
246
|
-
else:
|
|
247
|
-
if "SF_OCSP_RESPONSE_CACHE_SERVER_URL" in os.environ:
|
|
248
|
-
del os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"]
|
|
249
|
-
|
|
250
246
|
if self._session_parameters is None:
|
|
251
247
|
self._session_parameters = {}
|
|
252
248
|
if self._autocommit is not None:
|
|
@@ -715,7 +711,11 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
715
711
|
self, sql: str, request_id: uuid.UUID
|
|
716
712
|
) -> dict[str, bool | None]:
|
|
717
713
|
"""Cancels the query with the exact SQL query and requestId."""
|
|
718
|
-
logger.debug(
|
|
714
|
+
logger.debug(
|
|
715
|
+
"_cancel_query sql=[%s], request_id=[%s]",
|
|
716
|
+
self._format_query_for_log(sql),
|
|
717
|
+
request_id,
|
|
718
|
+
)
|
|
719
719
|
url_parameters = {REQUEST_ID: str(uuid.uuid4())}
|
|
720
720
|
|
|
721
721
|
return await self.rest.request(
|
|
@@ -1233,14 +1233,6 @@ class SnowflakeConnection(SnowflakeConnectionSync):
|
|
|
1233
1233
|
self._process_error_query_status(sf_qid, status_resp)
|
|
1234
1234
|
return status
|
|
1235
1235
|
|
|
1236
|
-
@staticmethod
|
|
1237
|
-
async def setup_ocsp_privatelink(app, hostname) -> None:
|
|
1238
|
-
hostname = hostname.lower()
|
|
1239
|
-
async with SnowflakeConnection.OCSP_ENV_LOCK:
|
|
1240
|
-
ocsp_cache_server = f"http://ocsp.{hostname}/ocsp_response_cache.json"
|
|
1241
|
-
os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"] = ocsp_cache_server
|
|
1242
|
-
logger.debug("OCSP Cache Server is updated: %s", ocsp_cache_server)
|
|
1243
|
-
|
|
1244
1236
|
async def rollback(self) -> None:
|
|
1245
1237
|
"""Rolls back the current transaction."""
|
|
1246
1238
|
await self.cursor().execute("ROLLBACK")
|
|
@@ -142,7 +142,11 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
142
142
|
|
|
143
143
|
async def __cancel_query(self, query) -> None:
|
|
144
144
|
if self._sequence_counter >= 0 and not self.is_closed():
|
|
145
|
-
logger.debug(
|
|
145
|
+
logger.debug(
|
|
146
|
+
"canceled. %s, request_id: %s",
|
|
147
|
+
self._format_query_for_log_lazy(query),
|
|
148
|
+
self._request_id,
|
|
149
|
+
)
|
|
146
150
|
async with self._lock_canceling:
|
|
147
151
|
await self._connection._cancel_query(query, self._request_id)
|
|
148
152
|
|
|
@@ -234,7 +238,7 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
234
238
|
|
|
235
239
|
logger.debug(f"Request id: {self._request_id}")
|
|
236
240
|
|
|
237
|
-
logger.debug("running query [%s]", self.
|
|
241
|
+
logger.debug("running query [%s]", self._format_query_for_log_lazy(query))
|
|
238
242
|
if _is_put_get is not None:
|
|
239
243
|
# if told the query is PUT or GET, use the information
|
|
240
244
|
self._is_file_transfer = _is_put_get
|
|
@@ -375,6 +379,10 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
375
379
|
self,
|
|
376
380
|
result_chunks,
|
|
377
381
|
self._connection.client_prefetch_threads,
|
|
382
|
+
# SNOW-4109042: a DML reuses "total" for the rows the statement
|
|
383
|
+
# affected, which says nothing about the rows in its result set, so
|
|
384
|
+
# only a query's total is a promise worth holding the back-end to.
|
|
385
|
+
total_row_count=None if is_dml else data.get("total"),
|
|
378
386
|
)
|
|
379
387
|
self._rownumber = -1
|
|
380
388
|
self._result_state = ResultState.VALID
|
|
@@ -574,7 +582,7 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
574
582
|
logger.warning("execute: no query is given to execute")
|
|
575
583
|
return None
|
|
576
584
|
|
|
577
|
-
logger.debug("query: [%s]", self.
|
|
585
|
+
logger.debug("query: [%s]", self._format_query_for_log_lazy(command))
|
|
578
586
|
|
|
579
587
|
_statement_params = _statement_params or dict()
|
|
580
588
|
# If we need to add another parameter, please consider introducing a dict for all extra params
|
|
@@ -918,24 +926,25 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
918
926
|
if self._result is None and self._result_set is not None:
|
|
919
927
|
self._result: ResultSetIterator = await self._result_set._create_iter()
|
|
920
928
|
self._result_state = ResultState.VALID
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
Error.errorhandler_wrapper_from_ready_exception(
|
|
927
|
-
self._connection,
|
|
928
|
-
self,
|
|
929
|
-
_next,
|
|
930
|
-
)
|
|
931
|
-
if _next is not None:
|
|
932
|
-
self._rownumber += 1
|
|
933
|
-
return _next
|
|
934
|
-
except TypeError as err:
|
|
929
|
+
if self._result is None:
|
|
930
|
+
# SNOW-4109042: a missing result iterator is the only reason to report
|
|
931
|
+
# end-of-results here -- a cursor that was reset has no rows left to
|
|
932
|
+
# hand out. Errors raised while iterating a real result set must reach
|
|
933
|
+
# the caller instead of looking like a result set that ran out.
|
|
935
934
|
if self._result_state == ResultState.DEFAULT:
|
|
936
|
-
raise
|
|
937
|
-
|
|
938
|
-
|
|
935
|
+
raise TypeError("'NoneType' object is not an iterator")
|
|
936
|
+
return None
|
|
937
|
+
|
|
938
|
+
_next = await self._result.get_next()
|
|
939
|
+
if isinstance(_next, Exception):
|
|
940
|
+
Error.errorhandler_wrapper_from_ready_exception(
|
|
941
|
+
self._connection,
|
|
942
|
+
self,
|
|
943
|
+
_next,
|
|
944
|
+
)
|
|
945
|
+
if _next is not None:
|
|
946
|
+
self._rownumber += 1
|
|
947
|
+
return _next
|
|
939
948
|
|
|
940
949
|
async def fetchmany(self, size: int | None = None) -> list[FetchRow]:
|
|
941
950
|
"""Fetches the number of specified rows."""
|
|
@@ -79,6 +79,7 @@ from ..network import (
|
|
|
79
79
|
is_econnreset_exception,
|
|
80
80
|
is_login_request,
|
|
81
81
|
is_retryable_http_code,
|
|
82
|
+
is_unexpected_eof_exception,
|
|
82
83
|
)
|
|
83
84
|
from ..secret_detector import SecretDetector
|
|
84
85
|
from ..sqlstate import (
|
|
@@ -730,6 +731,8 @@ class SnowflakeRestful(SnowflakeRestfulSync):
|
|
|
730
731
|
else:
|
|
731
732
|
input_data = data
|
|
732
733
|
|
|
734
|
+
# Work on a copy so the caller-supplied dict is never mutated.
|
|
735
|
+
headers = dict(headers)
|
|
733
736
|
if HEADER_AUTHORIZATION_KEY in headers:
|
|
734
737
|
del headers[HEADER_AUTHORIZATION_KEY]
|
|
735
738
|
if token != NO_TOKEN:
|
|
@@ -814,7 +817,7 @@ class SnowflakeRestful(SnowflakeRestfulSync):
|
|
|
814
817
|
finally:
|
|
815
818
|
raw_ret.close() # ensure response is closed
|
|
816
819
|
except (aiohttp.ClientSSLError, aiohttp.ClientConnectorSSLError) as se:
|
|
817
|
-
if is_econnreset_exception(se):
|
|
820
|
+
if is_econnreset_exception(se) or is_unexpected_eof_exception(se):
|
|
818
821
|
raise RetryRequest(se.os_error)
|
|
819
822
|
msg = f"Hit non-retryable SSL error, {str(se)}.\n{_CONNECTIVITY_ERR_MSG}"
|
|
820
823
|
logger.debug(msg)
|
|
@@ -33,7 +33,6 @@ from snowflake.connector.ocsp_snowflake import (
|
|
|
33
33
|
from snowflake.connector.ocsp_snowflake import OCSPServer as OCSPServerSync
|
|
34
34
|
from snowflake.connector.ocsp_snowflake import OCSPTelemetryData
|
|
35
35
|
from snowflake.connector.ocsp_snowflake import SnowflakeOCSP as SnowflakeOCSPSync
|
|
36
|
-
from snowflake.connector.url_util import extract_top_level_domain_from_hostname
|
|
37
36
|
|
|
38
37
|
if TYPE_CHECKING:
|
|
39
38
|
from snowflake.connector.aio._session_manager import SessionManager
|
|
@@ -157,11 +156,7 @@ class SnowflakeOCSP(SnowflakeOCSPSync):
|
|
|
157
156
|
|
|
158
157
|
self._use_post_method = use_post_method
|
|
159
158
|
self._root_certs_dict_lock_timeout = root_certs_dict_lock_timeout
|
|
160
|
-
self.OCSP_CACHE_SERVER = OCSPServer(
|
|
161
|
-
top_level_domain=extract_top_level_domain_from_hostname(
|
|
162
|
-
kwargs.pop("hostname", None)
|
|
163
|
-
)
|
|
164
|
-
)
|
|
159
|
+
self.OCSP_CACHE_SERVER = OCSPServer(hostname=kwargs.pop("hostname", None))
|
|
165
160
|
|
|
166
161
|
self.debug_ocsp_failure_url = None
|
|
167
162
|
|
|
@@ -86,12 +86,19 @@ def create_batches_from_response(
|
|
|
86
86
|
chunk_headers = {}
|
|
87
87
|
for header_key, header_value in data["chunkHeaders"].items():
|
|
88
88
|
chunk_headers[header_key] = header_value
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
# SNOW-3675590: never log the value — chunk-header values can be
|
|
90
|
+
# secrets (SSE-C customer key). Log the header name plus
|
|
91
|
+
# non-sensitive value metadata only. Capture real headers via a
|
|
92
|
+
# proxy (drivers-usage PROXY=1) when debugging.
|
|
93
|
+
logger.debug(
|
|
94
|
+
f"added chunk header: key={header_key} "
|
|
95
|
+
f"value={SecretDetector.describe_value(header_value)}"
|
|
96
|
+
)
|
|
93
97
|
elif qrmk is not None:
|
|
94
|
-
|
|
98
|
+
# SNOW-3675590: never log the qrmk value — it is the AES-256 SSE-C
|
|
99
|
+
# result-encryption key. Log only its presence; do not route it
|
|
100
|
+
# through masking helpers as a substitute.
|
|
101
|
+
logger.debug("qrmk is present in the result response")
|
|
95
102
|
chunk_headers[SSE_C_ALGORITHM] = SSE_C_AES
|
|
96
103
|
chunk_headers[SSE_C_KEY] = qrmk
|
|
97
104
|
|
|
@@ -154,7 +161,12 @@ def create_batches_from_response(
|
|
|
154
161
|
session_manager=cursor._connection._session_manager.clone(),
|
|
155
162
|
)
|
|
156
163
|
else:
|
|
157
|
-
|
|
164
|
+
# SNOW-3675590: log only the structural shape — the raw response can
|
|
165
|
+
# carry secrets, and this ERROR line is emitted regardless of DEBUG level.
|
|
166
|
+
logger.error(
|
|
167
|
+
"Don't know how to construct ResultBatches from response: "
|
|
168
|
+
f"format={_format!r}, shape={SecretDetector.describe_value(data)}"
|
|
169
|
+
)
|
|
158
170
|
first_chunk = ArrowResultBatch.from_data(
|
|
159
171
|
"",
|
|
160
172
|
0,
|
|
@@ -321,6 +333,7 @@ class JSONResultBatch(ResultBatch, JSONResultBatchSync):
|
|
|
321
333
|
async with TimerContextManager() as parse_metric:
|
|
322
334
|
parsed_data = self._parse(downloaded_data)
|
|
323
335
|
self._metrics[DownloadMetrics.parse.value] = parse_metric.get_timing_millis()
|
|
336
|
+
self._check_rowcount(len(parsed_data))
|
|
324
337
|
return iter(parsed_data)
|
|
325
338
|
|
|
326
339
|
async def _load(self, content: bytes, encoding: str) -> list:
|
|
@@ -439,4 +452,6 @@ class ArrowResultBatch(ResultBatch, ArrowResultBatchSync):
|
|
|
439
452
|
else:
|
|
440
453
|
return await self._get_arrow_iter(connection=connection)
|
|
441
454
|
else:
|
|
442
|
-
return
|
|
455
|
+
return self._iter_checked_rows(
|
|
456
|
+
await self._create_iter(iter_unit=iter_unit, connection=connection)
|
|
457
|
+
)
|