snowflake-connector-python 3.12.2__tar.gz → 3.12.3__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 (237) hide show
  1. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/DESCRIPTION.md +4 -0
  2. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/PKG-INFO +5 -1
  3. snowflake_connector_python-3.12.3/src/snowflake/connector/_utils.py +56 -0
  4. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/_auth.py +16 -2
  5. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/azure_storage_client.py +17 -1
  6. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/bind_upload_agent.py +19 -6
  7. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/connection.py +3 -0
  8. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/constants.py +6 -0
  9. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/cursor.py +17 -4
  10. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/network.py +14 -2
  11. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/pandas_tools.py +54 -8
  12. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/secret_detector.py +2 -2
  13. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/version.py +1 -1
  14. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake_connector_python.egg-info/PKG-INFO +5 -1
  15. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
  16. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/CONTRIBUTING.md +0 -0
  17. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/LICENSE.txt +0 -0
  18. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/MANIFEST.in +0 -0
  19. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/NOTICE +0 -0
  20. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/README.md +0 -0
  21. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/SECURITY.md +0 -0
  22. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/pyproject.toml +0 -0
  23. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/setup.cfg +0 -0
  24. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/setup.py +0 -0
  25. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/__init__.py +0 -0
  26. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/_query_context_cache.py +0 -0
  27. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/_sql_util.py +0 -0
  28. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/arrow_context.py +0 -0
  29. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/__init__.py +0 -0
  30. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/by_plugin.py +0 -0
  31. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/default.py +0 -0
  32. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/idtoken.py +0 -0
  33. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/keypair.py +0 -0
  34. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/oauth.py +0 -0
  35. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/okta.py +0 -0
  36. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  37. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/auth/webbrowser.py +0 -0
  38. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/backoff_policies.py +0 -0
  39. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/cache.py +0 -0
  40. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/compat.py +0 -0
  41. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/config_manager.py +0 -0
  42. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/connection_diagnostic.py +0 -0
  43. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/converter.py +0 -0
  44. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/converter_issue23517.py +0 -0
  45. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/converter_null.py +0 -0
  46. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/converter_snowsql.py +0 -0
  47. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/dbapi.py +0 -0
  48. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/description.py +0 -0
  49. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/encryption_util.py +0 -0
  50. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/errorcode.py +0 -0
  51. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/errors.py +0 -0
  52. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/feature.py +0 -0
  53. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/file_compression_type.py +0 -0
  54. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/file_transfer_agent.py +0 -0
  55. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/file_util.py +0 -0
  56. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/gcs_storage_client.py +0 -0
  57. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/gzip_decoder.py +0 -0
  58. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/local_storage_client.py +0 -0
  59. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/log_configuration.py +0 -0
  60. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  61. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  62. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  63. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  64. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  65. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  66. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  67. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  68. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  69. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  70. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  71. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  72. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  73. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  74. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  75. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  76. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  77. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  78. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  79. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  80. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  81. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  82. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  83. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  84. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  85. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  86. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  87. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  88. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  89. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  90. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  91. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  92. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  93. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  94. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  95. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  96. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  97. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  98. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  99. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  100. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  101. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  102. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  103. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  104. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  105. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  106. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  107. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  108. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  109. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  110. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  111. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  112. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  113. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  114. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  115. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  116. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  117. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  118. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  119. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  120. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  121. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  122. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  123. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  124. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  125. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  126. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  127. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  128. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  129. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  130. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  131. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  132. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  133. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  134. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  135. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  136. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  137. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  138. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  139. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  140. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  141. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  142. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  143. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  144. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  145. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  146. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  147. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  148. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  149. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/options.py +0 -0
  150. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/proxy.py +0 -0
  151. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/py.typed +0 -0
  152. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/result_batch.py +0 -0
  153. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/result_set.py +0 -0
  154. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/s3_storage_client.py +0 -0
  155. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/sf_dirs.py +0 -0
  156. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/sfbinaryformat.py +0 -0
  157. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/sfdatetime.py +0 -0
  158. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/snow_logging.py +0 -0
  159. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/sqlstate.py +0 -0
  160. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  161. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  162. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/storage_client.py +0 -0
  163. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/telemetry.py +0 -0
  164. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/telemetry_oob.py +0 -0
  165. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/test_util.py +0 -0
  166. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/time_util.py +0 -0
  167. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/tool/__init__.py +0 -0
  168. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/tool/dump_certs.py +0 -0
  169. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  170. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  171. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/tool/probe_connection.py +0 -0
  172. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/url_util.py +0 -0
  173. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/util_text.py +0 -0
  174. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/__init__.py +0 -0
  175. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  176. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  177. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  178. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  179. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  180. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/api.py +0 -0
  181. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  182. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  183. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  184. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  185. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  186. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/help.py +0 -0
  187. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  188. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/models.py +0 -0
  189. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  190. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  191. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  192. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  193. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  194. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  195. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  196. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  197. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  198. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  199. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  200. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
  201. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
  202. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
  203. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
  204. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
  205. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
  206. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  207. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
  208. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  209. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  210. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  211. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  212. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
  213. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
  214. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
  215. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
  216. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
  217. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  218. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
  219. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  220. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  221. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  222. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  223. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
  224. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  225. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  226. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  227. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  228. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  229. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  230. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  231. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  232. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  233. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  234. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  235. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  236. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
  237. {snowflake_connector_python-3.12.2 → snowflake_connector_python-3.12.3}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -8,6 +8,10 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
8
8
 
9
9
  # Release Notes
10
10
 
11
+ - v3.12.3(October 25,2024)
12
+ - Improved the error message for SSL-related issues to provide clearer guidance when an SSL error occurs.
13
+ - Improved error message for SQL execution cancellations caused by timeout.
14
+
11
15
  - v3.12.2(September 11,2024)
12
16
  - Improved error handling for asynchronous queries, providing more detailed and informative error messages when an async query fails.
13
17
  - Improved inference of top-level domains for accounts specifying a region in China, now defaulting to snowflakecomputing.cn.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: snowflake-connector-python
3
- Version: 3.12.2
3
+ Version: 3.12.3
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -85,6 +85,10 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
85
85
 
86
86
  # Release Notes
87
87
 
88
+ - v3.12.3(October 25,2024)
89
+ - Improved the error message for SSL-related issues to provide clearer guidance when an SSL error occurs.
90
+ - Improved error message for SQL execution cancellations caused by timeout.
91
+
88
92
  - v3.12.2(September 11,2024)
89
93
  - Improved error handling for asynchronous queries, providing more detailed and informative error messages when an async query fails.
90
94
  - Improved inference of top-level domains for accounts specifying a region in China, now defaulting to snowflakecomputing.cn.
@@ -0,0 +1,56 @@
1
+ #
2
+ # Copyright (c) 2012-2023 Snowflake Computing Inc. All rights reserved.
3
+ #
4
+
5
+ from __future__ import annotations
6
+
7
+ import string
8
+ from enum import Enum
9
+ from random import choice
10
+ from threading import Timer
11
+
12
+
13
+ class TempObjectType(Enum):
14
+ TABLE = "TABLE"
15
+ VIEW = "VIEW"
16
+ STAGE = "STAGE"
17
+ FUNCTION = "FUNCTION"
18
+ FILE_FORMAT = "FILE_FORMAT"
19
+ QUERY_TAG = "QUERY_TAG"
20
+ COLUMN = "COLUMN"
21
+ PROCEDURE = "PROCEDURE"
22
+ TABLE_FUNCTION = "TABLE_FUNCTION"
23
+ DYNAMIC_TABLE = "DYNAMIC_TABLE"
24
+ AGGREGATE_FUNCTION = "AGGREGATE_FUNCTION"
25
+ CTE = "CTE"
26
+
27
+
28
+ TEMP_OBJECT_NAME_PREFIX = "SNOWPARK_TEMP_"
29
+ ALPHANUMERIC = string.digits + string.ascii_lowercase
30
+ TEMPORARY_STRING = "TEMP"
31
+ SCOPED_TEMPORARY_STRING = "SCOPED TEMPORARY"
32
+ _PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS_STRING = (
33
+ "PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS"
34
+ )
35
+
36
+
37
+ def generate_random_alphanumeric(length: int = 10) -> str:
38
+ return "".join(choice(ALPHANUMERIC) for _ in range(length))
39
+
40
+
41
+ def random_name_for_temp_object(object_type: TempObjectType) -> str:
42
+ return f"{TEMP_OBJECT_NAME_PREFIX}{object_type.value}_{generate_random_alphanumeric().upper()}"
43
+
44
+
45
+ def get_temp_type_for_object(use_scoped_temp_objects: bool) -> str:
46
+ return SCOPED_TEMPORARY_STRING if use_scoped_temp_objects else TEMPORARY_STRING
47
+
48
+
49
+ class _TrackedQueryCancellationTimer(Timer):
50
+ def __init__(self, interval, function, args=None, kwargs=None):
51
+ super().__init__(interval, function, args, kwargs)
52
+ self.executed = False
53
+
54
+ def run(self):
55
+ super().run()
56
+ self.executed = True
@@ -112,6 +112,18 @@ KEYRING_DRIVER_NAME = "SNOWFLAKE-PYTHON-DRIVER"
112
112
  ID_TOKEN = "ID_TOKEN"
113
113
  MFA_TOKEN = "MFATOKEN"
114
114
 
115
+ AUTHENTICATION_REQUEST_KEY_WHITELIST = {
116
+ "ACCOUNT_NAME",
117
+ "AUTHENTICATOR",
118
+ "CLIENT_APP_ID",
119
+ "CLIENT_APP_VERSION",
120
+ "CLIENT_ENVIRONMENT",
121
+ "EXT_AUTHN_DUO_METHOD",
122
+ "LOGIN_NAME",
123
+ "SESSION_PARAMETERS",
124
+ "SVN_REVISION",
125
+ }
126
+
115
127
 
116
128
  class Auth:
117
129
  """Snowflake Authenticator."""
@@ -205,7 +217,6 @@ class Auth:
205
217
 
206
218
  body = copy.deepcopy(body_template)
207
219
  # updating request body
208
- logger.debug("assertion content: %s", auth_instance.assertion_content)
209
220
  auth_instance.update_body(body)
210
221
 
211
222
  logger.debug(
@@ -243,7 +254,10 @@ class Auth:
243
254
 
244
255
  logger.debug(
245
256
  "body['data']: %s",
246
- {k: v for (k, v) in body["data"].items() if k != "PASSWORD"},
257
+ {
258
+ k: v if k in AUTHENTICATION_REQUEST_KEY_WHITELIST else "******"
259
+ for (k, v) in body["data"].items()
260
+ },
247
261
  )
248
262
 
249
263
  try:
@@ -8,7 +8,7 @@ import json
8
8
  import os
9
9
  import xml.etree.ElementTree as ET
10
10
  from datetime import datetime, timezone
11
- from logging import getLogger
11
+ from logging import Filter, getLogger
12
12
  from random import choice
13
13
  from string import hexdigits
14
14
  from typing import TYPE_CHECKING, Any, NamedTuple
@@ -39,6 +39,22 @@ ENCRYPTION_DATA = "x-ms-meta-encryptiondata"
39
39
  MATDESC = "x-ms-meta-matdesc"
40
40
 
41
41
 
42
+ class AzureCredentialFilter(Filter):
43
+ LEAKY_FMT = '%s://%s:%s "%s %s %s" %s %s'
44
+
45
+ def filter(self, record):
46
+ if record.msg == AzureCredentialFilter.LEAKY_FMT and len(record.args) == 8:
47
+ record.args = (
48
+ record.args[:4] + (record.args[4].split("?")[0],) + record.args[5:]
49
+ )
50
+ return True
51
+
52
+
53
+ getLogger("snowflake.connector.vendored.urllib3.connectionpool").addFilter(
54
+ AzureCredentialFilter()
55
+ )
56
+
57
+
42
58
  class SnowflakeAzureRestClient(SnowflakeStorageClient):
43
59
  def __init__(
44
60
  self,
@@ -10,6 +10,10 @@ from io import BytesIO
10
10
  from logging import getLogger
11
11
  from typing import TYPE_CHECKING
12
12
 
13
+ from ._utils import (
14
+ _PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS_STRING,
15
+ get_temp_type_for_object,
16
+ )
13
17
  from .errors import BindUploadError, Error
14
18
 
15
19
  if TYPE_CHECKING: # pragma: no cover
@@ -19,11 +23,6 @@ logger = getLogger(__name__)
19
23
 
20
24
 
21
25
  class BindUploadAgent:
22
- _STAGE_NAME = "SYSTEMBIND"
23
- _CREATE_STAGE_STMT = (
24
- f"create or replace temporary stage {_STAGE_NAME} "
25
- "file_format=(type=csv field_optionally_enclosed_by='\"')"
26
- )
27
26
 
28
27
  def __init__(
29
28
  self,
@@ -38,13 +37,27 @@ class BindUploadAgent:
38
37
  rows: Rows of binding parameters in CSV format.
39
38
  stream_buffer_size: Size of each file, default to 10MB.
40
39
  """
40
+ self._use_scoped_temp_object = (
41
+ cursor.connection._session_parameters.get(
42
+ _PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS_STRING, False
43
+ )
44
+ if cursor.connection._session_parameters
45
+ else False
46
+ )
47
+ self._STAGE_NAME = (
48
+ "SNOWPARK_TEMP_STAGE_BIND" if self._use_scoped_temp_object else "SYSTEMBIND"
49
+ )
41
50
  self.cursor = cursor
42
51
  self.rows = rows
43
52
  self._stream_buffer_size = stream_buffer_size
44
53
  self.stage_path = f"@{self._STAGE_NAME}/{uuid.uuid4().hex}"
45
54
 
46
55
  def _create_stage(self) -> None:
47
- self.cursor.execute(self._CREATE_STAGE_STMT)
56
+ create_stage_sql = (
57
+ f"create or replace {get_temp_type_for_object(self._use_scoped_temp_object)} stage {self._STAGE_NAME} "
58
+ "file_format=(type=csv field_optionally_enclosed_by='\"')"
59
+ )
60
+ self.cursor.execute(create_stage_sql)
48
61
 
49
62
  def upload(self) -> None:
50
63
  try:
@@ -52,6 +52,7 @@ from .compat import IS_LINUX, IS_WINDOWS, quote, urlencode
52
52
  from .config_manager import CONFIG_MANAGER, _get_default_connection_params
53
53
  from .connection_diagnostic import ConnectionDiagnostic
54
54
  from .constants import (
55
+ _CONNECTIVITY_ERR_MSG,
55
56
  _DOMAIN_NAME_MAP,
56
57
  ENV_VAR_PARTNER,
57
58
  PARAMETER_AUTOCOMMIT,
@@ -1455,6 +1456,8 @@ class SnowflakeConnection:
1455
1456
  )
1456
1457
  except OperationalError as auth_op:
1457
1458
  if auth_op.errno == ER_FAILED_TO_CONNECT_TO_DB:
1459
+ if _CONNECTIVITY_ERR_MSG in e.msg:
1460
+ auth_op.msg += f"\n{_CONNECTIVITY_ERR_MSG}"
1458
1461
  raise auth_op from e
1459
1462
  logger.debug("Continuing authenticator specific timeout handling")
1460
1463
  continue
@@ -428,3 +428,9 @@ ENV_VAR_TEST_MODE = "SNOWFLAKE_TEST_MODE"
428
428
 
429
429
 
430
430
  _DOMAIN_NAME_MAP = {_DEFAULT_HOSTNAME_TLD: "GLOBAL", _CHINA_HOSTNAME_TLD: "CHINA"}
431
+
432
+ _CONNECTIVITY_ERR_MSG = (
433
+ "Verify that the hostnames and port numbers in SYSTEM$ALLOWLIST are added to your firewall's allowed list."
434
+ "\nTo further troubleshoot your connection you may reference the following article: "
435
+ "https://docs.snowflake.com/en/user-guide/client-connectivity-troubleshooting/overview."
436
+ )
@@ -16,7 +16,7 @@ import uuid
16
16
  import warnings
17
17
  from enum import Enum
18
18
  from logging import getLogger
19
- from threading import Lock, Timer
19
+ from threading import Lock
20
20
  from types import TracebackType
21
21
  from typing import (
22
22
  IO,
@@ -39,6 +39,7 @@ from snowflake.connector.result_set import ResultSet
39
39
 
40
40
  from . import compat
41
41
  from ._sql_util import get_file_transfer_type
42
+ from ._utils import _TrackedQueryCancellationTimer
42
43
  from .bind_upload_agent import BindUploadAgent, BindUploadError
43
44
  from .constants import (
44
45
  FIELD_NAME_TO_ID,
@@ -392,7 +393,9 @@ class SnowflakeCursor:
392
393
  self.messages: list[
393
394
  tuple[type[Error] | type[Exception], dict[str, str | bool]]
394
395
  ] = []
395
- self._timebomb: Timer | None = None # must be here for abort_exit method
396
+ self._timebomb: _TrackedQueryCancellationTimer | None = (
397
+ None # must be here for abort_exit method
398
+ )
396
399
  self._description: list[ResultMetadataV2] | None = None
397
400
  self._sfqid: str | None = None
398
401
  self._sqlstate = None
@@ -654,7 +657,9 @@ class SnowflakeCursor:
654
657
  )
655
658
 
656
659
  if real_timeout is not None:
657
- self._timebomb = Timer(real_timeout, self.__cancel_query, [query])
660
+ self._timebomb = _TrackedQueryCancellationTimer(
661
+ real_timeout, self.__cancel_query, [query]
662
+ )
658
663
  self._timebomb.start()
659
664
  logger.debug("started timebomb in %ss", real_timeout)
660
665
  else:
@@ -1071,6 +1076,11 @@ class SnowflakeCursor:
1071
1076
  logger.debug(ret)
1072
1077
  err = ret["message"]
1073
1078
  code = ret.get("code", -1)
1079
+ if self._timebomb and self._timebomb.executed:
1080
+ err = (
1081
+ f"SQL execution was cancelled by the client due to a timeout. "
1082
+ f"Error message received from the server: {err}"
1083
+ )
1074
1084
  if "data" in ret:
1075
1085
  err += ret["data"].get("errorMessage", "")
1076
1086
  errvalue = {
@@ -1238,6 +1248,7 @@ class SnowflakeCursor:
1238
1248
  )
1239
1249
 
1240
1250
  def query_result(self, qid: str) -> SnowflakeCursor:
1251
+ """Query the result of a previously executed query."""
1241
1252
  url = f"/queries/{qid}/result"
1242
1253
  ret = self._connection.rest.request(url=url, method="get")
1243
1254
  self._sfqid = (
@@ -1631,7 +1642,9 @@ class SnowflakeCursor:
1631
1642
  self.close()
1632
1643
 
1633
1644
  def get_results_from_sfqid(self, sfqid: str) -> None:
1634
- """Gets the results from previously ran query."""
1645
+ """Gets the results from previously ran query. This methods differs from ``SnowflakeCursor.query_result``
1646
+ in that it monitors the ``sfqid`` until it is no longer running, and then retrieves the results.
1647
+ """
1635
1648
 
1636
1649
  def wait_until_ready() -> None:
1637
1650
  """Makes sure query has finished executing and once it has retrieves results."""
@@ -46,6 +46,7 @@ from .compat import (
46
46
  urlparse,
47
47
  )
48
48
  from .constants import (
49
+ _CONNECTIVITY_ERR_MSG,
49
50
  _SNOWFLAKE_HOST_SUFFIX_REGEX,
50
51
  HTTP_HEADER_ACCEPT,
51
52
  HTTP_HEADER_CONTENT_TYPE,
@@ -1134,8 +1135,19 @@ class SnowflakeRestful:
1134
1135
  finally:
1135
1136
  raw_ret.close() # ensure response is closed
1136
1137
  except SSLError as se:
1137
- logger.debug("Hit non-retryable SSL error, %s", str(se))
1138
-
1138
+ msg = f"Hit non-retryable SSL error, {str(se)}.\n{_CONNECTIVITY_ERR_MSG}"
1139
+ logger.debug(msg)
1140
+ # the following code is for backward compatibility with old versions of python connector which calls
1141
+ # self._handle_unknown_error to process SSLError
1142
+ Error.errorhandler_wrapper(
1143
+ self._connection,
1144
+ None,
1145
+ OperationalError,
1146
+ {
1147
+ "msg": msg,
1148
+ "errno": ER_FAILED_TO_REQUEST,
1149
+ },
1150
+ )
1139
1151
  except (
1140
1152
  BadStatusLine,
1141
1153
  ConnectionError,
@@ -26,6 +26,12 @@ from snowflake.connector.options import pandas
26
26
  from snowflake.connector.telemetry import TelemetryData, TelemetryField
27
27
  from snowflake.connector.util_text import random_string
28
28
 
29
+ from ._utils import (
30
+ _PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS_STRING,
31
+ TempObjectType,
32
+ get_temp_type_for_object,
33
+ random_name_for_temp_object,
34
+ )
29
35
  from .cursor import SnowflakeCursor
30
36
 
31
37
  if TYPE_CHECKING: # pragma: no cover
@@ -77,8 +83,9 @@ def _do_create_temp_stage(
77
83
  compression: str,
78
84
  auto_create_table: bool,
79
85
  overwrite: bool,
86
+ use_scoped_temp_object: bool,
80
87
  ) -> None:
81
- create_stage_sql = f"CREATE TEMP STAGE /* Python:snowflake.connector.pandas_tools.write_pandas() */ {stage_location} FILE_FORMAT=(TYPE=PARQUET COMPRESSION={compression}{' BINARY_AS_TEXT=FALSE' if auto_create_table or overwrite else ''})"
88
+ create_stage_sql = f"CREATE {get_temp_type_for_object(use_scoped_temp_object)} STAGE /* Python:snowflake.connector.pandas_tools.write_pandas() */ {stage_location} FILE_FORMAT=(TYPE=PARQUET COMPRESSION={compression}{' BINARY_AS_TEXT=FALSE' if auto_create_table or overwrite else ''})"
82
89
  logger.debug(f"creating stage with '{create_stage_sql}'")
83
90
  cursor.execute(create_stage_sql, _is_internal=True).fetchall()
84
91
 
@@ -91,8 +98,13 @@ def _create_temp_stage(
91
98
  compression: str,
92
99
  auto_create_table: bool,
93
100
  overwrite: bool,
101
+ use_scoped_temp_object: bool = False,
94
102
  ) -> str:
95
- stage_name = random_string()
103
+ stage_name = (
104
+ random_name_for_temp_object(TempObjectType.STAGE)
105
+ if use_scoped_temp_object
106
+ else random_string()
107
+ )
96
108
  stage_location = build_location_helper(
97
109
  database=database,
98
110
  schema=schema,
@@ -101,7 +113,12 @@ def _create_temp_stage(
101
113
  )
102
114
  try:
103
115
  _do_create_temp_stage(
104
- cursor, stage_location, compression, auto_create_table, overwrite
116
+ cursor,
117
+ stage_location,
118
+ compression,
119
+ auto_create_table,
120
+ overwrite,
121
+ use_scoped_temp_object,
105
122
  )
106
123
  except ProgrammingError as e:
107
124
  # User may not have the privilege to create stage on the target schema, so fall back to use current schema as
@@ -111,7 +128,12 @@ def _create_temp_stage(
111
128
  )
112
129
  stage_location = stage_name
113
130
  _do_create_temp_stage(
114
- cursor, stage_location, compression, auto_create_table, overwrite
131
+ cursor,
132
+ stage_location,
133
+ compression,
134
+ auto_create_table,
135
+ overwrite,
136
+ use_scoped_temp_object,
115
137
  )
116
138
 
117
139
  return stage_location
@@ -122,9 +144,10 @@ def _do_create_temp_file_format(
122
144
  file_format_location: str,
123
145
  compression: str,
124
146
  sql_use_logical_type: str,
147
+ use_scoped_temp_object: bool,
125
148
  ) -> None:
126
149
  file_format_sql = (
127
- f"CREATE TEMP FILE FORMAT {file_format_location} "
150
+ f"CREATE {get_temp_type_for_object(use_scoped_temp_object)} FILE FORMAT {file_format_location} "
128
151
  f"/* Python:snowflake.connector.pandas_tools.write_pandas() */ "
129
152
  f"TYPE=PARQUET COMPRESSION={compression}{sql_use_logical_type}"
130
153
  )
@@ -139,8 +162,13 @@ def _create_temp_file_format(
139
162
  quote_identifiers: bool,
140
163
  compression: str,
141
164
  sql_use_logical_type: str,
165
+ use_scoped_temp_object: bool = False,
142
166
  ) -> str:
143
- file_format_name = random_string()
167
+ file_format_name = (
168
+ random_name_for_temp_object(TempObjectType.FILE_FORMAT)
169
+ if use_scoped_temp_object
170
+ else random_string()
171
+ )
144
172
  file_format_location = build_location_helper(
145
173
  database=database,
146
174
  schema=schema,
@@ -149,7 +177,11 @@ def _create_temp_file_format(
149
177
  )
150
178
  try:
151
179
  _do_create_temp_file_format(
152
- cursor, file_format_location, compression, sql_use_logical_type
180
+ cursor,
181
+ file_format_location,
182
+ compression,
183
+ sql_use_logical_type,
184
+ use_scoped_temp_object,
153
185
  )
154
186
  except ProgrammingError as e:
155
187
  # User may not have the privilege to create file format on the target schema, so fall back to use current schema
@@ -159,7 +191,11 @@ def _create_temp_file_format(
159
191
  )
160
192
  file_format_location = file_format_name
161
193
  _do_create_temp_file_format(
162
- cursor, file_format_location, compression, sql_use_logical_type
194
+ cursor,
195
+ file_format_location,
196
+ compression,
197
+ sql_use_logical_type,
198
+ use_scoped_temp_object,
163
199
  )
164
200
 
165
201
  return file_format_location
@@ -263,6 +299,14 @@ def write_pandas(
263
299
  f"Invalid compression '{compression}', only acceptable values are: {compression_map.keys()}"
264
300
  )
265
301
 
302
+ _use_scoped_temp_object = (
303
+ conn._session_parameters.get(
304
+ _PYTHON_SNOWPARK_USE_SCOPED_TEMP_OBJECTS_STRING, False
305
+ )
306
+ if conn._session_parameters
307
+ else False
308
+ )
309
+
266
310
  if create_temp_table:
267
311
  warnings.warn(
268
312
  "create_temp_table is deprecated, we still respect this parameter when it is True but "
@@ -324,6 +368,7 @@ def write_pandas(
324
368
  compression,
325
369
  auto_create_table,
326
370
  overwrite,
371
+ _use_scoped_temp_object,
327
372
  )
328
373
 
329
374
  with TemporaryDirectory() as tmp_folder:
@@ -370,6 +415,7 @@ def write_pandas(
370
415
  quote_identifiers,
371
416
  compression_map[compression],
372
417
  sql_use_logical_type,
418
+ _use_scoped_temp_object,
373
419
  )
374
420
  infer_schema_sql = f"SELECT COLUMN_NAME, TYPE FROM table(infer_schema(location=>'@{stage_location}', file_format=>'{file_format_location}'))"
375
421
  logger.debug(f"inferring schema with '{infer_schema_sql}'")
@@ -33,14 +33,14 @@ class SecretDetector(logging.Formatter):
33
33
  flags=re.IGNORECASE,
34
34
  )
35
35
  PRIVATE_KEY_PATTERN = re.compile(
36
- r"-----BEGIN PRIVATE KEY-----\\n([a-z0-9/+=\\n]{32,})\\n-----END PRIVATE KEY-----",
36
+ r"-{3,}BEGIN [A-Z ]*PRIVATE KEY-{3,}\n([\s\S]*?)\n-{3,}END [A-Z ]*PRIVATE KEY-{3,}",
37
37
  flags=re.MULTILINE | re.IGNORECASE,
38
38
  )
39
39
  PRIVATE_KEY_DATA_PATTERN = re.compile(
40
40
  r'"privateKeyData": "([a-z0-9/+=\\n]{10,})"', flags=re.MULTILINE | re.IGNORECASE
41
41
  )
42
42
  CONNECTION_TOKEN_PATTERN = re.compile(
43
- r"(token|assertion content)" r"([\'\"\s:=]+)" r"([a-z0-9=/_\-\+]{8,})",
43
+ r"(token|assertion content)" r"([\'\"\s:=]+)" r"([a-z0-9=/_\-\+\.]{8,})",
44
44
  flags=re.IGNORECASE,
45
45
  )
46
46
 
@@ -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, 2, None)
3
+ VERSION = (3, 12, 3, None)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: snowflake-connector-python
3
- Version: 3.12.2
3
+ Version: 3.12.3
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -85,6 +85,10 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
85
85
 
86
86
  # Release Notes
87
87
 
88
+ - v3.12.3(October 25,2024)
89
+ - Improved the error message for SSL-related issues to provide clearer guidance when an SSL error occurs.
90
+ - Improved error message for SQL execution cancellations caused by timeout.
91
+
88
92
  - v3.12.2(September 11,2024)
89
93
  - Improved error handling for asynchronous queries, providing more detailed and informative error messages when an async query fails.
90
94
  - Improved inference of top-level domains for accounts specifying a region in China, now defaulting to snowflakecomputing.cn.
@@ -11,6 +11,7 @@ setup.py
11
11
  src/snowflake/connector/__init__.py
12
12
  src/snowflake/connector/_query_context_cache.py
13
13
  src/snowflake/connector/_sql_util.py
14
+ src/snowflake/connector/_utils.py
14
15
  src/snowflake/connector/arrow_context.py
15
16
  src/snowflake/connector/azure_storage_client.py
16
17
  src/snowflake/connector/backoff_policies.py