snowflake-connector-python 3.12.4__tar.gz → 3.13.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.
Files changed (238) hide show
  1. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/DESCRIPTION.md +7 -0
  2. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/PKG-INFO +9 -2
  3. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/README.md +20 -0
  4. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/__init__.py +3 -0
  5. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/by_plugin.py +1 -0
  6. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/keypair.py +13 -2
  7. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/oauth.py +1 -1
  8. snowflake_connector_python-3.13.0/src/snowflake/connector/auth/pat.py +43 -0
  9. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/connection.py +41 -6
  10. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/cursor.py +9 -5
  11. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/errors.py +2 -3
  12. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/file_transfer_agent.py +12 -2
  13. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/network.py +1 -0
  14. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/version.py +1 -1
  15. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake_connector_python.egg-info/PKG-INFO +9 -2
  16. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
  17. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/CONTRIBUTING.md +0 -0
  18. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/LICENSE.txt +0 -0
  19. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/MANIFEST.in +0 -0
  20. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/NOTICE +0 -0
  21. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/SECURITY.md +0 -0
  22. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/pyproject.toml +0 -0
  23. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/setup.cfg +0 -0
  24. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/setup.py +0 -0
  25. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/__init__.py +0 -0
  26. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/_query_context_cache.py +0 -0
  27. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/_sql_util.py +0 -0
  28. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/_utils.py +0 -0
  29. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/arrow_context.py +0 -0
  30. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/_auth.py +0 -0
  31. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/default.py +0 -0
  32. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/idtoken.py +0 -0
  33. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/okta.py +0 -0
  34. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  35. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
  36. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/azure_storage_client.py +0 -0
  37. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/backoff_policies.py +0 -0
  38. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
  39. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/cache.py +0 -0
  40. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/compat.py +0 -0
  41. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/config_manager.py +0 -0
  42. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/connection_diagnostic.py +0 -0
  43. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/constants.py +0 -0
  44. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/converter.py +0 -0
  45. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/converter_issue23517.py +0 -0
  46. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/converter_null.py +0 -0
  47. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/converter_snowsql.py +0 -0
  48. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/dbapi.py +0 -0
  49. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/description.py +0 -0
  50. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/encryption_util.py +0 -0
  51. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/errorcode.py +0 -0
  52. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/feature.py +0 -0
  53. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/file_compression_type.py +0 -0
  54. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/file_util.py +0 -0
  55. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/gcs_storage_client.py +0 -0
  56. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/gzip_decoder.py +0 -0
  57. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/local_storage_client.py +0 -0
  58. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/log_configuration.py +0 -0
  59. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  60. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  61. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  62. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  63. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  64. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  65. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  66. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  67. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  68. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  69. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  70. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  71. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  72. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  73. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  74. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  75. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  76. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  77. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  78. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  79. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  80. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  81. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  82. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  83. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  84. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  85. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  86. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  87. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  88. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  89. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  90. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  91. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  92. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  93. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  94. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  95. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  96. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  97. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  98. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  99. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  100. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  101. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  102. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  103. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  104. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  105. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  106. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  107. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  108. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  109. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  110. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  111. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  112. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  113. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  114. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  115. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  116. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  117. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  118. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  119. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  120. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  121. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  122. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  123. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  124. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  125. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  126. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  127. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  128. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  129. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  130. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  131. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  132. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  133. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  134. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  135. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  136. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  137. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  138. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  139. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  140. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  141. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  142. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  143. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  144. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  145. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  146. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  147. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  148. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/options.py +0 -0
  149. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/pandas_tools.py +0 -0
  150. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/proxy.py +0 -0
  151. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/py.typed +0 -0
  152. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/result_batch.py +0 -0
  153. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/result_set.py +0 -0
  154. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/s3_storage_client.py +0 -0
  155. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/secret_detector.py +0 -0
  156. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/sf_dirs.py +0 -0
  157. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
  158. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/sfdatetime.py +0 -0
  159. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/snow_logging.py +0 -0
  160. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/sqlstate.py +0 -0
  161. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  162. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  163. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/storage_client.py +0 -0
  164. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/telemetry.py +0 -0
  165. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/telemetry_oob.py +0 -0
  166. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/test_util.py +0 -0
  167. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/time_util.py +0 -0
  168. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/tool/__init__.py +0 -0
  169. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
  170. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  171. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  172. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
  173. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/url_util.py +0 -0
  174. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/util_text.py +0 -0
  175. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/__init__.py +0 -0
  176. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  177. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  178. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  179. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  180. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  181. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
  182. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  183. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  184. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  185. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  186. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  187. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
  188. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  189. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
  190. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  191. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  192. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  193. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  194. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  195. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  196. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  197. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  198. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  199. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  200. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  201. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
  202. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
  203. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
  204. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
  205. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
  206. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
  207. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  208. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
  209. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  210. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  211. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  212. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  213. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
  214. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
  215. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
  216. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
  217. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
  218. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  219. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
  220. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  221. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  222. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  223. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  224. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
  225. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  226. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  227. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  228. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  229. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  230. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  231. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  232. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  233. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  234. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  235. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  236. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  237. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
  238. {snowflake_connector_python-3.12.4 → snowflake_connector_python-3.13.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -8,6 +8,13 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
8
8
 
9
9
  # Release Notes
10
10
 
11
+ - v3.13.0(January 23,2025)
12
+ - Added a feature to limit the sizes of IO-bound ThreadPoolExecutors during PUT and GET commands.
13
+ - Updated README.md to include instructions on how to verify package signatures using `cosign`.
14
+ - Updated the log level for cursor's chunk rowcount from INFO to DEBUG.
15
+ - Added a feature to verify if the connection is still good enough to send queries over.
16
+ - Added support for base64-encoded DER private key strings in the `private_key` authentication type.
17
+
11
18
  - v3.12.4(December 3,2024)
12
19
  - Fixed a bug where multipart uploads to Azure would be missing their MD5 hashes.
13
20
  - Fixed a bug where OpenTelemetry header injection would sometimes cause Exceptions to be thrown.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: snowflake-connector-python
3
- Version: 3.12.4
3
+ Version: 3.13.0
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -85,6 +85,13 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
85
85
 
86
86
  # Release Notes
87
87
 
88
+ - v3.13.0(January 23,2025)
89
+ - Added a feature to limit the sizes of IO-bound ThreadPoolExecutors during PUT and GET commands.
90
+ - Updated README.md to include instructions on how to verify package signatures using `cosign`.
91
+ - Updated the log level for cursor's chunk rowcount from INFO to DEBUG.
92
+ - Added a feature to verify if the connection is still good enough to send queries over.
93
+ - Added support for base64-encoded DER private key strings in the `private_key` authentication type.
94
+
88
95
  - v3.12.4(December 3,2024)
89
96
  - Fixed a bug where multipart uploads to Azure would be missing their MD5 hashes.
90
97
  - Fixed a bug where OpenTelemetry header injection would sometimes cause Exceptions to be thrown.
@@ -82,6 +82,26 @@ conn = snowflake.connector.connect(
82
82
  conn.telemetry_enabled = False
83
83
  ```
84
84
 
85
+ ## Verifying Package Signatures
86
+
87
+ To ensure the authenticity and integrity of the Python package, follow the steps below to verify the package signature using `cosign`.
88
+
89
+ **Steps to verify the signature:**
90
+ - Install cosign:
91
+ - This example is using golang installation: [installing-cosign-with-go](https://edu.chainguard.dev/open-source/sigstore/cosign/how-to-install-cosign/#installing-cosign-with-go)
92
+ - Download the file from the repository like pypi:
93
+ - https://pypi.org/project/snowflake-connector-python/#files
94
+ - Download the signature files from the release tag, replace the version number with the version you are verifying:
95
+ - https://github.com/snowflakedb/snowflake-connector-python/releases/tag/v3.12.2
96
+ - Verify signature:
97
+ ````bash
98
+ # replace the version number with the version you are verifying
99
+ ./cosign verify-blob snowflake_connector_python-3.12.2.tar.gz \
100
+ --key snowflake-connector-python-v3.12.2.pub \
101
+ --signature resources.linux.snowflake_connector_python-3.12.2.tar.gz.sig
102
+
103
+ Verified OK
104
+ ````
85
105
 
86
106
  ## NOTE
87
107
 
@@ -11,6 +11,7 @@ from .idtoken import AuthByIdToken
11
11
  from .keypair import AuthByKeyPair
12
12
  from .oauth import AuthByOAuth
13
13
  from .okta import AuthByOkta
14
+ from .pat import AuthByPAT
14
15
  from .usrpwdmfa import AuthByUsrPwdMfa
15
16
  from .webbrowser import AuthByWebBrowser
16
17
 
@@ -23,6 +24,7 @@ FIRST_PARTY_AUTHENTICATORS = frozenset(
23
24
  AuthByUsrPwdMfa,
24
25
  AuthByWebBrowser,
25
26
  AuthByIdToken,
27
+ AuthByPAT,
26
28
  )
27
29
  )
28
30
 
@@ -30,6 +32,7 @@ __all__ = [
30
32
  "AuthByPlugin",
31
33
  "AuthByDefault",
32
34
  "AuthByKeyPair",
35
+ "AuthByPAT",
33
36
  "AuthByOAuth",
34
37
  "AuthByOkta",
35
38
  "AuthByUsrPwdMfa",
@@ -54,6 +54,7 @@ class AuthType(Enum):
54
54
  ID_TOKEN = "ID_TOKEN"
55
55
  USR_PWD_MFA = "USERNAME_PASSWORD_MFA"
56
56
  OKTA = "OKTA"
57
+ PAT = "PROGRAMMATIC_ACCESS_TOKEN'"
57
58
 
58
59
 
59
60
  class AuthByPlugin(ABC):
@@ -43,7 +43,7 @@ class AuthByKeyPair(AuthByPlugin):
43
43
 
44
44
  def __init__(
45
45
  self,
46
- private_key: bytes | RSAPrivateKey,
46
+ private_key: bytes | str | RSAPrivateKey,
47
47
  lifetime_in_seconds: int = LIFETIME,
48
48
  **kwargs,
49
49
  ) -> None:
@@ -75,7 +75,7 @@ class AuthByKeyPair(AuthByPlugin):
75
75
  ).total_seconds()
76
76
  )
77
77
 
78
- self._private_key: bytes | RSAPrivateKey | None = private_key
78
+ self._private_key: bytes | str | RSAPrivateKey | None = private_key
79
79
  self._jwt_token = ""
80
80
  self._jwt_token_exp = 0
81
81
  self._lifetime = timedelta(
@@ -105,6 +105,17 @@ class AuthByKeyPair(AuthByPlugin):
105
105
 
106
106
  now = datetime.now(timezone.utc).replace(tzinfo=None)
107
107
 
108
+ if isinstance(self._private_key, str):
109
+ try:
110
+ self._private_key = base64.b64decode(self._private_key)
111
+ except Exception as e:
112
+ raise ProgrammingError(
113
+ msg=f"Failed to decode private key: {e}\nPlease provide a valid "
114
+ "unencrypted rsa private key in base64-encoded DER format as a "
115
+ "str object",
116
+ errno=ER_INVALID_PRIVATE_KEY,
117
+ )
118
+
108
119
  if isinstance(self._private_key, bytes):
109
120
  try:
110
121
  private_key = load_der_private_key(
@@ -22,7 +22,7 @@ class AuthByOAuth(AuthByPlugin):
22
22
  return AuthType.OAUTH
23
23
 
24
24
  @property
25
- def assertion_content(self) -> str:
25
+ def assertion_content(self) -> str | None:
26
26
  """Returns the token."""
27
27
  return self._oauth_token
28
28
 
@@ -0,0 +1,43 @@
1
+ #
2
+ # Copyright (c) 2012-2023 Snowflake Computing Inc. All rights reserved.
3
+ #
4
+
5
+ from __future__ import annotations
6
+
7
+ import typing
8
+
9
+ from snowflake.connector.network import PROGRAMMATIC_ACCESS_TOKEN
10
+
11
+ from .by_plugin import AuthByPlugin, AuthType
12
+
13
+
14
+ class AuthByPAT(AuthByPlugin):
15
+
16
+ def __init__(self, pat_token: str, **kwargs) -> None:
17
+ super().__init__(**kwargs)
18
+ self._pat_token: str | None = pat_token
19
+
20
+ def type_(self) -> AuthType:
21
+ return AuthType.PAT
22
+
23
+ def reset_secrets(self) -> None:
24
+ self._pat_token = None
25
+
26
+ def update_body(self, body: dict[typing.Any, typing.Any]) -> None:
27
+ body["data"]["AUTHENTICATOR"] = PROGRAMMATIC_ACCESS_TOKEN
28
+ body["data"]["TOKEN"] = self._pat_token
29
+
30
+ def prepare(
31
+ self,
32
+ **kwargs: typing.Any,
33
+ ) -> None:
34
+ """Nothing to do here, token should be obtained outside the driver."""
35
+ pass
36
+
37
+ def reauthenticate(self, **kwargs: typing.Any) -> dict[str, bool]:
38
+ return {"success": False}
39
+
40
+ @property
41
+ def assertion_content(self) -> str | None:
42
+ """Returns the token."""
43
+ return self._pat_token
@@ -41,6 +41,7 @@ from .auth import (
41
41
  AuthByKeyPair,
42
42
  AuthByOAuth,
43
43
  AuthByOkta,
44
+ AuthByPAT,
44
45
  AuthByPlugin,
45
46
  AuthByUsrPwdMfa,
46
47
  AuthByWebBrowser,
@@ -99,6 +100,7 @@ from .network import (
99
100
  EXTERNAL_BROWSER_AUTHENTICATOR,
100
101
  KEY_PAIR_AUTHENTICATOR,
101
102
  OAUTH_AUTHENTICATOR,
103
+ PROGRAMMATIC_ACCESS_TOKEN,
102
104
  REQUEST_ID,
103
105
  USR_PWD_MFA_AUTHENTICATOR,
104
106
  ReauthenticationRequest,
@@ -182,10 +184,14 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
182
184
  "backoff_policy": (DEFAULT_BACKOFF_POLICY, Callable),
183
185
  "passcode_in_password": (False, bool), # Snowflake MFA
184
186
  "passcode": (None, (type(None), str)), # Snowflake MFA
185
- "private_key": (None, (type(None), bytes, RSAPrivateKey)),
187
+ "private_key": (None, (type(None), bytes, str, RSAPrivateKey)),
186
188
  "private_key_file": (None, (type(None), str)),
187
189
  "private_key_file_pwd": (None, (type(None), str, bytes)),
188
- "token": (None, (type(None), str)), # OAuth or JWT Token
190
+ "token": (None, (type(None), str)), # OAuth/JWT/PAT Token
191
+ "token_file_path": (
192
+ None,
193
+ (type(None), str, bytes),
194
+ ), # OAuth/JWT/PAT Token file path
189
195
  "authenticator": (DEFAULT_AUTHENTICATOR, (type(None), str)),
190
196
  "mfa_callback": (None, (type(None), Callable)),
191
197
  "password_callback": (None, (type(None), Callable)),
@@ -294,6 +300,10 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
294
300
  False,
295
301
  bool,
296
302
  ), # disable saml url check in okta authentication
303
+ "iobound_tpe_limit": (
304
+ None,
305
+ (type(None), int),
306
+ ), # SNOW-1817982: limit iobound TPE sizes when executing PUT/GET
297
307
  }
298
308
 
299
309
  APPLICATION_RE = re.compile(r"[\w\d_]+")
@@ -726,6 +736,10 @@ class SnowflakeConnection:
726
736
  def is_query_context_cache_disabled(self) -> bool:
727
737
  return self._disable_query_context_cache
728
738
 
739
+ @property
740
+ def iobound_tpe_limit(self) -> int | None:
741
+ return self._iobound_tpe_limit
742
+
729
743
  def connect(self, **kwargs) -> None:
730
744
  """Establishes connection to Snowflake."""
731
745
  logger.debug("connect")
@@ -1089,6 +1103,8 @@ class SnowflakeConnection:
1089
1103
  timeout=self.login_timeout,
1090
1104
  backoff_generator=self._backoff_generator,
1091
1105
  )
1106
+ elif self._authenticator == PROGRAMMATIC_ACCESS_TOKEN:
1107
+ self.auth_class = AuthByPAT(self._token)
1092
1108
  else:
1093
1109
  # okta URL, e.g., https://<account>.okta.com/
1094
1110
  self.auth_class = AuthByOkta(
@@ -1237,11 +1253,12 @@ class SnowflakeConnection:
1237
1253
  if (
1238
1254
  self.auth_class is None
1239
1255
  and self._authenticator
1240
- not in [
1256
+ not in (
1241
1257
  EXTERNAL_BROWSER_AUTHENTICATOR,
1242
1258
  OAUTH_AUTHENTICATOR,
1243
1259
  KEY_PAIR_AUTHENTICATOR,
1244
- ]
1260
+ PROGRAMMATIC_ACCESS_TOKEN,
1261
+ )
1245
1262
  and not self._password
1246
1263
  ):
1247
1264
  Error.errorhandler_wrapper(
@@ -1660,7 +1677,7 @@ class SnowflakeConnection:
1660
1677
  self._telemetry.try_add_log_to_batch(telemetry_data)
1661
1678
 
1662
1679
  def _add_heartbeat(self) -> None:
1663
- """Add an hourly heartbeat query in order to keep connection alive."""
1680
+ """Add a periodic heartbeat query in order to keep connection alive."""
1664
1681
  if not self.heartbeat_thread:
1665
1682
  self._validate_client_session_keep_alive_heartbeat_frequency()
1666
1683
  heartbeat_wref = weakref.WeakMethod(self._heartbeat_tick)
@@ -1686,7 +1703,7 @@ class SnowflakeConnection:
1686
1703
  logger.debug("stopped heartbeat")
1687
1704
 
1688
1705
  def _heartbeat_tick(self) -> None:
1689
- """Execute a hearbeat if connection isn't closed yet."""
1706
+ """Execute a heartbeat if connection isn't closed yet."""
1690
1707
  if not self.is_closed():
1691
1708
  logger.debug("heartbeating!")
1692
1709
  self.rest._heartbeat()
@@ -1973,3 +1990,21 @@ class SnowflakeConnection:
1973
1990
  connection=self,
1974
1991
  )
1975
1992
  )
1993
+
1994
+ def is_valid(self) -> bool:
1995
+ """This function tries to answer the question: Is this connection still good for sending queries?
1996
+ Attempts to validate the connections both on the TCP/IP and Session levels."""
1997
+ logger.debug("validating connection and session")
1998
+ if self.is_closed():
1999
+ logger.debug("connection is already closed and not valid")
2000
+ return False
2001
+
2002
+ try:
2003
+ logger.debug("trying to heartbeat into the session to validate")
2004
+ hb_result = self.rest._heartbeat()
2005
+ session_valid = hb_result.get("success")
2006
+ logger.debug("session still valid? %s", session_valid)
2007
+ return bool(session_valid)
2008
+ except Exception as e:
2009
+ logger.debug("session could not be validated due to exception: %s", e)
2010
+ return False
@@ -929,12 +929,15 @@ class SnowflakeCursor:
929
929
 
930
930
  if _do_reset:
931
931
  self.reset()
932
- command = command.strip(" \t\n\r") if command else None
932
+ command = command.strip(" \t\n\r") if command else ""
933
933
  if not command:
934
- logger.warning("execute: no query is given to execute")
935
- return None
936
- logger.debug("query: [%s]", self._format_query_for_log(command))
934
+ if _dataframe_ast:
935
+ logger.debug("dataframe ast: [%s]", _dataframe_ast)
936
+ else:
937
+ logger.warning("execute: no query is given to execute")
938
+ return None
937
939
 
940
+ logger.debug("query: [%s]", self._format_query_for_log(command))
938
941
  _statement_params = _statement_params or dict()
939
942
  # If we need to add another parameter, please consider introducing a dict for all extra params
940
943
  # See discussion in https://github.com/snowflakedb/snowflake-connector-python/pull/1524#discussion_r1174061775
@@ -1054,6 +1057,7 @@ class SnowflakeCursor:
1054
1057
  source_from_stream=file_stream,
1055
1058
  multipart_threshold=data.get("threshold"),
1056
1059
  use_s3_regional_url=self._connection.enable_stage_s3_privatelink_for_us_east_1,
1060
+ iobound_tpe_limit=self._connection.iobound_tpe_limit,
1057
1061
  )
1058
1062
  sf_file_transfer_agent.execute()
1059
1063
  data = sf_file_transfer_agent.result()
@@ -1163,7 +1167,7 @@ class SnowflakeCursor:
1163
1167
  )
1164
1168
 
1165
1169
  if not (is_dml or self.is_file_transfer):
1166
- logger.info(
1170
+ logger.debug(
1167
1171
  "Number of results in first chunk: %s", result_chunks[0].rowcount
1168
1172
  )
1169
1173
 
@@ -12,7 +12,6 @@ import traceback
12
12
  from logging import getLogger
13
13
  from typing import TYPE_CHECKING, Any
14
14
 
15
- from .compat import BASE_EXCEPTION_CLASS
16
15
  from .secret_detector import SecretDetector
17
16
  from .telemetry import TelemetryData, TelemetryField
18
17
  from .time_util import get_time_millis
@@ -28,7 +27,7 @@ connector_base_path = os.path.join("snowflake", "connector")
28
27
  RE_FORMATTED_ERROR = re.compile(r"^(\d{6,})(?: \((\S+)\))?:")
29
28
 
30
29
 
31
- class Error(BASE_EXCEPTION_CLASS):
30
+ class Error(Exception):
32
31
  """Base Snowflake exception class."""
33
32
 
34
33
  def __init__(
@@ -361,7 +360,7 @@ class Error(BASE_EXCEPTION_CLASS):
361
360
  return error_class(error_value)
362
361
 
363
362
 
364
- class _Warning(BASE_EXCEPTION_CLASS):
363
+ class _Warning(Exception):
365
364
  """Exception for important warnings."""
366
365
 
367
366
  pass
@@ -354,6 +354,7 @@ class SnowflakeFileTransferAgent:
354
354
  multipart_threshold: int | None = None,
355
355
  source_from_stream: IO[bytes] | None = None,
356
356
  use_s3_regional_url: bool = False,
357
+ iobound_tpe_limit: int | None = None,
357
358
  ) -> None:
358
359
  self._cursor = cursor
359
360
  self._command = command
@@ -384,6 +385,7 @@ class SnowflakeFileTransferAgent:
384
385
  self._multipart_threshold = multipart_threshold or 67108864 # Historical value
385
386
  self._use_s3_regional_url = use_s3_regional_url
386
387
  self._credentials: StorageCredential | None = None
388
+ self._iobound_tpe_limit = iobound_tpe_limit
387
389
 
388
390
  def execute(self) -> None:
389
391
  self._parse_command()
@@ -440,10 +442,15 @@ class SnowflakeFileTransferAgent:
440
442
  result.result_status = result.result_status.value
441
443
 
442
444
  def transfer(self, metas: list[SnowflakeFileMeta]) -> None:
445
+ iobound_tpe_limit = min(len(metas), os.cpu_count())
446
+ logger.debug("Decided IO-bound TPE size: %d", iobound_tpe_limit)
447
+ if self._iobound_tpe_limit is not None:
448
+ logger.debug("IO-bound TPE size is limited to: %d", self._iobound_tpe_limit)
449
+ iobound_tpe_limit = min(iobound_tpe_limit, self._iobound_tpe_limit)
443
450
  max_concurrency = self._parallel
444
451
  network_tpe = ThreadPoolExecutor(max_concurrency)
445
- preprocess_tpe = ThreadPoolExecutor(min(len(metas), os.cpu_count()))
446
- postprocess_tpe = ThreadPoolExecutor(min(len(metas), os.cpu_count()))
452
+ preprocess_tpe = ThreadPoolExecutor(iobound_tpe_limit)
453
+ postprocess_tpe = ThreadPoolExecutor(iobound_tpe_limit)
447
454
  logger.debug(f"Chunk ThreadPoolExecutor size: {max_concurrency}")
448
455
  cv_main_thread = threading.Condition() # to signal the main thread
449
456
  cv_chunk_process = (
@@ -454,6 +461,9 @@ class SnowflakeFileTransferAgent:
454
461
  transfer_metadata = TransferMetadata() # this is protected by cv_chunk_process
455
462
  is_upload = self._command_type == CMD_TYPE_UPLOAD
456
463
  exception_caught_in_callback: Exception | None = None
464
+ logger.debug(
465
+ "Going to %sload %d files", "up" if is_upload else "down", len(metas)
466
+ )
457
467
 
458
468
  def notify_file_completed() -> None:
459
469
  # Increment the number of completed files, then notify the main thread.
@@ -187,6 +187,7 @@ KEY_PAIR_AUTHENTICATOR = "SNOWFLAKE_JWT"
187
187
  OAUTH_AUTHENTICATOR = "OAUTH"
188
188
  ID_TOKEN_AUTHENTICATOR = "ID_TOKEN"
189
189
  USR_PWD_MFA_AUTHENTICATOR = "USERNAME_PASSWORD_MFA"
190
+ PROGRAMMATIC_ACCESS_TOKEN = "PROGRAMMATIC_ACCESS_TOKEN"
190
191
 
191
192
 
192
193
  def is_retryable_http_code(code: int) -> bool:
@@ -1,3 +1,3 @@
1
1
  # Update this for the versions
2
2
  # Don't change the forth version number from None
3
- VERSION = (3, 12, 4, None)
3
+ VERSION = (3, 13, 0, None)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: snowflake-connector-python
3
- Version: 3.12.4
3
+ Version: 3.13.0
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -85,6 +85,13 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
85
85
 
86
86
  # Release Notes
87
87
 
88
+ - v3.13.0(January 23,2025)
89
+ - Added a feature to limit the sizes of IO-bound ThreadPoolExecutors during PUT and GET commands.
90
+ - Updated README.md to include instructions on how to verify package signatures using `cosign`.
91
+ - Updated the log level for cursor's chunk rowcount from INFO to DEBUG.
92
+ - Added a feature to verify if the connection is still good enough to send queries over.
93
+ - Added support for base64-encoded DER private key strings in the `private_key` authentication type.
94
+
88
95
  - v3.12.4(December 3,2024)
89
96
  - Fixed a bug where multipart uploads to Azure would be missing their MD5 hashes.
90
97
  - Fixed a bug where OpenTelemetry header injection would sometimes cause Exceptions to be thrown.
@@ -74,6 +74,7 @@ src/snowflake/connector/auth/idtoken.py
74
74
  src/snowflake/connector/auth/keypair.py
75
75
  src/snowflake/connector/auth/oauth.py
76
76
  src/snowflake/connector/auth/okta.py
77
+ src/snowflake/connector/auth/pat.py
77
78
  src/snowflake/connector/auth/usrpwdmfa.py
78
79
  src/snowflake/connector/auth/webbrowser.py
79
80
  src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp