snowflake-connector-python 4.8.0__tar.gz → 4.8.1__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.8.0 → snowflake_connector_python-4.8.1}/CONTRIBUTING.md +2 -2
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/DESCRIPTION.md +10 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/PKG-INFO +14 -5
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/README.md +3 -3
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/setup.cfg +3 -4
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_pandas_tools.py +17 -19
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_result_batch.py +11 -2
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/pandas_tools.py +57 -29
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/result_batch.py +33 -2
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/__init__.py +4 -4
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_collections.py +4 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_version.py +2 -2
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/connection.py +150 -45
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/connectionpool.py +29 -9
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +61 -21
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +5 -7
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/http2/connection.py +3 -2
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/poolmanager.py +28 -4
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/response.py +42 -9
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/request.py +40 -4
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/retry.py +13 -1
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +12 -8
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/url.py +158 -50
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/PKG-INFO +14 -5
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/MANIFEST.in +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/NOTICE +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/SECURITY.md +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/pyproject.toml +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/setup.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_host_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_ocsp_mode.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/README.md +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_connection.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_cursor.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_description.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_network.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_result_set.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_session_manager.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_telemetry.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_time_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_wif_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_auth.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_default.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_okta.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_pat.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/_auth.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/_oauth_base.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/oauth_code.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/workload_identity.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/connection.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/constants.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/cursor.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/interval_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/minicore/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/network.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/os_details.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/session_manager.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -30,8 +30,8 @@ dependencies installed with `snowflake-connector-python` installed as an editabl
|
|
|
30
30
|
Setting up a development environment is super easy with this [one simple tox command](https://tox.wiki/en/legacy/example/devenv.html).
|
|
31
31
|
|
|
32
32
|
```shell
|
|
33
|
-
tox --devenv
|
|
34
|
-
.
|
|
33
|
+
tox --devenv venv311 -e py311
|
|
34
|
+
. venv311/bin/activate
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Note: we suggest using the lowest supported Python version for development.
|
|
@@ -7,6 +7,15 @@ https://docs.snowflake.com/
|
|
|
7
7
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
8
8
|
|
|
9
9
|
# Release Notes
|
|
10
|
+
- v4.8.1(Oct 26,2026)
|
|
11
|
+
- Fixed `write_pandas` identifier quoting. Parquet field paths are quoted, Iceberg option values are escaped string literals, and `quote_identifiers=False` accepts only valid unquoted identifiers.
|
|
12
|
+
- Dropped support for Python 3.10. The minimum supported version is now Python 3.11.
|
|
13
|
+
- Bumped vendored `urllib3` to `2.8.0`. This includes the upstream fix for importing the connector on Python built against OpenSSL 4, where `ssl.PROTOCOL_TLSv1` no longer exists (SNOW-4232077).
|
|
14
|
+
- Fixed large result set batch chunk download logging every transient retry at ERROR level with a traceback. Intermediate retries now log at WARNING; only the final failure after all retries are exhausted logs at ERROR with a traceback. These retry and failure logs now also include the S3 request IDs (`x-amz-request-id` / `x-amz-id-2`) when present, to aid troubleshooting and correlation with AWS-side records (SNOW-4218352).
|
|
15
|
+
- Fixed a spurious `RequestsDependencyWarning` emitted at import time by the vendored `requests` when a newer `chardet` (7.x) or `charset_normalizer` is installed. `check_compatibility()` still requires `chardet >= 3.0.2` and `charset_normalizer >= 2.0.0`, but no longer rejects newer majors (SNOW-3559506).
|
|
16
|
+
- Raised the minimum certifi requirement to 2026.10.18
|
|
17
|
+
- Raised filelock upper bound dependency to allow installation of filelock 4.X.
|
|
18
|
+
|
|
10
19
|
- v4.8.0(Sep 30,2026)
|
|
11
20
|
- Fixed external-browser (SSO) authentication to validate the `Origin` header on the local callback server, rejecting tokens delivered from unexpected origins. A trailing slash in the origin (e.g. `https://account.snowflakecomputing.com/`) is now accepted on par with the bare origin, matching JDBC and other driver behaviour. Preconnect probe connections (empty recv) no longer count against the retry budget and no longer abort the login flow.
|
|
12
21
|
- Added the `SNOWFLAKE_TLS_CIPHERS` environment variable to restrict which TLS ciphers the connector offers. It takes a colon-separated list; names beginning with `TLS_` are applied as TLS 1.3 cipher suites and the remainder as the cipher list for TLS 1.2 and below, so a single variable covers both. Leaving it unset keeps OpenSSL's defaults unchanged, and an unrecognized cipher name is rejected rather than silently ignored. The restriction covers Snowflake API traffic, cloud-storage (stage) transfers, OCSP/CRL fetches and IdP requests. Requests issued by the AWS and Azure SDKs, and asynchronous connections, are not covered — for TLS 1.3 suites specifically they cannot be, because the Python standard library exposes no API for restricting them.
|
|
@@ -39,6 +48,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
39
48
|
- Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
|
|
40
49
|
- When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
|
|
41
50
|
- 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.
|
|
51
|
+
- Please review [Snowflake documentation](https://docs.snowflake.com/en/release-notes/clients-drivers/python-connector-2026#version-473-sep-3-2026) for possible implications to your workflow
|
|
42
52
|
- 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.
|
|
43
53
|
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
44
54
|
- 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).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 4.8.
|
|
3
|
+
Version: 4.8.1
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -22,7 +22,6 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
22
22
|
Classifier: Operating System :: OS Independent
|
|
23
23
|
Classifier: Programming Language :: Python :: 3
|
|
24
24
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
25
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
26
25
|
Classifier: Programming Language :: Python :: 3.11
|
|
27
26
|
Classifier: Programming Language :: Python :: 3.12
|
|
28
27
|
Classifier: Programming Language :: Python :: 3.13
|
|
@@ -35,7 +34,7 @@ Classifier: Topic :: Software Development
|
|
|
35
34
|
Classifier: Topic :: Software Development :: Libraries
|
|
36
35
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
37
36
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
38
|
-
Requires-Python: >=3.
|
|
37
|
+
Requires-Python: >=3.11
|
|
39
38
|
Description-Content-Type: text/markdown
|
|
40
39
|
License-File: LICENSE.txt
|
|
41
40
|
License-File: NOTICE
|
|
@@ -48,9 +47,9 @@ Requires-Dist: requests<3.0.0,>=2.32.4
|
|
|
48
47
|
Requires-Dist: packaging
|
|
49
48
|
Requires-Dist: charset_normalizer<4,>=2
|
|
50
49
|
Requires-Dist: idna<4,>=3.7
|
|
51
|
-
Requires-Dist: certifi>=
|
|
50
|
+
Requires-Dist: certifi>=2026.10.18
|
|
52
51
|
Requires-Dist: typing_extensions<5,>=4.3
|
|
53
|
-
Requires-Dist: filelock<
|
|
52
|
+
Requires-Dist: filelock<5,>=3.12
|
|
54
53
|
Requires-Dist: sortedcontainers>=2.4.0
|
|
55
54
|
Requires-Dist: platformdirs<5.0.0,>=2.6.0
|
|
56
55
|
Requires-Dist: tomlkit
|
|
@@ -97,6 +96,15 @@ https://docs.snowflake.com/
|
|
|
97
96
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
98
97
|
|
|
99
98
|
# Release Notes
|
|
99
|
+
- v4.8.1(Oct 26,2026)
|
|
100
|
+
- Fixed `write_pandas` identifier quoting. Parquet field paths are quoted, Iceberg option values are escaped string literals, and `quote_identifiers=False` accepts only valid unquoted identifiers.
|
|
101
|
+
- Dropped support for Python 3.10. The minimum supported version is now Python 3.11.
|
|
102
|
+
- Bumped vendored `urllib3` to `2.8.0`. This includes the upstream fix for importing the connector on Python built against OpenSSL 4, where `ssl.PROTOCOL_TLSv1` no longer exists (SNOW-4232077).
|
|
103
|
+
- Fixed large result set batch chunk download logging every transient retry at ERROR level with a traceback. Intermediate retries now log at WARNING; only the final failure after all retries are exhausted logs at ERROR with a traceback. These retry and failure logs now also include the S3 request IDs (`x-amz-request-id` / `x-amz-id-2`) when present, to aid troubleshooting and correlation with AWS-side records (SNOW-4218352).
|
|
104
|
+
- Fixed a spurious `RequestsDependencyWarning` emitted at import time by the vendored `requests` when a newer `chardet` (7.x) or `charset_normalizer` is installed. `check_compatibility()` still requires `chardet >= 3.0.2` and `charset_normalizer >= 2.0.0`, but no longer rejects newer majors (SNOW-3559506).
|
|
105
|
+
- Raised the minimum certifi requirement to 2026.10.18
|
|
106
|
+
- Raised filelock upper bound dependency to allow installation of filelock 4.X.
|
|
107
|
+
|
|
100
108
|
- v4.8.0(Sep 30,2026)
|
|
101
109
|
- Fixed external-browser (SSO) authentication to validate the `Origin` header on the local callback server, rejecting tokens delivered from unexpected origins. A trailing slash in the origin (e.g. `https://account.snowflakecomputing.com/`) is now accepted on par with the bare origin, matching JDBC and other driver behaviour. Preconnect probe connections (empty recv) no longer count against the retry budget and no longer abort the login flow.
|
|
102
110
|
- Added the `SNOWFLAKE_TLS_CIPHERS` environment variable to restrict which TLS ciphers the connector offers. It takes a colon-separated list; names beginning with `TLS_` are applied as TLS 1.3 cipher suites and the remainder as the cipher list for TLS 1.2 and below, so a single variable covers both. Leaving it unset keeps OpenSSL's defaults unchanged, and an unrecognized cipher name is rejected rather than silently ignored. The restriction covers Snowflake API traffic, cloud-storage (stage) transfers, OCSP/CRL fetches and IdP requests. Requests issued by the AWS and Azure SDKs, and asynchronous connections, are not covered — for TLS 1.3 suites specifically they cannot be, because the Python standard library exposes no API for restricting them.
|
|
@@ -129,6 +137,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
129
137
|
- Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
|
|
130
138
|
- When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
|
|
131
139
|
- 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.
|
|
140
|
+
- Please review [Snowflake documentation](https://docs.snowflake.com/en/release-notes/clients-drivers/python-connector-2026#version-473-sep-3-2026) for possible implications to your workflow
|
|
132
141
|
- 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.
|
|
133
142
|
- Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
|
|
134
143
|
- 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).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Snowflake Connector for Python
|
|
2
2
|
|
|
3
3
|
> [!IMPORTANT]
|
|
4
|
-
>
|
|
4
|
+
> Version 5.0.0 of the Snowflake Connector for Python has been released. Development has moved to [snowflakedb/drivers](https://github.com/snowflakedb/drivers). See the [documentation](https://docs.snowflake.com/en/developer-guide/universal-core/universal-core) for more information.
|
|
5
5
|
|
|
6
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.
|
|
7
7
|
|
|
@@ -12,7 +12,7 @@ using the Snowflake JDBC or ODBC drivers.
|
|
|
12
12
|
|
|
13
13
|
The connector has **no** dependencies on JDBC or ODBC.
|
|
14
14
|
It can be installed using ``pip`` on Linux, Mac OSX, and Windows platforms
|
|
15
|
-
where Python 3.
|
|
15
|
+
where Python 3.11.0 (or higher) is installed.
|
|
16
16
|
|
|
17
17
|
Snowflake Documentation is available at:
|
|
18
18
|
https://docs.snowflake.com/
|
|
@@ -39,7 +39,7 @@ Find the `snowflake_connector_python*.whl` package in the `./dist` directory.
|
|
|
39
39
|
### In Docker
|
|
40
40
|
Or use our Dockerized build script `ci/build_docker.sh` and find the built wheel files in `dist/repaired_wheels`.
|
|
41
41
|
|
|
42
|
-
Note: `ci/build_docker.sh` can be used to compile only certain versions, like this: `ci/build_docker.sh "3.
|
|
42
|
+
Note: `ci/build_docker.sh` can be used to compile only certain versions, like this: `ci/build_docker.sh "3.11 3.12"`
|
|
43
43
|
|
|
44
44
|
## Code hygiene and other utilities
|
|
45
45
|
These tools are integrated into `tox` to allow us to easily set them up universally on any computer.
|
|
@@ -20,7 +20,6 @@ classifiers =
|
|
|
20
20
|
Operating System :: OS Independent
|
|
21
21
|
Programming Language :: Python :: 3
|
|
22
22
|
Programming Language :: Python :: 3 :: Only
|
|
23
|
-
Programming Language :: Python :: 3.10
|
|
24
23
|
Programming Language :: Python :: 3.11
|
|
25
24
|
Programming Language :: Python :: 3.12
|
|
26
25
|
Programming Language :: Python :: 3.13
|
|
@@ -41,7 +40,7 @@ project_urls =
|
|
|
41
40
|
Changelog=https://github.com/snowflakedb/snowflake-connector-python/blob/main/DESCRIPTION.md
|
|
42
41
|
|
|
43
42
|
[options]
|
|
44
|
-
python_requires = >=3.
|
|
43
|
+
python_requires = >=3.11
|
|
45
44
|
packages = find_namespace:
|
|
46
45
|
install_requires =
|
|
47
46
|
asn1crypto>0.24.0,<2.0.0
|
|
@@ -53,9 +52,9 @@ install_requires =
|
|
|
53
52
|
packaging
|
|
54
53
|
charset_normalizer>=2,<4
|
|
55
54
|
idna>=3.7,<4
|
|
56
|
-
certifi>=
|
|
55
|
+
certifi>=2026.10.18
|
|
57
56
|
typing_extensions>=4.3,<5
|
|
58
|
-
filelock>=3.5
|
|
57
|
+
filelock>=3.12,<5
|
|
59
58
|
sortedcontainers>=2.4.0
|
|
60
59
|
platformdirs>=2.6.0,<5.0.0
|
|
61
60
|
tomlkit
|
|
@@ -12,6 +12,8 @@ from snowflake.connector.options import pandas
|
|
|
12
12
|
# Import utilities from sync version
|
|
13
13
|
from snowflake.connector.pandas_tools import (
|
|
14
14
|
_iceberg_config_statement_helper,
|
|
15
|
+
_quote_sql_identifier,
|
|
16
|
+
_sql_column_identifier,
|
|
15
17
|
build_location_helper,
|
|
16
18
|
chunk_helper,
|
|
17
19
|
)
|
|
@@ -240,7 +242,8 @@ async def write_pandas(
|
|
|
240
242
|
https://docs.snowflake.com/en/sql-reference/sql/put.html#optional-parameters (Default value = 4).
|
|
241
243
|
quote_identifiers: By default, identifiers, specifically database, schema, table and column names
|
|
242
244
|
(from df.columns) will be quoted. If set to False, identifiers are passed on to Snowflake without quoting.
|
|
243
|
-
I.e. identifiers will be coerced to uppercase by Snowflake.
|
|
245
|
+
I.e. identifiers will be coerced to uppercase by Snowflake. Column names in this mode must be valid
|
|
246
|
+
Snowflake unquoted identifiers. (Default value = True)
|
|
244
247
|
infer_schema: Perform explicit schema inference on the data in the DataFrame and use the inferred data types
|
|
245
248
|
when selecting columns from the DataFrame. (Default value = False)
|
|
246
249
|
auto_create_table: When true, will automatically create a table with corresponding columns for each column in
|
|
@@ -335,6 +338,15 @@ async def write_pandas(
|
|
|
335
338
|
else:
|
|
336
339
|
sql_use_logical_type = " USE_LOGICAL_TYPE = FALSE"
|
|
337
340
|
|
|
341
|
+
# Validate/quote column names before creating temp objects or uploading.
|
|
342
|
+
# `$1:"field"` path syntax does not support IDENTIFIER(?) or ? bindings; always quote it.
|
|
343
|
+
# quote_identifiers only controls CREATE/COPY column lists (case-folding), not the parquet path.
|
|
344
|
+
snowflake_column_names = [
|
|
345
|
+
_sql_column_identifier(c, quote_identifiers) for c in df.columns
|
|
346
|
+
]
|
|
347
|
+
parquet_field_names = [_quote_sql_identifier(c) for c in df.columns]
|
|
348
|
+
columns = ",".join(snowflake_column_names)
|
|
349
|
+
|
|
338
350
|
cursor = conn.cursor()
|
|
339
351
|
stage_location = await _create_temp_stage(
|
|
340
352
|
cursor,
|
|
@@ -373,18 +385,6 @@ async def write_pandas(
|
|
|
373
385
|
options={"parallel": parallel, "source_compression": "auto_detect"},
|
|
374
386
|
)
|
|
375
387
|
|
|
376
|
-
# in Snowflake, all parquet data is stored in a single column, $1, so we must select columns explicitly
|
|
377
|
-
# see (https://docs.snowflake.com/en/user-guide/script-data-load-transform-parquet.html)
|
|
378
|
-
if quote_identifiers:
|
|
379
|
-
quote = '"'
|
|
380
|
-
# if the column name contains a double quote, we need to escape it by replacing with two double quotes
|
|
381
|
-
# https://docs.snowflake.com/en/sql-reference/identifiers-syntax#double-quoted-identifiers
|
|
382
|
-
snowflake_column_names = [str(c).replace('"', '""') for c in df.columns]
|
|
383
|
-
else:
|
|
384
|
-
quote = ""
|
|
385
|
-
snowflake_column_names = list(df.columns)
|
|
386
|
-
columns = quote + f"{quote},{quote}".join(snowflake_column_names) + quote
|
|
387
|
-
|
|
388
388
|
async def drop_object(name: str, object_type: str) -> None:
|
|
389
389
|
drop_sql = f"DROP {object_type.upper()} IF EXISTS identifier(?) /* Python:snowflake.connector.aio._pandas_tools.write_pandas() */"
|
|
390
390
|
params = (name,)
|
|
@@ -427,7 +427,7 @@ async def write_pandas(
|
|
|
427
427
|
# columns in order
|
|
428
428
|
create_table_columns = ", ".join(
|
|
429
429
|
[
|
|
430
|
-
f"{
|
|
430
|
+
f"{snowflake_col} {column_type_mapping[col]}"
|
|
431
431
|
for snowflake_col, col in zip(snowflake_column_names, df.columns)
|
|
432
432
|
]
|
|
433
433
|
)
|
|
@@ -468,8 +468,8 @@ async def write_pandas(
|
|
|
468
468
|
|
|
469
469
|
# need explicit casting when the underlying table schema is inferred
|
|
470
470
|
parquet_columns = "$1:" + ",$1:".join(
|
|
471
|
-
f"{
|
|
472
|
-
for
|
|
471
|
+
f"{parquet_field}::{column_type_mapping[col]}"
|
|
472
|
+
for parquet_field, col in zip(parquet_field_names, df.columns)
|
|
473
473
|
)
|
|
474
474
|
else:
|
|
475
475
|
target_table_location = build_location_helper(
|
|
@@ -478,9 +478,7 @@ async def write_pandas(
|
|
|
478
478
|
name=table_name,
|
|
479
479
|
quote_identifiers=quote_identifiers,
|
|
480
480
|
)
|
|
481
|
-
parquet_columns = "$1:" + ",$1:".join(
|
|
482
|
-
f"{quote}{snowflake_col}{quote}" for snowflake_col in snowflake_column_names
|
|
483
|
-
)
|
|
481
|
+
parquet_columns = "$1:" + ",$1:".join(parquet_field_names)
|
|
484
482
|
|
|
485
483
|
try:
|
|
486
484
|
if overwrite and (not auto_create_table):
|
|
@@ -34,6 +34,7 @@ from snowflake.connector.result_batch import RemoteChunkInfo
|
|
|
34
34
|
from snowflake.connector.result_batch import ResultBatch as ResultBatchSync
|
|
35
35
|
from snowflake.connector.result_batch import (
|
|
36
36
|
_create_nanoarrow_iterator,
|
|
37
|
+
_s3_request_id_log_suffix,
|
|
37
38
|
inline_first_chunk_rowcount,
|
|
38
39
|
)
|
|
39
40
|
from snowflake.connector.secret_detector import SecretDetector
|
|
@@ -232,6 +233,7 @@ class ResultBatch(ResultBatchSync):
|
|
|
232
233
|
|
|
233
234
|
content, encoding = None, None
|
|
234
235
|
for retry in range(max(MAX_DOWNLOAD_RETRY, 1)):
|
|
236
|
+
amz_request_id_suffix = ""
|
|
235
237
|
try:
|
|
236
238
|
|
|
237
239
|
async with TimerContextManager() as download_metric:
|
|
@@ -284,6 +286,7 @@ class ResultBatch(ResultBatchSync):
|
|
|
284
286
|
) as session:
|
|
285
287
|
response, content, encoding = await download_chunk(session)
|
|
286
288
|
|
|
289
|
+
amz_request_id_suffix = _s3_request_id_log_suffix(response)
|
|
287
290
|
if response.status == OK:
|
|
288
291
|
break
|
|
289
292
|
# Raise error here to correctly go in to exception clause
|
|
@@ -301,12 +304,18 @@ class ResultBatch(ResultBatchSync):
|
|
|
301
304
|
if retry == MAX_DOWNLOAD_RETRY - 1:
|
|
302
305
|
# Re-throw if we failed on the last retry
|
|
303
306
|
e = e.args[0] if isinstance(e, RetryRequest) else e
|
|
307
|
+
logger.error(
|
|
308
|
+
f"Failed to fetch the large result set batch "
|
|
309
|
+
f"{self.id} after {MAX_DOWNLOAD_RETRY} attempts, "
|
|
310
|
+
f"giving up for the reason: '{e}'{amz_request_id_suffix}",
|
|
311
|
+
exc_info=True,
|
|
312
|
+
)
|
|
304
313
|
raise e
|
|
305
314
|
sleep_timer = next(backoff)
|
|
306
|
-
logger.
|
|
315
|
+
logger.warning(
|
|
307
316
|
f"Failed to fetch the large result set batch "
|
|
308
317
|
f"{self.id} for the {retry + 1} th time, "
|
|
309
|
-
f"backing off for {sleep_timer}s for the reason: '{e}'"
|
|
318
|
+
f"backing off for {sleep_timer}s for the reason: '{e}'{amz_request_id_suffix}"
|
|
310
319
|
)
|
|
311
320
|
await asyncio.sleep(sleep_timer)
|
|
312
321
|
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import collections.abc
|
|
4
4
|
import os
|
|
5
|
+
import re
|
|
5
6
|
import warnings
|
|
6
7
|
from functools import partial
|
|
7
8
|
from logging import getLogger
|
|
@@ -41,6 +42,36 @@ T = TypeVar("T", bound=collections.abc.Sequence)
|
|
|
41
42
|
|
|
42
43
|
logger = getLogger(__name__)
|
|
43
44
|
|
|
45
|
+
# Snowflake unquoted identifiers: start with letter/underscore, then alnum/_/$.
|
|
46
|
+
# https://docs.snowflake.com/en/sql-reference/identifiers-syntax
|
|
47
|
+
_UNQUOTED_IDENTIFIER_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_$]*$")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _quote_sql_identifier(name: str) -> str:
|
|
51
|
+
"""Double-quote a SQL identifier, escaping internal double quotes."""
|
|
52
|
+
return '"' + str(name).replace('"', '""') + '"'
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _sql_column_identifier(name: str, quote_identifiers: bool) -> str:
|
|
56
|
+
"""Format a DataFrame column name for interpolation into DDL/DML.
|
|
57
|
+
|
|
58
|
+
When quote_identifiers is True, the name is always emitted as a quoted
|
|
59
|
+
identifier. When False, the name is left unquoted so Snowflake can
|
|
60
|
+
case-fold it, but only if it is a valid unquoted identifier — otherwise
|
|
61
|
+
SQL metacharacters in the name would be interpolated as SQL.
|
|
62
|
+
"""
|
|
63
|
+
name = str(name)
|
|
64
|
+
if quote_identifiers:
|
|
65
|
+
return _quote_sql_identifier(name)
|
|
66
|
+
if not _UNQUOTED_IDENTIFIER_RE.fullmatch(name):
|
|
67
|
+
raise ProgrammingError(
|
|
68
|
+
f"Invalid unquoted identifier {name!r}. Column names used with "
|
|
69
|
+
"quote_identifiers=False must be valid Snowflake unquoted identifiers "
|
|
70
|
+
"(letter or underscore, then letters, digits, underscores, or dollar "
|
|
71
|
+
"signs). Set quote_identifiers=True to use arbitrary column names."
|
|
72
|
+
)
|
|
73
|
+
return name
|
|
74
|
+
|
|
44
75
|
|
|
45
76
|
def chunk_helper(
|
|
46
77
|
lst: pandas.DataFrame, n: int
|
|
@@ -207,17 +238,18 @@ def _create_temp_file_format(
|
|
|
207
238
|
return file_format_location
|
|
208
239
|
|
|
209
240
|
|
|
210
|
-
def _convert_value_to_sql_option(value:
|
|
241
|
+
def _convert_value_to_sql_option(value: str | bool | int | float) -> str:
|
|
242
|
+
"""Convert a Python value to a SQL option literal for iceberg config.
|
|
243
|
+
|
|
244
|
+
String values are always emitted as one escaped single-quoted literal,
|
|
245
|
+
including values that already start and end with quotes. Backslashes are
|
|
246
|
+
doubled before quotes because Snowflake treats ``\\`` as an escape inside
|
|
247
|
+
``'...'``.
|
|
248
|
+
"""
|
|
211
249
|
if isinstance(value, str):
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
value = value.replace(
|
|
216
|
-
"'", "''"
|
|
217
|
-
) # escape single quotes before adding a pair of quotes
|
|
218
|
-
return f"'{value}'"
|
|
219
|
-
else:
|
|
220
|
-
return str(value)
|
|
250
|
+
escaped = value.replace("\\", "\\\\").replace("'", "''")
|
|
251
|
+
return f"'{escaped}'"
|
|
252
|
+
return str(value)
|
|
221
253
|
|
|
222
254
|
|
|
223
255
|
def _iceberg_config_statement_helper(iceberg_config: dict[str, str]) -> str:
|
|
@@ -316,7 +348,8 @@ def write_pandas(
|
|
|
316
348
|
https://docs.snowflake.com/en/sql-reference/sql/put.html#optional-parameters (Default value = 4).
|
|
317
349
|
quote_identifiers: By default, identifiers, specifically database, schema, table and column names
|
|
318
350
|
(from df.columns) will be quoted. If set to False, identifiers are passed on to Snowflake without quoting.
|
|
319
|
-
I.e. identifiers will be coerced to uppercase by Snowflake.
|
|
351
|
+
I.e. identifiers will be coerced to uppercase by Snowflake. Column names in this mode must be valid
|
|
352
|
+
Snowflake unquoted identifiers. (Default value = True)
|
|
320
353
|
infer_schema: Perform explicit schema inference on the data in the DataFrame and use the inferred data types
|
|
321
354
|
when selecting columns from the DataFrame. (Default value = False)
|
|
322
355
|
auto_create_table: When true, will automatically create a table with corresponding columns for each column in
|
|
@@ -422,6 +455,15 @@ def write_pandas(
|
|
|
422
455
|
else:
|
|
423
456
|
sql_use_logical_type = " USE_LOGICAL_TYPE = FALSE"
|
|
424
457
|
|
|
458
|
+
# Validate/quote column names before creating temp objects or uploading.
|
|
459
|
+
# `$1:"field"` path syntax does not support IDENTIFIER(?) or ? bindings; always quote it.
|
|
460
|
+
# quote_identifiers only controls CREATE/COPY column lists (case-folding), not the parquet path.
|
|
461
|
+
snowflake_column_names = [
|
|
462
|
+
_sql_column_identifier(c, quote_identifiers) for c in df.columns
|
|
463
|
+
]
|
|
464
|
+
parquet_field_names = [_quote_sql_identifier(c) for c in df.columns]
|
|
465
|
+
columns = ",".join(snowflake_column_names)
|
|
466
|
+
|
|
425
467
|
cursor = conn.cursor()
|
|
426
468
|
stage_location = _create_temp_stage(
|
|
427
469
|
cursor,
|
|
@@ -460,18 +502,6 @@ def write_pandas(
|
|
|
460
502
|
options={"parallel": parallel, "source_compression": "auto_detect"},
|
|
461
503
|
)
|
|
462
504
|
|
|
463
|
-
# in Snowflake, all parquet data is stored in a single column, $1, so we must select columns explicitly
|
|
464
|
-
# see (https://docs.snowflake.com/en/user-guide/script-data-load-transform-parquet.html)
|
|
465
|
-
if quote_identifiers:
|
|
466
|
-
quote = '"'
|
|
467
|
-
# if the column name contains a double quote, we need to escape it by replacing with two double quotes
|
|
468
|
-
# https://docs.snowflake.com/en/sql-reference/identifiers-syntax#double-quoted-identifiers
|
|
469
|
-
snowflake_column_names = [str(c).replace('"', '""') for c in df.columns]
|
|
470
|
-
else:
|
|
471
|
-
quote = ""
|
|
472
|
-
snowflake_column_names = list(df.columns)
|
|
473
|
-
columns = quote + f"{quote},{quote}".join(snowflake_column_names) + quote
|
|
474
|
-
|
|
475
505
|
def drop_object(name: str, object_type: str) -> None:
|
|
476
506
|
drop_sql = f"DROP {object_type.upper()} IF EXISTS identifier(?) /* Python:snowflake.connector.pandas_tools.write_pandas() */"
|
|
477
507
|
params = (name,)
|
|
@@ -512,7 +542,7 @@ def write_pandas(
|
|
|
512
542
|
# columns in order
|
|
513
543
|
create_table_columns = ", ".join(
|
|
514
544
|
[
|
|
515
|
-
f"{
|
|
545
|
+
f"{snowflake_col} {column_type_mapping[col]}"
|
|
516
546
|
for snowflake_col, col in zip(snowflake_column_names, df.columns)
|
|
517
547
|
]
|
|
518
548
|
)
|
|
@@ -553,8 +583,8 @@ def write_pandas(
|
|
|
553
583
|
|
|
554
584
|
# need explicit casting when the underlying table schema is inferred
|
|
555
585
|
parquet_columns = "$1:" + ",$1:".join(
|
|
556
|
-
f"{
|
|
557
|
-
for
|
|
586
|
+
f"{parquet_field}::{column_type_mapping[col]}"
|
|
587
|
+
for parquet_field, col in zip(parquet_field_names, df.columns)
|
|
558
588
|
)
|
|
559
589
|
else:
|
|
560
590
|
target_table_location = build_location_helper(
|
|
@@ -563,9 +593,7 @@ def write_pandas(
|
|
|
563
593
|
name=table_name,
|
|
564
594
|
quote_identifiers=quote_identifiers,
|
|
565
595
|
)
|
|
566
|
-
parquet_columns = "$1:" + ",$1:".join(
|
|
567
|
-
f"{quote}{snowflake_col}{quote}" for snowflake_col in snowflake_column_names
|
|
568
|
-
)
|
|
596
|
+
parquet_columns = "$1:" + ",$1:".join(parquet_field_names)
|
|
569
597
|
|
|
570
598
|
try:
|
|
571
599
|
if overwrite and (not auto_create_table):
|
|
@@ -55,6 +55,29 @@ MAX_INLINE_RESULT_RETRY = 1
|
|
|
55
55
|
MAX_INCOMPLETE_CHUNK_RETRY = 1
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
def _s3_request_id_log_suffix(response: Response | None) -> str:
|
|
59
|
+
"""Return a ``', S3 request id: ..., S3 extended request id: ...'`` log suffix, or ``''``.
|
|
60
|
+
|
|
61
|
+
S3 returns these trace headers (``x-amz-request-id`` / ``x-amz-id-2``) on every
|
|
62
|
+
response, including error responses, so surfacing them in the retry/failure logs
|
|
63
|
+
lets support correlate a failed chunk download with AWS-side records. Empty string
|
|
64
|
+
when no response arrived (pure network failure) or the headers are absent (non-S3
|
|
65
|
+
stage).
|
|
66
|
+
"""
|
|
67
|
+
headers = getattr(response, "headers", None)
|
|
68
|
+
if headers is None or not hasattr(headers, "get"):
|
|
69
|
+
return ""
|
|
70
|
+
parts = []
|
|
71
|
+
for name, label in (
|
|
72
|
+
("x-amz-request-id", "S3 request id"),
|
|
73
|
+
("x-amz-id-2", "S3 extended request id"),
|
|
74
|
+
):
|
|
75
|
+
value = headers.get(name)
|
|
76
|
+
if isinstance(value, str) and value:
|
|
77
|
+
parts.append(f"{label}: {value}")
|
|
78
|
+
return f", {', '.join(parts)}" if parts else ""
|
|
79
|
+
|
|
80
|
+
|
|
58
81
|
def inline_first_chunk_rowcount(data: dict[str, Any]) -> int:
|
|
59
82
|
"""Rows attributed to the inline first chunk: ``total`` minus remote chunk rowCounts.
|
|
60
83
|
|
|
@@ -520,6 +543,7 @@ class ResultBatch(abc.ABC):
|
|
|
520
543
|
else exponential_backoff()()
|
|
521
544
|
)
|
|
522
545
|
for retry in range(MAX_DOWNLOAD_RETRY):
|
|
546
|
+
amz_request_id_suffix = ""
|
|
523
547
|
try:
|
|
524
548
|
with TimerContextManager() as download_metric:
|
|
525
549
|
logger.debug(f"started downloading result batch id: {self.id}")
|
|
@@ -560,6 +584,7 @@ class ResultBatch(abc.ABC):
|
|
|
560
584
|
)
|
|
561
585
|
response = local_session_manager.get(**request_data)
|
|
562
586
|
|
|
587
|
+
amz_request_id_suffix = _s3_request_id_log_suffix(response)
|
|
563
588
|
if response.status_code == OK:
|
|
564
589
|
logger.debug(
|
|
565
590
|
f"successfully downloaded result batch id: {self.id}"
|
|
@@ -581,12 +606,18 @@ class ResultBatch(abc.ABC):
|
|
|
581
606
|
if retry == MAX_DOWNLOAD_RETRY - 1:
|
|
582
607
|
# Re-throw if we failed on the last retry
|
|
583
608
|
e = e.args[0] if isinstance(e, RetryRequest) else e
|
|
609
|
+
logger.error(
|
|
610
|
+
f"Failed to fetch the large result set batch "
|
|
611
|
+
f"{self.id} after {MAX_DOWNLOAD_RETRY} attempts, "
|
|
612
|
+
f"giving up for the reason: '{e}'{amz_request_id_suffix}",
|
|
613
|
+
exc_info=True,
|
|
614
|
+
)
|
|
584
615
|
raise e
|
|
585
616
|
sleep_timer = next(backoff)
|
|
586
|
-
logger.
|
|
617
|
+
logger.warning(
|
|
587
618
|
f"Failed to fetch the large result set batch "
|
|
588
619
|
f"{self.id} for the {retry + 1} th time, "
|
|
589
|
-
f"backing off for {sleep_timer}s for the reason: '{e}'"
|
|
620
|
+
f"backing off for {sleep_timer}s for the reason: '{e}'{amz_request_id_suffix}"
|
|
590
621
|
)
|
|
591
622
|
time.sleep(sleep_timer)
|
|
592
623
|
|
|
@@ -75,13 +75,13 @@ def check_compatibility(urllib3_version, chardet_version, charset_normalizer_ver
|
|
|
75
75
|
if chardet_version:
|
|
76
76
|
major, minor, patch = chardet_version.split(".")[:3]
|
|
77
77
|
major, minor, patch = int(major), int(minor), int(patch)
|
|
78
|
-
# chardet_version >= 3.0.2
|
|
79
|
-
assert (3, 0, 2) <= (major, minor, patch)
|
|
78
|
+
# chardet_version >= 3.0.2
|
|
79
|
+
assert (3, 0, 2) <= (major, minor, patch)
|
|
80
80
|
elif charset_normalizer_version:
|
|
81
81
|
major, minor, patch = charset_normalizer_version.split(".")[:3]
|
|
82
82
|
major, minor, patch = int(major), int(minor), int(patch)
|
|
83
|
-
# charset_normalizer >= 2.0.0
|
|
84
|
-
assert (2, 0, 0) <= (major, minor, patch)
|
|
83
|
+
# charset_normalizer >= 2.0.0
|
|
84
|
+
assert (2, 0, 0) <= (major, minor, patch)
|
|
85
85
|
else:
|
|
86
86
|
warnings.warn(
|
|
87
87
|
"Unable to find acceptable character detection dependency "
|
|
@@ -400,6 +400,9 @@ class HTTPHeaderDict(typing.MutableMapping[str, str]):
|
|
|
400
400
|
"""
|
|
401
401
|
Remove content-specific header fields before changing the request
|
|
402
402
|
method to GET or HEAD according to RFC 9110, Section 15.4.
|
|
403
|
+
|
|
404
|
+
``Transfer-Encoding`` goes as well: it frames a request body that is
|
|
405
|
+
no longer going to be sent.
|
|
403
406
|
"""
|
|
404
407
|
content_specific_headers = [
|
|
405
408
|
"Content-Encoding",
|
|
@@ -409,6 +412,7 @@ class HTTPHeaderDict(typing.MutableMapping[str, str]):
|
|
|
409
412
|
"Content-Length",
|
|
410
413
|
"Digest",
|
|
411
414
|
"Last-Modified",
|
|
415
|
+
"Transfer-Encoding",
|
|
412
416
|
]
|
|
413
417
|
for header in content_specific_headers:
|
|
414
418
|
self.discard(header)
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.
|
|
22
|
-
__version_tuple__ = version_tuple = (2,
|
|
21
|
+
__version__ = version = '2.8.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 8, 0)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|