snowflake-connector-python 4.7.1__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.1 → snowflake_connector_python-4.7.2}/DESCRIPTION.md +9 -0
  2. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/PKG-INFO +12 -2
  3. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/pyproject.toml +10 -1
  4. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/setup.cfg +2 -1
  5. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_auth.py +11 -3
  6. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_okta.py +11 -1
  7. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_auth.py +31 -9
  8. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_oauth_base.py +58 -1
  9. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_code.py +1 -1
  10. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/okta.py +29 -2
  11. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection.py +16 -1
  12. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/constants.py +7 -1
  13. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_transfer_agent.py +70 -46
  14. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +5 -2
  15. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +5 -2
  16. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +6 -2
  17. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +1 -0
  18. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +1 -3
  19. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +4 -0
  20. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/network.py +22 -0
  21. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/platform_detection.py +30 -10
  22. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sqlstate.py +1 -0
  23. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/util_text.py +6 -1
  24. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/version.py +1 -1
  25. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/PKG-INFO +12 -2
  26. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/requires.txt +1 -1
  27. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/CONTRIBUTING.md +0 -0
  28. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/LICENSE.txt +0 -0
  29. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/MANIFEST.in +0 -0
  30. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/NOTICE +0 -0
  31. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/README.md +0 -0
  32. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/SECURITY.md +0 -0
  33. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/setup.py +0 -0
  34. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/__init__.py +0 -0
  35. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  36. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_query_context_cache.py +0 -0
  37. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_sql_util.py +0 -0
  38. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/_utils.py +0 -0
  39. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/README.md +0 -0
  40. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/__init__.py +0 -0
  41. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  42. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  43. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_connection.py +0 -0
  44. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_cursor.py +0 -0
  45. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_description.py +0 -0
  46. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  47. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  48. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  49. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_network.py +0 -0
  50. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  51. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
  52. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
  53. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_batch.py +0 -0
  54. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_result_set.py +0 -0
  55. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  56. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_session_manager.py +0 -0
  57. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_storage_client.py +0 -0
  58. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_telemetry.py +0 -0
  59. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_time_util.py +0 -0
  60. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/_wif_util.py +0 -0
  61. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  62. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  63. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_default.py +0 -0
  64. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  65. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  66. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  67. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  68. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
  69. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
  70. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  71. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  72. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  73. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
  74. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/arrow_context.py +0 -0
  75. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/__init__.py +0 -0
  76. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/_http_server.py +0 -0
  77. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/by_plugin.py +0 -0
  78. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/default.py +0 -0
  79. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/idtoken.py +0 -0
  80. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/keypair.py +0 -0
  81. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/no_auth.py +0 -0
  82. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth.py +0 -0
  83. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  84. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/pat.py +0 -0
  85. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  86. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/webbrowser.py +0 -0
  87. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/auth/workload_identity.py +0 -0
  88. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/azure_storage_client.py +0 -0
  89. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/backoff_policies.py +0 -0
  90. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/bind_upload_agent.py +0 -0
  91. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cache.py +0 -0
  92. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/compat.py +0 -0
  93. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/config_manager.py +0 -0
  94. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/connection_diagnostic.py +0 -0
  95. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter.py +0 -0
  96. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_issue23517.py +0 -0
  97. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_null.py +0 -0
  98. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/converter_snowsql.py +0 -0
  99. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl.py +0 -0
  100. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/crl_cache.py +0 -0
  101. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/cursor.py +0 -0
  102. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/dbapi.py +0 -0
  103. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/description.py +0 -0
  104. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  105. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/encryption_util.py +0 -0
  106. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errorcode.py +0 -0
  107. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/errors.py +0 -0
  108. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  109. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
  110. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/feature.py +0 -0
  111. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_compression_type.py +0 -0
  112. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_lock.py +0 -0
  113. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/file_util.py +0 -0
  114. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gcs_storage_client.py +0 -0
  115. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/gzip_decoder.py +0 -0
  116. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/interval_util.py +0 -0
  117. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/local_storage_client.py +0 -0
  118. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/log_configuration.py +0 -0
  119. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  120. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/logging_utils/filters.py +0 -0
  121. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/minicore/__init__.py +0 -0
  122. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  123. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  124. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  125. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  126. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  127. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  128. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  129. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  130. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  131. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  132. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  133. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  134. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  135. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  136. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  137. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  138. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  139. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  140. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  141. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  142. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  143. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  144. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  145. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  146. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  147. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  148. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  149. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  150. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  151. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  152. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  153. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  154. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  155. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  156. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  157. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  158. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  159. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  160. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  161. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  162. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  163. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  164. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  165. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  166. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  167. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  168. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  169. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  170. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  171. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  172. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  173. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  174. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  175. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  176. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  177. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  178. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  179. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  180. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  181. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  182. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  183. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  184. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  185. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  186. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  187. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  188. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  189. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  190. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  191. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  192. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  193. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  194. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  195. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  196. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  197. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  198. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  199. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  200. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  201. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  202. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  203. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  204. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  205. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  206. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  207. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  208. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  209. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  210. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/options.py +0 -0
  211. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/os_details.py +0 -0
  212. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/pandas_tools.py +0 -0
  213. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/proxy.py +0 -0
  214. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/py.typed +0 -0
  215. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_batch.py +0 -0
  216. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/result_set.py +0 -0
  217. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/s3_storage_client.py +0 -0
  218. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/secret_detector.py +0 -0
  219. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/session_manager.py +0 -0
  220. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sf_dirs.py +0 -0
  221. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfbinaryformat.py +0 -0
  222. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/sfdatetime.py +0 -0
  223. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/snow_logging.py +0 -0
  224. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  225. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  226. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/storage_client.py +0 -0
  227. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry.py +0 -0
  228. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/telemetry_oob.py +0 -0
  229. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/test_util.py +0 -0
  230. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/time_util.py +0 -0
  231. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/token_cache.py +0 -0
  232. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/__init__.py +0 -0
  233. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_certs.py +0 -0
  234. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  235. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  236. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/tool/probe_connection.py +0 -0
  237. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/url_util.py +0 -0
  238. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/__init__.py +0 -0
  239. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  240. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  241. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  242. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  243. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  244. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/api.py +0 -0
  245. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  246. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  247. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  248. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  249. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  250. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/help.py +0 -0
  251. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  252. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/models.py +0 -0
  253. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  254. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  255. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  256. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  257. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  258. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  259. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  260. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  261. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  262. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  263. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  264. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  265. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  266. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  267. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  268. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  269. {snowflake_connector_python-4.7.1 → 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.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  271. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  272. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  273. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  274. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  275. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  276. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  277. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  278. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  279. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  280. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  281. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  282. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  283. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  284. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  285. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  286. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  287. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  288. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  289. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  290. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  291. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  292. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  293. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  294. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  295. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  296. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  297. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake/connector/wif_util.py +0 -0
  298. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  299. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  300. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  301. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  302. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.2}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,6 +7,14 @@ 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.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
+
10
18
  - v4.7.1(Jul 15,2026)
11
19
  - Added support for Python 3.14t (free-threaded).
12
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,6 +29,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
21
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.
22
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.
23
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).
24
33
 
25
34
  - v4.6.0(May 28,2026)
26
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.1
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,7 +62,7 @@ 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
68
  Requires-Dist: mitmproxy>=12.0.0; (python_version >= "3.12" and python_version < "3.14") and extra == "development"
@@ -96,6 +97,14 @@ https://docs.snowflake.com/
96
97
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
97
98
 
98
99
  # Release Notes
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
+
99
108
  - v4.7.1(Jul 15,2026)
100
109
  - Added support for Python 3.14t (free-threaded).
101
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).
@@ -110,6 +119,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
110
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.
111
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.
112
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).
113
123
 
114
124
  - v4.6.0(May 28,2026)
115
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,7 +89,7 @@ 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
95
  mitmproxy>=12.0.0; python_version >= '3.12' and python_version < '3.14'
@@ -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
@@ -9,6 +9,7 @@ import os
9
9
  import sys
10
10
  import threading
11
11
  from concurrent.futures.thread import ThreadPoolExecutor
12
+ from contextlib import ExitStack
12
13
  from dataclasses import dataclass
13
14
  from functools import partial
14
15
  from logging import getLogger
@@ -21,6 +22,8 @@ from .compat import IS_WINDOWS
21
22
  from .constants import (
22
23
  AZURE_CHUNK_SIZE,
23
24
  AZURE_FS,
25
+ AZURE_MAX_BLOCKS,
26
+ AZURE_MAX_OBJECT_SIZE,
24
27
  CMD_TYPE_DOWNLOAD,
25
28
  CMD_TYPE_UPLOAD,
26
29
  GCS_FS,
@@ -186,24 +189,31 @@ def _update_progress(
186
189
  return progress == 1.0
187
190
 
188
191
 
189
- def _chunk_size_calculator(file_size: int) -> int:
190
- # S3 has limitation on the num of parts to be uploaded, this helper method recalculate the num of parts
191
- if file_size > S3_MAX_OBJECT_SIZE:
192
- # check if we don't exceed the allowed S3 max file size 5 TiB
192
+ def _chunk_size_calculator(
193
+ file_size: int,
194
+ default_chunk_size: int = S3_DEFAULT_CHUNK_SIZE,
195
+ max_parts: int = S3_MAX_PARTS,
196
+ min_part_size: int = S3_MIN_PART_SIZE,
197
+ max_object_size: int = S3_MAX_OBJECT_SIZE,
198
+ ) -> int:
199
+ # Cloud providers cap the number of parts/blocks per object (S3: 10,000 parts,
200
+ # Azure: 50,000 blocks). This helper scales the chunk size up so the resulting
201
+ # number of parts stays within that limit; otherwise it keeps the default chunk size.
202
+ if file_size > max_object_size:
193
203
  raise ValueError(
194
- f"File size {file_size} exceeds the maximum file size {S3_MAX_OBJECT_SIZE} allowed in S3."
204
+ f"File size {file_size} exceeds the maximum allowed file size {max_object_size}."
195
205
  )
196
206
 
197
207
  # num_parts = math.ceil(file_size / default_chunk_size)
198
- # if num_parts is greater than the allowed S3_MAX_PARTS, we update our chunk_size, otherwise we use the default one
208
+ # if num_parts is greater than the allowed max_parts, we update our chunk_size, otherwise we use the default one
199
209
  calculated_chunk_size = (
200
- max(math.ceil(file_size / S3_MAX_PARTS), S3_MIN_PART_SIZE)
201
- if math.ceil(file_size / S3_DEFAULT_CHUNK_SIZE) > S3_MAX_PARTS
202
- else S3_DEFAULT_CHUNK_SIZE
210
+ max(math.ceil(file_size / max_parts), min_part_size)
211
+ if math.ceil(file_size / default_chunk_size) > max_parts
212
+ else default_chunk_size
203
213
  )
204
- if calculated_chunk_size != S3_DEFAULT_CHUNK_SIZE:
214
+ if calculated_chunk_size != default_chunk_size:
205
215
  logger.debug(
206
- f"Setting chunksize to {calculated_chunk_size} instead of the default {S3_DEFAULT_CHUNK_SIZE}."
216
+ f"Setting chunksize to {calculated_chunk_size} instead of the default {default_chunk_size}."
207
217
  )
208
218
  return calculated_chunk_size
209
219
 
@@ -462,9 +472,16 @@ class SnowflakeFileTransferAgent:
462
472
  max_concurrency = min(
463
473
  self._parallel, self._snowflake_server_dop_cap_for_file_transfer
464
474
  )
465
- network_tpe = ThreadPoolExecutor(max_concurrency)
466
- preprocess_tpe = ThreadPoolExecutor(iobound_tpe_limit)
467
- postprocess_tpe = ThreadPoolExecutor(iobound_tpe_limit)
475
+ thread_pools_exit_stack = ExitStack()
476
+ network_tpe = thread_pools_exit_stack.enter_context(
477
+ ThreadPoolExecutor(max_concurrency)
478
+ )
479
+ preprocess_tpe = thread_pools_exit_stack.enter_context(
480
+ ThreadPoolExecutor(iobound_tpe_limit)
481
+ )
482
+ postprocess_tpe = thread_pools_exit_stack.enter_context(
483
+ ThreadPoolExecutor(iobound_tpe_limit)
484
+ )
468
485
  logger.debug(f"Chunk ThreadPoolExecutor size: {max_concurrency}")
469
486
  cv_main_thread = threading.Condition() # to signal the main thread
470
487
  cv_chunk_process = (
@@ -661,37 +678,38 @@ class SnowflakeFileTransferAgent:
661
678
  f"An exception was raised in {repr(callback)}", exc_info=True
662
679
  )
663
680
 
664
- for file_client in files:
665
- callback = partial(preprocess_done_cb, done_client=file_client)
666
- if is_upload:
667
- preprocess_tpe.submit(
668
- function_and_callback_wrapper,
669
- # Work fn
670
- file_client.prepare_upload,
671
- # Callback fn
672
- callback,
673
- file_client.meta,
674
- )
675
- else:
676
- preprocess_tpe.submit(
677
- function_and_callback_wrapper,
678
- # Work fn
679
- file_client.prepare_download,
680
- # Callback fn
681
- callback,
682
- file_client.meta,
683
- )
684
- transfer_metadata.num_files_started += 1 # TODO: do we need this?
685
-
686
- with cv_main_thread:
687
- while transfer_metadata.num_files_completed < num_total_files:
688
- cv_main_thread.wait()
689
- # If both exception_caught_in_work and exception_caught_in_callback
690
- # are present, the former will take precedence.
691
- if exception_caught_in_work is not None:
692
- raise exception_caught_in_work
693
- if exception_caught_in_callback is not None:
694
- raise exception_caught_in_callback
681
+ with thread_pools_exit_stack:
682
+ for file_client in files:
683
+ callback = partial(preprocess_done_cb, done_client=file_client)
684
+ if is_upload:
685
+ preprocess_tpe.submit(
686
+ function_and_callback_wrapper,
687
+ # Work fn
688
+ file_client.prepare_upload,
689
+ # Callback fn
690
+ callback,
691
+ file_client.meta,
692
+ )
693
+ else:
694
+ preprocess_tpe.submit(
695
+ function_and_callback_wrapper,
696
+ # Work fn
697
+ file_client.prepare_download,
698
+ # Callback fn
699
+ callback,
700
+ file_client.meta,
701
+ )
702
+ transfer_metadata.num_files_started += 1 # TODO: do we need this?
703
+
704
+ with cv_main_thread:
705
+ while transfer_metadata.num_files_completed < num_total_files:
706
+ cv_main_thread.wait()
707
+ # If both exception_caught_in_work and exception_caught_in_callback
708
+ # are present, the former will take precedence.
709
+ if exception_caught_in_work is not None:
710
+ raise exception_caught_in_work
711
+ if exception_caught_in_callback is not None:
712
+ raise exception_caught_in_callback
695
713
 
696
714
  self._results = metas
697
715
 
@@ -709,7 +727,13 @@ class SnowflakeFileTransferAgent:
709
727
  return SnowflakeAzureRestClient(
710
728
  meta,
711
729
  self._credentials,
712
- AZURE_CHUNK_SIZE,
730
+ _chunk_size_calculator(
731
+ meta.src_file_size,
732
+ default_chunk_size=AZURE_CHUNK_SIZE,
733
+ max_parts=AZURE_MAX_BLOCKS,
734
+ min_part_size=AZURE_CHUNK_SIZE,
735
+ max_object_size=AZURE_MAX_OBJECT_SIZE,
736
+ ),
713
737
  self._stage_info,
714
738
  unsafe_file_write=self._unsafe_file_write,
715
739
  )
@@ -1,6 +1,7 @@
1
1
  #include "DateConverter.hpp"
2
2
 
3
3
  #include <memory>
4
+ #include <mutex>
4
5
 
5
6
  #include "Python/Helpers.hpp"
6
7
 
@@ -9,12 +10,14 @@ Logger* DateConverter::logger = new Logger("snowflake.connector.DateConverter");
9
10
 
10
11
  py::UniqueRef& DateConverter::initPyDatetimeDate() {
11
12
  static py::UniqueRef pyDatetimeDate;
12
- if (pyDatetimeDate.empty()) {
13
+ // Serializes the lazy import for free-threaded builds
14
+ static std::once_flag onceFlag;
15
+ std::call_once(onceFlag, []() {
13
16
  py::UniqueRef pyDatetimeModule;
14
17
  py::importPythonModule("datetime", pyDatetimeModule);
15
18
  py::importFromModule(pyDatetimeModule, "date", pyDatetimeDate);
16
19
  Py_XINCREF(pyDatetimeDate.get());
17
- }
20
+ });
18
21
  return pyDatetimeDate;
19
22
  }
20
23