snowflake-connector-python 3.13.2__tar.gz → 3.14.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-3.13.2 → snowflake_connector_python-3.14.0}/DESCRIPTION.md +11 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/MANIFEST.in +1 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/PKG-INFO +14 -3
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/setup.cfg +2 -2
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/__init__.py +3 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/_auth.py +5 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/by_plugin.py +1 -0
- snowflake_connector_python-3.14.0/src/snowflake/connector/auth/no_auth.py +43 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/azure_storage_client.py +8 -1
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/config_manager.py +3 -7
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/connection.py +29 -9
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/constants.py +3 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/cursor.py +1 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/encryption_util.py +4 -1
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/file_transfer_agent.py +6 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/gcs_storage_client.py +7 -1
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/local_storage_client.py +4 -1
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/network.py +1 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/options.py +11 -12
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/pandas_tools.py +52 -2
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/s3_storage_client.py +8 -1
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/storage_client.py +4 -1
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/PKG-INFO +14 -3
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/LICENSE.txt +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/NOTICE +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/README.md +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/SECURITY.md +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/pyproject.toml +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/setup.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/_utils.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/pat.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/errors.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ocsp_snowflake.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -7,6 +7,17 @@ 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
|
+
- v3.14.0(March 03, 2025)
|
|
11
|
+
- Bumped pyOpenSSL dependency upper boundary from <25.0.0 to <26.0.0.
|
|
12
|
+
- Added a <19.0.0 pin to pyarrow as a workaround to a bug affecting Azure Batch.
|
|
13
|
+
- Optimized distribution package lookup to speed up import.
|
|
14
|
+
- Fixed a bug where privatelink OCSP Cache url could not be determined if privatelink account name was specified in uppercase.
|
|
15
|
+
- Added support for iceberg tables to `write_pandas`.
|
|
16
|
+
- Fixed base64 encoded private key tests.
|
|
17
|
+
- Fixed a bug where file permission check happened on Windows.
|
|
18
|
+
- Added support for File types.
|
|
19
|
+
- Added `unsafe_file_write` connection parameter that restores the previous behaviour of saving files downloaded with GET with 644 permissions.
|
|
20
|
+
|
|
10
21
|
- v3.13.2(January 29, 2025)
|
|
11
22
|
- Changed not to use scoped temporary objects.
|
|
12
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.14.0
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -41,7 +41,7 @@ License-File: NOTICE
|
|
|
41
41
|
Requires-Dist: asn1crypto<2.0.0,>0.24.0
|
|
42
42
|
Requires-Dist: cffi<2.0.0,>=1.9
|
|
43
43
|
Requires-Dist: cryptography>=3.1.0
|
|
44
|
-
Requires-Dist: pyOpenSSL<
|
|
44
|
+
Requires-Dist: pyOpenSSL<26.0.0,>=22.0.0
|
|
45
45
|
Requires-Dist: pyjwt<3.0.0
|
|
46
46
|
Requires-Dist: pytz
|
|
47
47
|
Requires-Dist: requests<3.0.0
|
|
@@ -71,7 +71,7 @@ Requires-Dist: pytest-xdist; extra == "development"
|
|
|
71
71
|
Requires-Dist: pytzdata; extra == "development"
|
|
72
72
|
Provides-Extra: pandas
|
|
73
73
|
Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "pandas"
|
|
74
|
-
Requires-Dist: pyarrow; extra == "pandas"
|
|
74
|
+
Requires-Dist: pyarrow<19.0.0; extra == "pandas"
|
|
75
75
|
Provides-Extra: secure-local-storage
|
|
76
76
|
Requires-Dist: keyring<26.0.0,>=23.1.0; extra == "secure-local-storage"
|
|
77
77
|
|
|
@@ -84,6 +84,17 @@ https://docs.snowflake.com/
|
|
|
84
84
|
Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
|
|
85
85
|
|
|
86
86
|
# Release Notes
|
|
87
|
+
- v3.14.0(March 03, 2025)
|
|
88
|
+
- Bumped pyOpenSSL dependency upper boundary from <25.0.0 to <26.0.0.
|
|
89
|
+
- Added a <19.0.0 pin to pyarrow as a workaround to a bug affecting Azure Batch.
|
|
90
|
+
- Optimized distribution package lookup to speed up import.
|
|
91
|
+
- Fixed a bug where privatelink OCSP Cache url could not be determined if privatelink account name was specified in uppercase.
|
|
92
|
+
- Added support for iceberg tables to `write_pandas`.
|
|
93
|
+
- Fixed base64 encoded private key tests.
|
|
94
|
+
- Fixed a bug where file permission check happened on Windows.
|
|
95
|
+
- Added support for File types.
|
|
96
|
+
- Added `unsafe_file_write` connection parameter that restores the previous behaviour of saving files downloaded with GET with 644 permissions.
|
|
97
|
+
|
|
87
98
|
- v3.13.2(January 29, 2025)
|
|
88
99
|
- Changed not to use scoped temporary objects.
|
|
89
100
|
|
|
@@ -46,7 +46,7 @@ install_requires =
|
|
|
46
46
|
asn1crypto>0.24.0,<2.0.0
|
|
47
47
|
cffi>=1.9,<2.0.0
|
|
48
48
|
cryptography>=3.1.0
|
|
49
|
-
pyOpenSSL>=22.0.0,<
|
|
49
|
+
pyOpenSSL>=22.0.0,<26.0.0
|
|
50
50
|
pyjwt<3.0.0
|
|
51
51
|
pytz
|
|
52
52
|
requests<3.0.0
|
|
@@ -93,7 +93,7 @@ development =
|
|
|
93
93
|
pytzdata
|
|
94
94
|
pandas =
|
|
95
95
|
pandas>=1.0.0,<3.0.0
|
|
96
|
-
pyarrow
|
|
96
|
+
pyarrow<19.0.0
|
|
97
97
|
secure-local-storage =
|
|
98
98
|
keyring>=23.1.0,<26.0.0
|
|
99
99
|
|
|
@@ -9,6 +9,7 @@ from .by_plugin import AuthByPlugin, AuthType
|
|
|
9
9
|
from .default import AuthByDefault
|
|
10
10
|
from .idtoken import AuthByIdToken
|
|
11
11
|
from .keypair import AuthByKeyPair
|
|
12
|
+
from .no_auth import AuthNoAuth
|
|
12
13
|
from .oauth import AuthByOAuth
|
|
13
14
|
from .okta import AuthByOkta
|
|
14
15
|
from .pat import AuthByPAT
|
|
@@ -25,6 +26,7 @@ FIRST_PARTY_AUTHENTICATORS = frozenset(
|
|
|
25
26
|
AuthByWebBrowser,
|
|
26
27
|
AuthByIdToken,
|
|
27
28
|
AuthByPAT,
|
|
29
|
+
AuthNoAuth,
|
|
28
30
|
)
|
|
29
31
|
)
|
|
30
32
|
|
|
@@ -37,6 +39,7 @@ __all__ = [
|
|
|
37
39
|
"AuthByOkta",
|
|
38
40
|
"AuthByUsrPwdMfa",
|
|
39
41
|
"AuthByWebBrowser",
|
|
42
|
+
"AuthNoAuth",
|
|
40
43
|
"Auth",
|
|
41
44
|
"AuthType",
|
|
42
45
|
"FIRST_PARTY_AUTHENTICATORS",
|
|
@@ -63,6 +63,7 @@ from ..network import (
|
|
|
63
63
|
from ..options import installed_keyring, keyring
|
|
64
64
|
from ..sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
|
|
65
65
|
from ..version import VERSION
|
|
66
|
+
from .no_auth import AuthNoAuth
|
|
66
67
|
|
|
67
68
|
if TYPE_CHECKING:
|
|
68
69
|
from . import AuthByPlugin
|
|
@@ -186,6 +187,10 @@ class Auth:
|
|
|
186
187
|
) -> dict[str, str | int | bool]:
|
|
187
188
|
logger.debug("authenticate")
|
|
188
189
|
|
|
190
|
+
# For no-auth connection, authentication is no-op, and we can return early here.
|
|
191
|
+
if isinstance(auth_instance, AuthNoAuth):
|
|
192
|
+
return {}
|
|
193
|
+
|
|
189
194
|
if timeout is None:
|
|
190
195
|
timeout = auth_instance.timeout
|
|
191
196
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2012-2023 Snowflake Computing Inc. All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from .by_plugin import AuthByPlugin, AuthType
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AuthNoAuth(AuthByPlugin):
|
|
14
|
+
"""No-auth Authentication.
|
|
15
|
+
|
|
16
|
+
It is a dummy auth that requires no extra connection establishment.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def type_(self) -> AuthType:
|
|
21
|
+
return AuthType.NO_AUTH
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def assertion_content(self) -> str | None:
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
def __init__(self) -> None:
|
|
28
|
+
super().__init__()
|
|
29
|
+
|
|
30
|
+
def reset_secrets(self) -> None:
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
def prepare(
|
|
34
|
+
self,
|
|
35
|
+
**kwargs: Any,
|
|
36
|
+
) -> None:
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
def reauthenticate(self, **kwargs: Any) -> dict[str, bool]:
|
|
40
|
+
return {"success": True}
|
|
41
|
+
|
|
42
|
+
def update_body(self, body: dict[Any, Any]) -> None:
|
|
43
|
+
pass
|
|
@@ -65,8 +65,15 @@ class SnowflakeAzureRestClient(SnowflakeStorageClient):
|
|
|
65
65
|
chunk_size: int,
|
|
66
66
|
stage_info: dict[str, Any],
|
|
67
67
|
use_s3_regional_url: bool = False,
|
|
68
|
+
unsafe_file_write: bool = False,
|
|
68
69
|
) -> None:
|
|
69
|
-
super().__init__(
|
|
70
|
+
super().__init__(
|
|
71
|
+
meta,
|
|
72
|
+
stage_info,
|
|
73
|
+
chunk_size,
|
|
74
|
+
credentials=credentials,
|
|
75
|
+
unsafe_file_write=unsafe_file_write,
|
|
76
|
+
)
|
|
70
77
|
end_point: str = stage_info["endPoint"]
|
|
71
78
|
if end_point.startswith("blob."):
|
|
72
79
|
end_point = end_point[len("blob.") :]
|
|
@@ -330,7 +330,8 @@ class ConfigManager:
|
|
|
330
330
|
continue
|
|
331
331
|
|
|
332
332
|
if (
|
|
333
|
-
|
|
333
|
+
not IS_WINDOWS # Skip checking on Windows
|
|
334
|
+
and sliceoptions.check_permissions # Skip checking if this file couldn't hold sensitive information
|
|
334
335
|
# Same check as openssh does for permissions
|
|
335
336
|
# https://github.com/openssh/openssh-portable/blob/2709809fd616a0991dc18e3a58dea10fb383c3f0/readconf.c#LL2264C1-L2264C1
|
|
336
337
|
and filep.stat().st_mode & READABLE_BY_OTHERS != 0
|
|
@@ -341,12 +342,7 @@ class ConfigManager:
|
|
|
341
342
|
and filep.stat().st_uid != os.getuid()
|
|
342
343
|
)
|
|
343
344
|
):
|
|
344
|
-
|
|
345
|
-
chmod_message = (
|
|
346
|
-
f'.\n * To change owner, run `chown $USER "{str(filep)}"`.\n * To restrict permissions, run `chmod 0600 "{str(filep)}"`.\n'
|
|
347
|
-
if not IS_WINDOWS
|
|
348
|
-
else ""
|
|
349
|
-
)
|
|
345
|
+
chmod_message = f'.\n * To change owner, run `chown $USER "{str(filep)}"`.\n * To restrict permissions, run `chmod 0600 "{str(filep)}"`.\n'
|
|
350
346
|
|
|
351
347
|
warn(f"Bad owner or permissions on {str(filep)}{chmod_message}")
|
|
352
348
|
LOGGER.debug(f"reading configuration file from {str(filep)}")
|
|
@@ -23,7 +23,6 @@ from functools import partial
|
|
|
23
23
|
from io import StringIO
|
|
24
24
|
from logging import getLogger
|
|
25
25
|
from threading import Lock
|
|
26
|
-
from time import strptime
|
|
27
26
|
from types import TracebackType
|
|
28
27
|
from typing import Any, Callable, Generator, Iterable, Iterator, NamedTuple, Sequence
|
|
29
28
|
from uuid import UUID
|
|
@@ -45,6 +44,7 @@ from .auth import (
|
|
|
45
44
|
AuthByPlugin,
|
|
46
45
|
AuthByUsrPwdMfa,
|
|
47
46
|
AuthByWebBrowser,
|
|
47
|
+
AuthNoAuth,
|
|
48
48
|
)
|
|
49
49
|
from .auth.idtoken import AuthByIdToken
|
|
50
50
|
from .backoff_policies import exponential_backoff
|
|
@@ -99,6 +99,7 @@ from .network import (
|
|
|
99
99
|
DEFAULT_AUTHENTICATOR,
|
|
100
100
|
EXTERNAL_BROWSER_AUTHENTICATOR,
|
|
101
101
|
KEY_PAIR_AUTHENTICATOR,
|
|
102
|
+
NO_AUTH_AUTHENTICATOR,
|
|
102
103
|
OAUTH_AUTHENTICATOR,
|
|
103
104
|
PROGRAMMATIC_ACCESS_TOKEN,
|
|
104
105
|
REQUEST_ID,
|
|
@@ -312,9 +313,6 @@ APPLICATION_RE = re.compile(r"[\w\d_]+")
|
|
|
312
313
|
for m in [method for method in dir(errors) if callable(getattr(errors, method))]:
|
|
313
314
|
setattr(sys.modules[__name__], m, getattr(errors, m))
|
|
314
315
|
|
|
315
|
-
# Workaround for https://bugs.python.org/issue7980
|
|
316
|
-
strptime("20150102030405", "%Y%m%d%H%M%S")
|
|
317
|
-
|
|
318
316
|
logger = getLogger(__name__)
|
|
319
317
|
|
|
320
318
|
|
|
@@ -383,6 +381,7 @@ class SnowflakeConnection:
|
|
|
383
381
|
server_session_keep_alive: When true, the connector does not destroy the session on the Snowflake server side
|
|
384
382
|
before the connector shuts down. Default value is false.
|
|
385
383
|
token_file_path: The file path of the token file. If both token and token_file_path are provided, the token in token_file_path will be used.
|
|
384
|
+
unsafe_file_write: When true, files downloaded by GET will be saved with 644 permissions. Otherwise, files will be saved with safe - owner-only permissions: 600.
|
|
386
385
|
"""
|
|
387
386
|
|
|
388
387
|
OCSP_ENV_LOCK = Lock()
|
|
@@ -740,6 +739,14 @@ class SnowflakeConnection:
|
|
|
740
739
|
def iobound_tpe_limit(self) -> int | None:
|
|
741
740
|
return self._iobound_tpe_limit
|
|
742
741
|
|
|
742
|
+
@property
|
|
743
|
+
def unsafe_file_write(self) -> bool:
|
|
744
|
+
return self._unsafe_file_write
|
|
745
|
+
|
|
746
|
+
@unsafe_file_write.setter
|
|
747
|
+
def unsafe_file_write(self, value: bool) -> None:
|
|
748
|
+
self._unsafe_file_write = value
|
|
749
|
+
|
|
743
750
|
def connect(self, **kwargs) -> None:
|
|
744
751
|
"""Establishes connection to Snowflake."""
|
|
745
752
|
logger.debug("connect")
|
|
@@ -930,6 +937,7 @@ class SnowflakeConnection:
|
|
|
930
937
|
|
|
931
938
|
@staticmethod
|
|
932
939
|
def setup_ocsp_privatelink(app, hostname) -> None:
|
|
940
|
+
hostname = hostname.lower()
|
|
933
941
|
SnowflakeConnection.OCSP_ENV_LOCK.acquire()
|
|
934
942
|
ocsp_cache_server = f"http://ocsp.{hostname}/ocsp_response_cache.json"
|
|
935
943
|
os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"] = ocsp_cache_server
|
|
@@ -961,7 +969,7 @@ class SnowflakeConnection:
|
|
|
961
969
|
os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"],
|
|
962
970
|
)
|
|
963
971
|
|
|
964
|
-
if ".privatelink.snowflakecomputing." in self.host:
|
|
972
|
+
if ".privatelink.snowflakecomputing." in self.host.lower():
|
|
965
973
|
SnowflakeConnection.setup_ocsp_privatelink(self.application, self.host)
|
|
966
974
|
else:
|
|
967
975
|
if "SF_OCSP_RESPONSE_CACHE_SERVER_URL" in os.environ:
|
|
@@ -1210,6 +1218,11 @@ class SnowflakeConnection:
|
|
|
1210
1218
|
if "protocol" not in kwargs:
|
|
1211
1219
|
self._protocol = "https"
|
|
1212
1220
|
|
|
1221
|
+
if "unsafe_file_write" in kwargs:
|
|
1222
|
+
self._unsafe_file_write = kwargs["unsafe_file_write"]
|
|
1223
|
+
else:
|
|
1224
|
+
self._unsafe_file_write = False
|
|
1225
|
+
|
|
1213
1226
|
logger.info(
|
|
1214
1227
|
f"Connecting to {_DOMAIN_NAME_MAP.get(extract_top_level_domain_from_hostname(self._host), 'GLOBAL')} Snowflake domain"
|
|
1215
1228
|
)
|
|
@@ -1237,9 +1250,15 @@ class SnowflakeConnection:
|
|
|
1237
1250
|
with open(token_file_path) as f:
|
|
1238
1251
|
self._token = f.read()
|
|
1239
1252
|
|
|
1253
|
+
# Set of authenticators allowing empty user.
|
|
1254
|
+
empty_user_allowed_authenticators = {OAUTH_AUTHENTICATOR, NO_AUTH_AUTHENTICATOR}
|
|
1255
|
+
|
|
1240
1256
|
if not (self._master_token and self._session_token):
|
|
1241
|
-
if
|
|
1242
|
-
|
|
1257
|
+
if (
|
|
1258
|
+
not self.user
|
|
1259
|
+
and self._authenticator not in empty_user_allowed_authenticators
|
|
1260
|
+
):
|
|
1261
|
+
# OAuth and NoAuth Authentications does not require a username
|
|
1243
1262
|
Error.errorhandler_wrapper(
|
|
1244
1263
|
self,
|
|
1245
1264
|
None,
|
|
@@ -1268,14 +1287,15 @@ class SnowflakeConnection:
|
|
|
1268
1287
|
{"msg": "Password is empty", "errno": ER_NO_PASSWORD},
|
|
1269
1288
|
)
|
|
1270
1289
|
|
|
1271
|
-
|
|
1290
|
+
# Only AuthNoAuth allows account to be omitted.
|
|
1291
|
+
if not self._account and not isinstance(self.auth_class, AuthNoAuth):
|
|
1272
1292
|
Error.errorhandler_wrapper(
|
|
1273
1293
|
self,
|
|
1274
1294
|
None,
|
|
1275
1295
|
ProgrammingError,
|
|
1276
1296
|
{"msg": "Account must be specified", "errno": ER_NO_ACCOUNT_NAME},
|
|
1277
1297
|
)
|
|
1278
|
-
if "." in self._account:
|
|
1298
|
+
if self._account and "." in self._account:
|
|
1279
1299
|
self._account = parse_account(self._account)
|
|
1280
1300
|
|
|
1281
1301
|
if not isinstance(self._backoff_policy, Callable) or not isinstance(
|
|
@@ -182,6 +182,9 @@ FIELD_TYPES: tuple[FieldType, ...] = (
|
|
|
182
182
|
),
|
|
183
183
|
FieldType(name="VECTOR", dbapi_type=[DBAPI_TYPE_BINARY], pa_type=vector_pa_type),
|
|
184
184
|
FieldType(name="MAP", dbapi_type=[DBAPI_TYPE_BINARY], pa_type=map_pa_type),
|
|
185
|
+
FieldType(
|
|
186
|
+
name="FILE", dbapi_type=[DBAPI_TYPE_STRING], pa_type=lambda _: pa.string()
|
|
187
|
+
),
|
|
185
188
|
)
|
|
186
189
|
|
|
187
190
|
FIELD_NAME_TO_ID: DefaultDict[Any, int] = defaultdict(int)
|
|
@@ -1060,6 +1060,7 @@ class SnowflakeCursor:
|
|
|
1060
1060
|
multipart_threshold=data.get("threshold"),
|
|
1061
1061
|
use_s3_regional_url=self._connection.enable_stage_s3_privatelink_for_us_east_1,
|
|
1062
1062
|
iobound_tpe_limit=self._connection.iobound_tpe_limit,
|
|
1063
|
+
unsafe_file_write=self._connection.unsafe_file_write,
|
|
1063
1064
|
)
|
|
1064
1065
|
sf_file_transfer_agent.execute()
|
|
1065
1066
|
data = sf_file_transfer_agent.result()
|
|
@@ -195,6 +195,7 @@ class SnowflakeEncryptionUtil:
|
|
|
195
195
|
in_filename: str,
|
|
196
196
|
chunk_size: int = 64 * kilobyte,
|
|
197
197
|
tmp_dir: str | None = None,
|
|
198
|
+
unsafe_file_write: bool = False,
|
|
198
199
|
) -> str:
|
|
199
200
|
"""Decrypts a file and stores the output in the temporary directory.
|
|
200
201
|
|
|
@@ -213,8 +214,10 @@ class SnowflakeEncryptionUtil:
|
|
|
213
214
|
temp_output_file = os.path.join(tmp_dir, temp_output_file)
|
|
214
215
|
|
|
215
216
|
logger.debug("encrypted file: %s, tmp file: %s", in_filename, temp_output_file)
|
|
217
|
+
|
|
218
|
+
file_opener = None if unsafe_file_write else owner_rw_opener
|
|
216
219
|
with open(in_filename, "rb") as infile:
|
|
217
|
-
with open(temp_output_file, "wb", opener=
|
|
220
|
+
with open(temp_output_file, "wb", opener=file_opener) as outfile:
|
|
218
221
|
SnowflakeEncryptionUtil.decrypt_stream(
|
|
219
222
|
metadata, encryption_material, infile, outfile, chunk_size
|
|
220
223
|
)
|
|
@@ -355,6 +355,7 @@ class SnowflakeFileTransferAgent:
|
|
|
355
355
|
source_from_stream: IO[bytes] | None = None,
|
|
356
356
|
use_s3_regional_url: bool = False,
|
|
357
357
|
iobound_tpe_limit: int | None = None,
|
|
358
|
+
unsafe_file_write: bool = False,
|
|
358
359
|
) -> None:
|
|
359
360
|
self._cursor = cursor
|
|
360
361
|
self._command = command
|
|
@@ -386,6 +387,7 @@ class SnowflakeFileTransferAgent:
|
|
|
386
387
|
self._use_s3_regional_url = use_s3_regional_url
|
|
387
388
|
self._credentials: StorageCredential | None = None
|
|
388
389
|
self._iobound_tpe_limit = iobound_tpe_limit
|
|
390
|
+
self._unsafe_file_write = unsafe_file_write
|
|
389
391
|
|
|
390
392
|
def execute(self) -> None:
|
|
391
393
|
self._parse_command()
|
|
@@ -673,6 +675,7 @@ class SnowflakeFileTransferAgent:
|
|
|
673
675
|
meta,
|
|
674
676
|
self._stage_info,
|
|
675
677
|
4 * megabyte,
|
|
678
|
+
unsafe_file_write=self._unsafe_file_write,
|
|
676
679
|
)
|
|
677
680
|
elif self._stage_location_type == AZURE_FS:
|
|
678
681
|
return SnowflakeAzureRestClient(
|
|
@@ -681,6 +684,7 @@ class SnowflakeFileTransferAgent:
|
|
|
681
684
|
AZURE_CHUNK_SIZE,
|
|
682
685
|
self._stage_info,
|
|
683
686
|
use_s3_regional_url=self._use_s3_regional_url,
|
|
687
|
+
unsafe_file_write=self._unsafe_file_write,
|
|
684
688
|
)
|
|
685
689
|
elif self._stage_location_type == S3_FS:
|
|
686
690
|
return SnowflakeS3RestClient(
|
|
@@ -690,6 +694,7 @@ class SnowflakeFileTransferAgent:
|
|
|
690
694
|
_chunk_size_calculator(meta.src_file_size),
|
|
691
695
|
use_accelerate_endpoint=self._use_accelerate_endpoint,
|
|
692
696
|
use_s3_regional_url=self._use_s3_regional_url,
|
|
697
|
+
unsafe_file_write=self._unsafe_file_write,
|
|
693
698
|
)
|
|
694
699
|
elif self._stage_location_type == GCS_FS:
|
|
695
700
|
return SnowflakeGCSRestClient(
|
|
@@ -699,6 +704,7 @@ class SnowflakeFileTransferAgent:
|
|
|
699
704
|
self._cursor._connection,
|
|
700
705
|
self._command,
|
|
701
706
|
use_s3_regional_url=self._use_s3_regional_url,
|
|
707
|
+
unsafe_file_write=self._unsafe_file_write,
|
|
702
708
|
)
|
|
703
709
|
raise Exception(f"{self._stage_location_type} is an unknown stage type")
|
|
704
710
|
|
|
@@ -54,6 +54,7 @@ class SnowflakeGCSRestClient(SnowflakeStorageClient):
|
|
|
54
54
|
cnx: SnowflakeConnection,
|
|
55
55
|
command: str,
|
|
56
56
|
use_s3_regional_url: bool = False,
|
|
57
|
+
unsafe_file_write: bool = False,
|
|
57
58
|
) -> None:
|
|
58
59
|
"""Creates a client object with given stage credentials.
|
|
59
60
|
|
|
@@ -64,7 +65,12 @@ class SnowflakeGCSRestClient(SnowflakeStorageClient):
|
|
|
64
65
|
The client to communicate with GCS.
|
|
65
66
|
"""
|
|
66
67
|
super().__init__(
|
|
67
|
-
meta,
|
|
68
|
+
meta,
|
|
69
|
+
stage_info,
|
|
70
|
+
-1,
|
|
71
|
+
credentials=credentials,
|
|
72
|
+
chunked_transfer=False,
|
|
73
|
+
unsafe_file_write=unsafe_file_write,
|
|
68
74
|
)
|
|
69
75
|
self.stage_info = stage_info
|
|
70
76
|
self._command = command
|
|
@@ -26,8 +26,11 @@ class SnowflakeLocalStorageClient(SnowflakeStorageClient):
|
|
|
26
26
|
meta: SnowflakeFileMeta,
|
|
27
27
|
stage_info: dict[str, Any],
|
|
28
28
|
chunk_size: int,
|
|
29
|
+
unsafe_file_write: bool = False,
|
|
29
30
|
) -> None:
|
|
30
|
-
super().__init__(
|
|
31
|
+
super().__init__(
|
|
32
|
+
meta, stage_info, chunk_size, unsafe_file_write=unsafe_file_write
|
|
33
|
+
)
|
|
31
34
|
self.data_file = meta.src_file_name
|
|
32
35
|
self.full_dst_file_name: str = os.path.join(
|
|
33
36
|
stage_info["location"], os.path.basename(meta.dst_file_name)
|
|
@@ -188,6 +188,7 @@ OAUTH_AUTHENTICATOR = "OAUTH"
|
|
|
188
188
|
ID_TOKEN_AUTHENTICATOR = "ID_TOKEN"
|
|
189
189
|
USR_PWD_MFA_AUTHENTICATOR = "USERNAME_PASSWORD_MFA"
|
|
190
190
|
PROGRAMMATIC_ACCESS_TOKEN = "PROGRAMMATIC_ACCESS_TOKEN"
|
|
191
|
+
NO_AUTH_AUTHENTICATOR = "NO_AUTH"
|
|
191
192
|
|
|
192
193
|
|
|
193
194
|
def is_retryable_http_code(code: int) -> bool:
|
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
|
7
7
|
import importlib
|
|
8
8
|
import os
|
|
9
9
|
import warnings
|
|
10
|
-
from importlib.metadata import
|
|
10
|
+
from importlib.metadata import PackageNotFoundError, distribution
|
|
11
11
|
from logging import getLogger
|
|
12
12
|
from types import ModuleType
|
|
13
13
|
from typing import Union
|
|
@@ -85,13 +85,13 @@ def _import_or_missing_pandas_option() -> (
|
|
|
85
85
|
os.environ["ARROW_DEFAULT_MEMORY_POOL"] = "system"
|
|
86
86
|
|
|
87
87
|
# Check whether we have the currently supported pyarrow installed
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
dependencies =
|
|
93
|
-
"
|
|
94
|
-
|
|
88
|
+
try:
|
|
89
|
+
pyarrow_dist = distribution("pyarrow")
|
|
90
|
+
snowflake_connector_dist = distribution("snowflake-connector-python")
|
|
91
|
+
|
|
92
|
+
dependencies = snowflake_connector_dist.metadata.get_all(
|
|
93
|
+
"Requires-Dist", []
|
|
94
|
+
)
|
|
95
95
|
pandas_pyarrow_extra = None
|
|
96
96
|
for dependency in dependencies:
|
|
97
97
|
dep = Requirement(dependency)
|
|
@@ -103,16 +103,15 @@ def _import_or_missing_pandas_option() -> (
|
|
|
103
103
|
pandas_pyarrow_extra = dep
|
|
104
104
|
break
|
|
105
105
|
|
|
106
|
-
installed_pyarrow_version =
|
|
106
|
+
installed_pyarrow_version = pyarrow_dist.version
|
|
107
107
|
if not pandas_pyarrow_extra.specifier.contains(installed_pyarrow_version):
|
|
108
108
|
warn_incompatible_dep(
|
|
109
109
|
"pyarrow", installed_pyarrow_version, pandas_pyarrow_extra
|
|
110
110
|
)
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
except PackageNotFoundError as e:
|
|
113
113
|
logger.info(
|
|
114
|
-
"Cannot determine if compatible pyarrow is installed because of missing package(s)
|
|
115
|
-
"{}".format(list(installed_packages.keys()))
|
|
114
|
+
f"Cannot determine if compatible pyarrow is installed because of missing package(s): {e}"
|
|
116
115
|
)
|
|
117
116
|
return pandas, pyarrow, True
|
|
118
117
|
except ImportError:
|
|
@@ -215,6 +215,42 @@ def _create_temp_file_format(
|
|
|
215
215
|
return file_format_location
|
|
216
216
|
|
|
217
217
|
|
|
218
|
+
def _convert_value_to_sql_option(value: Union[str, bool, int, float]) -> str:
|
|
219
|
+
if isinstance(value, str):
|
|
220
|
+
if len(value) > 1 and value.startswith("'") and value.endswith("'"):
|
|
221
|
+
return value
|
|
222
|
+
else:
|
|
223
|
+
value = value.replace(
|
|
224
|
+
"'", "''"
|
|
225
|
+
) # escape single quotes before adding a pair of quotes
|
|
226
|
+
return f"'{value}'"
|
|
227
|
+
else:
|
|
228
|
+
return str(value)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _iceberg_config_statement_helper(iceberg_config: dict[str, str]) -> str:
|
|
232
|
+
ALLOWED_CONFIGS = {
|
|
233
|
+
"EXTERNAL_VOLUME",
|
|
234
|
+
"CATALOG",
|
|
235
|
+
"BASE_LOCATION",
|
|
236
|
+
"CATALOG_SYNC",
|
|
237
|
+
"STORAGE_SERIALIZATION_POLICY",
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
normalized = {
|
|
241
|
+
k.upper(): _convert_value_to_sql_option(v)
|
|
242
|
+
for k, v in iceberg_config.items()
|
|
243
|
+
if v is not None
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if invalid_configs := set(normalized.keys()) - ALLOWED_CONFIGS:
|
|
247
|
+
raise ProgrammingError(
|
|
248
|
+
f"Invalid iceberg configurations option(s) provided {', '.join(sorted(invalid_configs))}"
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
return " ".join(f"{k}={v}" for k, v in normalized.items())
|
|
252
|
+
|
|
253
|
+
|
|
218
254
|
def write_pandas(
|
|
219
255
|
conn: SnowflakeConnection,
|
|
220
256
|
df: pandas.DataFrame,
|
|
@@ -231,6 +267,7 @@ def write_pandas(
|
|
|
231
267
|
overwrite: bool = False,
|
|
232
268
|
table_type: Literal["", "temp", "temporary", "transient"] = "",
|
|
233
269
|
use_logical_type: bool | None = None,
|
|
270
|
+
iceberg_config: dict[str, str] | None = None,
|
|
234
271
|
**kwargs: Any,
|
|
235
272
|
) -> tuple[
|
|
236
273
|
bool,
|
|
@@ -295,6 +332,14 @@ def write_pandas(
|
|
|
295
332
|
Snowflake can interpret Parquet logical types during data loading. To enable Parquet logical types,
|
|
296
333
|
set use_logical_type as True. Set to None to use Snowflakes default. For more information, see:
|
|
297
334
|
https://docs.snowflake.com/en/sql-reference/sql/create-file-format
|
|
335
|
+
iceberg_config: A dictionary that can contain the following iceberg configuration values:
|
|
336
|
+
* external_volume: specifies the identifier for the external volume where
|
|
337
|
+
the Iceberg table stores its metadata files and data in Parquet format
|
|
338
|
+
* catalog: specifies either Snowflake or a catalog integration to use for this table
|
|
339
|
+
* base_location: the base directory that snowflake can write iceberg metadata and files to
|
|
340
|
+
* catalog_sync: optionally sets the catalog integration configured for Polaris Catalog
|
|
341
|
+
* storage_serialization_policy: specifies the storage serialization policy for the table
|
|
342
|
+
|
|
298
343
|
|
|
299
344
|
|
|
300
345
|
Returns:
|
|
@@ -479,9 +524,14 @@ def write_pandas(
|
|
|
479
524
|
quote_identifiers,
|
|
480
525
|
)
|
|
481
526
|
|
|
527
|
+
iceberg = "ICEBERG " if iceberg_config else ""
|
|
528
|
+
iceberg_config_statement = _iceberg_config_statement_helper(
|
|
529
|
+
iceberg_config or {}
|
|
530
|
+
)
|
|
531
|
+
|
|
482
532
|
create_table_sql = (
|
|
483
|
-
f"CREATE {table_type.upper()} TABLE IF NOT EXISTS identifier(?) "
|
|
484
|
-
f"({create_table_columns})"
|
|
533
|
+
f"CREATE {table_type.upper()} {iceberg}TABLE IF NOT EXISTS identifier(?) "
|
|
534
|
+
f"({create_table_columns}) {iceberg_config_statement}"
|
|
485
535
|
f" /* Python:snowflake.connector.pandas_tools.write_pandas() */ "
|
|
486
536
|
)
|
|
487
537
|
params = (target_table_location,)
|
|
@@ -61,13 +61,20 @@ class SnowflakeS3RestClient(SnowflakeStorageClient):
|
|
|
61
61
|
chunk_size: int,
|
|
62
62
|
use_accelerate_endpoint: bool | None = None,
|
|
63
63
|
use_s3_regional_url: bool = False,
|
|
64
|
+
unsafe_file_write: bool = False,
|
|
64
65
|
) -> None:
|
|
65
66
|
"""Rest client for S3 storage.
|
|
66
67
|
|
|
67
68
|
Args:
|
|
68
69
|
stage_info:
|
|
69
70
|
"""
|
|
70
|
-
super().__init__(
|
|
71
|
+
super().__init__(
|
|
72
|
+
meta,
|
|
73
|
+
stage_info,
|
|
74
|
+
chunk_size,
|
|
75
|
+
credentials=credentials,
|
|
76
|
+
unsafe_file_write=unsafe_file_write,
|
|
77
|
+
)
|
|
71
78
|
# Signature version V4
|
|
72
79
|
# Addressing style Virtual Host
|
|
73
80
|
self.region_name: str = stage_info["region"]
|