snowflake-connector-python 4.1.1__tar.gz → 4.3.0__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.1.1 → snowflake_connector_python-4.3.0}/DESCRIPTION.md +16 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/MANIFEST.in +4 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/PKG-INFO +18 -2
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/README.md +3 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/pyproject.toml +5 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/setup.cfg +8 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/setup.py +0 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/__init__.py +10 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/_utils.py +370 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/README.md +88 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/__init__.py +163 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_azure_storage_client.py +227 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_bind_upload_agent.py +69 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_connection.py +1216 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_cursor.py +1402 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_description.py +5 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_direct_file_operation_utils.py +88 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_file_transfer_agent.py +316 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_gcs_storage_client.py +360 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_network.py +860 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_ocsp_asn1crypto.py +51 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_ocsp_snowflake.py +608 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_pandas_tools.py +561 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_result_batch.py +442 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_result_set.py +309 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_s3_storage_client.py +460 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_session_manager.py +588 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_storage_client.py +331 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_telemetry.py +97 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_time_util.py +57 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/_wif_util.py +324 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/__init__.py +52 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_auth.py +401 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_by_plugin.py +131 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_default.py +28 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_idtoken.py +54 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_keypair.py +60 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_no_auth.py +31 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_oauth.py +27 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_oauth_code.py +117 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_oauth_credentials.py +100 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_okta.py +247 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_pat.py +27 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_usrpwdmfa.py +30 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_webbrowser.py +405 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/aio/auth/_workload_identity.py +60 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/arrow_context.py +8 -4
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/_auth.py +27 -3
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/_oauth_base.py +21 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/keypair.py +5 -2
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/oauth_code.py +5 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/oauth_credentials.py +3 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/workload_identity.py +1 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/connection.py +61 -10
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/constants.py +1 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter.py +3 -2
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/cursor.py +99 -9
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/description.py +2 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/errors.py +29 -9
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/externals_utils/externals_setup.py +3 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/interval_util.py +26 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +14 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +13 -7
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +4 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +3 -3
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +2 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +9 -3
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ocsp_asn1crypto.py +1 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ocsp_snowflake.py +36 -11
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/options.py +25 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/os_details.py +88 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/result_batch.py +69 -14
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/result_set.py +26 -5
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/session_manager.py +4 -3
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/telemetry.py +3 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/test_util.py +2 -2
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/url_util.py +6 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_collections.py +8 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_version.py +16 -3
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/connection.py +6 -0
- snowflake_connector_python-4.3.0/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +1 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +6 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +8 -8
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +6 -8
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +2 -2
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +1 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +2 -2
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/http2/connection.py +4 -4
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +9 -11
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/response.py +276 -103
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/request.py +11 -14
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +16 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +11 -8
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/PKG-INFO +18 -2
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +40 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/requires.txt +1 -0
- snowflake_connector_python-4.1.1/src/snowflake/connector/_utils.py +0 -98
- snowflake_connector_python-4.1.1/src/snowflake/connector/interval_util.py +0 -17
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/LICENSE.txt +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/NOTICE +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/SECURITY.md +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/_http_server.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/no_auth.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/crl.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/crl_cache.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/externals_utils/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_lock.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/logging_utils/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/logging_utils/filters.py +0 -0
- {snowflake_connector_python-4.1.1/src/snowflake/connector/tool → snowflake_connector_python-4.3.0/src/snowflake/connector/minicore}/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/network.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/platform_detection.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/token_cache.py +0 -0
- {snowflake_connector_python-4.1.1/src/snowflake/connector/vendored/urllib3/contrib → snowflake_connector_python-4.3.0/src/snowflake/connector/tool}/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/packages.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake/connector/wif_util.py +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-4.1.1 → snowflake_connector_python-4.3.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,7 +7,22 @@ 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.
|
|
10
|
+
- v4.3.0(February 12,2026)
|
|
11
|
+
- Ensured proper list conversion - the converter runs to_snowflake on all list elements.
|
|
12
|
+
- Made the parameter `server_session_keep_alive` in `SnowflakeConnection` skip checking for pending async queries, providing faster connection close times especially when many async queries are executed.
|
|
13
|
+
- Fix string representation of INTERVAL YEAR and INTERVAL MONTH types.
|
|
14
|
+
- Log a warning when using http protocol for OAuth urls.
|
|
15
|
+
- Deprecated support for custom revocation error classes in OCSP response cache deserialization. By default, only `RevocationCheckError` exceptions are deserialized from OCSP cache. Custom exception classes can be temporarily enabled by setting the `SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS` environment variable to `true` or `1`, but this support will be removed in a future release.
|
|
16
|
+
- Bumped up vendored `urllib3` to `2.6.3`
|
|
17
|
+
- Added `force_microseconds_precision` to `cursor.fetch_arrow_all` and `cursor.fetch_pandas_all` to avoid PyArrow schema incosistency between batches.
|
|
18
|
+
|
|
19
|
+
- v4.2.0(January 07,2026)
|
|
20
|
+
- Added `SnowflakeCursor.stats` property to expose granular DML statistics (rows inserted, deleted, updated, and duplicates) for operations like CTAS where `rowcount` is insufficient.
|
|
21
|
+
- Added support for injecting SPCS service identifier token (`SPCS_TOKEN`) into login requests when present in SPCS containers.
|
|
22
|
+
- Introduced shared library([source code](https://github.com/snowflakedb/universal-driver/tree/main/sf_mini_core)) for extended telemetry to identify and prepare testing platform for native rust extensions.
|
|
23
|
+
- Added `private_key_passphrase` connection parameter for key pair authentication with encrypted private keys.
|
|
24
|
+
|
|
25
|
+
- v4.1.1(December 12,2025)
|
|
11
26
|
- Relaxed pandas dependency requirements for Python below 3.12.
|
|
12
27
|
- Changed CRL cache cleanup background task to daemon to avoid blocking main thread.
|
|
13
28
|
- Fixed NO_PROXY issues with PUT operations
|
|
@@ -4,6 +4,7 @@ include LICENSE.txt
|
|
|
4
4
|
include NOTICE
|
|
5
5
|
include pyproject.toml
|
|
6
6
|
include src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt
|
|
7
|
+
include src/snowflake/connector/aio/README.md
|
|
7
8
|
recursive-include src/snowflake/connector py.typed *.py *.pyx *.js
|
|
8
9
|
recursive-include src/snowflake/connector/vendored LICENSE*
|
|
9
10
|
|
|
@@ -13,6 +14,9 @@ exclude src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iter
|
|
|
13
14
|
exclude src/snowflake/connector/nanoarrow_cpp/scripts/.clang-format
|
|
14
15
|
exclude src/snowflake/connector/nanoarrow_cpp/scripts/format.sh
|
|
15
16
|
|
|
17
|
+
include src/snowflake/connector/minicore __init__.py
|
|
18
|
+
recursive-include src/snowflake/connector/minicore *.so *.dll *.dylib *.a *.h *.lib
|
|
19
|
+
|
|
16
20
|
exclude .git-blame-ignore-revs
|
|
17
21
|
exclude .pre-commit-config.yaml
|
|
18
22
|
exclude license_header.txt
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.3.0
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -68,6 +68,7 @@ Requires-Dist: numpy<=2.2.4; extra == "development"
|
|
|
68
68
|
Requires-Dist: pendulum!=2.1.1; extra == "development"
|
|
69
69
|
Requires-Dist: pexpect; extra == "development"
|
|
70
70
|
Requires-Dist: pytest<7.5.0; extra == "development"
|
|
71
|
+
Requires-Dist: pytest-asyncio; extra == "development"
|
|
71
72
|
Requires-Dist: pytest-cov; extra == "development"
|
|
72
73
|
Requires-Dist: pytest-rerunfailures<16.0; extra == "development"
|
|
73
74
|
Requires-Dist: pytest-timeout; extra == "development"
|
|
@@ -92,7 +93,22 @@ https://docs.snowflake.com/
|
|
|
92
93
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
93
94
|
|
|
94
95
|
# Release Notes
|
|
95
|
-
- v4.
|
|
96
|
+
- v4.3.0(February 12,2026)
|
|
97
|
+
- Ensured proper list conversion - the converter runs to_snowflake on all list elements.
|
|
98
|
+
- Made the parameter `server_session_keep_alive` in `SnowflakeConnection` skip checking for pending async queries, providing faster connection close times especially when many async queries are executed.
|
|
99
|
+
- Fix string representation of INTERVAL YEAR and INTERVAL MONTH types.
|
|
100
|
+
- Log a warning when using http protocol for OAuth urls.
|
|
101
|
+
- Deprecated support for custom revocation error classes in OCSP response cache deserialization. By default, only `RevocationCheckError` exceptions are deserialized from OCSP cache. Custom exception classes can be temporarily enabled by setting the `SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS` environment variable to `true` or `1`, but this support will be removed in a future release.
|
|
102
|
+
- Bumped up vendored `urllib3` to `2.6.3`
|
|
103
|
+
- Added `force_microseconds_precision` to `cursor.fetch_arrow_all` and `cursor.fetch_pandas_all` to avoid PyArrow schema incosistency between batches.
|
|
104
|
+
|
|
105
|
+
- v4.2.0(January 07,2026)
|
|
106
|
+
- Added `SnowflakeCursor.stats` property to expose granular DML statistics (rows inserted, deleted, updated, and duplicates) for operations like CTAS where `rowcount` is insufficient.
|
|
107
|
+
- Added support for injecting SPCS service identifier token (`SPCS_TOKEN`) into login requests when present in SPCS containers.
|
|
108
|
+
- Introduced shared library([source code](https://github.com/snowflakedb/universal-driver/tree/main/sf_mini_core)) for extended telemetry to identify and prepare testing platform for native rust extensions.
|
|
109
|
+
- Added `private_key_passphrase` connection parameter for key pair authentication with encrypted private keys.
|
|
110
|
+
|
|
111
|
+
- v4.1.1(December 12,2025)
|
|
96
112
|
- Relaxed pandas dependency requirements for Python below 3.12.
|
|
97
113
|
- Changed CRL cache cleanup background task to daemon to avoid blocking main thread.
|
|
98
114
|
- Fixed NO_PROXY issues with PUT operations
|
|
@@ -103,6 +103,8 @@ To ensure the authenticity and integrity of the Python package, follow the steps
|
|
|
103
103
|
Verified OK
|
|
104
104
|
````
|
|
105
105
|
|
|
106
|
-
##
|
|
106
|
+
## Notes
|
|
107
107
|
|
|
108
108
|
This library currently does not support GCP regional endpoints. Please ensure that any workloads using through this library do not require support for regional endpoints on GCP. If you have questions about this, please contact [Snowflake Support](https://community.snowflake.com/s/article/How-To-Submit-a-Support-Case-in-Snowflake-Lodge).
|
|
109
|
+
|
|
110
|
+
The driver uses Rust library called sf_mini_core, you can find its source code [here](https://github.com/snowflakedb/universal-driver/tree/main/sf_mini_core)
|
|
@@ -15,6 +15,8 @@ build-verbosity = 1
|
|
|
15
15
|
|
|
16
16
|
[tool.cibuildwheel.linux]
|
|
17
17
|
archs = ["x86_64", "aarch64"]
|
|
18
|
+
# Exclude pre-built minicore libraries from auditwheel repair
|
|
19
|
+
repair-wheel-command = ""
|
|
18
20
|
|
|
19
21
|
[tool.cibuildwheel.macos]
|
|
20
22
|
archs = ["x86_64", "arm64"]
|
|
@@ -23,3 +25,6 @@ repair-wheel-command = ""
|
|
|
23
25
|
|
|
24
26
|
[tool.cibuildwheel.windows]
|
|
25
27
|
archs = ["AMD64"]
|
|
28
|
+
|
|
29
|
+
[tool.check-manifest]
|
|
30
|
+
ignore-bad-ideas = ["src/snowflake/connector/minicore/**"]
|
|
@@ -69,6 +69,13 @@ where = src
|
|
|
69
69
|
exclude = snowflake.connector.cpp*
|
|
70
70
|
include = snowflake.*
|
|
71
71
|
|
|
72
|
+
[options.package_data]
|
|
73
|
+
snowflake.connector.minicore =
|
|
74
|
+
*.so
|
|
75
|
+
*.dll
|
|
76
|
+
*.dylib
|
|
77
|
+
*.a
|
|
78
|
+
|
|
72
79
|
[options.entry_points]
|
|
73
80
|
console_scripts =
|
|
74
81
|
snowflake-dump-ocsp-response = snowflake.connector.tool.dump_ocsp_response:main
|
|
@@ -88,6 +95,7 @@ development =
|
|
|
88
95
|
pendulum!=2.1.1
|
|
89
96
|
pexpect
|
|
90
97
|
pytest<7.5.0
|
|
98
|
+
pytest-asyncio
|
|
91
99
|
pytest-cov
|
|
92
100
|
pytest-rerunfailures<16.0
|
|
93
101
|
pytest-timeout
|
|
@@ -186,7 +186,6 @@ class SetDefaultInstallationExtras(egg_info):
|
|
|
186
186
|
|
|
187
187
|
def finalize_options(self):
|
|
188
188
|
super().finalize_options()
|
|
189
|
-
|
|
190
189
|
# if not explicitly excluded, add boto dependencies to install_requires
|
|
191
190
|
if not SNOWFLAKE_NO_BOTO:
|
|
192
191
|
boto_extras = self.distribution.extras_require.get("boto", [])
|
|
@@ -5,6 +5,8 @@ from __future__ import annotations
|
|
|
5
5
|
|
|
6
6
|
from functools import wraps
|
|
7
7
|
|
|
8
|
+
from ._utils import _core_loader
|
|
9
|
+
|
|
8
10
|
apilevel = "2.0"
|
|
9
11
|
threadsafety = 2
|
|
10
12
|
paramstyle = "pyformat"
|
|
@@ -45,6 +47,14 @@ from .errors import (
|
|
|
45
47
|
from .log_configuration import EasyLoggingConfigPython
|
|
46
48
|
from .version import VERSION
|
|
47
49
|
|
|
50
|
+
# Load the core library - failures are captured in core_loader and don't prevent module loading
|
|
51
|
+
try:
|
|
52
|
+
_core_loader.load()
|
|
53
|
+
except Exception:
|
|
54
|
+
# Silently continue if core loading fails - the error is already captured in core_loader
|
|
55
|
+
# This ensures the connector module loads even if the minicore library is unavailable
|
|
56
|
+
pass
|
|
57
|
+
|
|
48
58
|
logging.getLogger(__name__).addHandler(NullHandler())
|
|
49
59
|
setup_external_libraries()
|
|
50
60
|
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import ctypes
|
|
4
|
+
import importlib
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
import platform
|
|
8
|
+
import string
|
|
9
|
+
import threading
|
|
10
|
+
import time
|
|
11
|
+
from enum import Enum
|
|
12
|
+
from inspect import stack
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from random import choice
|
|
15
|
+
from threading import Timer
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
|
|
18
|
+
from snowflake.connector.description import ISA, OPERATING_SYSTEM, OS_VERSION
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TempObjectType(Enum):
|
|
24
|
+
TABLE = "TABLE"
|
|
25
|
+
VIEW = "VIEW"
|
|
26
|
+
STAGE = "STAGE"
|
|
27
|
+
FUNCTION = "FUNCTION"
|
|
28
|
+
FILE_FORMAT = "FILE_FORMAT"
|
|
29
|
+
QUERY_TAG = "QUERY_TAG"
|
|
30
|
+
COLUMN = "COLUMN"
|
|
31
|
+
PROCEDURE = "PROCEDURE"
|
|
32
|
+
TABLE_FUNCTION = "TABLE_FUNCTION"
|
|
33
|
+
DYNAMIC_TABLE = "DYNAMIC_TABLE"
|
|
34
|
+
AGGREGATE_FUNCTION = "AGGREGATE_FUNCTION"
|
|
35
|
+
CTE = "CTE"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
TEMP_OBJECT_NAME_PREFIX = "SNOWPARK_TEMP_"
|
|
39
|
+
ALPHANUMERIC = string.digits + string.ascii_lowercase
|
|
40
|
+
TEMPORARY_STRING = "TEMP"
|
|
41
|
+
SCOPED_TEMPORARY_STRING = "SCOPED TEMPORARY"
|
|
42
|
+
_PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS_STRING = (
|
|
43
|
+
"PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
REQUEST_ID_STATEMENT_PARAM_NAME = "requestId"
|
|
47
|
+
|
|
48
|
+
# Default server side cap on Degree of Parallelism for file transfer
|
|
49
|
+
# This default value is set to 2^30 (~ 10^9), such that it will not
|
|
50
|
+
# throttle regular sessions.
|
|
51
|
+
_DEFAULT_VALUE_SERVER_DOP_CAP_FOR_FILE_TRANSFER = 1 << 30
|
|
52
|
+
# Variable name of server DoP cap for file transfer
|
|
53
|
+
_VARIABLE_NAME_SERVER_DOP_CAP_FOR_FILE_TRANSFER = (
|
|
54
|
+
"snowflake_server_dop_cap_for_file_transfer"
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def generate_random_alphanumeric(length: int = 10) -> str:
|
|
59
|
+
return "".join(choice(ALPHANUMERIC) for _ in range(length))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def random_name_for_temp_object(object_type: TempObjectType) -> str:
|
|
63
|
+
return f"{TEMP_OBJECT_NAME_PREFIX}{object_type.value}_{generate_random_alphanumeric().upper()}"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def get_temp_type_for_object(use_scoped_temp_objects: bool) -> str:
|
|
67
|
+
return SCOPED_TEMPORARY_STRING if use_scoped_temp_objects else TEMPORARY_STRING
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def is_uuid4(str_or_uuid: str | UUID) -> bool:
|
|
71
|
+
"""Check whether provided string str is a valid UUID version4."""
|
|
72
|
+
if isinstance(str_or_uuid, UUID):
|
|
73
|
+
return str_or_uuid.version == 4
|
|
74
|
+
|
|
75
|
+
if not isinstance(str_or_uuid, str):
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
uuid_str = str(UUID(str_or_uuid, version=4))
|
|
80
|
+
except ValueError:
|
|
81
|
+
return False
|
|
82
|
+
return uuid_str == str_or_uuid
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _snowflake_max_parallelism_for_file_transfer(connection):
|
|
86
|
+
"""Returns the server side cap on max parallelism for file transfer for the given connection."""
|
|
87
|
+
return getattr(
|
|
88
|
+
connection,
|
|
89
|
+
f"_{_VARIABLE_NAME_SERVER_DOP_CAP_FOR_FILE_TRANSFER}",
|
|
90
|
+
_DEFAULT_VALUE_SERVER_DOP_CAP_FOR_FILE_TRANSFER,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class _TrackedQueryCancellationTimer(Timer):
|
|
95
|
+
def __init__(self, interval, function, args=None, kwargs=None):
|
|
96
|
+
super().__init__(interval, function, args, kwargs)
|
|
97
|
+
self.executed = False
|
|
98
|
+
|
|
99
|
+
def run(self):
|
|
100
|
+
super().run()
|
|
101
|
+
self.executed = True
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_application_path() -> str:
|
|
105
|
+
"""Get the path of the application script using the connector."""
|
|
106
|
+
try:
|
|
107
|
+
outermost_frame = stack()[-1]
|
|
108
|
+
return outermost_frame.filename
|
|
109
|
+
except Exception:
|
|
110
|
+
return "unknown"
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
_SPCS_TOKEN_ENV_VAR_NAME = "SF_SPCS_TOKEN_PATH"
|
|
114
|
+
_SPCS_TOKEN_DEFAULT_PATH = "/snowflake/session/spcs_token"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def get_spcs_token() -> str | None:
|
|
118
|
+
"""Return the SPCS token read from the configured path, or None.
|
|
119
|
+
|
|
120
|
+
The path is determined by the SF_SPCS_TOKEN_PATH environment variable,
|
|
121
|
+
falling back to ``/snowflake/session/spcs_token`` when unset.
|
|
122
|
+
|
|
123
|
+
Any I/O errors or missing/empty files are treated as \"no token\" and
|
|
124
|
+
will not cause authentication to fail.
|
|
125
|
+
"""
|
|
126
|
+
path = os.getenv(_SPCS_TOKEN_ENV_VAR_NAME) or _SPCS_TOKEN_DEFAULT_PATH
|
|
127
|
+
try:
|
|
128
|
+
if not os.path.isfile(path):
|
|
129
|
+
return None
|
|
130
|
+
with open(path, encoding="utf-8") as f:
|
|
131
|
+
token = f.read().strip()
|
|
132
|
+
if not token:
|
|
133
|
+
return None
|
|
134
|
+
return token
|
|
135
|
+
except Exception as exc: # pragma: no cover - best-effort logging only
|
|
136
|
+
logger.debug("Failed to read SPCS token from %s: %s", path, exc)
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class _NanoarrowLoader:
|
|
141
|
+
def __init__(self):
|
|
142
|
+
self._error: Exception | None = None
|
|
143
|
+
|
|
144
|
+
def set_load_error(self, err: Exception):
|
|
145
|
+
self._error = err
|
|
146
|
+
|
|
147
|
+
def get_load_error(self) -> str:
|
|
148
|
+
return str(self._error)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class _CoreLoader:
|
|
152
|
+
def __init__(self):
|
|
153
|
+
self._version: bytes | None = None
|
|
154
|
+
self._error: Exception | None = None
|
|
155
|
+
self._path: str | None = None
|
|
156
|
+
self._load_time: float | None = None
|
|
157
|
+
|
|
158
|
+
@staticmethod
|
|
159
|
+
def _detect_os() -> str:
|
|
160
|
+
"""Detect the operating system."""
|
|
161
|
+
system = platform.system().lower()
|
|
162
|
+
if system == "linux":
|
|
163
|
+
return "linux"
|
|
164
|
+
elif system == "darwin":
|
|
165
|
+
return "macos"
|
|
166
|
+
elif system == "windows":
|
|
167
|
+
return "windows"
|
|
168
|
+
elif system == "aix":
|
|
169
|
+
return "aix"
|
|
170
|
+
else:
|
|
171
|
+
return "unknown"
|
|
172
|
+
|
|
173
|
+
@staticmethod
|
|
174
|
+
def _detect_arch() -> str:
|
|
175
|
+
"""Detect the CPU architecture."""
|
|
176
|
+
machine = platform.machine().lower()
|
|
177
|
+
if machine in ("x86_64", "amd64"):
|
|
178
|
+
return "x86_64"
|
|
179
|
+
elif machine in ("aarch64", "arm64"):
|
|
180
|
+
return "aarch64"
|
|
181
|
+
elif machine in ("i686", "i386", "x86"):
|
|
182
|
+
return "i686"
|
|
183
|
+
elif machine == "ppc64":
|
|
184
|
+
return "ppc64"
|
|
185
|
+
else:
|
|
186
|
+
return "unknown"
|
|
187
|
+
|
|
188
|
+
@staticmethod
|
|
189
|
+
def _detect_libc() -> str:
|
|
190
|
+
"""Detect libc type on Linux (glibc vs musl)."""
|
|
191
|
+
# Check if we're on Alpine/musl
|
|
192
|
+
if Path("/etc/alpine-release").exists():
|
|
193
|
+
return "musl"
|
|
194
|
+
|
|
195
|
+
# Check for musl by looking at the libc library
|
|
196
|
+
try:
|
|
197
|
+
import subprocess
|
|
198
|
+
|
|
199
|
+
result = subprocess.run(
|
|
200
|
+
["ldd", "--version"],
|
|
201
|
+
capture_output=True,
|
|
202
|
+
text=True,
|
|
203
|
+
)
|
|
204
|
+
if "musl" in result.stdout.lower() or "musl" in result.stderr.lower():
|
|
205
|
+
return "musl"
|
|
206
|
+
except Exception:
|
|
207
|
+
pass
|
|
208
|
+
|
|
209
|
+
# Default to glibc
|
|
210
|
+
return "glibc"
|
|
211
|
+
|
|
212
|
+
@staticmethod
|
|
213
|
+
def _get_platform_subdir() -> str:
|
|
214
|
+
"""Get the platform-specific subdirectory name."""
|
|
215
|
+
os_name = _CoreLoader._detect_os()
|
|
216
|
+
arch = _CoreLoader._detect_arch()
|
|
217
|
+
|
|
218
|
+
if os_name == "linux":
|
|
219
|
+
libc = _CoreLoader._detect_libc()
|
|
220
|
+
return f"linux_{arch}_{libc}"
|
|
221
|
+
elif os_name == "macos":
|
|
222
|
+
return f"macos_{arch}"
|
|
223
|
+
elif os_name == "windows":
|
|
224
|
+
return f"windows_{arch}"
|
|
225
|
+
elif os_name == "aix":
|
|
226
|
+
return f"aix_{arch}"
|
|
227
|
+
|
|
228
|
+
raise OSError(f"Mini core binary for {os_name} {arch} not found")
|
|
229
|
+
|
|
230
|
+
@staticmethod
|
|
231
|
+
def _get_lib_name() -> str:
|
|
232
|
+
"""Get the library filename for the current platform."""
|
|
233
|
+
os_name = _CoreLoader._detect_os()
|
|
234
|
+
if os_name == "windows":
|
|
235
|
+
return "sf_mini_core.dll"
|
|
236
|
+
elif os_name == "macos":
|
|
237
|
+
return "libsf_mini_core.dylib"
|
|
238
|
+
elif os_name == "aix":
|
|
239
|
+
return "libsf_mini_core.a"
|
|
240
|
+
else:
|
|
241
|
+
# Linux and other Unix-like systems
|
|
242
|
+
return "libsf_mini_core.so"
|
|
243
|
+
|
|
244
|
+
@staticmethod
|
|
245
|
+
def _get_core_path():
|
|
246
|
+
"""Get the path to the minicore library for the current platform."""
|
|
247
|
+
subdir = _CoreLoader._get_platform_subdir()
|
|
248
|
+
lib_name = _CoreLoader._get_lib_name()
|
|
249
|
+
|
|
250
|
+
files = importlib.resources.files("snowflake.connector.minicore")
|
|
251
|
+
|
|
252
|
+
return files.joinpath(subdir, lib_name)
|
|
253
|
+
|
|
254
|
+
@staticmethod
|
|
255
|
+
def _register_functions(core: ctypes.CDLL):
|
|
256
|
+
core.sf_core_full_version.argtypes = []
|
|
257
|
+
core.sf_core_full_version.restype = ctypes.c_char_p
|
|
258
|
+
|
|
259
|
+
@staticmethod
|
|
260
|
+
def _load_minicore(path: str) -> ctypes.CDLL:
|
|
261
|
+
# This context manager is the safe way to get a
|
|
262
|
+
# file path from importlib.resources. It handles cases
|
|
263
|
+
# where the file is inside a zip and needs to be extracted
|
|
264
|
+
# to a temporary location.
|
|
265
|
+
with importlib.resources.as_file(path) as lib_path:
|
|
266
|
+
core = ctypes.CDLL(str(lib_path))
|
|
267
|
+
return core
|
|
268
|
+
|
|
269
|
+
def get_present_binaries(self) -> str:
|
|
270
|
+
present_binaries = []
|
|
271
|
+
try:
|
|
272
|
+
minicore_files = importlib.resources.files("snowflake.connector.minicore")
|
|
273
|
+
# Iterate through all items in the minicore module
|
|
274
|
+
for item in minicore_files.iterdir():
|
|
275
|
+
# Skip non-platform directories like __pycache__
|
|
276
|
+
if item.is_dir() and not item.name.startswith("__"):
|
|
277
|
+
# This is a platform subdirectory
|
|
278
|
+
platform_name = item.name
|
|
279
|
+
try:
|
|
280
|
+
# List all files in this subdirectory
|
|
281
|
+
for binary_file in item.iterdir():
|
|
282
|
+
if binary_file.is_file():
|
|
283
|
+
# Store as "platform/filename"
|
|
284
|
+
present_binaries.append(
|
|
285
|
+
f"{platform_name}/{binary_file.name}"
|
|
286
|
+
)
|
|
287
|
+
except Exception as e:
|
|
288
|
+
logger.debug(f"Error listing binaries in {platform_name}: {e}")
|
|
289
|
+
except Exception as e:
|
|
290
|
+
logger.debug(f"Error populating present binaries: {e}")
|
|
291
|
+
|
|
292
|
+
return ",".join(present_binaries)
|
|
293
|
+
|
|
294
|
+
def _is_core_disabled(self) -> bool:
|
|
295
|
+
value = str(os.getenv("SNOWFLAKE_DISABLE_MINICORE", None)).lower()
|
|
296
|
+
return value in ["1", "true"]
|
|
297
|
+
|
|
298
|
+
def _load(self) -> None:
|
|
299
|
+
start_time = time.perf_counter()
|
|
300
|
+
try:
|
|
301
|
+
path = self._get_core_path()
|
|
302
|
+
self._path = str(path)
|
|
303
|
+
core = self._load_minicore(path)
|
|
304
|
+
self._register_functions(core)
|
|
305
|
+
self._version = core.sf_core_full_version()
|
|
306
|
+
self._error = None
|
|
307
|
+
except Exception as err:
|
|
308
|
+
self._error = err
|
|
309
|
+
end_time = time.perf_counter()
|
|
310
|
+
# Store load time in milliseconds (with sub-millisecond precision)
|
|
311
|
+
self._load_time = (end_time - start_time) * 1000
|
|
312
|
+
|
|
313
|
+
def load(self):
|
|
314
|
+
"""Spawn a separate thread to load the minicore library (non-blocking)."""
|
|
315
|
+
if self._is_core_disabled():
|
|
316
|
+
self._error = "mini-core-disabled"
|
|
317
|
+
return
|
|
318
|
+
self._error = "still-loading"
|
|
319
|
+
thread = threading.Thread(target=self._load, daemon=True)
|
|
320
|
+
thread.start()
|
|
321
|
+
|
|
322
|
+
def get_load_error(self) -> str:
|
|
323
|
+
return str(self._error)
|
|
324
|
+
|
|
325
|
+
def get_core_version(self) -> str | None:
|
|
326
|
+
if self._version:
|
|
327
|
+
try:
|
|
328
|
+
return self._version.decode("utf-8")
|
|
329
|
+
except Exception:
|
|
330
|
+
pass
|
|
331
|
+
return None
|
|
332
|
+
|
|
333
|
+
def get_file_name(self) -> str:
|
|
334
|
+
return self._path
|
|
335
|
+
|
|
336
|
+
def get_load_time(self) -> float | None:
|
|
337
|
+
"""Return the time it took to load the minicore binary in milliseconds."""
|
|
338
|
+
return self._load_time
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
_core_loader = _CoreLoader()
|
|
342
|
+
_nanoarrow_loader = _NanoarrowLoader()
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def build_minicore_usage_for_session() -> dict[str, str | None]:
|
|
346
|
+
return {
|
|
347
|
+
"ISA": ISA,
|
|
348
|
+
"CORE_VERSION": _core_loader.get_core_version(),
|
|
349
|
+
"CORE_FILE_NAME": _core_loader.get_file_name(),
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def build_minicore_usage_for_telemetry() -> dict[str, str | None]:
|
|
354
|
+
return {
|
|
355
|
+
"OS": OPERATING_SYSTEM,
|
|
356
|
+
"OS_VERSION": OS_VERSION,
|
|
357
|
+
"CORE_LOAD_ERROR": _core_loader.get_load_error(),
|
|
358
|
+
"CORE_BINARIES_PRESENT": _core_loader.get_present_binaries(),
|
|
359
|
+
"CORE_LOAD_TIME": _core_loader.get_load_time(),
|
|
360
|
+
**build_minicore_usage_for_session(),
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def build_nanoarrow_usage_for_telemetry() -> dict[str, str | None]:
|
|
365
|
+
return {
|
|
366
|
+
"OS": OPERATING_SYSTEM,
|
|
367
|
+
"OS_VERSION": OS_VERSION,
|
|
368
|
+
"NANOARROW_LOAD_ERROR": _nanoarrow_loader.get_load_error(),
|
|
369
|
+
"ISA": ISA,
|
|
370
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Notice
|
|
2
|
+
|
|
3
|
+
**This component is a Preview feature provided for experimental purposes only.
|
|
4
|
+
It is provided "AS IS" and without warranty of any kind. This module is not
|
|
5
|
+
supported by Snowflake Support. Use of this code is at your own risk and it
|
|
6
|
+
is not intended for production environments.**
|
|
7
|
+
|
|
8
|
+
## Features NOT Supported
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
- ❌ `conn.errorhandler` (get/set) - no support for async errorhandlers
|
|
12
|
+
- ❌ `enable_connection_diag=True` - no connection diagnostic
|
|
13
|
+
- ❌ `authenticator='PAT_WITH_EXTERNAL_SESSION'` - not supported
|
|
14
|
+
- ❌ `mfa_callback` / `password_callback` - not supported
|
|
15
|
+
- ❌ `_probe_connection=True` - no connection diagnostic
|
|
16
|
+
- ❌ Raw binary response handling - not supported
|
|
17
|
+
- ❌ CRL (Certificate Revocation List) - not supported (only OCSP is supported)
|
|
18
|
+
|
|
19
|
+
## Installation & Import
|
|
20
|
+
|
|
21
|
+
Using aio version requires additional installation of `aiohttp` dependency.
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
# Same package, different import
|
|
25
|
+
from snowflake.connector.aio import connect, SnowflakeConnection, DictCursor
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## Connection Patterns
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
# Pattern 1: Async context manager (recommended)
|
|
34
|
+
async with connect(user='...', password='...', account='...') as conn:
|
|
35
|
+
# Use connection
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# Pattern 2: Direct await
|
|
40
|
+
conn = await connect(user='...', password='...', account='...')
|
|
41
|
+
await conn.close()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Pattern 3: Manual
|
|
45
|
+
conn = SnowflakeConnection(user='...', password='...', account='...')
|
|
46
|
+
await conn.connect()
|
|
47
|
+
await conn.close()
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## Basic Operations Comparison
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
| Operation | Sync | Async |
|
|
55
|
+
|-----------|------|-------|
|
|
56
|
+
| **Connect** | `conn = connect(...)` | `conn = await connect(...)` |
|
|
57
|
+
| **Create cursor** | `cur = conn.cursor()` | `cur = conn.cursor()` *(same)* |
|
|
58
|
+
| **Execute** | `cur.execute(sql)` | `await cur.execute(sql)` |
|
|
59
|
+
| **Fetch one** | `cur.fetchone()` | `await cur.fetchone()` |
|
|
60
|
+
| **Fetch many** | `cur.fetchmany(n)` | `await cur.fetchmany(n)` |
|
|
61
|
+
| **Fetch all** | `cur.fetchall()` | `await cur.fetchall()` |
|
|
62
|
+
| **Iterate** | `for row in cur:` | `async for row in cur:` |
|
|
63
|
+
| **Commit** | `conn.commit()` | `await conn.commit()` |
|
|
64
|
+
| **Rollback** | `conn.rollback()` | `await conn.rollback()` |
|
|
65
|
+
| **Close** | `conn.close()` | `await conn.close()` |
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
## Quick Examples
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
### Simple Query
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
import asyncio
|
|
76
|
+
from snowflake.connector.aio import connect
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
async def query_data():
|
|
80
|
+
async with connect(user='...', password='...', account='...') as conn:
|
|
81
|
+
async with conn.cursor() as cur:
|
|
82
|
+
await cur.execute("SELECT * FROM table WHERE id < %s", (100,))
|
|
83
|
+
async for row in cur:
|
|
84
|
+
print(row)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
asyncio.run(query_data())
|
|
88
|
+
```
|