snowflake-connector-python 4.7.2__tar.gz → 4.7.3__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.3}/DESCRIPTION.md +20 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/PKG-INFO +21 -1
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/README.md +23 -0
- snowflake_connector_python-4.7.3/src/snowflake/connector/_host_util.py +106 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_utils.py +16 -4
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_connection.py +10 -18
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_cursor.py +7 -3
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_network.py +2 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_ocsp_snowflake.py +1 -6
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_result_batch.py +18 -6
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_workload_identity.py +2 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/workload_identity.py +74 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/cache.py +31 -2
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/connection.py +39 -19
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/constants.py +17 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/cursor.py +10 -3
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/errorcode.py +2 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/externals_utils/externals_setup.py +12 -4
- snowflake_connector_python-4.7.3/src/snowflake/connector/logging_utils/filters.py +160 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/network.py +4 -2
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ocsp_asn1crypto.py +11 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ocsp_snowflake.py +105 -32
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/result_batch.py +18 -6
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/secret_detector.py +82 -7
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/util_text.py +5 -6
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +24 -8
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/PKG-INFO +21 -1
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
- 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.3}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/NOTICE +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/SECURITY.md +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/pyproject.toml +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/setup.cfg +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/setup.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_result_set.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_okta.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_oauth_base.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth_code.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/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.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
- {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,6 +7,26 @@ 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.3(Sep 3,2026)
|
|
11
|
+
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
12
|
+
- Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
|
|
13
|
+
- Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
|
|
14
|
+
- 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).
|
|
15
|
+
- Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
|
|
16
|
+
- DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
|
|
17
|
+
- The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
|
|
18
|
+
- 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).
|
|
19
|
+
- 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).
|
|
20
|
+
- Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
|
|
21
|
+
- 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).
|
|
22
|
+
- Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
|
|
23
|
+
- When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
|
|
24
|
+
- 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.
|
|
25
|
+
- Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
|
|
26
|
+
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
27
|
+
- Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
|
|
28
|
+
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
29
|
+
|
|
10
30
|
- v4.7.2(Aug 6,2026)
|
|
11
31
|
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
12
32
|
- Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 4.7.
|
|
3
|
+
Version: 4.7.3
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -97,6 +97,26 @@ 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.3(Sep 3,2026)
|
|
101
|
+
- Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
|
|
102
|
+
- Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
|
|
103
|
+
- Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
|
|
104
|
+
- 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).
|
|
105
|
+
- Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
|
|
106
|
+
- DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
|
|
107
|
+
- The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
|
|
108
|
+
- 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).
|
|
109
|
+
- 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).
|
|
110
|
+
- Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
|
|
111
|
+
- 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).
|
|
112
|
+
- Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
|
|
113
|
+
- When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
|
|
114
|
+
- 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.
|
|
115
|
+
- Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
|
|
116
|
+
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
117
|
+
- Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
|
|
118
|
+
- Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
|
|
119
|
+
|
|
100
120
|
- v4.7.2(Aug 6,2026)
|
|
101
121
|
- Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
|
|
102
122
|
- Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
|
|
@@ -53,6 +53,29 @@ These tools are integrated into `tox` to allow us to easily set them up universa
|
|
|
53
53
|
and we would like to have an overall coverage data file created for them.
|
|
54
54
|
* **flake8**: (Deprecated) Similar to `fix_lint`, but only runs `flake8` checks.
|
|
55
55
|
|
|
56
|
+
## Log secret masking
|
|
57
|
+
|
|
58
|
+
By default, the connector masks secrets (tokens, passwords, cloud credentials,
|
|
59
|
+
private keys) in records emitted by `snowflake.connector` loggers and by the
|
|
60
|
+
third-party loggers it uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`,
|
|
61
|
+
`aioboto3`, and vendored `urllib3`). Masking applies even when logging is
|
|
62
|
+
configured with `logging.basicConfig`, not only when Easy Logging
|
|
63
|
+
(`save_logs = true` in `config.toml`) is enabled. The same opt-out covers
|
|
64
|
+
those trees: they also interpolate the message and clear `record.args`.
|
|
65
|
+
|
|
66
|
+
To disable masking, set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING` to `true`.
|
|
67
|
+
The connector reads this on every log record, so it is an escape hatch if
|
|
68
|
+
masking is incompatible with a log pipeline (for example one that depends
|
|
69
|
+
on structured `record.args`). Setting it **before** importing
|
|
70
|
+
`snowflake.connector` also skips installing the masking hook:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
export SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The masker interpolates each log record and clears `record.args`. Leave
|
|
77
|
+
masking enabled unless you need that escape hatch.
|
|
78
|
+
|
|
56
79
|
## Disable telemetry
|
|
57
80
|
|
|
58
81
|
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
|
|
@@ -574,7 +578,7 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
|
|
|
574
578
|
logger.warning("execute: no query is given to execute")
|
|
575
579
|
return None
|
|
576
580
|
|
|
577
|
-
logger.debug("query: [%s]", self.
|
|
581
|
+
logger.debug("query: [%s]", self._format_query_for_log_lazy(command))
|
|
578
582
|
|
|
579
583
|
_statement_params = _statement_params or dict()
|
|
580
584
|
# If we need to add another parameter, please consider introducing a dict for all extra params
|
|
@@ -730,6 +730,8 @@ class SnowflakeRestful(SnowflakeRestfulSync):
|
|
|
730
730
|
else:
|
|
731
731
|
input_data = data
|
|
732
732
|
|
|
733
|
+
# Work on a copy so the caller-supplied dict is never mutated.
|
|
734
|
+
headers = dict(headers)
|
|
733
735
|
if HEADER_AUTHORIZATION_KEY in headers:
|
|
734
736
|
del headers[HEADER_AUTHORIZATION_KEY]
|
|
735
737
|
if token != NO_TOKEN:
|
|
@@ -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,
|
|
@@ -9,6 +9,7 @@ if TYPE_CHECKING:
|
|
|
9
9
|
from ...auth.workload_identity import (
|
|
10
10
|
AuthByWorkloadIdentity as AuthByWorkloadIdentitySync,
|
|
11
11
|
)
|
|
12
|
+
from ...auth.workload_identity import _verify_host_allowed_for_workload_identity
|
|
12
13
|
from .._wif_util import AttestationProvider, create_attestation
|
|
13
14
|
from ._by_plugin import AuthByPlugin as AuthByPluginAsync
|
|
14
15
|
|
|
@@ -42,6 +43,7 @@ class AuthByWorkloadIdentity(AuthByPluginAsync, AuthByWorkloadIdentitySync):
|
|
|
42
43
|
self, *, conn: SnowflakeConnection | None, **kwargs: typing.Any
|
|
43
44
|
) -> None:
|
|
44
45
|
"""Fetch the token using async wif_util."""
|
|
46
|
+
_verify_host_allowed_for_workload_identity(conn)
|
|
45
47
|
self.attestation = await create_attestation(
|
|
46
48
|
self.provider,
|
|
47
49
|
self.entra_resource,
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
4
6
|
import typing
|
|
5
7
|
from enum import Enum, unique
|
|
6
8
|
|
|
7
9
|
if typing.TYPE_CHECKING:
|
|
8
10
|
from snowflake.connector.connection import SnowflakeConnection
|
|
9
11
|
|
|
12
|
+
from .._host_util import has_recognized_snowflake_suffix, normalize_host
|
|
13
|
+
from ..errorcode import ER_WIF_UNTRUSTED_HOST
|
|
14
|
+
from ..errors import ProgrammingError
|
|
10
15
|
from ..network import WORKLOAD_IDENTITY_AUTHENTICATOR
|
|
11
16
|
from ..wif_util import (
|
|
12
17
|
AttestationProvider,
|
|
@@ -15,6 +20,72 @@ from ..wif_util import (
|
|
|
15
20
|
)
|
|
16
21
|
from .by_plugin import AuthByPlugin, AuthType
|
|
17
22
|
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
# Additive escape hatch for on-prem / air-gapped Snowflake deployments whose host
|
|
26
|
+
# does not end in a recognized Snowflake suffix.
|
|
27
|
+
#
|
|
28
|
+
# Read only from the process environment - never from the DSN, connection
|
|
29
|
+
# parameters or configuration files - so connection configuration cannot
|
|
30
|
+
# influence the allowlist. Entries are additive: they extend the
|
|
31
|
+
# recognized-host list and cannot disable it.
|
|
32
|
+
#
|
|
33
|
+
# Scoped to WORKLOAD_IDENTITY on purpose. Widening the hosts an ambient cloud
|
|
34
|
+
# credential may be sent to is a different decision from widening the hosts an
|
|
35
|
+
# OCSP cache may be fetched from, so the OCSP gate passes no extra suffixes.
|
|
36
|
+
_SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES_ENV_VAR = "SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _extra_wif_allowed_suffixes() -> list[str]:
|
|
40
|
+
"""Reads the additive SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES env-var allow-list.
|
|
41
|
+
|
|
42
|
+
Comma-separated, additive-only (never disables the built-in allow-list),
|
|
43
|
+
normalized the same way as the candidate host. Logs at INFO naming the
|
|
44
|
+
extra suffixes whenever the env var is used, since this widens the set of
|
|
45
|
+
hosts the ambient cloud credential may be sent to.
|
|
46
|
+
"""
|
|
47
|
+
raw = os.environ.get(_SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES_ENV_VAR, "")
|
|
48
|
+
if not raw:
|
|
49
|
+
return []
|
|
50
|
+
suffixes = [normalize_host(entry) for entry in raw.split(",") if entry.strip()]
|
|
51
|
+
suffixes = [s for s in suffixes if s]
|
|
52
|
+
if suffixes:
|
|
53
|
+
logger.info(
|
|
54
|
+
"SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES is set; extending the WORKLOAD_IDENTITY "
|
|
55
|
+
"recognized-host allow-list with additional suffixes: %s.",
|
|
56
|
+
suffixes,
|
|
57
|
+
)
|
|
58
|
+
return suffixes
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _is_host_allowed_for_workload_identity(host: str) -> bool:
|
|
62
|
+
"""Returns True if `host` (already-normalized or not) is a trusted WIF destination."""
|
|
63
|
+
return has_recognized_snowflake_suffix(
|
|
64
|
+
normalize_host(host), _extra_wif_allowed_suffixes()
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _verify_host_allowed_for_workload_identity(
|
|
69
|
+
conn: SnowflakeConnection | None,
|
|
70
|
+
) -> None:
|
|
71
|
+
"""Suffix-anchored allowlist that restricts Workload Identity attestation to
|
|
72
|
+
recognized Snowflake hosts before any cloud credential is fetched.
|
|
73
|
+
|
|
74
|
+
When ``conn`` is None there is no destination to send the credential to (e.g.
|
|
75
|
+
unit tests that only exercise attestation creation), so the check is skipped.
|
|
76
|
+
"""
|
|
77
|
+
if conn is None:
|
|
78
|
+
return
|
|
79
|
+
host = conn.host or ""
|
|
80
|
+
if not _is_host_allowed_for_workload_identity(host):
|
|
81
|
+
raise ProgrammingError(
|
|
82
|
+
msg=(
|
|
83
|
+
f"WORKLOAD_IDENTITY requires a recognized Snowflake host "
|
|
84
|
+
f"(*.snowflakecomputing.com, .cn or .mil). Got: '{host}'."
|
|
85
|
+
),
|
|
86
|
+
errno=ER_WIF_UNTRUSTED_HOST,
|
|
87
|
+
)
|
|
88
|
+
|
|
18
89
|
|
|
19
90
|
@unique
|
|
20
91
|
class ApiFederatedAuthenticationType(Enum):
|
|
@@ -88,6 +159,9 @@ class AuthByWorkloadIdentity(AuthByPlugin):
|
|
|
88
159
|
self, *, conn: SnowflakeConnection | None, **kwargs: typing.Any
|
|
89
160
|
) -> None:
|
|
90
161
|
"""Fetch the token."""
|
|
162
|
+
# Verify the host is a recognized Snowflake endpoint before fetching
|
|
163
|
+
# cloud credentials.
|
|
164
|
+
_verify_host_allowed_for_workload_identity(conn)
|
|
91
165
|
self.attestation = create_attestation(
|
|
92
166
|
self.provider,
|
|
93
167
|
self.entra_resource,
|
|
@@ -451,7 +451,8 @@ class SFDictFileCache(SFDictCache):
|
|
|
451
451
|
os.unlink(tmp_file_path)
|
|
452
452
|
self.file_timeout = file_timeout
|
|
453
453
|
self._file_lock_path = f"{self.file_path}.lock"
|
|
454
|
-
self.
|
|
454
|
+
self._file_lock_rebuild_lock = Lock()
|
|
455
|
+
self._new_file_lock()
|
|
455
456
|
self.last_loaded: datetime.datetime | None = None
|
|
456
457
|
if os.path.exists(self.file_path) and load_if_file_exists:
|
|
457
458
|
with self._lock:
|
|
@@ -460,6 +461,33 @@ class SFDictFileCache(SFDictCache):
|
|
|
460
461
|
# SFDictFileCache to determine whether to dump cache to file when _save is called
|
|
461
462
|
self._cache_modified = False
|
|
462
463
|
|
|
464
|
+
def _new_file_lock(self) -> None:
|
|
465
|
+
"""Creates the inter-process file lock owned by the current process."""
|
|
466
|
+
self._file_lock_instance = FileLock(
|
|
467
|
+
self._file_lock_path, timeout=self.file_timeout
|
|
468
|
+
)
|
|
469
|
+
self._file_lock_pid = os.getpid()
|
|
470
|
+
|
|
471
|
+
@property
|
|
472
|
+
def _file_lock(self) -> FileLock:
|
|
473
|
+
"""The inter-process file lock, re-created when we crossed a fork().
|
|
474
|
+
|
|
475
|
+
A FileLock remembers the pid that created it and refuses to be acquired
|
|
476
|
+
by any other process: the underlying OS lock stays owned by the creator,
|
|
477
|
+
so it would grant the caller no mutual exclusion at all. Rebuilding it
|
|
478
|
+
for the multiprocessing "spawn" start method is handled by __setstate__,
|
|
479
|
+
but fork() copies the object without pickling it, so __setstate__ never
|
|
480
|
+
runs and the inherited lock is unusable. Notice the pid change here and
|
|
481
|
+
rebuild instead, which keeps the guarantee the lock is meant to provide.
|
|
482
|
+
"""
|
|
483
|
+
if self._file_lock_pid != os.getpid():
|
|
484
|
+
# Held only for the object construction below, never across I/O.
|
|
485
|
+
with self._file_lock_rebuild_lock:
|
|
486
|
+
# Another thread may have rebuilt the lock in the meantime.
|
|
487
|
+
if self._file_lock_pid != os.getpid():
|
|
488
|
+
self._new_file_lock()
|
|
489
|
+
return self._file_lock_instance
|
|
490
|
+
|
|
463
491
|
def _getitem_non_locking(
|
|
464
492
|
self,
|
|
465
493
|
k: K,
|
|
@@ -684,7 +712,8 @@ class SFDictFileCache(SFDictCache):
|
|
|
684
712
|
self.__dict__.update(state)
|
|
685
713
|
self._cache_modified = False
|
|
686
714
|
self._lock = Lock()
|
|
687
|
-
self.
|
|
715
|
+
self._file_lock_rebuild_lock = Lock()
|
|
716
|
+
self._new_file_lock()
|
|
688
717
|
|
|
689
718
|
def _add_or_remove(self) -> None:
|
|
690
719
|
"""This function gets called when an element is added, or removed.
|