snowflake-connector-python 4.7.0__tar.gz → 4.7.2__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 (302) hide show
  1. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/DESCRIPTION.md +13 -2
  2. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/PKG-INFO +21 -8
  3. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/pyproject.toml +10 -1
  4. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/setup.cfg +7 -5
  5. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_auth.py +11 -3
  6. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_okta.py +11 -1
  7. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_auth.py +31 -9
  8. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_oauth_base.py +58 -1
  9. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_code.py +1 -1
  10. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/okta.py +29 -2
  11. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection.py +16 -1
  12. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/constants.py +7 -1
  13. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_transfer_agent.py +70 -46
  14. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +5 -2
  15. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +5 -2
  16. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +6 -2
  17. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +1 -0
  18. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +1 -3
  19. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +4 -0
  20. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/network.py +22 -0
  21. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/platform_detection.py +30 -10
  22. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sqlstate.py +1 -0
  23. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssl_wrap_socket.py +124 -3
  24. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/util_text.py +6 -1
  25. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/version.py +1 -1
  26. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/PKG-INFO +21 -8
  27. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/requires.txt +10 -5
  28. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/CONTRIBUTING.md +0 -0
  29. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/LICENSE.txt +0 -0
  30. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/MANIFEST.in +0 -0
  31. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/NOTICE +0 -0
  32. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/README.md +0 -0
  33. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/SECURITY.md +0 -0
  34. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/setup.py +0 -0
  35. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/__init__.py +0 -0
  36. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  37. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_query_context_cache.py +0 -0
  38. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_sql_util.py +0 -0
  39. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_utils.py +0 -0
  40. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/README.md +0 -0
  41. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/__init__.py +0 -0
  42. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  43. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  44. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_connection.py +0 -0
  45. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_cursor.py +0 -0
  46. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_description.py +0 -0
  47. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  48. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  49. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  50. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_network.py +0 -0
  51. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  52. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
  53. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
  54. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_batch.py +0 -0
  55. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_set.py +0 -0
  56. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  57. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_session_manager.py +0 -0
  58. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_storage_client.py +0 -0
  59. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_telemetry.py +0 -0
  60. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_time_util.py +0 -0
  61. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_wif_util.py +0 -0
  62. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  63. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  64. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_default.py +0 -0
  65. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  66. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  67. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  68. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  69. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
  70. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
  71. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  72. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  73. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  74. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
  75. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/arrow_context.py +0 -0
  76. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/__init__.py +0 -0
  77. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_http_server.py +0 -0
  78. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/by_plugin.py +0 -0
  79. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/default.py +0 -0
  80. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/idtoken.py +0 -0
  81. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/keypair.py +0 -0
  82. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/no_auth.py +0 -0
  83. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth.py +0 -0
  84. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  85. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/pat.py +0 -0
  86. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  87. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/webbrowser.py +0 -0
  88. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/workload_identity.py +0 -0
  89. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/azure_storage_client.py +0 -0
  90. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/backoff_policies.py +0 -0
  91. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/bind_upload_agent.py +0 -0
  92. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cache.py +0 -0
  93. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/compat.py +0 -0
  94. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/config_manager.py +0 -0
  95. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection_diagnostic.py +0 -0
  96. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter.py +0 -0
  97. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_issue23517.py +0 -0
  98. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_null.py +0 -0
  99. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_snowsql.py +0 -0
  100. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl.py +0 -0
  101. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl_cache.py +0 -0
  102. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cursor.py +0 -0
  103. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/dbapi.py +0 -0
  104. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/description.py +0 -0
  105. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  106. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/encryption_util.py +0 -0
  107. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errorcode.py +0 -0
  108. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errors.py +0 -0
  109. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  110. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
  111. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/feature.py +0 -0
  112. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_compression_type.py +0 -0
  113. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_lock.py +0 -0
  114. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_util.py +0 -0
  115. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gcs_storage_client.py +0 -0
  116. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gzip_decoder.py +0 -0
  117. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/interval_util.py +0 -0
  118. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/local_storage_client.py +0 -0
  119. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/log_configuration.py +0 -0
  120. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  121. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/filters.py +0 -0
  122. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/minicore/__init__.py +0 -0
  123. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  124. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  125. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  126. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  127. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  128. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  129. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  130. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  131. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  132. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  133. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  134. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  135. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  136. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  137. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  138. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  139. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  140. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  141. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  142. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  143. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  144. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  145. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  146. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  147. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  148. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  149. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  150. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  151. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  152. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  153. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  154. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  155. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  156. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  157. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  158. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  159. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  160. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  161. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  162. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  163. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  164. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  165. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  166. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  167. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  168. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  169. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  170. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  171. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  172. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  173. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  174. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  175. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  176. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  177. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  178. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  179. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  180. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  181. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  182. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  183. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  184. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  185. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  186. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  187. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  188. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  189. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  190. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  191. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  192. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  193. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  194. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  195. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  196. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  197. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  198. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  199. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  200. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  201. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  202. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  203. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  204. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  205. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  206. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  207. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  208. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  209. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  210. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  211. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/options.py +0 -0
  212. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/os_details.py +0 -0
  213. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/pandas_tools.py +0 -0
  214. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/proxy.py +0 -0
  215. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/py.typed +0 -0
  216. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_batch.py +0 -0
  217. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_set.py +0 -0
  218. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/s3_storage_client.py +0 -0
  219. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/secret_detector.py +0 -0
  220. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/session_manager.py +0 -0
  221. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sf_dirs.py +0 -0
  222. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfbinaryformat.py +0 -0
  223. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfdatetime.py +0 -0
  224. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/snow_logging.py +0 -0
  225. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  226. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/storage_client.py +0 -0
  227. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry.py +0 -0
  228. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry_oob.py +0 -0
  229. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/test_util.py +0 -0
  230. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/time_util.py +0 -0
  231. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/token_cache.py +0 -0
  232. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/__init__.py +0 -0
  233. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_certs.py +0 -0
  234. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  235. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  236. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/probe_connection.py +0 -0
  237. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/url_util.py +0 -0
  238. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/__init__.py +0 -0
  239. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  240. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  241. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  242. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  243. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  244. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/api.py +0 -0
  245. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  246. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  247. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  248. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  249. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  250. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/help.py +0 -0
  251. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  252. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/models.py +0 -0
  253. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  254. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  255. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  256. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  257. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  258. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  259. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  260. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  261. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  262. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  263. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  264. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  265. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  266. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  267. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  268. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  269. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
  270. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  271. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  272. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  273. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  274. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  275. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  276. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  277. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  278. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  279. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  280. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  281. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  282. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  283. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  284. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  285. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  286. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  287. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  288. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  289. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  290. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  291. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  292. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  293. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  294. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  295. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  296. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  297. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake/connector/wif_util.py +0 -0
  298. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  299. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  300. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  301. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  302. {snowflake_connector_python-4.7.0 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,18 +7,29 @@ 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.0(Jul 2,2026)
10
+ - v4.7.2(Aug 6,2026)
11
+ - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
12
+ - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
13
+ - 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).
14
+ - 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.
15
+ - 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).
16
+ - 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.
17
+
18
+ - v4.7.1(Jul 15,2026)
19
+ - Added support for Python 3.14t (free-threaded).
20
+ - **Note:** Python 3.14t CI testing excludes `win_arm64` (no `cryptography` wheels available) and `mitmproxy` proxy tests on all platforms (transitive dependencies `aioquic`/`pylsqpack` lack free-threaded-compatible wheels).
21
+ - Improved verification of TLS connections (SNOW-3675579).
11
22
  - Fixed `python-connector.log` not rotating on Windows, and every record being logged twice, when easy logging is enabled via `config.toml` (SNOW-3680325).
12
23
  - **Note:** As part of this fix, easy logging no longer calls `logging.basicConfig()` and therefore no longer configures the root logger. `python-connector.log` now captures only the `snowflake.connector`, `botocore`, and `boto3`.
13
24
  - Improved URL validation reliability by replacing the hand-rolled regex in `is_valid_url()` with `urllib.parse.urlparse` (SNOW-3392651).
14
25
  - Fixed OAuth infinite loop when tokens expire by ensuring `reauthenticate()` calls `_request_tokens()` directly instead of looping through `prepare()`. Token cache is now read exactly once per connection, and `_store_tokens()` preserves macOS Keychain ACL by never calling `remove()`. The async OAuth `reauthenticate()` now runs the synchronous OAuth flow on a worker thread instead of blocking the event loop.
15
26
  - Fixed OAuth scope handling for Snowflake custom OAuth: when refresh tokens are enabled, the connector no longer appends the OIDC `offline_access` scope for token endpoints on `*.snowflakecomputing.com` or `*.snowflakecomputing.cn`, which caused `invalid_scope` errors. Snowflake custom OAuth expects `refresh_token` in scope instead. External IdP behavior is unchanged.
16
27
  - Fixed input validation for `scale` metadata in Arrow result set processing for `TIME`, `TIMESTAMP_NTZ`, `TIMESTAMP_LTZ`, and `TIMESTAMP_TZ` columns (SNOW-3388299).
17
- - Removed pandas upper bound dependency constraint on the `[pandas]` extra to allow installation of pandas 3.0.0 and later.
18
28
  - Fixed S3 storage client to correctly handle 307/308 (method-preserving) and 301/302 (GET/HEAD only) redirects by disabling automatic redirect following and re-signing each request with AWS SigV4 credentials for the redirect target. The region is updated from the `x-amz-bucket-region` response header on each redirect. Redirects are capped at 5 hops.
19
29
  - 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.
20
30
  - 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.
21
31
  - 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).
32
+ - 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).
22
33
 
23
34
  - v4.6.0(May 28,2026)
24
35
  - 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.0
3
+ Version: 4.7.2
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -27,6 +27,7 @@ Classifier: Programming Language :: Python :: 3.11
27
27
  Classifier: Programming Language :: Python :: 3.12
28
28
  Classifier: Programming Language :: Python :: 3.13
29
29
  Classifier: Programming Language :: Python :: 3.14
30
+ Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
30
31
  Classifier: Programming Language :: SQL
31
32
  Classifier: Topic :: Database
32
33
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
@@ -61,10 +62,10 @@ Requires-Dist: botocore>=1.24; extra == "boto"
61
62
  Provides-Extra: azure
62
63
  Requires-Dist: azure-identity>=1.16; extra == "azure"
63
64
  Provides-Extra: development
64
- Requires-Dist: Cython; extra == "development"
65
+ Requires-Dist: Cython>=3.1; extra == "development"
65
66
  Requires-Dist: azure-identity>=1.16; extra == "development"
66
67
  Requires-Dist: coverage; extra == "development"
67
- Requires-Dist: mitmproxy>=12.0.0; python_version >= "3.12" and extra == "development"
68
+ Requires-Dist: mitmproxy>=12.0.0; (python_version >= "3.12" and python_version < "3.14") and extra == "development"
68
69
  Requires-Dist: more-itertools; extra == "development"
69
70
  Requires-Dist: numpy<=2.4.3; extra == "development"
70
71
  Requires-Dist: pendulum!=2.1.1; extra == "development"
@@ -78,9 +79,10 @@ Requires-Dist: pytest-xdist; extra == "development"
78
79
  Requires-Dist: pytzdata; extra == "development"
79
80
  Requires-Dist: responses; extra == "development"
80
81
  Provides-Extra: pandas
81
- Requires-Dist: pandas>=1.0.0; python_version < "3.13" and extra == "pandas"
82
- Requires-Dist: pandas>=2.1.2; python_version >= "3.13" and extra == "pandas"
83
- Requires-Dist: pyarrow>=14.0.1; extra == "pandas"
82
+ Requires-Dist: pandas<3.0.0,>=1.0.0; python_version < "3.13" and extra == "pandas"
83
+ Requires-Dist: pandas<3.0.0,>=2.1.2; python_version >= "3.13" and extra == "pandas"
84
+ Requires-Dist: pyarrow<24,>=14.0.1; python_version >= "3.14" and extra == "pandas"
85
+ Requires-Dist: pyarrow>=14.0.1; python_version < "3.14" and extra == "pandas"
84
86
  Provides-Extra: secure-local-storage
85
87
  Requires-Dist: keyring<26.0.0,>=23.1.0; extra == "secure-local-storage"
86
88
  Dynamic: license-file
@@ -95,18 +97,29 @@ https://docs.snowflake.com/
95
97
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
96
98
 
97
99
  # Release Notes
98
- - v4.7.0(Jul 2,2026)
100
+ - v4.7.2(Aug 6,2026)
101
+ - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
102
+ - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
103
+ - 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).
104
+ - 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.
105
+ - 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).
106
+ - 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.
107
+
108
+ - v4.7.1(Jul 15,2026)
109
+ - Added support for Python 3.14t (free-threaded).
110
+ - **Note:** Python 3.14t CI testing excludes `win_arm64` (no `cryptography` wheels available) and `mitmproxy` proxy tests on all platforms (transitive dependencies `aioquic`/`pylsqpack` lack free-threaded-compatible wheels).
111
+ - Improved verification of TLS connections (SNOW-3675579).
99
112
  - Fixed `python-connector.log` not rotating on Windows, and every record being logged twice, when easy logging is enabled via `config.toml` (SNOW-3680325).
100
113
  - **Note:** As part of this fix, easy logging no longer calls `logging.basicConfig()` and therefore no longer configures the root logger. `python-connector.log` now captures only the `snowflake.connector`, `botocore`, and `boto3`.
101
114
  - Improved URL validation reliability by replacing the hand-rolled regex in `is_valid_url()` with `urllib.parse.urlparse` (SNOW-3392651).
102
115
  - Fixed OAuth infinite loop when tokens expire by ensuring `reauthenticate()` calls `_request_tokens()` directly instead of looping through `prepare()`. Token cache is now read exactly once per connection, and `_store_tokens()` preserves macOS Keychain ACL by never calling `remove()`. The async OAuth `reauthenticate()` now runs the synchronous OAuth flow on a worker thread instead of blocking the event loop.
103
116
  - Fixed OAuth scope handling for Snowflake custom OAuth: when refresh tokens are enabled, the connector no longer appends the OIDC `offline_access` scope for token endpoints on `*.snowflakecomputing.com` or `*.snowflakecomputing.cn`, which caused `invalid_scope` errors. Snowflake custom OAuth expects `refresh_token` in scope instead. External IdP behavior is unchanged.
104
117
  - Fixed input validation for `scale` metadata in Arrow result set processing for `TIME`, `TIMESTAMP_NTZ`, `TIMESTAMP_LTZ`, and `TIMESTAMP_TZ` columns (SNOW-3388299).
105
- - Removed pandas upper bound dependency constraint on the `[pandas]` extra to allow installation of pandas 3.0.0 and later.
106
118
  - Fixed S3 storage client to correctly handle 307/308 (method-preserving) and 301/302 (GET/HEAD only) redirects by disabling automatic redirect following and re-signing each request with AWS SigV4 credentials for the redirect target. The region is updated from the `x-amz-bucket-region` response header on each redirect. Redirects are capped at 5 hops.
107
119
  - 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.
108
120
  - 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.
109
121
  - 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).
122
+ - 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).
110
123
 
111
124
  - v4.6.0(May 28,2026)
112
125
  - Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
@@ -4,7 +4,9 @@ requires = [
4
4
  # and may be stricter than the version required in `setup.py`
5
5
  "setuptools>=40.6.0",
6
6
  "wheel",
7
- "cython",
7
+ # cython>=3.1 is required for the `freethreading_compatible` directive
8
+ # used by src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx
9
+ "cython>=3.1",
8
10
  ]
9
11
 
10
12
  [tool.cibuildwheel]
@@ -12,6 +14,13 @@ test-skip = "*"
12
14
  manylinux-x86_64-image = "manylinux2014"
13
15
  environment = {AUDITWHEEL_PLAT="manylinux2014_$(uname -m)"}
14
16
  build-verbosity = 1
17
+ # Opt in to free-threaded CPython wheel builds (cp313t, cp314t, ...).
18
+ # Without this, cibuildwheel silently skips every `cp*t-*` target even when
19
+ # the matrix and CIBW_BUILD env var ask for them. Requires cibuildwheel>=2.20.
20
+ # Paired with the `freethreading_compatible` Cython directive in
21
+ # src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx
22
+ # so the produced wheel actually keeps the GIL disabled at import time.
23
+ enable = ["cpython-freethreading"]
15
24
 
16
25
  [tool.cibuildwheel.linux]
17
26
  archs = ["x86_64", "aarch64"]
@@ -25,6 +25,7 @@ classifiers =
25
25
  Programming Language :: Python :: 3.12
26
26
  Programming Language :: Python :: 3.13
27
27
  Programming Language :: Python :: 3.14
28
+ Programming Language :: Python :: Free Threading :: 2 - Beta
28
29
  Programming Language :: SQL
29
30
  Topic :: Database
30
31
  Topic :: Scientific/Engineering :: Information Analysis
@@ -88,10 +89,10 @@ boto =
88
89
  azure =
89
90
  azure-identity>=1.16
90
91
  development =
91
- Cython
92
+ Cython>=3.1
92
93
  azure-identity>=1.16
93
94
  coverage
94
- mitmproxy>=12.0.0; python_version >= '3.12'
95
+ mitmproxy>=12.0.0; python_version >= '3.12' and python_version < '3.14'
95
96
  more-itertools
96
97
  numpy<=2.4.3
97
98
  pendulum!=2.1.1
@@ -105,9 +106,10 @@ development =
105
106
  pytzdata
106
107
  responses
107
108
  pandas =
108
- pandas>=1.0.0; python_version < '3.13'
109
- pandas>=2.1.2; python_version >= '3.13'
110
- pyarrow>=14.0.1
109
+ pandas>=1.0.0,<3.0.0; python_version < '3.13'
110
+ pandas>=2.1.2,<3.0.0; python_version >= '3.13'
111
+ pyarrow>=14.0.1,<24; python_version >= '3.14'
112
+ pyarrow>=14.0.1; python_version < '3.14'
111
113
  secure-local-storage =
112
114
  keyring>=23.1.0,<26.0.0
113
115
 
@@ -29,12 +29,16 @@ from ...errors import (
29
29
  from ...network import (
30
30
  ACCEPT_TYPE_APPLICATION_SNOWFLAKE,
31
31
  CONTENT_TYPE_APPLICATION_JSON,
32
+ CREDENTIAL_REJECTION_GS_CODES,
32
33
  ID_TOKEN_INVALID_LOGIN_REQUEST_GS_CODE,
33
34
  OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE,
34
35
  PYTHON_CONNECTOR_USER_AGENT,
35
36
  ReauthenticationRequest,
36
37
  )
37
- from ...sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
38
+ from ...sqlstate import (
39
+ SQLSTATE_AUTHORIZATION_FAILURE,
40
+ SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
41
+ )
38
42
  from ...token_cache import TokenType
39
43
  from ._no_auth import AuthNoAuth
40
44
 
@@ -334,8 +338,12 @@ class Auth(AuthSync):
334
338
  port=self._rest._port,
335
339
  message=ret["message"],
336
340
  ),
337
- "errno": ER_FAILED_TO_CONNECT_TO_DB,
338
- "sqlstate": SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
341
+ "errno": int(errno),
342
+ "sqlstate": (
343
+ SQLSTATE_AUTHORIZATION_FAILURE
344
+ if str(errno) in CREDENTIAL_REJECTION_GS_CODES
345
+ else SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
346
+ ),
339
347
  },
340
348
  )
341
349
  else:
@@ -212,7 +212,7 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
212
212
  ) -> dict[Any, Any]:
213
213
  logger.debug("step 4: query IDP URL snowflake app to get SAML " "response")
214
214
  timeout_time = time.time() + conn.login_timeout if conn.login_timeout else None
215
- response_html = {}
215
+ response_html = None
216
216
  origin_sso_url = sso_url
217
217
  while timeout_time is None or time.time() < timeout_time:
218
218
  try:
@@ -225,6 +225,12 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
225
225
  HTTP_HEADER_ACCEPT: "*/*",
226
226
  }
227
227
  remaining_timeout = timeout_time - time.time() if timeout_time else None
228
+ if remaining_timeout is not None and remaining_timeout <= 0:
229
+ # Obtaining the one time token consumed the whole login budget.
230
+ # The HTTP layer rejects a non-positive timeout with an opaque
231
+ # ValueError, so stop here and report the timeout that actually
232
+ # happened.
233
+ break
228
234
  response_html = await conn.rest.fetch(
229
235
  "get",
230
236
  sso_url,
@@ -237,6 +243,10 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
237
243
  break
238
244
  except RefreshTokenError:
239
245
  logger.debug("step4: refresh token for re-authentication")
246
+ if response_html is None:
247
+ # Every way out of the loop above without a response means the
248
+ # login_timeout budget ran out.
249
+ AuthByOktaSync._handle_login_timeout(conn)
240
250
  return response_html
241
251
 
242
252
  async def _step5(
@@ -51,8 +51,10 @@ from ..errors import (
51
51
  from ..network import (
52
52
  ACCEPT_TYPE_APPLICATION_SNOWFLAKE,
53
53
  CONTENT_TYPE_APPLICATION_JSON,
54
+ CREDENTIAL_REJECTION_GS_CODES,
54
55
  ID_TOKEN_INVALID_LOGIN_REQUEST_GS_CODE,
55
56
  OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE,
57
+ OAUTH_ACCESS_TOKEN_INVALID_GS_CODE,
56
58
  PYTHON_CONNECTOR_USER_AGENT,
57
59
  ReauthenticationRequest,
58
60
  )
@@ -61,12 +63,15 @@ from ..platform_detection import detect_platforms
61
63
  from ..session_manager import BaseHttpConfig, HttpConfig
62
64
  from ..session_manager import SessionManager as SyncSessionManager
63
65
  from ..session_manager import SessionManagerFactory
64
- from ..sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
66
+ from ..sqlstate import (
67
+ SQLSTATE_AUTHORIZATION_FAILURE,
68
+ SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
69
+ )
65
70
  from ..token_cache import TokenCache, TokenKey, TokenType
66
71
  from ..util_text import expand_tilde
67
72
  from ..version import VERSION
73
+ from ._oauth_base import AuthByOAuthBase
68
74
  from .no_auth import AuthNoAuth
69
- from .oauth import AuthByOAuth
70
75
 
71
76
  if TYPE_CHECKING:
72
77
  from . import AuthByPlugin
@@ -419,11 +424,24 @@ class Auth:
419
424
  sqlstate=SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
420
425
  )
421
426
  )
422
- elif (errno == OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE) and (
423
- # SNOW-2329031: OAuth v1.0 does not support token renewal,
424
- # for backward compatibility, we do not raise an exception here
425
- not isinstance(auth_instance, AuthByOAuth)
426
- ):
427
+ elif (
428
+ errno
429
+ in (
430
+ OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE,
431
+ OAUTH_ACCESS_TOKEN_INVALID_GS_CODE,
432
+ )
433
+ ) and isinstance(auth_instance, AuthByOAuthBase):
434
+ # A presented OAuth access token was rejected as expired (390318)
435
+ # or invalid (390303) - both are OAuth-scoped codes in GS.
436
+ # Reauthenticate (via refresh token or interactive) instead of
437
+ # hard-failing; reauthenticate() also evicts the stale token from
438
+ # the cache on terminal failure so it is not replayed.
439
+ #
440
+ # The guard is a positive isinstance(AuthByOAuthBase): only OAuth
441
+ # v2 authenticators (authorization-code, client-credentials) can
442
+ # renew a token. This excludes OAuth v1.0 (AuthByOAuth), whose
443
+ # user-supplied token cannot be renewed (SNOW-2329031), and keeps
444
+ # any non-OAuth authenticator out of the reauth retry.
427
445
  raise ReauthenticationRequest(
428
446
  ProgrammingError(
429
447
  msg=ret["message"],
@@ -460,8 +478,12 @@ class Auth:
460
478
  port=self._rest._port,
461
479
  message=ret["message"],
462
480
  ),
463
- "errno": ER_FAILED_TO_CONNECT_TO_DB,
464
- "sqlstate": SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
481
+ "errno": int(errno),
482
+ "sqlstate": (
483
+ SQLSTATE_AUTHORIZATION_FAILURE
484
+ if str(errno) in CREDENTIAL_REJECTION_GS_CODES
485
+ else SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
486
+ ),
465
487
  },
466
488
  )
467
489
  else:
@@ -118,6 +118,23 @@ class _OAuthTokensMixin:
118
118
  if key:
119
119
  self._token_cache.remove(key)
120
120
 
121
+ def _invalidate_access_token(self) -> None:
122
+ """Clear a confirmed-invalid access token from memory and cache.
123
+
124
+ Prevents a poisoned cached access token from being replayed on the next
125
+ connection (the symptom that made disabling the credential cache the only
126
+ workaround). Only call this on a *terminal* rejection, i.e. when it will
127
+ NOT be followed by a store of a fresh token: a lone remove() is safe, but
128
+ the remove-then-store pattern destroys macOS Keychain ACL entries. On a
129
+ successful reauth the new token is written via _store_tokens(), which
130
+ overwrites the stale one ACL-safely without a remove().
131
+ """
132
+ self._access_token = None
133
+ if self._token_cache:
134
+ key = self._get_access_token_cache_key()
135
+ if key:
136
+ self._token_cache.remove(key)
137
+
121
138
  def _store_tokens(
122
139
  self, access_token: str | None = None, refresh_token: str | None = None
123
140
  ) -> None:
@@ -308,6 +325,10 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
308
325
  password=None,
309
326
  )
310
327
  if access_token is None:
328
+ # Terminal rejection: we could not obtain a new access token, so the
329
+ # stale one must not linger in the cache to be replayed next time.
330
+ # This is a lone remove() (no subsequent store), so it is ACL-safe.
331
+ self._invalidate_access_token()
311
332
  self._handle_failure(
312
333
  conn=conn,
313
334
  ret={
@@ -338,7 +359,43 @@ class AuthByOAuthBase(AuthByPlugin, _OAuthTokensMixin, ABC):
338
359
  logger.info("OAuth access token is already available in cache")
339
360
  return
340
361
 
341
- # No cached token - request fresh tokens via browser
362
+ # No cached access token, but a cached refresh token may still be usable
363
+ # (loaded into memory above). Try to exchange it for a new access token
364
+ # BEFORE falling back to interactive auth, so a fresh process can refresh
365
+ # silently without a browser prompt. Gated on refresh_token_enabled, so
366
+ # behavior is unchanged when refresh tokens are disabled.
367
+ if self._refresh_token_enabled and self._refresh_token:
368
+ logger.debug(
369
+ "no cached OAuth access token; attempting silent refresh using "
370
+ "the cached refresh token"
371
+ )
372
+ try:
373
+ self._do_refresh_token(conn=conn)
374
+ except Exception as exc:
375
+ # A silent refresh at connection setup must never hard-fail the
376
+ # connection. _get_refresh_token_response() surfaces transport
377
+ # failures (e.g. a transient network error or an urllib3
378
+ # exception reaching the token endpoint) through _handle_failure,
379
+ # which raises. Swallow it here and fall back to interactive auth,
380
+ # which can still recover - this is the whole point of a proactive
381
+ # refresh. Note this differs from reauthenticate(), where raising
382
+ # mid-session is the correct behavior.
383
+ logger.debug(
384
+ "silent refresh raised %s; falling back to interactive "
385
+ "authentication",
386
+ exc,
387
+ )
388
+ if self._access_token is not None:
389
+ logger.info(
390
+ "obtained a new OAuth access token via the cached refresh token"
391
+ )
392
+ return
393
+ logger.debug(
394
+ "silent refresh did not yield an access token; falling back to "
395
+ "interactive authentication"
396
+ )
397
+
398
+ # No usable cached tokens - request fresh tokens via browser
342
399
  access_token, refresh_token = self._request_tokens(
343
400
  conn=conn,
344
401
  authenticator=authenticator,
@@ -431,7 +431,7 @@ You can close this window now and go back where you started from.
431
431
  parsed_host = urllib.parse.urlparse(url).hostname
432
432
  except ValueError:
433
433
  return False
434
- return parsed_host is not None and parsed_host == host
434
+ return parsed_host is not None and parsed_host == host.lower()
435
435
 
436
436
  return _matches_host(authentication_url) and _matches_host(token_request_url)
437
437
 
@@ -15,7 +15,7 @@ from ..constants import (
15
15
  HTTP_HEADER_USER_AGENT,
16
16
  )
17
17
  from ..errorcode import ER_IDP_CONNECTION_ERROR, ER_INCORRECT_DESTINATION
18
- from ..errors import DatabaseError, Error, RefreshTokenError
18
+ from ..errors import DatabaseError, Error, OperationalError, RefreshTokenError
19
19
  from ..network import CONTENT_TYPE_APPLICATION_JSON, PYTHON_CONNECTOR_USER_AGENT
20
20
  from ..sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
21
21
  from . import Auth
@@ -276,7 +276,7 @@ class AuthByOkta(AuthByPlugin):
276
276
  ) -> dict[Any, Any]:
277
277
  logger.debug("step 4: query IDP URL snowflake app to get SAML " "response")
278
278
  timeout_time = time.time() + conn.login_timeout if conn.login_timeout else None
279
- response_html = {}
279
+ response_html = None
280
280
  origin_sso_url = sso_url
281
281
  while timeout_time is None or time.time() < timeout_time:
282
282
  try:
@@ -289,6 +289,12 @@ class AuthByOkta(AuthByPlugin):
289
289
  HTTP_HEADER_ACCEPT: "*/*",
290
290
  }
291
291
  remaining_timeout = timeout_time - time.time() if timeout_time else None
292
+ if remaining_timeout is not None and remaining_timeout <= 0:
293
+ # Obtaining the one time token consumed the whole login budget.
294
+ # The HTTP layer rejects a non-positive timeout with an opaque
295
+ # ValueError, so stop here and report the timeout that actually
296
+ # happened.
297
+ break
292
298
  response_html = conn.rest.fetch(
293
299
  "get",
294
300
  sso_url,
@@ -301,8 +307,29 @@ class AuthByOkta(AuthByPlugin):
301
307
  break
302
308
  except RefreshTokenError:
303
309
  logger.debug("step4: refresh token for re-authentication")
310
+ if response_html is None:
311
+ # Every way out of the loop above without a response means the
312
+ # login_timeout budget ran out.
313
+ AuthByOkta._handle_login_timeout(conn)
304
314
  return response_html
305
315
 
316
+ @staticmethod
317
+ def _handle_login_timeout(conn: SnowflakeConnection) -> None:
318
+ Error.errorhandler_wrapper(
319
+ conn._rest._connection,
320
+ None,
321
+ OperationalError,
322
+ {
323
+ "msg": (
324
+ f"Timed out after {conn.login_timeout} second(s) waiting for "
325
+ "the identity provider to return a SAML response. Consider "
326
+ "increasing login_timeout."
327
+ ),
328
+ "errno": ER_IDP_CONNECTION_ERROR,
329
+ "sqlstate": SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
330
+ },
331
+ )
332
+
306
333
  def _step5(
307
334
  self,
308
335
  conn: SnowflakeConnection,
@@ -2025,7 +2025,22 @@ class SnowflakeConnection:
2025
2025
  ):
2026
2026
  # IDToken and OAuth auth need to authenticate through
2027
2027
  # SSO if its credential has expired
2028
- self._reauthenticate()
2028
+ result = self._reauthenticate()
2029
+ # AuthByIdToken re-establishes the session inside reauthenticate()
2030
+ # (it swaps to browser auth and re-runs _authenticate). The OAuth
2031
+ # authenticators only obtain a fresh access token, so we must
2032
+ # re-post the login here to actually establish a session with the
2033
+ # new token - otherwise the connection is left without a session
2034
+ # token and the first query fails with 250002 (connection closed).
2035
+ # prepare() short-circuits on the in-memory token (tokens load from
2036
+ # cache only once per connection), so this does not loop back into
2037
+ # another refresh.
2038
+ if (
2039
+ type(auth_instance) in (AuthByOauthCode, AuthByOauthCredentials)
2040
+ and isinstance(result, dict)
2041
+ and result.get("success")
2042
+ ):
2043
+ self._authenticate(auth_instance)
2029
2044
  else:
2030
2045
  self._authenticate(auth_instance)
2031
2046
 
@@ -430,7 +430,13 @@ S3_MIN_PART_SIZE = 5 * 1024**2
430
430
  S3_MAX_PARTS = 10000
431
431
 
432
432
  S3_CHUNK_SIZE = 8388608 # boto3 default
433
- AZURE_CHUNK_SIZE = 4 * megabyte
433
+
434
+ # Azure Block Blob multipart upload limits
435
+ # https://learn.microsoft.com/en-us/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs
436
+ AZURE_CHUNK_SIZE = 8 * megabyte # kept consistent with S3_DEFAULT_CHUNK_SIZE
437
+ AZURE_MAX_BLOCKS = 50000
438
+ AZURE_MAX_BLOCK_SIZE = 4000 * megabyte
439
+ AZURE_MAX_OBJECT_SIZE = AZURE_MAX_BLOCKS * AZURE_MAX_BLOCK_SIZE
434
440
 
435
441
  # https://requests.readthedocs.io/en/latest/user/advanced/#timeouts
436
442
  REQUEST_CONNECTION_TIMEOUT = 10