snowflake-connector-python 4.7.4__tar.gz → 4.7.5__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.4 → snowflake_connector_python-4.7.5}/DESCRIPTION.md +5 -0
  2. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/PKG-INFO +6 -1
  3. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_connection.py +21 -0
  4. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_network.py +2 -1
  5. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_result_batch.py +5 -5
  6. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/connection.py +55 -1
  7. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/connection_diagnostic.py +5 -0
  8. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/constants.py +55 -0
  9. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/cursor.py +87 -1
  10. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/errors.py +19 -0
  11. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/network.py +6 -1
  12. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/result_batch.py +138 -13
  13. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/session_manager.py +61 -0
  14. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ssl_wrap_socket.py +114 -2
  15. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/storage_client.py +22 -1
  16. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/version.py +1 -1
  17. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/wif_util.py +17 -3
  18. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/PKG-INFO +6 -1
  19. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/CONTRIBUTING.md +0 -0
  20. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/LICENSE.txt +0 -0
  21. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/MANIFEST.in +0 -0
  22. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/NOTICE +0 -0
  23. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/README.md +0 -0
  24. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/SECURITY.md +0 -0
  25. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/pyproject.toml +0 -0
  26. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/setup.cfg +0 -0
  27. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/setup.py +0 -0
  28. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/__init__.py +0 -0
  29. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  30. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_host_util.py +0 -0
  31. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_query_context_cache.py +0 -0
  32. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_sql_util.py +0 -0
  33. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/_utils.py +0 -0
  34. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/README.md +0 -0
  35. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/__init__.py +0 -0
  36. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  37. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  38. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_cursor.py +0 -0
  39. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_description.py +0 -0
  40. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  41. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  42. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  43. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  44. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
  45. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
  46. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_result_set.py +0 -0
  47. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  48. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_session_manager.py +0 -0
  49. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_storage_client.py +0 -0
  50. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_telemetry.py +0 -0
  51. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_time_util.py +0 -0
  52. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/_wif_util.py +0 -0
  53. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  54. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_auth.py +0 -0
  55. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  56. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_default.py +0 -0
  57. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  58. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  59. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  60. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  61. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
  62. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
  63. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_okta.py +0 -0
  64. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  65. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  66. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  67. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
  68. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/arrow_context.py +0 -0
  69. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/__init__.py +0 -0
  70. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_auth.py +0 -0
  71. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_http_server.py +0 -0
  72. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/_oauth_base.py +0 -0
  73. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/by_plugin.py +0 -0
  74. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/default.py +0 -0
  75. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/idtoken.py +0 -0
  76. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/keypair.py +0 -0
  77. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/no_auth.py +0 -0
  78. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth.py +0 -0
  79. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth_code.py +0 -0
  80. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  81. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/okta.py +0 -0
  82. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/pat.py +0 -0
  83. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  84. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/webbrowser.py +0 -0
  85. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/auth/workload_identity.py +0 -0
  86. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/azure_storage_client.py +0 -0
  87. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/backoff_policies.py +0 -0
  88. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/bind_upload_agent.py +0 -0
  89. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/cache.py +0 -0
  90. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/compat.py +0 -0
  91. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/config_manager.py +0 -0
  92. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter.py +0 -0
  93. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_issue23517.py +0 -0
  94. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_null.py +0 -0
  95. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/converter_snowsql.py +0 -0
  96. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/crl.py +0 -0
  97. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/crl_cache.py +0 -0
  98. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/dbapi.py +0 -0
  99. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/description.py +0 -0
  100. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  101. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/encryption_util.py +0 -0
  102. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/errorcode.py +0 -0
  103. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  104. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
  105. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/feature.py +0 -0
  106. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_compression_type.py +0 -0
  107. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_lock.py +0 -0
  108. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_transfer_agent.py +0 -0
  109. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/file_util.py +0 -0
  110. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/gcs_storage_client.py +0 -0
  111. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/gzip_decoder.py +0 -0
  112. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/interval_util.py +0 -0
  113. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/local_storage_client.py +0 -0
  114. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/log_configuration.py +0 -0
  115. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  116. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/logging_utils/filters.py +0 -0
  117. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/minicore/__init__.py +0 -0
  118. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  119. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  120. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  121. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  122. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  123. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  124. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  125. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  126. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  127. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  128. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  129. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  130. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  131. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  132. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  133. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  134. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  135. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  136. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  137. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  138. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  139. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  140. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  141. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  142. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  143. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  144. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  145. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  146. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  147. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  148. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  149. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  150. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  151. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  152. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  153. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  154. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  155. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  156. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  157. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  158. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  159. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  160. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  161. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  162. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  163. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  164. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  165. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  166. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  167. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  168. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  169. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  170. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  171. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  172. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  173. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  174. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  175. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  176. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  177. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  178. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  179. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  180. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  181. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  182. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  183. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  184. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  185. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  186. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  187. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  188. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  189. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  190. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  191. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  192. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  193. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  194. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  195. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  196. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  197. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  198. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  199. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  200. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  201. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  202. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  203. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  204. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  205. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  206. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  207. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  208. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  209. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  210. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  211. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  212. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/options.py +0 -0
  213. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/os_details.py +0 -0
  214. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/pandas_tools.py +0 -0
  215. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/platform_detection.py +0 -0
  216. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/proxy.py +0 -0
  217. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/py.typed +0 -0
  218. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/result_set.py +0 -0
  219. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/s3_storage_client.py +0 -0
  220. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/secret_detector.py +0 -0
  221. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sf_dirs.py +0 -0
  222. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sfbinaryformat.py +0 -0
  223. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sfdatetime.py +0 -0
  224. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/snow_logging.py +0 -0
  225. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/sqlstate.py +0 -0
  226. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  227. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/telemetry.py +0 -0
  228. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/telemetry_oob.py +0 -0
  229. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/test_util.py +0 -0
  230. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/time_util.py +0 -0
  231. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/token_cache.py +0 -0
  232. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/__init__.py +0 -0
  233. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_certs.py +0 -0
  234. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  235. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  236. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/tool/probe_connection.py +0 -0
  237. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/url_util.py +0 -0
  238. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/util_text.py +0 -0
  239. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/__init__.py +0 -0
  240. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  241. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  242. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  243. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  244. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  245. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/api.py +0 -0
  246. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  247. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  248. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  249. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  250. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  251. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/help.py +0 -0
  252. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  253. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/models.py +0 -0
  254. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  255. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  256. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  257. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  258. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  259. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  260. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  261. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  262. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  263. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  264. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  265. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  266. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  267. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  268. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  269. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  270. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
  271. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  272. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  273. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  274. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  275. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  276. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  277. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  278. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  279. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  280. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  281. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  282. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  283. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  284. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  285. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  286. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  287. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  288. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  289. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  290. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  291. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  292. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  293. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  294. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  295. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  296. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  297. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  298. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  299. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  300. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  301. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  302. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
  303. {snowflake_connector_python-4.7.4 → snowflake_connector_python-4.7.5}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,10 +7,15 @@ 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.5(Sep 18,2026)
11
+ - Follow-up to the v4.7.4 incomplete-result fix (SNOW-4109042): when a successful query-request has an incomplete inline first chunk, the connector re-fetches the finished query once via `GET /queries/{qid}/result` before building the result set. JSON treats empty or shorter-than-declared inline rowsets as incomplete; Arrow only treats a missing/empty `rowsetBase64` as incomplete so the execute hot path does not decode IPC. If the result GET fails (transport error or `success: false`), the original payload is kept; if the GET succeeds but is still incomplete, that response is used. In either incomplete case the existing rowcount/total checks still raise `OperationalError` errno `252013` when the result is drained (no silent EOF). On the sync path, a remote result chunk whose body holds fewer rows than its declared `rowCount` is re-downloaded once before that check raises, so a truncated-but-valid chunk download can recover without silent data loss. Asynchronous (`snowflake.connector.aio`) remote-chunk re-download is unchanged.
12
+
10
13
  - v4.7.4(Sep 16,2026)
11
14
  - 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
15
  - 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
16
  - 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).
17
+ - Added the `SNOWFLAKE_MIN_TLS_VERSION` environment variable (`1.2`, `1.3`, `TLSv1.2` or `TLSv1.3`, defaulting to TLS 1.2) to raise the minimum TLS version on every outbound connection a synchronous connector makes: the Snowflake API, stage transfers, OCSP/CRL fetches, platform detection, IdP requests, AWS SDK requests (workload identity STS calls and the platform-detection identity probe) and Azure AD token requests made by `azure-identity`. An unrecognized value is rejected at connect time. The variable name and accepted values match the Go and JDBC drivers. Asynchronous (`snowflake.connector.aio`) connections are not yet covered.
18
+ - Fixed a TLS handshake failure that cannot succeed on a retry — a minimum-version mismatch, an untrusted certificate, a hostname mismatch — being reported by `connect()` as a generic `250001: Could not connect to Snowflake backend after N attempt(s)` alongside a firewall-troubleshooting hint. The network layer already identified and named such failures, but the authentication layer retried them until the login timeout expired and then replaced the diagnosis. They now surface as `NonRetryableTlsError` (a subclass of `OperationalError` keeping the same errno, so existing handlers are unaffected) naming the underlying cause, and are no longer retried. Transient handshake faults (`ECONNRESET`, unexpected EOF) remain retryable.
14
19
 
15
20
  - v4.7.3(Sep 3,2026)
16
21
  - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-connector-python
3
- Version: 4.7.4
3
+ Version: 4.7.5
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -97,10 +97,15 @@ 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.5(Sep 18,2026)
101
+ - Follow-up to the v4.7.4 incomplete-result fix (SNOW-4109042): when a successful query-request has an incomplete inline first chunk, the connector re-fetches the finished query once via `GET /queries/{qid}/result` before building the result set. JSON treats empty or shorter-than-declared inline rowsets as incomplete; Arrow only treats a missing/empty `rowsetBase64` as incomplete so the execute hot path does not decode IPC. If the result GET fails (transport error or `success: false`), the original payload is kept; if the GET succeeds but is still incomplete, that response is used. In either incomplete case the existing rowcount/total checks still raise `OperationalError` errno `252013` when the result is drained (no silent EOF). On the sync path, a remote result chunk whose body holds fewer rows than its declared `rowCount` is re-downloaded once before that check raises, so a truncated-but-valid chunk download can recover without silent data loss. Asynchronous (`snowflake.connector.aio`) remote-chunk re-download is unchanged.
102
+
100
103
  - v4.7.4(Sep 16,2026)
101
104
  - 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
105
  - 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
106
  - 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).
107
+ - Added the `SNOWFLAKE_MIN_TLS_VERSION` environment variable (`1.2`, `1.3`, `TLSv1.2` or `TLSv1.3`, defaulting to TLS 1.2) to raise the minimum TLS version on every outbound connection a synchronous connector makes: the Snowflake API, stage transfers, OCSP/CRL fetches, platform detection, IdP requests, AWS SDK requests (workload identity STS calls and the platform-detection identity probe) and Azure AD token requests made by `azure-identity`. An unrecognized value is rejected at connect time. The variable name and accepted values match the Go and JDBC drivers. Asynchronous (`snowflake.connector.aio`) connections are not yet covered.
108
+ - Fixed a TLS handshake failure that cannot succeed on a retry — a minimum-version mismatch, an untrusted certificate, a hostname mismatch — being reported by `connect()` as a generic `250001: Could not connect to Snowflake backend after N attempt(s)` alongside a firewall-troubleshooting hint. The network layer already identified and named such failures, but the authentication layer retried them until the login timeout expired and then replaced the diagnosis. They now surface as `NonRetryableTlsError` (a subclass of `OperationalError` keeping the same errno, so existing handlers are unaffected) naming the underlying cause, and are no longer retried. Transient handshake faults (`ECONNRESET`, unexpected EOF) remain retryable.
104
109
 
105
110
  - v4.7.3(Sep 3,2026)
106
111
  - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
@@ -23,6 +23,7 @@ from snowflake.connector import (
23
23
  OperationalError,
24
24
  ProgrammingError,
25
25
  )
26
+ from snowflake.connector.errors import NonRetryableTlsError
26
27
 
27
28
  from .._connection_identifier_shape import (
28
29
  ConnectionIdentifierShape,
@@ -38,6 +39,7 @@ from ..connection import _get_private_bytes_from_file
38
39
  from ..constants import (
39
40
  _CONNECTIVITY_ERR_MSG,
40
41
  _OAUTH_DEFAULT_SCOPE,
42
+ ENV_VAR_MIN_TLS_VERSION,
41
43
  PARAMETER_AUTOCOMMIT,
42
44
  PARAMETER_CLIENT_PREFETCH_THREADS,
43
45
  PARAMETER_CLIENT_REQUEST_MFA_TOKEN,
@@ -570,6 +572,11 @@ class SnowflakeConnection(SnowflakeConnectionSync):
570
572
  password_callback=self._password_callback,
571
573
  session_parameters=self._session_parameters,
572
574
  )
575
+ except NonRetryableTlsError:
576
+ # See the sync counterpart: a TLS failure that a retry cannot fix must
577
+ # surface with its diagnosis rather than be replaced by the generic
578
+ # "could not connect" message the retry loop below ends with.
579
+ raise
573
580
  except OperationalError as e:
574
581
  logger.debug(
575
582
  "Operational Error raised at authentication"
@@ -1110,6 +1117,20 @@ class SnowflakeConnection(SnowflakeConnectionSync):
1110
1117
  async def connect(self, **kwargs) -> None:
1111
1118
  """Establishes connection to Snowflake."""
1112
1119
  logger.debug("connect")
1120
+ self._validate_min_tls_version()
1121
+ # Validating the value here must not be read as enforcing it: the async
1122
+ # stack builds its TLS contexts through aiohttp, which the connector's
1123
+ # urllib3 interception never sees, so the floor is not applied to async
1124
+ # handshakes. Say so rather than let a successful connect imply otherwise.
1125
+ # Not raised, because the variable is process-wide -- failing here would
1126
+ # break async connections in any process that set it for the sync path.
1127
+ if os.environ.get(ENV_VAR_MIN_TLS_VERSION, "").strip():
1128
+ logger.warning(
1129
+ "%s is set but is not enforced on asynchronous connections; their "
1130
+ "TLS handshakes may negotiate a lower version. Use a synchronous "
1131
+ "connection where the minimum must be guaranteed.",
1132
+ ENV_VAR_MIN_TLS_VERSION,
1133
+ )
1113
1134
  if len(kwargs) > 0:
1114
1135
  self.__config(**kwargs)
1115
1136
  else:
@@ -42,6 +42,7 @@ from ..errors import (
42
42
  Error,
43
43
  ForbiddenError,
44
44
  HttpError,
45
+ NonRetryableTlsError,
45
46
  OperationalError,
46
47
  ProgrammingError,
47
48
  RefreshTokenError,
@@ -826,7 +827,7 @@ class SnowflakeRestful(SnowflakeRestfulSync):
826
827
  Error.errorhandler_wrapper(
827
828
  self._connection,
828
829
  None,
829
- OperationalError,
830
+ NonRetryableTlsError,
830
831
  {
831
832
  "msg": msg,
832
833
  "errno": ER_FAILED_TO_REQUEST,
@@ -32,7 +32,10 @@ from snowflake.connector.result_batch import DownloadMetrics
32
32
  from snowflake.connector.result_batch import JSONResultBatch as JSONResultBatchSync
33
33
  from snowflake.connector.result_batch import RemoteChunkInfo
34
34
  from snowflake.connector.result_batch import ResultBatch as ResultBatchSync
35
- from snowflake.connector.result_batch import _create_nanoarrow_iterator
35
+ from snowflake.connector.result_batch import (
36
+ _create_nanoarrow_iterator,
37
+ inline_first_chunk_rowcount,
38
+ )
36
39
  from snowflake.connector.secret_detector import SecretDetector
37
40
 
38
41
  if TYPE_CHECKING:
@@ -60,8 +63,7 @@ def create_batches_from_response(
60
63
  column_converters: list[tuple[str, SnowflakeConverterType]] = []
61
64
  arrow_context: ArrowConverterContext | None = None
62
65
  rowtypes = data["rowtype"]
63
- total_len: int = data.get("total", 0)
64
- first_chunk_len = total_len
66
+ first_chunk_len = inline_first_chunk_rowcount(data)
65
67
  rest_of_chunks: list[ResultBatch] = []
66
68
  if _format == "json":
67
69
 
@@ -138,8 +140,6 @@ def create_batches_from_response(
138
140
  )
139
141
  for c in chunks
140
142
  ]
141
- for c in rest_of_chunks:
142
- first_chunk_len -= c.rowcount
143
143
  if _format == "json":
144
144
  first_chunk = JSONResultBatch.from_data(
145
145
  data.get("rowset"),
@@ -76,6 +76,7 @@ from .constants import (
76
76
  _CONNECTIVITY_ERR_MSG,
77
77
  _DOMAIN_NAME_MAP,
78
78
  _OAUTH_DEFAULT_SCOPE,
79
+ ENV_VAR_MIN_TLS_VERSION,
79
80
  ENV_VAR_PARTNER,
80
81
  OCSP_ROOT_CERTS_DICT_LOCK_TIMEOUT_DEFAULT_NO_TIMEOUT,
81
82
  PARAMETER_AUTOCOMMIT,
@@ -92,6 +93,7 @@ from .constants import (
92
93
  PARAMETER_TIMEZONE,
93
94
  OCSPMode,
94
95
  QueryStatus,
96
+ get_min_tls_version,
95
97
  )
96
98
  from .converter import SnowflakeConverter
97
99
  from .crl import CRLConfig
@@ -119,7 +121,13 @@ from .errorcode import (
119
121
  ER_NO_USER,
120
122
  ER_NOT_IMPLICITY_SNOWFLAKE_DATATYPE,
121
123
  )
122
- from .errors import DatabaseError, Error, OperationalError, ProgrammingError
124
+ from .errors import (
125
+ DatabaseError,
126
+ Error,
127
+ NonRetryableTlsError,
128
+ OperationalError,
129
+ ProgrammingError,
130
+ )
123
131
  from .log_configuration import EasyLoggingConfigPython
124
132
  from .network import (
125
133
  DEFAULT_AUTHENTICATOR,
@@ -741,6 +749,44 @@ class SnowflakeConnection:
741
749
  self._file_operation_parser = FileOperationParser(self)
742
750
  self._stream_downloader = StreamDownloader(self)
743
751
 
752
+ def _validate_min_tls_version(self) -> None:
753
+ """Reject a malformed ``SNOWFLAKE_MIN_TLS_VERSION`` before any I/O.
754
+
755
+ The floor is otherwise resolved lazily, during the first TLS handshake,
756
+ where a bad value surfaces as a bare ``ValueError`` raised from deep
757
+ inside the HTTP stack. Checking it here turns that into an ordinary
758
+ connection-time ``ProgrammingError`` naming the variable.
759
+
760
+ ``ssl_wrap_socket`` keeps its own strict parse rather than trusting this
761
+ check: the variable is read per handshake and can change after
762
+ ``connect()``, and not every TLS connection originates from a
763
+ ``SnowflakeConnection``.
764
+ """
765
+ try:
766
+ get_min_tls_version()
767
+ except ValueError as exc:
768
+ raise ProgrammingError(msg=str(exc), errno=ER_INVALID_VALUE) from exc
769
+
770
+ # A botocore hook that could not be installed means AWS SDK requests are
771
+ # not honoring the floor. Report it to callers who actually configured one
772
+ # rather than at import time, which would break users who did not.
773
+ from . import ssl_wrap_socket
774
+
775
+ hook_error = ssl_wrap_socket.BOTOCORE_MIN_TLS_HOOK_ERROR
776
+ if (
777
+ hook_error is not None
778
+ and os.environ.get(ENV_VAR_MIN_TLS_VERSION, "").strip()
779
+ ):
780
+ raise ProgrammingError(
781
+ msg=(
782
+ f"{ENV_VAR_MIN_TLS_VERSION} is set, but the minimum TLS version "
783
+ f"cannot be enforced for AWS SDK requests: {hook_error}. Pin a "
784
+ f"compatible botocore version, or unset the variable to accept "
785
+ f"botocore's own TLS floor."
786
+ ),
787
+ errno=ER_INVALID_VALUE,
788
+ )
789
+
744
790
  def _validate_account(self, account_str):
745
791
  if not is_valid_account_identifier(account_str):
746
792
  Error.errorhandler_wrapper(
@@ -1171,6 +1217,7 @@ class SnowflakeConnection:
1171
1217
  def connect(self, **kwargs) -> None:
1172
1218
  """Establishes connection to Snowflake."""
1173
1219
  logger.debug("connect")
1220
+ self._validate_min_tls_version()
1174
1221
  if len(kwargs) > 0:
1175
1222
  self.__config(**kwargs)
1176
1223
 
@@ -2083,6 +2130,13 @@ class SnowflakeConnection:
2083
2130
  password_callback=self._password_callback,
2084
2131
  session_parameters=self._session_parameters,
2085
2132
  )
2133
+ except NonRetryableTlsError:
2134
+ # A TLS failure that cannot succeed on a retry (version floor the peer
2135
+ # can't meet, untrusted certificate, hostname mismatch). Re-raise it
2136
+ # so the caller sees the diagnosis; the retry loop below would burn
2137
+ # the login timeout and then replace it with a generic
2138
+ # "could not connect" message that points at the firewall instead.
2139
+ raise
2086
2140
  except OperationalError as e:
2087
2141
  logger.debug(
2088
2142
  "Operational Error raised at authentication"
@@ -18,6 +18,7 @@ import certifi
18
18
  import OpenSSL
19
19
 
20
20
  from .compat import IS_WINDOWS, urlparse
21
+ from .constants import get_min_tls_version
21
22
  from .cursor import SnowflakeCursor
22
23
  from .session_manager import SessionManager, SessionManagerFactory
23
24
  from .url_util import extract_top_level_domain_from_hostname
@@ -239,6 +240,10 @@ class ConnectionDiagnostic:
239
240
  conn.recv(4096).decode("utf-8")
240
241
 
241
242
  context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
243
+ # This context is hand-built rather than obtained from the HTTP
244
+ # stack, so it does not inherit the connector's TLS floor; apply
245
+ # it here so the diagnostic probes what real connections would do.
246
+ context.minimum_version = get_min_tls_version()
242
247
  context.load_verify_locations(certifi.where())
243
248
  # Best-effort: enable partial-chain when supported
244
249
  _partial_flag = getattr(ssl, "VERIFY_X509_PARTIAL_CHAIN", 0)
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env python
2
2
  from __future__ import annotations
3
3
 
4
+ import os
5
+ import ssl
4
6
  from collections import defaultdict
5
7
  from enum import Enum, auto, unique
8
+ from functools import lru_cache
6
9
  from typing import TYPE_CHECKING, Any, Callable, DefaultDict, NamedTuple
7
10
 
8
11
  from .options import pyarrow as pa
@@ -466,10 +469,62 @@ ENV_VAR_PARTNER = "SF_PARTNER"
466
469
  ENV_VAR_TEST_MODE = "SNOWFLAKE_TEST_MODE"
467
470
  ENV_VAR_DISABLE_PLATFORM_DETECTION = "SNOWFLAKE_DISABLE_PLATFORM_DETECTION"
468
471
  ENV_VAR_ENABLE_CUSTOM_REVOCATION_ERRORS = "SNOWFLAKE_ENABLE_CUSTOM_REVOCATION_ERRORS"
472
+ ENV_VAR_MIN_TLS_VERSION = "SNOWFLAKE_MIN_TLS_VERSION"
469
473
 
470
474
  # Boolean positive values (lowercased) for environment variable checks
471
475
  ENV_VAR_BOOL_POSITIVE_VALUES_LOWERCASED = ["true"]
472
476
 
477
+ # Floor applied when ENV_VAR_MIN_TLS_VERSION is unset. Matches urllib3's own
478
+ # default (create_urllib3_context), so leaving the variable unset preserves the
479
+ # connector's historical behavior exactly.
480
+ DEFAULT_MIN_TLS_VERSION: ssl.TLSVersion = ssl.TLSVersion.TLSv1_2
481
+
482
+ # Accepted spellings, matched case-insensitively after trimming. Deliberately the
483
+ # same set the Go and JDBC drivers accept, so one value can be documented and
484
+ # deployed across drivers unchanged.
485
+ _MIN_TLS_VERSION_VALUES: dict[str, ssl.TLSVersion] = {
486
+ "1.2": ssl.TLSVersion.TLSv1_2,
487
+ "tlsv1.2": ssl.TLSVersion.TLSv1_2,
488
+ "1.3": ssl.TLSVersion.TLSv1_3,
489
+ "tlsv1.3": ssl.TLSVersion.TLSv1_3,
490
+ }
491
+
492
+
493
+ @lru_cache(maxsize=None)
494
+ def _parse_min_tls_version(raw: str) -> ssl.TLSVersion:
495
+ """Parse a minimum-TLS-version string into an ``ssl.TLSVersion``.
496
+
497
+ Accepts ``1.2``, ``1.3``, ``TLSv1.2`` and ``TLSv1.3``, case-insensitively and
498
+ ignoring surrounding whitespace.
499
+
500
+ Raises:
501
+ ValueError: if the value is not a recognized TLS version. A minimum TLS
502
+ version is a security control, so an unrecognized value fails loudly
503
+ rather than silently falling back to a weaker floor.
504
+
505
+ Cached per distinct input string so that repeated handshakes don't re-parse.
506
+ """
507
+ parsed = _MIN_TLS_VERSION_VALUES.get(raw.strip().lower())
508
+ if parsed is None:
509
+ raise ValueError(
510
+ f"Invalid {ENV_VAR_MIN_TLS_VERSION} value {raw!r}. "
511
+ f"Supported values: {', '.join(sorted(_MIN_TLS_VERSION_VALUES))}."
512
+ )
513
+ return parsed
514
+
515
+
516
+ def get_min_tls_version() -> ssl.TLSVersion:
517
+ """Return the process-wide minimum TLS version.
518
+
519
+ Read from ENV_VAR_MIN_TLS_VERSION on every call (so the value is not frozen
520
+ at import time), falling back to DEFAULT_MIN_TLS_VERSION when unset or empty.
521
+ """
522
+ raw = os.environ.get(ENV_VAR_MIN_TLS_VERSION, "").strip()
523
+ if not raw:
524
+ return DEFAULT_MIN_TLS_VERSION
525
+ return _parse_min_tls_version(raw)
526
+
527
+
473
528
  _DOMAIN_NAME_MAP = {_DEFAULT_HOSTNAME_TLD: "GLOBAL", _CHINA_HOSTNAME_TLD: "CHINA"}
474
529
 
475
530
  _CONNECTIVITY_ERR_MSG = (
@@ -35,7 +35,11 @@ from typing import (
35
35
 
36
36
  from typing_extensions import Self
37
37
 
38
- from snowflake.connector.result_batch import create_batches_from_response
38
+ from snowflake.connector.result_batch import (
39
+ MAX_INLINE_RESULT_RETRY,
40
+ create_batches_from_response,
41
+ is_inline_result_incomplete,
42
+ )
39
43
  from snowflake.connector.result_set import ResultSet
40
44
 
41
45
  from . import compat
@@ -57,8 +61,11 @@ from .constants import (
57
61
  QueryStatus,
58
62
  )
59
63
  from .errorcode import (
64
+ ER_CONNECTION_IS_CLOSED,
60
65
  ER_CURSOR_IS_CLOSED,
61
66
  ER_FAILED_PROCESSING_PYFORMAT,
67
+ ER_FAILED_TO_CONNECT_TO_DB,
68
+ ER_FAILED_TO_RENEW_SESSION,
62
69
  ER_FAILED_TO_REWRITE_MULTI_ROW_INSERT,
63
70
  ER_INVALID_VALUE,
64
71
  ER_NO_ARROW_RESULT,
@@ -1099,12 +1106,18 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
1099
1106
  if _exec_async:
1100
1107
  self.connection._async_sfqids[self._sfqid] = None
1101
1108
  if _no_results:
1109
+ # SNOW-4109042: skip recovery here. execute_async / _no_results
1110
+ # returns before building a ResultSet; callers fetch rows later
1111
+ # via query_result / get_results_from_sfqid, which re-GET and
1112
+ # run the same incomplete-inline recovery.
1102
1113
  self._total_rowcount = (
1103
1114
  ret["data"]["total"]
1104
1115
  if "data" in ret and "total" in ret["data"]
1105
1116
  else -1
1106
1117
  )
1107
1118
  return data
1119
+ if self._is_inline_chunk_incomplete(data):
1120
+ data = self._refetch(data)
1108
1121
  self._init_result_and_meta(data)
1109
1122
  else:
1110
1123
  self._total_rowcount = (
@@ -1194,6 +1207,77 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
1194
1207
  and int(data["statementTypeId"]) in STATEMENT_TYPE_ID_DML_SET
1195
1208
  )
1196
1209
 
1210
+ def _is_inline_chunk_incomplete(self, data: dict[Any, Any]) -> bool:
1211
+ """Whether the inline first chunk is short of the server-declared size.
1212
+
1213
+ DML and file-transfer responses are ignored: their ``total`` is not a
1214
+ promise about returned rows. Truncated HTTP JSON bodies are handled
1215
+ separately in ``network.py``.
1216
+ """
1217
+ if (
1218
+ not isinstance(data, dict)
1219
+ or not self._sfqid
1220
+ or self._is_dml(data)
1221
+ or self.is_file_transfer
1222
+ ):
1223
+ return False
1224
+ return is_inline_result_incomplete(data, data.get("queryResultFormat", "json"))
1225
+
1226
+ def _should_reraise_refetch_error(self, err: Error) -> bool:
1227
+ """True when a recovery GET failure must surface, not become keep-original.
1228
+
1229
+ Transport / HTTP-retryable failures keep the truncated payload so the
1230
+ existing ``252013`` drain checks still fire. Closed-connection, session
1231
+ renew, and programming errors are the real failure and must not be
1232
+ masked as an incomplete-result OperationalError later.
1233
+ """
1234
+ if isinstance(err, (ProgrammingError, InterfaceError)):
1235
+ return True
1236
+ return err.errno in (
1237
+ ER_CONNECTION_IS_CLOSED,
1238
+ ER_CURSOR_IS_CLOSED,
1239
+ ER_FAILED_TO_CONNECT_TO_DB,
1240
+ ER_FAILED_TO_RENEW_SESSION,
1241
+ )
1242
+
1243
+ def _refetch(self, data: dict[Any, Any]) -> dict[Any, Any]:
1244
+ """Re-GET ``/queries/{sfqid}/result`` while the inline first chunk is short.
1245
+
1246
+ Callers enter after detecting incompleteness, so the incomplete check
1247
+ runs after each GET (exit when recovered, continue while short).
1248
+ """
1249
+ for attempt in range(MAX_INLINE_RESULT_RETRY):
1250
+ logger.warning(
1251
+ "Incomplete inline result chunk for sfqid=%s; "
1252
+ "re-fetching query result (%s retry(s) left)",
1253
+ self._sfqid,
1254
+ MAX_INLINE_RESULT_RETRY - attempt,
1255
+ )
1256
+ url = f"/queries/{self._sfqid}/result"
1257
+ try:
1258
+ ret = self._connection.rest.request(url=url, method="get")
1259
+ except Error as err:
1260
+ if self._should_reraise_refetch_error(err):
1261
+ raise
1262
+ logger.warning(
1263
+ "Re-fetch of query result for sfqid=%s failed; "
1264
+ "keeping the original response",
1265
+ self._sfqid,
1266
+ exc_info=True,
1267
+ )
1268
+ return data
1269
+ if not ret.get("success") or not isinstance(ret.get("data"), dict):
1270
+ logger.warning(
1271
+ "Re-fetch of query result for sfqid=%s did not succeed; "
1272
+ "keeping the original response",
1273
+ self._sfqid,
1274
+ )
1275
+ return data
1276
+ data = ret["data"]
1277
+ if not self._is_inline_chunk_incomplete(data):
1278
+ return data
1279
+ return data
1280
+
1197
1281
  def _init_result_and_meta(self, data: dict[Any, Any]) -> None:
1198
1282
  is_dml = self._is_dml(data)
1199
1283
  self._query_result_format = data.get("queryResultFormat", "json")
@@ -1323,6 +1407,8 @@ class SnowflakeCursorBase(abc.ABC, Generic[FetchRow]):
1323
1407
 
1324
1408
  if ret.get("success"):
1325
1409
  data = ret.get("data")
1410
+ if self._is_inline_chunk_incomplete(data):
1411
+ data = self._refetch(data)
1326
1412
  self._init_result_and_meta(data)
1327
1413
  else:
1328
1414
  logger.debug("failed")
@@ -461,6 +461,25 @@ class RevocationCheckError(OperationalError):
461
461
  )
462
462
 
463
463
 
464
+ class NonRetryableTlsError(OperationalError):
465
+ """A TLS failure that cannot succeed on a retry.
466
+
467
+ Raised for handshake failures whose cause is a property of the endpoint or of
468
+ the local configuration rather than a transient network fault -- a protocol
469
+ version floor the peer cannot meet, an untrusted certificate, a hostname
470
+ mismatch. Retrying cannot change the outcome.
471
+
472
+ It exists as its own type so the authentication layer can re-raise it
473
+ directly instead of feeding it into its retry-until-timeout loop, which would
474
+ otherwise replace this error's diagnosis with a generic "could not connect"
475
+ message. Transient handshake faults (ECONNRESET, unexpected EOF) are *not*
476
+ raised as this type and remain retryable.
477
+
478
+ Still an ``OperationalError`` carrying the same errno, so existing handlers
479
+ keep working.
480
+ """
481
+
482
+
464
483
  # internal errors
465
484
  class InternalServerError(Error):
466
485
  """Exception for 500 HTTP code for retry."""
@@ -75,6 +75,7 @@ from .errors import (
75
75
  HttpError,
76
76
  InternalServerError,
77
77
  MethodNotAllowed,
78
+ NonRetryableTlsError,
78
79
  OperationalError,
79
80
  OtherHTTPRetryableError,
80
81
  ProgrammingError,
@@ -122,6 +123,10 @@ Monkey patch for PyOpenSSL Socket wrapper
122
123
  """
123
124
  ssl_wrap_socket.inject_into_urllib3()
124
125
 
126
+ # botocore builds its own SSL contexts on the real urllib3, so the patch above
127
+ # does not reach AWS SDK requests. Hook their TLS floor separately.
128
+ ssl_wrap_socket.inject_min_tls_version_into_botocore()
129
+
125
130
  # known applications
126
131
  APPLICATION_SNOWSQL = "SnowSQL"
127
132
 
@@ -1235,7 +1240,7 @@ class SnowflakeRestful:
1235
1240
  Error.errorhandler_wrapper(
1236
1241
  self._connection,
1237
1242
  None,
1238
- OperationalError,
1243
+ NonRetryableTlsError,
1239
1244
  {
1240
1245
  "msg": msg,
1241
1246
  "errno": ER_FAILED_TO_REQUEST,