snowflake-connector-python 4.7.3__tar.gz → 4.7.4__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 (303) hide show
  1. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/DESCRIPTION.md +8 -3
  2. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/PKG-INFO +11 -6
  3. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/README.md +2 -5
  4. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/setup.cfg +2 -2
  5. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_cursor.py +22 -17
  6. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_network.py +2 -1
  7. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_result_batch.py +4 -1
  8. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_result_set.py +26 -0
  9. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth_code.py +6 -1
  10. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth_credentials.py +6 -1
  11. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_oauth_base.py +171 -26
  12. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/cursor.py +22 -15
  13. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/errorcode.py +1 -0
  14. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/network.py +5 -1
  15. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/result_batch.py +62 -3
  16. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/result_set.py +60 -2
  17. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/version.py +1 -1
  18. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/PKG-INFO +11 -6
  19. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
  20. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/CONTRIBUTING.md +0 -0
  21. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/LICENSE.txt +0 -0
  22. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/MANIFEST.in +0 -0
  23. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/NOTICE +0 -0
  24. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/SECURITY.md +0 -0
  25. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/pyproject.toml +0 -0
  26. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/setup.py +0 -0
  27. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/__init__.py +0 -0
  28. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  29. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_host_util.py +0 -0
  30. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_query_context_cache.py +0 -0
  31. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_sql_util.py +0 -0
  32. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_utils.py +0 -0
  33. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/README.md +0 -0
  34. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/__init__.py +0 -0
  35. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  36. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  37. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_connection.py +0 -0
  38. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_description.py +0 -0
  39. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  40. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  41. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  42. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  43. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
  44. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
  45. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  46. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_session_manager.py +0 -0
  47. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_storage_client.py +0 -0
  48. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_telemetry.py +0 -0
  49. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_time_util.py +0 -0
  50. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_wif_util.py +0 -0
  51. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  52. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_auth.py +0 -0
  53. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  54. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_default.py +0 -0
  55. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  56. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  57. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  58. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  59. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_okta.py +0 -0
  60. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  61. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  62. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  63. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
  64. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/arrow_context.py +0 -0
  65. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/__init__.py +0 -0
  66. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_auth.py +0 -0
  67. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_http_server.py +0 -0
  68. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/by_plugin.py +0 -0
  69. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/default.py +0 -0
  70. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/idtoken.py +0 -0
  71. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/keypair.py +0 -0
  72. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/no_auth.py +0 -0
  73. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth.py +0 -0
  74. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth_code.py +0 -0
  75. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  76. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/okta.py +0 -0
  77. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/pat.py +0 -0
  78. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  79. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/webbrowser.py +0 -0
  80. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/workload_identity.py +0 -0
  81. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/azure_storage_client.py +0 -0
  82. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/backoff_policies.py +0 -0
  83. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/bind_upload_agent.py +0 -0
  84. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/cache.py +0 -0
  85. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/compat.py +0 -0
  86. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/config_manager.py +0 -0
  87. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/connection.py +0 -0
  88. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/connection_diagnostic.py +0 -0
  89. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/constants.py +0 -0
  90. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter.py +0 -0
  91. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_issue23517.py +0 -0
  92. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_null.py +0 -0
  93. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_snowsql.py +0 -0
  94. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/crl.py +0 -0
  95. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/crl_cache.py +0 -0
  96. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/dbapi.py +0 -0
  97. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/description.py +0 -0
  98. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  99. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/encryption_util.py +0 -0
  100. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/errors.py +0 -0
  101. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  102. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
  103. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/feature.py +0 -0
  104. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_compression_type.py +0 -0
  105. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_lock.py +0 -0
  106. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_transfer_agent.py +0 -0
  107. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_util.py +0 -0
  108. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/gcs_storage_client.py +0 -0
  109. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/gzip_decoder.py +0 -0
  110. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/interval_util.py +0 -0
  111. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/local_storage_client.py +0 -0
  112. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/log_configuration.py +0 -0
  113. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  114. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/logging_utils/filters.py +0 -0
  115. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/minicore/__init__.py +0 -0
  116. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  117. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  118. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  119. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  120. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  121. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  122. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  123. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  124. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  125. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  126. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  127. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  128. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  129. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  130. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  131. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  132. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  133. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  134. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  135. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  136. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  137. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  138. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  139. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  140. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  141. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  142. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  143. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  144. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  145. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  146. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  147. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  148. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  149. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  150. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  151. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  152. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  153. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  154. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  155. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  156. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  157. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  158. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  159. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  160. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  161. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  162. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  163. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  164. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  165. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  166. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  167. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  168. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  169. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  170. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  171. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  172. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  173. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  174. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  175. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  176. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  177. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  178. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  179. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  180. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  181. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  182. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  183. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  184. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  185. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  186. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  187. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  188. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  189. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  190. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  191. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  192. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  193. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  194. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  195. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  196. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  197. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  198. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  199. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  200. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  201. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  202. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  203. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  204. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  205. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  206. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  207. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  208. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  209. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  210. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/options.py +0 -0
  211. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/os_details.py +0 -0
  212. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/pandas_tools.py +0 -0
  213. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/platform_detection.py +0 -0
  214. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/proxy.py +0 -0
  215. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/py.typed +0 -0
  216. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/s3_storage_client.py +0 -0
  217. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/secret_detector.py +0 -0
  218. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/session_manager.py +0 -0
  219. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sf_dirs.py +0 -0
  220. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sfbinaryformat.py +0 -0
  221. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sfdatetime.py +0 -0
  222. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/snow_logging.py +0 -0
  223. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sqlstate.py +0 -0
  224. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  225. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  226. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/storage_client.py +0 -0
  227. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/telemetry.py +0 -0
  228. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/telemetry_oob.py +0 -0
  229. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/test_util.py +0 -0
  230. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/time_util.py +0 -0
  231. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/token_cache.py +0 -0
  232. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/__init__.py +0 -0
  233. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_certs.py +0 -0
  234. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  235. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  236. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/probe_connection.py +0 -0
  237. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/url_util.py +0 -0
  238. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/util_text.py +0 -0
  239. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/__init__.py +0 -0
  240. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  241. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  242. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  243. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  244. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  245. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/api.py +0 -0
  246. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  247. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  248. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  249. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  250. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  251. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/help.py +0 -0
  252. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  253. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/models.py +0 -0
  254. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  255. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  256. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  257. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  258. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  259. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  260. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  261. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  262. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  263. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  264. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  265. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  266. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  267. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  268. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  269. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  270. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
  271. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  272. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  273. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  274. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  275. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  276. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  277. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  278. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  279. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  280. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  281. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  282. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  283. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  284. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  285. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  286. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  287. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  288. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  289. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  290. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  291. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  292. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  293. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  294. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  295. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  296. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  297. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  298. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake/connector/wif_util.py +0 -0
  299. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  300. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  301. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  302. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  303. {snowflake_connector_python-4.7.3 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,11 +7,17 @@ https://docs.snowflake.com/
7
7
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
8
8
 
9
9
  # Release Notes
10
+ - v4.7.4(Sep 16,2026)
11
+ - Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
12
+ - Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
13
+ - Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
14
+
10
15
  - v4.7.3(Sep 3,2026)
11
16
  - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
12
17
  - Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
13
18
  - Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
14
19
  - Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
20
+ - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
15
21
  - Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
16
22
  - DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
17
23
  - The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
@@ -25,15 +31,15 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
25
31
  - Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
26
32
  - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
27
33
  - Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
28
- - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
29
34
 
30
- - v4.7.2(Aug 6,2026)
35
+ - v4.7.2(Aug 7,2026)
31
36
  - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
32
37
  - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
33
38
  - Fixed large-file PUT uploads to internal Azure stages failing against the Azure 50,000-block-per-blob limit. The Azure multipart chunk size is now scaled up dynamically for very large files (mirroring the existing S3 behavior), and the default Azure chunk size was raised from 4 MB to 8 MB (consistent with S3) for better throughput (SNOW-3839943).
34
39
  - Fixed OAuth cached-credential connections failing with `250001 Invalid OAuth access token` when the cached token was invalid (GS code `390303`); the connector now reauthenticates silently (via refresh token if available, otherwise browser) instead of hard-failing. Also fixed fresh processes holding only a cached refresh token going straight to an interactive browser prompt instead of attempting a silent refresh first.
35
40
  - Fixed Okta/SAML authentication reporting an exhausted `login_timeout` as `250003: Failed to execute request: Attempted to set connect timeout to <negative value>`. Obtaining the one-time token in step 4 can overshoot the login deadline, which made the remaining budget negative; it was then passed to the HTTP layer, which rejected it with an opaque `ValueError`. A timed-out SAML login now raises `250006` with a message naming `login_timeout`. Running out of budget while retrying on `RefreshTokenError` reports the same error instead of failing later with an `AttributeError` on an empty response (SNOW-3891419).
36
41
  - Fixed OAuth authorization code flow failing for accounts with uppercase letters in the account name. `urlparse().hostname` always returns lowercase, but the host was compared case-sensitively in `_is_snowflake_as_idp`, causing Snowflake-as-IdP detection to return `False` and raising error 251013 (`client_id is empty`) even for connections that don't require a client ID.
42
+ - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
37
43
 
38
44
  - v4.7.1(Jul 15,2026)
39
45
  - Added support for Python 3.14t (free-threaded).
@@ -49,7 +55,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
49
55
  - Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
50
56
  - Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
51
57
  - Fixed a bug where a fully-qualified DDL statement (e.g. `CREATE VIEW db.schema.obj`) on a session with no current schema would populate the connector's cached `_schema`/`_database` from the referenced object's namespace. This made `get_current_schema()` diverge from the server's `CURRENT_SCHEMA()` and mis-qualified Snowpark temp objects (SNOW-3665226).
52
- - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
53
58
 
54
59
  - v4.6.0(May 28,2026)
55
60
  - Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-connector-python
3
- Version: 4.7.3
3
+ Version: 4.7.4
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -70,8 +70,8 @@ Requires-Dist: more-itertools; extra == "development"
70
70
  Requires-Dist: numpy<=2.4.3; extra == "development"
71
71
  Requires-Dist: pendulum!=2.1.1; extra == "development"
72
72
  Requires-Dist: pexpect; extra == "development"
73
- Requires-Dist: pytest<7.5.0; extra == "development"
74
- Requires-Dist: pytest-asyncio; extra == "development"
73
+ Requires-Dist: pytest<9,>=8.4; extra == "development"
74
+ Requires-Dist: pytest-asyncio<2,>=1.4.0; extra == "development"
75
75
  Requires-Dist: pytest-cov; extra == "development"
76
76
  Requires-Dist: pytest-rerunfailures<16.0; extra == "development"
77
77
  Requires-Dist: pytest-timeout; extra == "development"
@@ -97,11 +97,17 @@ https://docs.snowflake.com/
97
97
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
98
98
 
99
99
  # Release Notes
100
+ - v4.7.4(Sep 16,2026)
101
+ - Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
102
+ - Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
103
+ - Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
104
+
100
105
  - v4.7.3(Sep 3,2026)
101
106
  - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
102
107
  - Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
103
108
  - Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
104
109
  - Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
110
+ - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
105
111
  - Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
106
112
  - DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
107
113
  - The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
@@ -115,15 +121,15 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
115
121
  - Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
116
122
  - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
117
123
  - Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
118
- - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
119
124
 
120
- - v4.7.2(Aug 6,2026)
125
+ - v4.7.2(Aug 7,2026)
121
126
  - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
122
127
  - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
123
128
  - Fixed large-file PUT uploads to internal Azure stages failing against the Azure 50,000-block-per-blob limit. The Azure multipart chunk size is now scaled up dynamically for very large files (mirroring the existing S3 behavior), and the default Azure chunk size was raised from 4 MB to 8 MB (consistent with S3) for better throughput (SNOW-3839943).
124
129
  - Fixed OAuth cached-credential connections failing with `250001 Invalid OAuth access token` when the cached token was invalid (GS code `390303`); the connector now reauthenticates silently (via refresh token if available, otherwise browser) instead of hard-failing. Also fixed fresh processes holding only a cached refresh token going straight to an interactive browser prompt instead of attempting a silent refresh first.
125
130
  - Fixed Okta/SAML authentication reporting an exhausted `login_timeout` as `250003: Failed to execute request: Attempted to set connect timeout to <negative value>`. Obtaining the one-time token in step 4 can overshoot the login deadline, which made the remaining budget negative; it was then passed to the HTTP layer, which rejected it with an opaque `ValueError`. A timed-out SAML login now raises `250006` with a message naming `login_timeout`. Running out of budget while retrying on `RefreshTokenError` reports the same error instead of failing later with an `AttributeError` on an empty response (SNOW-3891419).
126
131
  - Fixed OAuth authorization code flow failing for accounts with uppercase letters in the account name. `urlparse().hostname` always returns lowercase, but the host was compared case-sensitively in `_is_snowflake_as_idp`, causing Snowflake-as-IdP detection to return `False` and raising error 251013 (`client_id is empty`) even for connections that don't require a client ID.
132
+ - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
127
133
 
128
134
  - v4.7.1(Jul 15,2026)
129
135
  - Added support for Python 3.14t (free-threaded).
@@ -139,7 +145,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
139
145
  - Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
140
146
  - Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
141
147
  - Fixed a bug where a fully-qualified DDL statement (e.g. `CREATE VIEW db.schema.obj`) on a session with no current schema would populate the connector's cached `_schema`/`_database` from the referenced object's namespace. This made `get_current_schema()` diverge from the server's `CURRENT_SCHEMA()` and mis-qualified Snowpark temp objects (SNOW-3665226).
142
- - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
143
148
 
144
149
  - v4.6.0(May 28,2026)
145
150
  - Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
@@ -1,10 +1,7 @@
1
1
  # Snowflake Connector for Python
2
2
 
3
- [![Build and Test](https://github.com/snowflakedb/snowflake-connector-python/actions/workflows/build_test.yml/badge.svg)](https://github.com/snowflakedb/snowflake-connector-python/actions/workflows/build_test.yml)
4
- [![codecov](https://codecov.io/gh/snowflakedb/snowflake-connector-python/branch/main/graph/badge.svg?token=MVKSNtnLr0)](https://codecov.io/gh/snowflakedb/snowflake-connector-python)
5
- [![PyPi](https://img.shields.io/pypi/v/snowflake-connector-python.svg)](https://pypi.python.org/pypi/snowflake-connector-python/)
6
- [![License Apache-2.0](https://img.shields.io/:license-Apache%202-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0.txt)
7
- [![Codestyle Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
3
+ > [!IMPORTANT]
4
+ > A new version of the driver is being developed in [snowflakedb/drivers](https://github.com/snowflakedb/drivers) and is currently in public preview. See the [documentation](https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-universal-core) for more information.
8
5
 
9
6
  This package includes the Snowflake Connector for Python, which conforms to the [Python DB API 2.0](https://www.python.org/dev/peps/pep-0249/) specification.
10
7
 
@@ -97,8 +97,8 @@ development =
97
97
  numpy<=2.4.3
98
98
  pendulum!=2.1.1
99
99
  pexpect
100
- pytest<7.5.0
101
- pytest-asyncio
100
+ pytest>=8.4,<9
101
+ pytest-asyncio>=1.4.0,<2
102
102
  pytest-cov
103
103
  pytest-rerunfailures<16.0
104
104
  pytest-timeout
@@ -379,6 +379,10 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
379
379
  self,
380
380
  result_chunks,
381
381
  self._connection.client_prefetch_threads,
382
+ # SNOW-4109042: a DML reuses "total" for the rows the statement
383
+ # affected, which says nothing about the rows in its result set, so
384
+ # only a query's total is a promise worth holding the back-end to.
385
+ total_row_count=None if is_dml else data.get("total"),
382
386
  )
383
387
  self._rownumber = -1
384
388
  self._result_state = ResultState.VALID
@@ -922,24 +926,25 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
922
926
  if self._result is None and self._result_set is not None:
923
927
  self._result: ResultSetIterator = await self._result_set._create_iter()
924
928
  self._result_state = ResultState.VALID
925
- try:
926
- if self._result is None:
927
- raise TypeError("'NoneType' object is not an iterator")
928
- _next = await self._result.get_next()
929
- if isinstance(_next, Exception):
930
- Error.errorhandler_wrapper_from_ready_exception(
931
- self._connection,
932
- self,
933
- _next,
934
- )
935
- if _next is not None:
936
- self._rownumber += 1
937
- return _next
938
- except TypeError as err:
929
+ if self._result is None:
930
+ # SNOW-4109042: a missing result iterator is the only reason to report
931
+ # end-of-results here -- a cursor that was reset has no rows left to
932
+ # hand out. Errors raised while iterating a real result set must reach
933
+ # the caller instead of looking like a result set that ran out.
939
934
  if self._result_state == ResultState.DEFAULT:
940
- raise err
941
- else:
942
- return None
935
+ raise TypeError("'NoneType' object is not an iterator")
936
+ return None
937
+
938
+ _next = await self._result.get_next()
939
+ if isinstance(_next, Exception):
940
+ Error.errorhandler_wrapper_from_ready_exception(
941
+ self._connection,
942
+ self,
943
+ _next,
944
+ )
945
+ if _next is not None:
946
+ self._rownumber += 1
947
+ return _next
943
948
 
944
949
  async def fetchmany(self, size: int | None = None) -> list[FetchRow]:
945
950
  """Fetches the number of specified rows."""
@@ -79,6 +79,7 @@ from ..network import (
79
79
  is_econnreset_exception,
80
80
  is_login_request,
81
81
  is_retryable_http_code,
82
+ is_unexpected_eof_exception,
82
83
  )
83
84
  from ..secret_detector import SecretDetector
84
85
  from ..sqlstate import (
@@ -816,7 +817,7 @@ class SnowflakeRestful(SnowflakeRestfulSync):
816
817
  finally:
817
818
  raw_ret.close() # ensure response is closed
818
819
  except (aiohttp.ClientSSLError, aiohttp.ClientConnectorSSLError) as se:
819
- if is_econnreset_exception(se):
820
+ if is_econnreset_exception(se) or is_unexpected_eof_exception(se):
820
821
  raise RetryRequest(se.os_error)
821
822
  msg = f"Hit non-retryable SSL error, {str(se)}.\n{_CONNECTIVITY_ERR_MSG}"
822
823
  logger.debug(msg)
@@ -333,6 +333,7 @@ class JSONResultBatch(ResultBatch, JSONResultBatchSync):
333
333
  async with TimerContextManager() as parse_metric:
334
334
  parsed_data = self._parse(downloaded_data)
335
335
  self._metrics[DownloadMetrics.parse.value] = parse_metric.get_timing_millis()
336
+ self._check_rowcount(len(parsed_data))
336
337
  return iter(parsed_data)
337
338
 
338
339
  async def _load(self, content: bytes, encoding: str) -> list:
@@ -451,4 +452,6 @@ class ArrowResultBatch(ResultBatch, ArrowResultBatchSync):
451
452
  else:
452
453
  return await self._get_arrow_iter(connection=connection)
453
454
  else:
454
- return await self._create_iter(iter_unit=iter_unit, connection=connection)
455
+ return self._iter_checked_rows(
456
+ await self._create_iter(iter_unit=iter_unit, connection=connection)
457
+ )
@@ -29,6 +29,7 @@ from snowflake.connector.aio._result_batch import (
29
29
  from snowflake.connector.constants import IterUnit
30
30
  from snowflake.connector.options import pandas
31
31
  from snowflake.connector.result_set import ResultSet as ResultSetSync
32
+ from snowflake.connector.result_set import check_total_rowcount
32
33
 
33
34
  from .. import NotSupportedError
34
35
  from ..errors import Error
@@ -57,6 +58,7 @@ class ResultSetIterator:
57
58
  ) -> None:
58
59
  self._is_fetch_all = kw.pop("is_fetch_all", False)
59
60
  self._cursor = kw.pop("cursor", None)
61
+ self._total_row_count = kw.pop("total_row_count", None)
60
62
  self._first_batch_iter = first_batch_iter
61
63
  self._unfetched_batches = unfetched_batches
62
64
  self._final = final
@@ -104,9 +106,22 @@ class ResultSetIterator:
104
106
  )
105
107
  rets.extend(batch)
106
108
  await self._final()
109
+ check_total_rowcount(len(rets), self._total_row_count)
107
110
  return rets
108
111
 
109
112
  async def generator(self):
113
+ """Yields every row, then verifies the count the back-end declared.
114
+
115
+ SNOW-4109042: the check sits past the last ``yield`` on purpose, so a
116
+ consumer that stops early abandons this generator before reaching it.
117
+ """
118
+ rows_yielded = 0
119
+ async for value in self._generate():
120
+ rows_yielded += 1
121
+ yield value
122
+ check_total_rowcount(rows_yielded, self._total_row_count)
123
+
124
+ async def _generate(self):
110
125
  if self._is_fetch_all:
111
126
 
112
127
  tasks = await self._download_all_batches()
@@ -172,12 +187,14 @@ class ResultSet(ResultSetSync):
172
187
  cursor: SnowflakeCursor,
173
188
  result_chunks: list[JSONResultBatch] | list[ArrowResultBatch],
174
189
  prefetch_thread_num: int,
190
+ total_row_count: int | None = None,
175
191
  ) -> None:
176
192
  super().__init__(
177
193
  cursor,
178
194
  result_chunks,
179
195
  prefetch_thread_num,
180
196
  use_mp=False, # async code depends on aio rather than multiprocessing
197
+ total_row_count=total_row_count,
181
198
  )
182
199
  self.batches = cast(
183
200
  Union[list[JSONResultBatch], list[ArrowResultBatch]], self.batches
@@ -215,6 +232,14 @@ class ResultSet(ResultSetSync):
215
232
  for num, batch in enumerate(unfetched_batches):
216
233
  logger.debug(f"result batch {num + 1} has id: {batch.id}")
217
234
 
235
+ # SNOW-4109042: only row iteration yields one item per row; a table or
236
+ # pandas unit yields whole tables, so there is nothing to count there.
237
+ total_row_count = (
238
+ self._total_row_count
239
+ if kwargs.get("iter_unit", IterUnit.ROW_UNIT) == IterUnit.ROW_UNIT
240
+ else None
241
+ )
242
+
218
243
  return ResultSetIterator(
219
244
  first_batch_iter,
220
245
  unfetched_batches,
@@ -222,6 +247,7 @@ class ResultSet(ResultSetSync):
222
247
  self.prefetch_thread_num,
223
248
  cursor=self._cursor,
224
249
  is_fetch_all=is_fetch_all,
250
+ total_row_count=total_row_count,
225
251
  **kwargs,
226
252
  )
227
253
 
@@ -68,7 +68,12 @@ class AuthByOauthCode(AuthByPluginAsync, AuthByOauthCodeSync):
68
68
  AuthByOauthCodeSync.reset_secrets(self)
69
69
 
70
70
  async def prepare(self, **kwargs: Any) -> None:
71
- AuthByOauthCodeSync.prepare(self, **kwargs)
71
+ # Sync prepare may open a browser, block on the callback socket, POST to
72
+ # the IdP via urllib3, and sleep on token-request retries.
73
+ loop = asyncio.get_running_loop()
74
+ await loop.run_in_executor(
75
+ None, lambda: AuthByOauthCodeSync.prepare(self, **kwargs)
76
+ )
72
77
 
73
78
  async def reauthenticate(
74
79
  self, conn: SnowflakeConnection, **kwargs: Any
@@ -51,7 +51,12 @@ class AuthByOauthCredentials(AuthByPluginAsync, AuthByOauthCredentialsSync):
51
51
  AuthByOauthCredentialsSync.reset_secrets(self)
52
52
 
53
53
  async def prepare(self, **kwargs: Any) -> None:
54
- AuthByOauthCredentialsSync.prepare(self, **kwargs)
54
+ # Sync prepare POSTs to the IdP via urllib3 and may sleep on token-request
55
+ # retries, which would stall the asyncio event loop.
56
+ loop = asyncio.get_running_loop()
57
+ await loop.run_in_executor(
58
+ None, lambda: AuthByOauthCredentialsSync.prepare(self, **kwargs)
59
+ )
55
60
 
56
61
  async def reauthenticate(
57
62
  self, conn: SnowflakeConnection, **kwargs: Any
@@ -7,11 +7,14 @@ from __future__ import annotations
7
7
  import base64
8
8
  import json
9
9
  import logging
10
+ import time
10
11
  import urllib.parse
11
12
  from abc import ABC, abstractmethod
13
+ from collections.abc import Iterator
12
14
  from typing import TYPE_CHECKING, Any
13
15
  from urllib.error import HTTPError, URLError
14
16
 
17
+ from ..backoff_policies import exponential_backoff
15
18
  from ..errorcode import (
16
19
  ER_FAILED_TO_REQUEST,
17
20
  ER_IDP_CONNECTION_ERROR,
@@ -19,20 +22,39 @@ from ..errorcode import (
19
22
  ER_NO_CLIENT_SECRET,
20
23
  )
21
24
  from ..errors import Error, ProgrammingError
22
- from ..network import OAUTH_AUTHENTICATOR
25
+ from ..network import (
26
+ OAUTH_AUTHENTICATOR,
27
+ is_econnreset_exception,
28
+ is_unexpected_eof_exception,
29
+ )
23
30
  from ..proxy import get_proxy_url
24
31
  from ..secret_detector import SecretDetector
32
+ from ..time_util import TimeoutBackoffCtx
25
33
  from ..token_cache import TokenCache, TokenKey, TokenType
26
34
  from ..vendored import urllib3
27
35
  from ..vendored.requests.utils import get_environ_proxies, select_proxy
36
+ from ..vendored.urllib3.exceptions import IncompleteRead as Urllib3IncompleteRead
37
+ from ..vendored.urllib3.exceptions import (
38
+ MaxRetryError,
39
+ NewConnectionError,
40
+ ProtocolError,
41
+ )
42
+ from ..vendored.urllib3.exceptions import SSLError as Urllib3SSLError
43
+ from ..vendored.urllib3.exceptions import TimeoutError as Urllib3TimeoutError
28
44
  from ..vendored.urllib3.poolmanager import ProxyManager
29
- from .by_plugin import AuthByPlugin, AuthType
45
+ from .by_plugin import DEFAULT_AUTH_CLASS_TIMEOUT, AuthByPlugin, AuthType
30
46
 
31
47
  if TYPE_CHECKING:
32
48
  from .. import SnowflakeConnection
33
49
 
34
50
  logger = logging.getLogger(__name__)
35
51
 
52
+ # Total POSTs to the IdP token endpoint, including the first attempt. This is
53
+ # independent of AuthByPlugin._retry_ctx, which is reserved for the later
54
+ # Snowflake login-request retries in SnowflakeConnection._authenticate().
55
+ _OAUTH_TOKEN_REQUEST_MAX_ATTEMPTS = 3
56
+ _RETRYABLE_OAUTH_TOKEN_HTTP_STATUSES = frozenset({408, 429})
57
+
36
58
 
37
59
  class _OAuthTokensMixin:
38
60
  """Manages OAuth token caching to avoid repeated browser authentication flows.
@@ -470,19 +492,7 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
470
492
  fields["scope"] = self._scope
471
493
  try:
472
494
  # TODO(SNOW-2229411) Session manager should be used here. It may require additional security validation (since we would transition from PoolManager to requests.Session) and some parameters would be passed implicitly. OAuth token exchange must NOT reuse pooled HTTP sessions. We should create a fresh SessionManager with use_pooling=False for each call.
473
- proxy_url = self._resolve_proxy_url(conn, self._token_request_url)
474
- http_client = (
475
- ProxyManager(proxy_url=proxy_url)
476
- if proxy_url
477
- else urllib3.PoolManager()
478
- )
479
- return http_client.request_encode_body(
480
- "POST",
481
- self._token_request_url,
482
- encode_multipart=False,
483
- headers=self._create_token_request_headers(),
484
- fields=fields,
485
- )
495
+ return self._post_token_request(conn, fields)
486
496
  except HTTPError as e:
487
497
  self._handle_failure(
488
498
  conn=conn,
@@ -516,17 +526,17 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
516
526
  fields: dict[str, str],
517
527
  ) -> (str | None, str | None):
518
528
  # TODO(SNOW-2229411) Session manager should be used here. It may require additional security validation (since we would transition from PoolManager to requests.Session) and some parameters would be passed implicitly. Token request must bypass HTTP connection pools.
519
- proxy_url = self._resolve_proxy_url(connection, self._token_request_url)
520
- http_client = (
521
- ProxyManager(proxy_url=proxy_url) if proxy_url else urllib3.PoolManager()
522
- )
523
- resp = http_client.request_encode_body(
524
- "POST",
525
- self._token_request_url,
526
- headers=self._create_token_request_headers(),
527
- encode_multipart=False,
528
- fields=fields,
529
- )
529
+ try:
530
+ resp = self._post_token_request(connection, fields)
531
+ except Exception as exc:
532
+ self._handle_failure(
533
+ conn=connection,
534
+ ret={
535
+ "code": ER_FAILED_TO_REQUEST,
536
+ "message": f"Failed to request OAuth access token from IdP: {exc}",
537
+ },
538
+ )
539
+ return None, None
530
540
  try:
531
541
  logger.debug("OAuth IdP response received, try to parse it")
532
542
  json_resp: dict = json.loads(resp.data)
@@ -552,6 +562,141 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
552
562
  )
553
563
  return None, None
554
564
 
565
+ def _post_token_request(
566
+ self,
567
+ connection: SnowflakeConnection,
568
+ fields: dict[str, str],
569
+ ) -> urllib3.BaseHTTPResponse:
570
+ """POST to the IdP token endpoint, retrying transient transport and HTTP errors.
571
+
572
+ SnowflakeConnection._authenticate() calls prepare() (and therefore this
573
+ POST) once, outside the GS login retry loop. Transient IdP failures
574
+ (connection reset, timeout, 5xx, 429) must be retried here
575
+ (SNOW-3984430). Auth errors such as HTTP 400 invalid_grant are not retried.
576
+
577
+ Retries use a dedicated TimeoutBackoffCtx so AuthByPlugin._retry_ctx stays
578
+ reserved for later Snowflake login-request retries. Sleep is capped by
579
+ connection.login_timeout.
580
+ """
581
+ retry_ctx = self._oauth_token_request_retry_ctx(connection)
582
+ retry_ctx.set_start_time()
583
+ for attempt in range(1, _OAUTH_TOKEN_REQUEST_MAX_ATTEMPTS + 1):
584
+ proxy_url = self._resolve_proxy_url(connection, self._token_request_url)
585
+ http_client = (
586
+ ProxyManager(proxy_url=proxy_url)
587
+ if proxy_url
588
+ else urllib3.PoolManager()
589
+ )
590
+ try:
591
+ resp = http_client.request_encode_body(
592
+ "POST",
593
+ self._token_request_url,
594
+ headers=self._create_token_request_headers(),
595
+ encode_multipart=False,
596
+ fields=fields,
597
+ )
598
+ except Exception as exc:
599
+ if not self._is_retryable_oauth_token_exception(exc):
600
+ raise
601
+ logger.debug(
602
+ "OAuth token request failed on attempt %s/%s: %s",
603
+ attempt,
604
+ _OAUTH_TOKEN_REQUEST_MAX_ATTEMPTS,
605
+ exc,
606
+ )
607
+ if (
608
+ attempt >= _OAUTH_TOKEN_REQUEST_MAX_ATTEMPTS
609
+ or not retry_ctx.should_retry
610
+ ):
611
+ raise
612
+ self._sleep_before_oauth_token_retry(retry_ctx)
613
+ retry_ctx.increment()
614
+ continue
615
+
616
+ if self._is_retryable_oauth_token_http_status(resp.status) and (
617
+ attempt < _OAUTH_TOKEN_REQUEST_MAX_ATTEMPTS and retry_ctx.should_retry
618
+ ):
619
+ logger.debug(
620
+ "OAuth token request returned HTTP %s on attempt %s/%s; retrying",
621
+ resp.status,
622
+ attempt,
623
+ _OAUTH_TOKEN_REQUEST_MAX_ATTEMPTS,
624
+ )
625
+ self._sleep_before_oauth_token_retry(retry_ctx)
626
+ retry_ctx.increment()
627
+ continue
628
+ return resp
629
+
630
+ raise RuntimeError("OAuth token request retry loop exited without a response")
631
+
632
+ @staticmethod
633
+ def _oauth_token_request_retry_ctx(
634
+ connection: SnowflakeConnection,
635
+ ) -> TimeoutBackoffCtx:
636
+ timeout = getattr(connection, "login_timeout", None)
637
+ if isinstance(timeout, bool) or not isinstance(timeout, (int, float)):
638
+ timeout = DEFAULT_AUTH_CLASS_TIMEOUT
639
+ return TimeoutBackoffCtx(
640
+ timeout=int(timeout),
641
+ backoff_generator=AuthByOAuthBase._oauth_token_request_backoff(connection),
642
+ )
643
+
644
+ @staticmethod
645
+ def _oauth_token_request_backoff(
646
+ connection: SnowflakeConnection,
647
+ ) -> Iterator:
648
+ candidate = getattr(connection, "_backoff_generator", None)
649
+ if candidate is None:
650
+ return exponential_backoff()()
651
+ try:
652
+ iterator = iter(candidate)
653
+ first = next(iterator)
654
+ float(first)
655
+ except (TypeError, StopIteration, ValueError):
656
+ return exponential_backoff()()
657
+
658
+ def _chained() -> Iterator:
659
+ yield first
660
+ yield from iterator
661
+
662
+ return _chained()
663
+
664
+ @staticmethod
665
+ def _sleep_before_oauth_token_retry(retry_ctx: TimeoutBackoffCtx) -> None:
666
+ sleep_time = float(retry_ctx.current_sleep_time)
667
+ if retry_ctx.timeout is not None:
668
+ remaining = retry_ctx.remaining_time_millis / 1000.0
669
+ if remaining <= 0:
670
+ return
671
+ sleep_time = min(sleep_time, remaining)
672
+ if sleep_time > 0:
673
+ time.sleep(sleep_time)
674
+
675
+ @staticmethod
676
+ def _is_retryable_oauth_token_http_status(status: int) -> bool:
677
+ return status >= 500 or status in _RETRYABLE_OAUTH_TOKEN_HTTP_STATUSES
678
+
679
+ @staticmethod
680
+ def _is_retryable_oauth_token_exception(exc: BaseException) -> bool:
681
+ if isinstance(exc, MaxRetryError):
682
+ return (
683
+ exc.reason is None
684
+ or AuthByOAuthBase._is_retryable_oauth_token_exception(exc.reason)
685
+ )
686
+ if isinstance(exc, Urllib3SSLError):
687
+ return is_econnreset_exception(exc) or is_unexpected_eof_exception(exc)
688
+ return isinstance(
689
+ exc,
690
+ (
691
+ ProtocolError,
692
+ Urllib3TimeoutError,
693
+ Urllib3IncompleteRead,
694
+ NewConnectionError,
695
+ ConnectionError,
696
+ TimeoutError,
697
+ ),
698
+ )
699
+
555
700
  def _create_token_request_headers(self) -> dict[str, str]:
556
701
  return {
557
702
  "Authorization": "Basic "
@@ -1221,6 +1221,10 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
1221
1221
  self._connection.client_fetch_threads
1222
1222
  or self._connection.client_prefetch_threads,
1223
1223
  self._connection.client_fetch_use_mp,
1224
+ # SNOW-4109042: a DML reuses "total" for the rows the statement
1225
+ # affected, which says nothing about the rows in its result set, so
1226
+ # only a query's total is a promise worth holding the back-end to.
1227
+ total_row_count=None if is_dml else data.get("total"),
1224
1228
  )
1225
1229
  self._rownumber = -1
1226
1230
  self._result_state = ResultState.VALID
@@ -1584,22 +1588,25 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
1584
1588
  self._result = iter(self._result_set)
1585
1589
  self._result_state = ResultState.VALID
1586
1590
 
1587
- try:
1588
- _next = next(self._result, None)
1589
- if isinstance(_next, Exception):
1590
- Error.errorhandler_wrapper_from_ready_exception(
1591
- self._connection,
1592
- self,
1593
- _next,
1594
- )
1595
- if _next is not None:
1596
- self._rownumber += 1
1597
- return _next
1598
- except TypeError as err:
1591
+ if self._result is None:
1592
+ # SNOW-4109042: a missing result iterator is the only reason to report
1593
+ # end-of-results here -- a cursor that was reset has no rows left to
1594
+ # hand out. Errors raised while iterating a real result set must reach
1595
+ # the caller instead of looking like a result set that ran out.
1599
1596
  if self._result_state == ResultState.DEFAULT:
1600
- raise err
1601
- else:
1602
- return None
1597
+ raise TypeError("'NoneType' object is not an iterator")
1598
+ return None
1599
+
1600
+ _next = next(self._result, None)
1601
+ if isinstance(_next, Exception):
1602
+ Error.errorhandler_wrapper_from_ready_exception(
1603
+ self._connection,
1604
+ self,
1605
+ _next,
1606
+ )
1607
+ if _next is not None:
1608
+ self._rownumber += 1
1609
+ return _next
1603
1610
 
1604
1611
  def fetchmany(self, size: int | None = None) -> list[FetchRow]:
1605
1612
  """Fetches the number of specified rows."""