snowflake-connector-python 3.10.1__tar.gz → 3.12.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 (236) hide show
  1. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/DESCRIPTION.md +19 -0
  2. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/PKG-INFO +21 -2
  3. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/setup.cfg +1 -1
  4. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/_query_context_cache.py +5 -3
  5. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/_auth.py +20 -12
  6. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/okta.py +3 -1
  7. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/config_manager.py +8 -1
  8. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/connection.py +57 -23
  9. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/connection_diagnostic.py +15 -6
  10. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/constants.py +13 -0
  11. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/cursor.py +26 -21
  12. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/errors.py +3 -3
  13. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/file_transfer_agent.py +18 -14
  14. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/gcs_storage_client.py +10 -6
  15. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/network.py +13 -4
  16. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/ocsp_asn1crypto.py +2 -2
  17. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/ocsp_snowflake.py +26 -11
  18. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/result_batch.py +15 -5
  19. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/result_set.py +57 -36
  20. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/sf_dirs.py +1 -2
  21. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/ssl_wrap_socket.py +1 -0
  22. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/storage_client.py +10 -3
  23. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/telemetry.py +3 -3
  24. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/telemetry_oob.py +21 -21
  25. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/url_util.py +11 -1
  26. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/util_text.py +6 -1
  27. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/version.py +1 -1
  28. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake_connector_python.egg-info/PKG-INFO +21 -2
  29. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake_connector_python.egg-info/requires.txt +1 -1
  30. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/CONTRIBUTING.md +0 -0
  31. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/LICENSE.txt +0 -0
  32. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/MANIFEST.in +0 -0
  33. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/NOTICE +0 -0
  34. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/README.md +0 -0
  35. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/SECURITY.md +0 -0
  36. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/pyproject.toml +0 -0
  37. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/setup.py +0 -0
  38. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/__init__.py +0 -0
  39. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/_sql_util.py +0 -0
  40. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/arrow_context.py +0 -0
  41. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/__init__.py +0 -0
  42. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/by_plugin.py +0 -0
  43. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/default.py +0 -0
  44. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/idtoken.py +0 -0
  45. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/keypair.py +0 -0
  46. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/oauth.py +0 -0
  47. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  48. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
  49. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/azure_storage_client.py +0 -0
  50. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/backoff_policies.py +0 -0
  51. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
  52. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/cache.py +0 -0
  53. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/compat.py +0 -0
  54. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/converter.py +0 -0
  55. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/converter_issue23517.py +0 -0
  56. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/converter_null.py +0 -0
  57. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/converter_snowsql.py +0 -0
  58. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/dbapi.py +0 -0
  59. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/description.py +0 -0
  60. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/encryption_util.py +0 -0
  61. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/errorcode.py +0 -0
  62. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/feature.py +0 -0
  63. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/file_compression_type.py +0 -0
  64. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/file_util.py +0 -0
  65. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/gzip_decoder.py +0 -0
  66. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/local_storage_client.py +0 -0
  67. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/log_configuration.py +0 -0
  68. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  69. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  70. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  71. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  72. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  73. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  74. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  75. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  76. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  77. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  78. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  79. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  80. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  81. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  82. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  83. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  84. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  85. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  86. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  87. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  88. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  89. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  90. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  91. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  92. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  93. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  94. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  95. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  96. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  97. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  98. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  99. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  100. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  101. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  102. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  103. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  104. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  105. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  106. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  107. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  108. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  109. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  110. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  111. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  112. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  113. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  114. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  115. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  116. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  117. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  118. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  119. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  120. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  121. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  122. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  123. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  124. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  125. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  126. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  127. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  128. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  129. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  130. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  131. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  132. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  133. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  134. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  135. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  136. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  137. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  138. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  139. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  140. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  141. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  142. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  143. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  144. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  145. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  146. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  147. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  148. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  149. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  150. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  151. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  152. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  153. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  154. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  155. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/options.py +0 -0
  156. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/pandas_tools.py +0 -0
  157. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/proxy.py +0 -0
  158. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/py.typed +0 -0
  159. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/s3_storage_client.py +0 -0
  160. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/secret_detector.py +0 -0
  161. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
  162. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/sfdatetime.py +0 -0
  163. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/snow_logging.py +0 -0
  164. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/sqlstate.py +0 -0
  165. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  166. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/test_util.py +0 -0
  167. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/time_util.py +0 -0
  168. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/tool/__init__.py +0 -0
  169. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
  170. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  171. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  172. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
  173. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/__init__.py +0 -0
  174. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  175. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  176. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  177. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  178. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  179. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
  180. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  181. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  182. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  183. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  184. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  185. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
  186. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  187. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
  188. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  189. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  190. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  191. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  192. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  193. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  194. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  195. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  196. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  197. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  198. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  199. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
  200. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
  201. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
  202. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
  203. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
  204. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
  205. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  206. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
  207. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  208. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  209. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  210. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  211. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
  212. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
  213. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
  214. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
  215. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
  216. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  217. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
  218. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  219. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  220. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  221. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  222. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
  223. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  224. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  225. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  226. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  227. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  228. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  229. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  230. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  231. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  232. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  233. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  234. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  235. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  236. {snowflake_connector_python-3.10.1 → snowflake_connector_python-3.12.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -8,6 +8,25 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
8
8
 
9
9
  # Release Notes
10
10
 
11
+ - v3.12.0(July 24,2024)
12
+ - Set default connection timeout of 10 seconds and socket read timeout of 10 minutes for HTTP calls in file transfer.
13
+ - Optimized `to_pandas()` performance by fully parallel downloading logic.
14
+ - Fixed a bug that specifying client_session_keep_alive_heartbeat_frequency in snowflake-sqlalchemy could crash the connector.
15
+ - Fixed incorrect type hint of connection parameter `private_key`.
16
+ - Added support for connectivity to multiple domains.
17
+ - Bumped keyring dependency from >=23.1.0,<25.0.0 to >=23.1.0,<26.0.0.
18
+ - Disabled OOB Telemetry.
19
+
20
+ - v3.11.0(June 17,2024)
21
+ - Added support for `token_file_path` connection parameter to read an OAuth token from a file when connecting to Snowflake.
22
+ - Added support for `debug_arrow_chunk` connection parameter to allow debugging raw arrow data in case of arrow data parsing failure.
23
+ - Added support for `disable_saml_url_check` connection parameter to disable SAML URL check in OKTA authentication.
24
+ - Fixed a bug that OCSP certificate signed using SHA384 algorithm cannot be verified.
25
+ - Fixed a bug that status code shown as uploaded when PUT command failed with 400 error.
26
+ - Fixed a bug that a PermissionError was raised when the current user does not have the right permission on parent directory of config file path.
27
+ - Fixed a bug that OCSP GET url is not encoded correctly when it contains a slash.
28
+ - Fixed a bug that an SSO URL didn't accept `:` in a query parameter, for instance, `https://sso.abc.com/idp/startSSO.ping?PartnerSpId=https://xyz.snowflakecomputing.com/`.
29
+
11
30
  - v3.10.1(May 21, 2024)
12
31
 
13
32
  - Removed an incorrect error log message that could occur during arrow data conversion.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: snowflake-connector-python
3
- Version: 3.10.1
3
+ Version: 3.12.0
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -73,7 +73,7 @@ Provides-Extra: pandas
73
73
  Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "pandas"
74
74
  Requires-Dist: pyarrow; extra == "pandas"
75
75
  Provides-Extra: secure-local-storage
76
- Requires-Dist: keyring<25.0.0,>=23.1.0; extra == "secure-local-storage"
76
+ Requires-Dist: keyring<26.0.0,>=23.1.0; extra == "secure-local-storage"
77
77
 
78
78
  This package includes the Snowflake Connector for Python, which conforms to the Python DB API 2.0 specification:
79
79
  https://www.python.org/dev/peps/pep-0249/
@@ -85,6 +85,25 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
85
85
 
86
86
  # Release Notes
87
87
 
88
+ - v3.12.0(July 24,2024)
89
+ - Set default connection timeout of 10 seconds and socket read timeout of 10 minutes for HTTP calls in file transfer.
90
+ - Optimized `to_pandas()` performance by fully parallel downloading logic.
91
+ - Fixed a bug that specifying client_session_keep_alive_heartbeat_frequency in snowflake-sqlalchemy could crash the connector.
92
+ - Fixed incorrect type hint of connection parameter `private_key`.
93
+ - Added support for connectivity to multiple domains.
94
+ - Bumped keyring dependency from >=23.1.0,<25.0.0 to >=23.1.0,<26.0.0.
95
+ - Disabled OOB Telemetry.
96
+
97
+ - v3.11.0(June 17,2024)
98
+ - Added support for `token_file_path` connection parameter to read an OAuth token from a file when connecting to Snowflake.
99
+ - Added support for `debug_arrow_chunk` connection parameter to allow debugging raw arrow data in case of arrow data parsing failure.
100
+ - Added support for `disable_saml_url_check` connection parameter to disable SAML URL check in OKTA authentication.
101
+ - Fixed a bug that OCSP certificate signed using SHA384 algorithm cannot be verified.
102
+ - Fixed a bug that status code shown as uploaded when PUT command failed with 400 error.
103
+ - Fixed a bug that a PermissionError was raised when the current user does not have the right permission on parent directory of config file path.
104
+ - Fixed a bug that OCSP GET url is not encoded correctly when it contains a slash.
105
+ - Fixed a bug that an SSO URL didn't accept `:` in a query parameter, for instance, `https://sso.abc.com/idp/startSSO.ping?PartnerSpId=https://xyz.snowflakecomputing.com/`.
106
+
88
107
  - v3.10.1(May 21, 2024)
89
108
 
90
109
  - Removed an incorrect error log message that could occur during arrow data conversion.
@@ -96,7 +96,7 @@ pandas =
96
96
  pandas>=1.0.0,<3.0.0
97
97
  pyarrow
98
98
  secure-local-storage =
99
- keyring>=23.1.0,<25.0.0
99
+ keyring>=23.1.0,<26.0.0
100
100
 
101
101
  [egg_info]
102
102
  tag_build =
@@ -165,9 +165,11 @@ class QueryContextCache:
165
165
  "id": qce.id,
166
166
  "timestamp": qce.read_timestamp,
167
167
  "priority": qce.priority,
168
- "context": {"base64Data": qce.context}
169
- if qce.context is not None
170
- else {},
168
+ "context": (
169
+ {"base64Data": qce.context}
170
+ if qce.context is not None
171
+ else {}
172
+ ),
171
173
  }
172
174
  for qce in self._tree_set
173
175
  ]
@@ -417,27 +417,35 @@ class Auth:
417
417
  else:
418
418
  logger.debug(
419
419
  "token = %s",
420
- "******"
421
- if ret["data"] and ret["data"].get("token") is not None
422
- else "NULL",
420
+ (
421
+ "******"
422
+ if ret["data"] and ret["data"].get("token") is not None
423
+ else "NULL"
424
+ ),
423
425
  )
424
426
  logger.debug(
425
427
  "master_token = %s",
426
- "******"
427
- if ret["data"] and ret["data"].get("masterToken") is not None
428
- else "NULL",
428
+ (
429
+ "******"
430
+ if ret["data"] and ret["data"].get("masterToken") is not None
431
+ else "NULL"
432
+ ),
429
433
  )
430
434
  logger.debug(
431
435
  "id_token = %s",
432
- "******"
433
- if ret["data"] and ret["data"].get("idToken") is not None
434
- else "NULL",
436
+ (
437
+ "******"
438
+ if ret["data"] and ret["data"].get("idToken") is not None
439
+ else "NULL"
440
+ ),
435
441
  )
436
442
  logger.debug(
437
443
  "mfa_token = %s",
438
- "******"
439
- if ret["data"] and ret["data"].get("mfaToken") is not None
440
- else "NULL",
444
+ (
445
+ "******"
446
+ if ret["data"] and ret["data"].get("mfaToken") is not None
447
+ else "NULL"
448
+ ),
441
449
  )
442
450
  if not ret["data"]:
443
451
  Error.errorhandler_wrapper(
@@ -315,7 +315,9 @@ class AuthByOkta(AuthByPlugin):
315
315
  host=conn._rest._host,
316
316
  port=conn._rest._port,
317
317
  )
318
- if not _is_prefix_equal(post_back_url, full_url):
318
+ if not getattr(conn, "_disable_saml_url_check", False) and not _is_prefix_equal(
319
+ post_back_url, full_url
320
+ ):
319
321
  Error.errorhandler_wrapper(
320
322
  conn._rest._connection,
321
323
  None,
@@ -320,8 +320,15 @@ class ConfigManager:
320
320
  ):
321
321
  if sliceoptions.only_in_slice:
322
322
  del read_config_file[section]
323
- if not filep.exists():
323
+ try:
324
+ if not filep.exists():
325
+ continue
326
+ except PermissionError:
327
+ LOGGER.debug(
328
+ f"Fail to read configuration file from {str(filep)} due to no permission on its parent directory"
329
+ )
324
330
  continue
331
+
325
332
  if (
326
333
  sliceoptions.check_permissions # Skip checking if this file couldn't hold sensitive information
327
334
  # Same check as openssh does for permissions
@@ -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
+ _DOMAIN_NAME_MAP,
55
56
  ENV_VAR_PARTNER,
56
57
  PARAMETER_AUTOCOMMIT,
57
58
  PARAMETER_CLIENT_PREFETCH_THREADS,
@@ -107,6 +108,7 @@ from .sqlstate import SQLSTATE_CONNECTION_NOT_EXISTS, SQLSTATE_FEATURE_NOT_SUPPO
107
108
  from .telemetry import TelemetryClient, TelemetryData, TelemetryField
108
109
  from .telemetry_oob import TelemetryService
109
110
  from .time_util import HeartBeatTimer, get_time_millis
111
+ from .url_util import extract_top_level_domain_from_hostname
110
112
  from .util_text import construct_hostname, parse_account, split_statements
111
113
 
112
114
  DEFAULT_CLIENT_PREFETCH_THREADS = 4
@@ -181,7 +183,7 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
181
183
  "backoff_policy": (DEFAULT_BACKOFF_POLICY, Callable),
182
184
  "passcode_in_password": (False, bool), # Snowflake MFA
183
185
  "passcode": (None, (type(None), str)), # Snowflake MFA
184
- "private_key": (None, (type(None), str, RSAPrivateKey)),
186
+ "private_key": (None, (type(None), bytes, RSAPrivateKey)),
185
187
  "private_key_file": (None, (type(None), str)),
186
188
  "private_key_file_pwd": (None, (type(None), str, bytes)),
187
189
  "token": (None, (type(None), str)), # OAuth or JWT Token
@@ -190,6 +192,10 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
190
192
  "password_callback": (None, (type(None), Callable)),
191
193
  "auth_class": (None, (type(None), AuthByPlugin)),
192
194
  "application": (CLIENT_NAME, (type(None), str)),
195
+ # internal_application_name/version is used to tell the server the type of client connecting to
196
+ # Snowflake. There are some functionalities (e.g., MFA, Arrow result format) that
197
+ # Snowflake server doesn't support for new client types, which requires developers to
198
+ # add the new client type to the server to support these features.
193
199
  "internal_application_name": (CLIENT_NAME, (type(None), str)),
194
200
  "internal_application_version": (CLIENT_VERSION, (type(None), str)),
195
201
  "insecure_mode": (False, bool), # Error security fix requirement
@@ -281,6 +287,14 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
281
287
  True,
282
288
  bool,
283
289
  ), # Disable console login and fall back to getting SSO URL from GS
290
+ "debug_arrow_chunk": (
291
+ False,
292
+ bool,
293
+ ), # log raw arrow chunk for debugging purpuse in case there is malformed arrow data
294
+ "disable_saml_url_check": (
295
+ False,
296
+ bool,
297
+ ), # disable saml url check in okta authentication
284
298
  }
285
299
 
286
300
  APPLICATION_RE = re.compile(r"[\w\d_]+")
@@ -359,6 +373,7 @@ class SnowflakeConnection:
359
373
  This parameter is only effective when the result format is JSON.
360
374
  server_session_keep_alive: When true, the connector does not destroy the session on the Snowflake server side
361
375
  before the connector shuts down. Default value is false.
376
+ token_file_path: The file path of the token file. If both token and token_file_path are provided, the token in token_file_path will be used.
362
377
  """
363
378
 
364
379
  OCSP_ENV_LOCK = Lock()
@@ -713,9 +728,11 @@ class SnowflakeConnection:
713
728
  account=self.account,
714
729
  host=self.host,
715
730
  connection_diag_log_path=self.connection_diag_log_path,
716
- connection_diag_allowlist_path=self.connection_diag_allowlist_path
717
- if self.connection_diag_allowlist_path is not None
718
- else self.connection_diag_whitelist_path,
731
+ connection_diag_allowlist_path=(
732
+ self.connection_diag_allowlist_path
733
+ if self.connection_diag_allowlist_path is not None
734
+ else self.connection_diag_whitelist_path
735
+ ),
719
736
  proxy_host=self.proxy_host,
720
737
  proxy_port=self.proxy_port,
721
738
  proxy_user=self.proxy_user,
@@ -920,7 +937,7 @@ class SnowflakeConnection:
920
937
  os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"],
921
938
  )
922
939
 
923
- if self.host.endswith(".privatelink.snowflakecomputing.com"):
940
+ if ".privatelink.snowflakecomputing." in self.host:
924
941
  SnowflakeConnection.setup_ocsp_privatelink(self.application, self.host)
925
942
  else:
926
943
  if "SF_OCSP_RESPONSE_CACHE_SERVER_URL" in os.environ:
@@ -936,14 +953,14 @@ class SnowflakeConnection:
936
953
 
937
954
  if self._validate_default_parameters:
938
955
  # Snowflake will validate the requested database, schema, and warehouse
939
- self._session_parameters[
940
- PARAMETER_CLIENT_VALIDATE_DEFAULT_PARAMETERS
941
- ] = True
956
+ self._session_parameters[PARAMETER_CLIENT_VALIDATE_DEFAULT_PARAMETERS] = (
957
+ True
958
+ )
942
959
 
943
960
  if self.client_session_keep_alive is not None:
944
- self._session_parameters[
945
- PARAMETER_CLIENT_SESSION_KEEP_ALIVE
946
- ] = self._client_session_keep_alive
961
+ self._session_parameters[PARAMETER_CLIENT_SESSION_KEEP_ALIVE] = (
962
+ self._client_session_keep_alive
963
+ )
947
964
 
948
965
  if self.client_session_keep_alive_heartbeat_frequency is not None:
949
966
  self._session_parameters[
@@ -951,9 +968,9 @@ class SnowflakeConnection:
951
968
  ] = self._validate_client_session_keep_alive_heartbeat_frequency()
952
969
 
953
970
  if self.client_prefetch_threads:
954
- self._session_parameters[
955
- PARAMETER_CLIENT_PREFETCH_THREADS
956
- ] = self._validate_client_prefetch_threads()
971
+ self._session_parameters[PARAMETER_CLIENT_PREFETCH_THREADS] = (
972
+ self._validate_client_prefetch_threads()
973
+ )
957
974
 
958
975
  # Setup authenticator
959
976
  auth = Auth(self.rest)
@@ -1119,11 +1136,13 @@ class SnowflakeConnection:
1119
1136
  warnings.warn(
1120
1137
  "'{}' connection parameter should be of type '{}', but is a '{}'".format(
1121
1138
  name,
1122
- str(tuple(e.__name__ for e in accepted_types)).replace(
1123
- "'", ""
1124
- )
1125
- if isinstance(accepted_types, tuple)
1126
- else accepted_types.__name__,
1139
+ (
1140
+ str(tuple(e.__name__ for e in accepted_types)).replace(
1141
+ "'", ""
1142
+ )
1143
+ if isinstance(accepted_types, tuple)
1144
+ else accepted_types.__name__
1145
+ ),
1127
1146
  type(value).__name__,
1128
1147
  ),
1129
1148
  # Raise warning from where class was initiated
@@ -1165,6 +1184,10 @@ class SnowflakeConnection:
1165
1184
  if "protocol" not in kwargs:
1166
1185
  self._protocol = "https"
1167
1186
 
1187
+ logger.info(
1188
+ f"Connecting to {_DOMAIN_NAME_MAP.get(extract_top_level_domain_from_hostname(self._host), 'GLOBAL')} Snowflake domain"
1189
+ )
1190
+
1168
1191
  # If using a custom auth class, we should set the authenticator
1169
1192
  # type to be the same as the custom auth class
1170
1193
  if self._auth_class:
@@ -1182,6 +1205,12 @@ class SnowflakeConnection:
1182
1205
  ]:
1183
1206
  self._authenticator = auth_tmp
1184
1207
 
1208
+ # read OAuth token from
1209
+ token_file_path = kwargs.get("token_file_path")
1210
+ if token_file_path:
1211
+ with open(token_file_path) as f:
1212
+ self._token = f.read()
1213
+
1185
1214
  if not (self._master_token and self._session_token):
1186
1215
  if not self.user and self._authenticator != OAUTH_AUTHENTICATOR:
1187
1216
  # OAuth Authentication does not require a username
@@ -1268,6 +1297,7 @@ class SnowflakeConnection:
1268
1297
  _update_current_object: bool = True,
1269
1298
  _no_retry: bool = False,
1270
1299
  timeout: int | None = None,
1300
+ dataframe_ast: str | None = None,
1271
1301
  ) -> dict[str, Any]:
1272
1302
  """Executes a query with a sequence counter."""
1273
1303
  logger.debug("_cmd_query")
@@ -1277,6 +1307,8 @@ class SnowflakeConnection:
1277
1307
  "sequenceId": sequence_counter,
1278
1308
  "querySubmissionTime": get_time_millis(),
1279
1309
  }
1310
+ if dataframe_ast is not None:
1311
+ data["dataframeAst"] = dataframe_ast
1280
1312
  if statement_params is not None:
1281
1313
  data["parameters"] = statement_params
1282
1314
  if is_internal:
@@ -1651,6 +1683,12 @@ class SnowflakeConnection:
1651
1683
  """Validate and return heartbeat frequency in seconds."""
1652
1684
  real_max = int(self.rest.master_validity_in_seconds / 4)
1653
1685
  real_min = int(real_max / 4)
1686
+
1687
+ # ensure the type is integer
1688
+ self._client_session_keep_alive_heartbeat_frequency = int(
1689
+ self.client_session_keep_alive_heartbeat_frequency
1690
+ )
1691
+
1654
1692
  if self.client_session_keep_alive_heartbeat_frequency is None:
1655
1693
  # This is an unlikely scenario but covering it just in case.
1656
1694
  self._client_session_keep_alive_heartbeat_frequency = real_min
@@ -1659,10 +1697,6 @@ class SnowflakeConnection:
1659
1697
  elif self.client_session_keep_alive_heartbeat_frequency < real_min:
1660
1698
  self._client_session_keep_alive_heartbeat_frequency = real_min
1661
1699
 
1662
- # ensure the type is integer
1663
- self._client_session_keep_alive_heartbeat_frequency = int(
1664
- self.client_session_keep_alive_heartbeat_frequency
1665
- )
1666
1700
  return self.client_session_keep_alive_heartbeat_frequency
1667
1701
 
1668
1702
  def _validate_client_prefetch_threads(self) -> int:
@@ -23,6 +23,7 @@ import OpenSSL
23
23
 
24
24
  from .compat import IS_WINDOWS, urlparse
25
25
  from .cursor import SnowflakeCursor
26
+ from .url_util import extract_top_level_domain_from_hostname
26
27
  from .vendored import urllib3
27
28
 
28
29
  logger = getLogger(__name__)
@@ -89,15 +90,21 @@ class ConnectionDiagnostic:
89
90
  self.__append_message(
90
91
  host_type, f"Host based on specified account: {self.host}"
91
92
  )
92
- if ".com.snowflakecomputing.com" in self.host:
93
- self.host = host.split(".com.snow", 1)[0] + ".com"
93
+
94
+ top_level_domain = extract_top_level_domain_from_hostname(host)
95
+ if (
96
+ f".{top_level_domain}.snowflakecomputing.{top_level_domain}" in self.host
97
+ ): # repeated domain name pattern
98
+ self.host = (
99
+ host.split(f".{top_level_domain}.snow", 1)[0] + f".{top_level_domain}"
100
+ )
94
101
  logger.warning(
95
- f"Account should not have snowflakecomputing.com in it. You provided {host}. "
102
+ f"Account should not have snowflakecomputing.{top_level_domain} in it. You provided {host}. "
96
103
  f"Continuing with fixed host."
97
104
  )
98
105
  self.__append_message(
99
106
  host_type,
100
- f"We removed extra .snowflakecomputing.com and will continue with host: "
107
+ f"We removed extra .snowflakecomputing.{top_level_domain} and will continue with host: "
101
108
  f"{self.host}",
102
109
  )
103
110
  else:
@@ -175,13 +182,15 @@ class ConnectionDiagnostic:
175
182
  )
176
183
  self.full_connection_diag_allowlist_path = None
177
184
 
178
- self.allowlist_sql: str = "select /* snowflake-connector-python:connection_diagnostics */ system$allowlist();"
185
+ self.allowlist_sql: str = (
186
+ "select /* snowflake-connector-python:connection_diagnostics */ system$allowlist();"
187
+ )
179
188
 
180
189
  if self.__is_privatelink():
181
190
  self.ocsp_urls.append(f"ocsp.{self.host}")
182
191
  self.allowlist_sql = "select system$allowlist_privatelink();"
183
192
  else:
184
- self.ocsp_urls.append("ocsp.snowflakecomputing.com")
193
+ self.ocsp_urls.append(f"ocsp.snowflakecomputing.{top_level_domain}")
185
194
 
186
195
  self.allowlist_retrieval_success: bool = False
187
196
  self.cursor: SnowflakeCursor | None = None
@@ -36,6 +36,11 @@ DBAPI_TYPE_BINARY = 1
36
36
  DBAPI_TYPE_NUMBER = 2
37
37
  DBAPI_TYPE_TIMESTAMP = 3
38
38
 
39
+ _DEFAULT_HOSTNAME_TLD = "com"
40
+ _CHINA_HOSTNAME_TLD = "cn"
41
+ _TOP_LEVEL_DOMAIN_REGEX = r"\.[a-zA-Z]{1,63}$"
42
+ _SNOWFLAKE_HOST_SUFFIX_REGEX = r"snowflakecomputing(\.[a-zA-Z]{1,63}){1,2}$"
43
+
39
44
 
40
45
  class FieldType(NamedTuple):
41
46
  name: str
@@ -399,6 +404,7 @@ class IterUnit(Enum):
399
404
  TABLE_UNIT = "table"
400
405
 
401
406
 
407
+ # File Transfer
402
408
  # Amazon S3 multipart upload limits
403
409
  # https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html
404
410
  S3_DEFAULT_CHUNK_SIZE = 8 * 1024**2
@@ -410,8 +416,15 @@ S3_MAX_PARTS = 10000
410
416
  S3_CHUNK_SIZE = 8388608 # boto3 default
411
417
  AZURE_CHUNK_SIZE = 4 * megabyte
412
418
 
419
+ # https://requests.readthedocs.io/en/latest/user/advanced/#timeouts
420
+ REQUEST_CONNECTION_TIMEOUT = 10
421
+ REQUEST_READ_TIMEOUT = 600
422
+
413
423
  DAY_IN_SECONDS = 60 * 60 * 24
414
424
 
415
425
  # TODO: all env variables definitions should be here
416
426
  ENV_VAR_PARTNER = "SF_PARTNER"
417
427
  ENV_VAR_TEST_MODE = "SNOWFLAKE_TEST_MODE"
428
+
429
+
430
+ _DOMAIN_NAME_MAP = {_DEFAULT_HOSTNAME_TLD: "GLOBAL", _CHINA_HOSTNAME_TLD: "CHINA"}
@@ -149,9 +149,11 @@ class ResultMetadata(NamedTuple):
149
149
  def from_column(cls, col: dict[str, Any]):
150
150
  """Initializes a ResultMetadata object from the column description in the query response."""
151
151
  type_code = FIELD_NAME_TO_ID[
152
- col["extTypeName"].upper()
153
- if col.get("extTypeName")
154
- else col["type"].upper()
152
+ (
153
+ col["extTypeName"].upper()
154
+ if col.get("extTypeName")
155
+ else col["type"].upper()
156
+ )
155
157
  ]
156
158
 
157
159
  return cls(
@@ -546,12 +548,10 @@ class SnowflakeCursor:
546
548
  return None
547
549
 
548
550
  @overload
549
- def callproc(self, procname: str) -> tuple:
550
- ...
551
+ def callproc(self, procname: str) -> tuple: ...
551
552
 
552
553
  @overload
553
- def callproc(self, procname: str, args: T) -> T:
554
- ...
554
+ def callproc(self, procname: str, args: T) -> T: ...
555
555
 
556
556
  def callproc(self, procname: str, args=tuple()):
557
557
  """Call a stored procedure.
@@ -601,6 +601,7 @@ class SnowflakeCursor:
601
601
  _no_results: bool = False,
602
602
  _is_put_get=None,
603
603
  _no_retry: bool = False,
604
+ dataframe_ast: str | None = None,
604
605
  ) -> dict[str, Any]:
605
606
  del self.messages[:]
606
607
 
@@ -630,9 +631,9 @@ class SnowflakeCursor:
630
631
  if str(result_format_val).upper() == "ARROW":
631
632
  self.check_can_use_arrow_resultset()
632
633
  elif result_format_val is None:
633
- statement_params[
634
- PARAMETER_PYTHON_CONNECTOR_QUERY_RESULT_FORMAT
635
- ] = "JSON"
634
+ statement_params[PARAMETER_PYTHON_CONNECTOR_QUERY_RESULT_FORMAT] = (
635
+ "JSON"
636
+ )
636
637
 
637
638
  self._sequence_counter = self._connection._next_sequence_counter()
638
639
  self._request_id = uuid.uuid4()
@@ -704,6 +705,7 @@ class SnowflakeCursor:
704
705
  _no_results=_no_results,
705
706
  _no_retry=_no_retry,
706
707
  timeout=real_timeout,
708
+ dataframe_ast=dataframe_ast,
707
709
  )
708
710
  finally:
709
711
  try:
@@ -758,9 +760,11 @@ class SnowflakeCursor:
758
760
  if params is not None and len(params) == 0:
759
761
  self._log_telemetry_job_data(
760
762
  TelemetryField.EMPTY_SEQ_INTERPOLATION,
761
- TelemetryData.TRUE
762
- if self.connection._interpolate_empty_sequences
763
- else TelemetryData.FALSE,
763
+ (
764
+ TelemetryData.TRUE
765
+ if self.connection._interpolate_empty_sequences
766
+ else TelemetryData.FALSE
767
+ ),
764
768
  )
765
769
  if logger.getEffectiveLevel() <= logging.DEBUG:
766
770
  logger.debug(
@@ -807,8 +811,8 @@ class SnowflakeCursor:
807
811
  _skip_upload_on_content_match: bool = False,
808
812
  file_stream: IO[bytes] | None = None,
809
813
  num_statements: int | None = None,
810
- ) -> Self | None:
811
- ...
814
+ _dataframe_ast: str | None = None,
815
+ ) -> Self | None: ...
812
816
 
813
817
  @overload
814
818
  def execute(
@@ -837,8 +841,8 @@ class SnowflakeCursor:
837
841
  _skip_upload_on_content_match: bool = False,
838
842
  file_stream: IO[bytes] | None = None,
839
843
  num_statements: int | None = None,
840
- ) -> dict[str, Any] | None:
841
- ...
844
+ _dataframe_ast: str | None = None,
845
+ ) -> dict[str, Any] | None: ...
842
846
 
843
847
  def execute(
844
848
  self,
@@ -866,6 +870,7 @@ class SnowflakeCursor:
866
870
  _skip_upload_on_content_match: bool = False,
867
871
  file_stream: IO[bytes] | None = None,
868
872
  num_statements: int | None = None,
873
+ _dataframe_ast: str | None = None,
869
874
  ) -> Self | dict[str, Any] | None:
870
875
  """Executes a command/query.
871
876
 
@@ -900,6 +905,7 @@ class SnowflakeCursor:
900
905
  file_stream: File-like object to be uploaded with PUT
901
906
  num_statements: Query level parameter submitted in _statement_params constraining exact number of
902
907
  statements being submitted (or 0 if submitting an uncounted number) when using a multi-statement query.
908
+ _dataframe_ast: Base64-encoded dataframe request abstract syntax tree.
903
909
 
904
910
  Returns:
905
911
  The cursor itself, or None if some error happened, or the response returned
@@ -941,6 +947,7 @@ class SnowflakeCursor:
941
947
  "_no_results": _no_results,
942
948
  "_is_put_get": _is_put_get,
943
949
  "_no_retry": _no_retry,
950
+ "dataframe_ast": _dataframe_ast,
944
951
  }
945
952
 
946
953
  if self._connection.is_pyformat:
@@ -1278,12 +1285,10 @@ class SnowflakeCursor:
1278
1285
  return self._result_set._fetch_arrow_batches()
1279
1286
 
1280
1287
  @overload
1281
- def fetch_arrow_all(self, force_return_table: Literal[False]) -> Table | None:
1282
- ...
1288
+ def fetch_arrow_all(self, force_return_table: Literal[False]) -> Table | None: ...
1283
1289
 
1284
1290
  @overload
1285
- def fetch_arrow_all(self, force_return_table: Literal[True]) -> Table:
1286
- ...
1291
+ def fetch_arrow_all(self, force_return_table: Literal[True]) -> Table: ...
1287
1292
 
1288
1293
  def fetch_arrow_all(self, force_return_table: bool = False) -> Table | None:
1289
1294
  """
@@ -153,9 +153,9 @@ class Error(BASE_EXCEPTION_CLASS):
153
153
  and not connection._telemetry.is_closed
154
154
  ):
155
155
  # Send with in-band telemetry
156
- telemetry_data[
157
- TelemetryField.KEY_TYPE.value
158
- ] = TelemetryField.SQL_EXCEPTION.value
156
+ telemetry_data[TelemetryField.KEY_TYPE.value] = (
157
+ TelemetryField.SQL_EXCEPTION.value
158
+ )
159
159
  telemetry_data[TelemetryField.KEY_SOURCE.value] = connection.application
160
160
  telemetry_data[TelemetryField.KEY_EXCEPTION.value] = self.__class__.__name__
161
161
  ts = get_time_millis()