snowflake-connector-python 3.6.0__tar.gz → 3.7.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.6.0 → snowflake-connector-python-3.7.0}/DESCRIPTION.md +11 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/MANIFEST.in +1 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/PKG-INFO +13 -1
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/setup.cfg +1 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/setup.py +30 -44
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/arrow_context.py +5 -3
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/_auth.py +2 -2
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/keypair.py +2 -2
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/webbrowser.py +32 -10
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/azure_storage_client.py +2 -2
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/config_manager.py +1 -1
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/connection.py +147 -107
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/connection_diagnostic.py +1 -1
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter.py +20 -6
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter_issue23517.py +4 -4
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/cursor.py +28 -13
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +7 -10
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +6 -7
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +25 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +6 -7
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +459 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +23 -20
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +129 -0
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +119 -0
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +959 -0
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +141 -0
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +51 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +11 -13
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +40 -51
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +23 -25
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +10 -21
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +4 -6
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +10 -17
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +12 -14
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +4 -6
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +6 -9
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +15 -25
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +3 -5
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +38 -56
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +17 -23
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +4 -5
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +5 -6
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +8 -11
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +7 -10
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +6 -7
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +40 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +6 -7
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +350 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +47 -52
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +69 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +7 -11
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +3204 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +403 -289
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +503 -368
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +55 -31
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +13 -15
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +78 -57
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +53 -37
- snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +33260 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +79 -70
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +19 -26
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +16 -12
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/network.py +8 -3
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ocsp_snowflake.py +3 -3
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/result_set.py +20 -3
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/s3_storage_client.py +2 -2
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/telemetry_oob.py +3 -1
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +2 -2
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/version.py +1 -1
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/PKG-INFO +13 -1
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -29
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -486
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -62
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -156
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -845
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -161
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -59
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -46
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -349
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -76
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -3169
- snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -22428
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/CONTRIBUTING.md +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/LICENSE.txt +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/NOTICE +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/README.md +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/SECURITY.md +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/pyproject.toml +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/okta.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/cache.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/compat.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/constants.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/description.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/errors.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/feature.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/file_util.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/options.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/proxy.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/py.typed +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sf_dirs.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/test_util.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/time_util.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/url_util.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/util_text.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
- {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -8,6 +8,17 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
8
8
|
|
|
9
9
|
# Release Notes
|
|
10
10
|
|
|
11
|
+
- v3.7.0(January 25,2024)
|
|
12
|
+
|
|
13
|
+
- Added a new boolean parameter `force_return_table` to `SnowflakeCursor.fetch_arrow_all` to force returning `pyarrow.Table` in case of zero rows.
|
|
14
|
+
- Cleanup some C++ code warnings and performance issues.
|
|
15
|
+
- Added support for Python 3.12
|
|
16
|
+
- Make local testing more robust against implicit assumptions.
|
|
17
|
+
- Fixed PyArrow Table type hinting
|
|
18
|
+
- Added support for connecting using an existing connection via the session and master token.
|
|
19
|
+
- Added support for connecting to Snowflake by authenticating with multiple SAML IDP using external browser.
|
|
20
|
+
- Fixed compilation issue due to missing cstdint header on gcc13.
|
|
21
|
+
- Improved config permissions warning message.
|
|
11
22
|
|
|
12
23
|
- v3.6.0(December 09,2023)
|
|
13
24
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.7.0
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -26,6 +26,7 @@ Classifier: Programming Language :: Python :: 3.8
|
|
|
26
26
|
Classifier: Programming Language :: Python :: 3.9
|
|
27
27
|
Classifier: Programming Language :: Python :: 3.10
|
|
28
28
|
Classifier: Programming Language :: Python :: 3.11
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
29
30
|
Classifier: Programming Language :: SQL
|
|
30
31
|
Classifier: Topic :: Database
|
|
31
32
|
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
@@ -84,6 +85,17 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
84
85
|
|
|
85
86
|
# Release Notes
|
|
86
87
|
|
|
88
|
+
- v3.7.0(January 25,2024)
|
|
89
|
+
|
|
90
|
+
- Added a new boolean parameter `force_return_table` to `SnowflakeCursor.fetch_arrow_all` to force returning `pyarrow.Table` in case of zero rows.
|
|
91
|
+
- Cleanup some C++ code warnings and performance issues.
|
|
92
|
+
- Added support for Python 3.12
|
|
93
|
+
- Make local testing more robust against implicit assumptions.
|
|
94
|
+
- Fixed PyArrow Table type hinting
|
|
95
|
+
- Added support for connecting using an existing connection via the session and master token.
|
|
96
|
+
- Added support for connecting to Snowflake by authenticating with multiple SAML IDP using external browser.
|
|
97
|
+
- Fixed compilation issue due to missing cstdint header on gcc13.
|
|
98
|
+
- Improved config permissions warning message.
|
|
87
99
|
|
|
88
100
|
- v3.6.0(December 09,2023)
|
|
89
101
|
|
|
@@ -24,6 +24,7 @@ classifiers =
|
|
|
24
24
|
Programming Language :: Python :: 3.9
|
|
25
25
|
Programming Language :: Python :: 3.10
|
|
26
26
|
Programming Language :: Python :: 3.11
|
|
27
|
+
Programming Language :: Python :: 3.12
|
|
27
28
|
Programming Language :: SQL
|
|
28
29
|
Topic :: Database
|
|
29
30
|
Topic :: Scientific/Engineering :: Information Analysis
|
|
@@ -75,6 +75,8 @@ if _ABLE_TO_COMPILE_EXTENSIONS and not SNOWFLAKE_DISABLE_COMPILE_ARROW_EXTENSION
|
|
|
75
75
|
if options["debug"]:
|
|
76
76
|
ext.extra_compile_args.append("-g")
|
|
77
77
|
ext.extra_link_args.append("-g")
|
|
78
|
+
ext.extra_compile_args.append("-O0")
|
|
79
|
+
ext.extra_link_args.append("-O0")
|
|
78
80
|
current_dir = os.getcwd()
|
|
79
81
|
|
|
80
82
|
if ext.name == "snowflake.connector.nanoarrow_arrow_iterator":
|
|
@@ -88,51 +90,35 @@ if _ABLE_TO_COMPILE_EXTENSIONS and not SNOWFLAKE_DISABLE_COMPILE_ARROW_EXTENSION
|
|
|
88
90
|
|
|
89
91
|
ext.sources += [
|
|
90
92
|
os.path.join(
|
|
91
|
-
NANOARROW_ARROW_ITERATOR_SRC_DIR,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "IntConverter.cpp"),
|
|
117
|
-
os.path.join(
|
|
118
|
-
NANOARROW_ARROW_ITERATOR_SRC_DIR, "StringConverter.cpp"
|
|
119
|
-
),
|
|
120
|
-
os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "TimeConverter.cpp"),
|
|
121
|
-
os.path.join(
|
|
122
|
-
NANOARROW_ARROW_ITERATOR_SRC_DIR, "TimeStampConverter.cpp"
|
|
123
|
-
),
|
|
124
|
-
os.path.join(
|
|
125
|
-
NANOARROW_ARROW_ITERATOR_SRC_DIR, "Python", "Common.cpp"
|
|
126
|
-
),
|
|
127
|
-
os.path.join(
|
|
128
|
-
NANOARROW_ARROW_ITERATOR_SRC_DIR, "Python", "Helpers.cpp"
|
|
129
|
-
),
|
|
130
|
-
os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "Util", "time.cpp"),
|
|
131
|
-
NANOARROW_LOGGING_SRC_DIR + "/logging.cpp",
|
|
132
|
-
os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "nanoarrow.c"),
|
|
133
|
-
os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "nanoarrow_ipc.c"),
|
|
134
|
-
os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "flatcc.c"),
|
|
93
|
+
NANOARROW_ARROW_ITERATOR_SRC_DIR,
|
|
94
|
+
*((file,) if isinstance(file, str) else file)
|
|
95
|
+
)
|
|
96
|
+
for file in {
|
|
97
|
+
"BinaryConverter.cpp",
|
|
98
|
+
"BooleanConverter.cpp",
|
|
99
|
+
"CArrowChunkIterator.cpp",
|
|
100
|
+
"CArrowIterator.cpp",
|
|
101
|
+
"CArrowTableIterator.cpp",
|
|
102
|
+
"DateConverter.cpp",
|
|
103
|
+
"DecimalConverter.cpp",
|
|
104
|
+
"FixedSizeListConverter.cpp",
|
|
105
|
+
"FloatConverter.cpp",
|
|
106
|
+
"IntConverter.cpp",
|
|
107
|
+
"SnowflakeType.cpp",
|
|
108
|
+
"StringConverter.cpp",
|
|
109
|
+
"TimeConverter.cpp",
|
|
110
|
+
"TimeStampConverter.cpp",
|
|
111
|
+
"flatcc.c",
|
|
112
|
+
"nanoarrow.c",
|
|
113
|
+
"nanoarrow_ipc.c",
|
|
114
|
+
("Python", "Common.cpp"),
|
|
115
|
+
("Python", "Helpers.cpp"),
|
|
116
|
+
("Util", "time.cpp"),
|
|
117
|
+
}
|
|
135
118
|
]
|
|
119
|
+
ext.sources.append(
|
|
120
|
+
os.path.join(NANOARROW_LOGGING_SRC_DIR, "logging.cpp")
|
|
121
|
+
)
|
|
136
122
|
ext.include_dirs.append(NANOARROW_ARROW_ITERATOR_SRC_DIR)
|
|
137
123
|
ext.include_dirs.append(NANOARROW_LOGGING_SRC_DIR)
|
|
138
124
|
|
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
|
7
7
|
|
|
8
8
|
import decimal
|
|
9
9
|
import time
|
|
10
|
-
from datetime import datetime, timedelta, tzinfo
|
|
10
|
+
from datetime import datetime, timedelta, timezone, tzinfo
|
|
11
11
|
from logging import getLogger
|
|
12
12
|
from sys import byteorder
|
|
13
13
|
from typing import TYPE_CHECKING
|
|
@@ -33,7 +33,7 @@ try:
|
|
|
33
33
|
except ImportError:
|
|
34
34
|
tzlocal = None
|
|
35
35
|
|
|
36
|
-
ZERO_EPOCH = datetime.
|
|
36
|
+
ZERO_EPOCH = datetime.fromtimestamp(0, timezone.utc).replace(tzinfo=None)
|
|
37
37
|
|
|
38
38
|
logger = getLogger(__name__)
|
|
39
39
|
|
|
@@ -99,7 +99,9 @@ class ArrowConverterContext:
|
|
|
99
99
|
return t.replace(tzinfo=tzinfo)
|
|
100
100
|
|
|
101
101
|
def TIMESTAMP_NTZ_to_python(self, epoch: int, microseconds: int) -> datetime:
|
|
102
|
-
return datetime.
|
|
102
|
+
return datetime.fromtimestamp(epoch, timezone.utc).replace(
|
|
103
|
+
tzinfo=None
|
|
104
|
+
) + timedelta(microseconds=microseconds)
|
|
103
105
|
|
|
104
106
|
def TIMESTAMP_NTZ_to_python_windows(
|
|
105
107
|
self, epoch: int, microseconds: int
|
|
@@ -11,7 +11,7 @@ import logging
|
|
|
11
11
|
import tempfile
|
|
12
12
|
import time
|
|
13
13
|
import uuid
|
|
14
|
-
from datetime import datetime
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
15
|
from os import getenv, makedirs, mkdir, path, remove, removedirs, rmdir
|
|
16
16
|
from os.path import expanduser
|
|
17
17
|
from threading import Lock, Thread
|
|
@@ -392,7 +392,7 @@ class Auth:
|
|
|
392
392
|
"Token expires at: %s. "
|
|
393
393
|
"Current Time: %s",
|
|
394
394
|
str(auth_instance._jwt_token_exp),
|
|
395
|
-
str(datetime.
|
|
395
|
+
str(datetime.now(timezone.utc).replace(tzinfo=None)),
|
|
396
396
|
)
|
|
397
397
|
from . import AuthByUsrPwdMfa
|
|
398
398
|
|
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
import base64
|
|
9
9
|
import hashlib
|
|
10
10
|
import os
|
|
11
|
-
from datetime import datetime, timedelta
|
|
11
|
+
from datetime import datetime, timedelta, timezone
|
|
12
12
|
from logging import getLogger
|
|
13
13
|
from typing import Any
|
|
14
14
|
|
|
@@ -103,7 +103,7 @@ class AuthByKeyPair(AuthByPlugin):
|
|
|
103
103
|
account = account.upper()
|
|
104
104
|
user = user.upper()
|
|
105
105
|
|
|
106
|
-
now = datetime.
|
|
106
|
+
now = datetime.now(timezone.utc).replace(tzinfo=None)
|
|
107
107
|
|
|
108
108
|
if isinstance(self._private_key, bytes):
|
|
109
109
|
try:
|
|
@@ -5,16 +5,18 @@
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import base64
|
|
8
9
|
import json
|
|
9
10
|
import logging
|
|
10
11
|
import os
|
|
12
|
+
import secrets
|
|
11
13
|
import socket
|
|
12
14
|
import time
|
|
13
15
|
import webbrowser
|
|
14
16
|
from types import ModuleType
|
|
15
17
|
from typing import TYPE_CHECKING, Any
|
|
16
18
|
|
|
17
|
-
from ..compat import parse_qs, urlparse, urlsplit
|
|
19
|
+
from ..compat import parse_qs, urlencode, urlparse, urlsplit
|
|
18
20
|
from ..constants import (
|
|
19
21
|
HTTP_HEADER_ACCEPT,
|
|
20
22
|
HTTP_HEADER_CONTENT_TYPE,
|
|
@@ -134,10 +136,14 @@ class AuthByWebBrowser(AuthByPlugin):
|
|
|
134
136
|
socket_connection.listen(0) # no backlog
|
|
135
137
|
callback_port = socket_connection.getsockname()[1]
|
|
136
138
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
if conn._disable_console_login:
|
|
140
|
+
logger.debug("step 1: query GS to obtain SSO url")
|
|
141
|
+
sso_url = self._get_sso_url(
|
|
142
|
+
conn, authenticator, service_name, account, callback_port, user
|
|
143
|
+
)
|
|
144
|
+
else:
|
|
145
|
+
logger.debug("step 1: constructing console login url")
|
|
146
|
+
sso_url = self._get_console_login_url(conn, callback_port, user)
|
|
141
147
|
|
|
142
148
|
logger.debug("Validate SSO URL")
|
|
143
149
|
if not is_valid_url(sso_url):
|
|
@@ -274,15 +280,13 @@ class AuthByWebBrowser(AuthByPlugin):
|
|
|
274
280
|
content.append(f"Access-Control-Allow-Origin: {self._origin}")
|
|
275
281
|
content.append("Vary: Accept-Encoding, Origin")
|
|
276
282
|
else:
|
|
277
|
-
msg = """
|
|
283
|
+
msg = f"""
|
|
278
284
|
<!DOCTYPE html><html><head><meta charset="UTF-8"/>
|
|
279
285
|
<title>SAML Response for Snowflake</title></head>
|
|
280
286
|
<body>
|
|
281
|
-
Your identity was confirmed and propagated to Snowflake {}.
|
|
287
|
+
Your identity was confirmed and propagated to Snowflake {self._application}.
|
|
282
288
|
You can close this window now and go back where you started from.
|
|
283
|
-
</body></html>"""
|
|
284
|
-
self._application
|
|
285
|
-
)
|
|
289
|
+
</body></html>"""
|
|
286
290
|
content.append(f"Content-Length: {len(msg)}")
|
|
287
291
|
content.append("")
|
|
288
292
|
content.append(msg)
|
|
@@ -415,3 +419,21 @@ You can close this window now and go back where you started from.
|
|
|
415
419
|
sso_url = data["ssoUrl"]
|
|
416
420
|
self._proof_key = data["proofKey"]
|
|
417
421
|
return sso_url
|
|
422
|
+
|
|
423
|
+
def _get_console_login_url(
|
|
424
|
+
self, conn: SnowflakeConnection, port: int, user: str
|
|
425
|
+
) -> str:
|
|
426
|
+
self._proof_key = base64.b64encode(secrets.token_bytes(32)).decode("ascii")
|
|
427
|
+
url = (
|
|
428
|
+
conn._rest.server_url
|
|
429
|
+
+ "/console/login?"
|
|
430
|
+
+ urlencode(
|
|
431
|
+
{
|
|
432
|
+
"login_name": user,
|
|
433
|
+
"browser_mode_redirect_port": port,
|
|
434
|
+
"proof_key": self._proof_key,
|
|
435
|
+
}
|
|
436
|
+
)
|
|
437
|
+
)
|
|
438
|
+
logger.debug(f"Console Log In URL: {url}")
|
|
439
|
+
return url
|
|
@@ -7,7 +7,7 @@ from __future__ import annotations
|
|
|
7
7
|
import json
|
|
8
8
|
import os
|
|
9
9
|
import xml.etree.ElementTree as ET
|
|
10
|
-
from datetime import datetime
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
11
|
from logging import getLogger
|
|
12
12
|
from random import choice
|
|
13
13
|
from string import hexdigits
|
|
@@ -90,7 +90,7 @@ class SnowflakeAzureRestClient(SnowflakeStorageClient):
|
|
|
90
90
|
headers = {}
|
|
91
91
|
|
|
92
92
|
def generate_authenticated_url_and_rest_args() -> tuple[bytes, dict[str, Any]]:
|
|
93
|
-
curtime = datetime.
|
|
93
|
+
curtime = datetime.now(timezone.utc).replace(tzinfo=None)
|
|
94
94
|
timestamp = curtime.strftime("YYYY-MM-DD")
|
|
95
95
|
sas_token = self.credentials.creds["AZURE_SAS_TOKEN"]
|
|
96
96
|
if sas_token and sas_token.startswith("?"):
|
|
@@ -336,7 +336,7 @@ class ConfigManager:
|
|
|
336
336
|
):
|
|
337
337
|
# for non-Windows, suggest change to 0600 permissions.
|
|
338
338
|
chmod_message = (
|
|
339
|
-
f
|
|
339
|
+
f'.\n * To change owner, run `chown $USER "{str(filep)}"`.\n * To restrict permissions, run `chmod 0600 "{str(filep)}"`.\n'
|
|
340
340
|
if not IS_WINDOWS
|
|
341
341
|
else ""
|
|
342
342
|
)
|
|
@@ -256,6 +256,22 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
|
|
|
256
256
|
True,
|
|
257
257
|
bool,
|
|
258
258
|
), # Enable sending retryReason in response header for query-requests
|
|
259
|
+
"session_token": (
|
|
260
|
+
None,
|
|
261
|
+
(type(None), str),
|
|
262
|
+
), # session token from another connection, to be provided together with master token
|
|
263
|
+
"master_token": (
|
|
264
|
+
None,
|
|
265
|
+
(type(None), str),
|
|
266
|
+
), # master token from another connection, to be provided together with session token
|
|
267
|
+
"master_validity_in_seconds": (
|
|
268
|
+
None,
|
|
269
|
+
(type(None), int),
|
|
270
|
+
), # master token validity in seconds
|
|
271
|
+
"disable_console_login": (
|
|
272
|
+
True,
|
|
273
|
+
bool,
|
|
274
|
+
), # Disable console login and fall back to getting SSO URL from GS
|
|
259
275
|
}
|
|
260
276
|
|
|
261
277
|
APPLICATION_RE = re.compile(r"[\w\d_]+")
|
|
@@ -913,100 +929,123 @@ class SnowflakeConnection:
|
|
|
913
929
|
|
|
914
930
|
# Setup authenticator
|
|
915
931
|
auth = Auth(self.rest)
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
raise TypeError("auth_class must be a child class of AuthByKeyPair")
|
|
923
|
-
# TODO: add telemetry for custom auth
|
|
924
|
-
self.auth_class = self.auth_class
|
|
925
|
-
elif self._authenticator == DEFAULT_AUTHENTICATOR:
|
|
926
|
-
self.auth_class = AuthByDefault(
|
|
927
|
-
password=self._password,
|
|
928
|
-
timeout=self._login_timeout,
|
|
929
|
-
backoff_generator=self._backoff_generator,
|
|
930
|
-
)
|
|
931
|
-
elif self._authenticator == EXTERNAL_BROWSER_AUTHENTICATOR:
|
|
932
|
-
self._session_parameters[PARAMETER_CLIENT_STORE_TEMPORARY_CREDENTIAL] = (
|
|
933
|
-
self._client_store_temporary_credential if IS_LINUX else True
|
|
934
|
-
)
|
|
935
|
-
auth.read_temporary_credentials(
|
|
936
|
-
self.host,
|
|
937
|
-
self.user,
|
|
938
|
-
self._session_parameters,
|
|
932
|
+
|
|
933
|
+
if self._session_token and self._master_token:
|
|
934
|
+
auth._rest.update_tokens(
|
|
935
|
+
self._session_token,
|
|
936
|
+
self._master_token,
|
|
937
|
+
self._master_validity_in_seconds,
|
|
939
938
|
)
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
if
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
939
|
+
heartbeat_ret = auth._rest._heartbeat()
|
|
940
|
+
logger.debug(heartbeat_ret)
|
|
941
|
+
if not heartbeat_ret or not heartbeat_ret.get("success"):
|
|
942
|
+
Error.errorhandler_wrapper(
|
|
943
|
+
self,
|
|
944
|
+
None,
|
|
945
|
+
ProgrammingError,
|
|
946
|
+
{
|
|
947
|
+
"msg": "Session and master tokens invalid",
|
|
948
|
+
"errno": ER_INVALID_VALUE,
|
|
949
|
+
},
|
|
950
950
|
)
|
|
951
951
|
else:
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
952
|
+
logger.debug("Session and master token validation successful.")
|
|
953
|
+
|
|
954
|
+
else:
|
|
955
|
+
if self.auth_class is not None:
|
|
956
|
+
if type(
|
|
957
|
+
self.auth_class
|
|
958
|
+
) not in FIRST_PARTY_AUTHENTICATORS and not issubclass(
|
|
959
|
+
type(self.auth_class), AuthByKeyPair
|
|
960
|
+
):
|
|
961
|
+
raise TypeError("auth_class must be a child class of AuthByKeyPair")
|
|
962
|
+
# TODO: add telemetry for custom auth
|
|
963
|
+
self.auth_class = self.auth_class
|
|
964
|
+
elif self._authenticator == DEFAULT_AUTHENTICATOR:
|
|
965
|
+
self.auth_class = AuthByDefault(
|
|
966
|
+
password=self._password,
|
|
958
967
|
timeout=self._login_timeout,
|
|
959
968
|
backoff_generator=self._backoff_generator,
|
|
960
969
|
)
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
if self._private_key_file:
|
|
966
|
-
private_key = _get_private_bytes_from_file(
|
|
967
|
-
self._private_key_file,
|
|
968
|
-
self._private_key_file_pwd,
|
|
969
|
-
)
|
|
970
|
-
|
|
971
|
-
self.auth_class = AuthByKeyPair(
|
|
972
|
-
private_key=private_key,
|
|
973
|
-
timeout=self._login_timeout,
|
|
974
|
-
backoff_generator=self._backoff_generator,
|
|
975
|
-
)
|
|
976
|
-
elif self._authenticator == OAUTH_AUTHENTICATOR:
|
|
977
|
-
self.auth_class = AuthByOAuth(
|
|
978
|
-
oauth_token=self._token,
|
|
979
|
-
timeout=self._login_timeout,
|
|
980
|
-
backoff_generator=self._backoff_generator,
|
|
981
|
-
)
|
|
982
|
-
elif self._authenticator == USR_PWD_MFA_AUTHENTICATOR:
|
|
983
|
-
self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN] = (
|
|
984
|
-
self._client_request_mfa_token if IS_LINUX else True
|
|
985
|
-
)
|
|
986
|
-
if self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN]:
|
|
970
|
+
elif self._authenticator == EXTERNAL_BROWSER_AUTHENTICATOR:
|
|
971
|
+
self._session_parameters[
|
|
972
|
+
PARAMETER_CLIENT_STORE_TEMPORARY_CREDENTIAL
|
|
973
|
+
] = (self._client_store_temporary_credential if IS_LINUX else True)
|
|
987
974
|
auth.read_temporary_credentials(
|
|
988
975
|
self.host,
|
|
989
976
|
self.user,
|
|
990
977
|
self._session_parameters,
|
|
991
978
|
)
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
979
|
+
# Depending on whether self._rest.id_token is available we do different
|
|
980
|
+
# auth_instance
|
|
981
|
+
if self._rest.id_token is None:
|
|
982
|
+
self.auth_class = AuthByWebBrowser(
|
|
983
|
+
application=self.application,
|
|
984
|
+
protocol=self._protocol,
|
|
985
|
+
host=self.host,
|
|
986
|
+
port=self.port,
|
|
987
|
+
timeout=self._login_timeout,
|
|
988
|
+
backoff_generator=self._backoff_generator,
|
|
989
|
+
)
|
|
990
|
+
else:
|
|
991
|
+
self.auth_class = AuthByIdToken(
|
|
992
|
+
id_token=self._rest.id_token,
|
|
993
|
+
application=self.application,
|
|
994
|
+
protocol=self._protocol,
|
|
995
|
+
host=self.host,
|
|
996
|
+
port=self.port,
|
|
997
|
+
timeout=self._login_timeout,
|
|
998
|
+
backoff_generator=self._backoff_generator,
|
|
999
|
+
)
|
|
1000
|
+
|
|
1001
|
+
elif self._authenticator == KEY_PAIR_AUTHENTICATOR:
|
|
1002
|
+
private_key = self._private_key
|
|
1003
|
+
|
|
1004
|
+
if self._private_key_file:
|
|
1005
|
+
private_key = _get_private_bytes_from_file(
|
|
1006
|
+
self._private_key_file,
|
|
1007
|
+
self._private_key_file_pwd,
|
|
1008
|
+
)
|
|
1009
|
+
|
|
1010
|
+
self.auth_class = AuthByKeyPair(
|
|
1011
|
+
private_key=private_key,
|
|
1012
|
+
timeout=self._login_timeout,
|
|
1013
|
+
backoff_generator=self._backoff_generator,
|
|
1014
|
+
)
|
|
1015
|
+
elif self._authenticator == OAUTH_AUTHENTICATOR:
|
|
1016
|
+
self.auth_class = AuthByOAuth(
|
|
1017
|
+
oauth_token=self._token,
|
|
1018
|
+
timeout=self._login_timeout,
|
|
1019
|
+
backoff_generator=self._backoff_generator,
|
|
1020
|
+
)
|
|
1021
|
+
elif self._authenticator == USR_PWD_MFA_AUTHENTICATOR:
|
|
1022
|
+
self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN] = (
|
|
1023
|
+
self._client_request_mfa_token if IS_LINUX else True
|
|
1024
|
+
)
|
|
1025
|
+
if self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN]:
|
|
1026
|
+
auth.read_temporary_credentials(
|
|
1027
|
+
self.host,
|
|
1028
|
+
self.user,
|
|
1029
|
+
self._session_parameters,
|
|
1030
|
+
)
|
|
1031
|
+
self.auth_class = AuthByUsrPwdMfa(
|
|
1032
|
+
password=self._password,
|
|
1033
|
+
mfa_token=self.rest.mfa_token,
|
|
1034
|
+
timeout=self._login_timeout,
|
|
1035
|
+
backoff_generator=self._backoff_generator,
|
|
1036
|
+
)
|
|
1037
|
+
else:
|
|
1038
|
+
# okta URL, e.g., https://<account>.okta.com/
|
|
1039
|
+
self.auth_class = AuthByOkta(
|
|
1040
|
+
application=self.application,
|
|
1041
|
+
timeout=self._login_timeout,
|
|
1042
|
+
backoff_generator=self._backoff_generator,
|
|
1043
|
+
)
|
|
1005
1044
|
|
|
1006
|
-
|
|
1045
|
+
self.authenticate_with_retry(self.auth_class)
|
|
1007
1046
|
|
|
1008
|
-
|
|
1009
|
-
|
|
1047
|
+
self._password = None # ensure password won't persist
|
|
1048
|
+
self.auth_class.reset_secrets()
|
|
1010
1049
|
|
|
1011
1050
|
self.initialize_query_context_cache()
|
|
1012
1051
|
|
|
@@ -1115,34 +1154,35 @@ class SnowflakeConnection:
|
|
|
1115
1154
|
]:
|
|
1116
1155
|
self._authenticator = auth_tmp
|
|
1117
1156
|
|
|
1118
|
-
if not self.
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1157
|
+
if not (self._master_token and self._session_token):
|
|
1158
|
+
if not self.user and self._authenticator != OAUTH_AUTHENTICATOR:
|
|
1159
|
+
# OAuth Authentication does not require a username
|
|
1160
|
+
Error.errorhandler_wrapper(
|
|
1161
|
+
self,
|
|
1162
|
+
None,
|
|
1163
|
+
ProgrammingError,
|
|
1164
|
+
{"msg": "User is empty", "errno": ER_NO_USER},
|
|
1165
|
+
)
|
|
1126
1166
|
|
|
1127
|
-
|
|
1128
|
-
|
|
1167
|
+
if self._private_key or self._private_key_file:
|
|
1168
|
+
self._authenticator = KEY_PAIR_AUTHENTICATOR
|
|
1129
1169
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1170
|
+
if (
|
|
1171
|
+
self.auth_class is None
|
|
1172
|
+
and self._authenticator
|
|
1173
|
+
not in [
|
|
1174
|
+
EXTERNAL_BROWSER_AUTHENTICATOR,
|
|
1175
|
+
OAUTH_AUTHENTICATOR,
|
|
1176
|
+
KEY_PAIR_AUTHENTICATOR,
|
|
1177
|
+
]
|
|
1178
|
+
and not self._password
|
|
1179
|
+
):
|
|
1180
|
+
Error.errorhandler_wrapper(
|
|
1181
|
+
self,
|
|
1182
|
+
None,
|
|
1183
|
+
ProgrammingError,
|
|
1184
|
+
{"msg": "Password is empty", "errno": ER_NO_PASSWORD},
|
|
1185
|
+
)
|
|
1146
1186
|
|
|
1147
1187
|
if not self._account:
|
|
1148
1188
|
Error.errorhandler_wrapper(
|
|
@@ -211,7 +211,7 @@ class ConnectionDiagnostic:
|
|
|
211
211
|
conn.send(str.encode(connect))
|
|
212
212
|
conn.recv(4096).decode("utf-8")
|
|
213
213
|
|
|
214
|
-
context = ssl.SSLContext(ssl.
|
|
214
|
+
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
|
215
215
|
sock = context.wrap_socket(conn, server_hostname=host)
|
|
216
216
|
certificate = ssl.DER_cert_to_PEM_cert(sock.getpeercert(True))
|
|
217
217
|
conn.close()
|