snowflake-connector-python 4.7.2__tar.gz → 4.7.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/DESCRIPTION.md +27 -2
  2. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/PKG-INFO +30 -5
  3. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/README.md +25 -5
  4. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/setup.cfg +2 -2
  5. snowflake_connector_python-4.7.4/src/snowflake/connector/_host_util.py +106 -0
  6. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_utils.py +16 -4
  7. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_connection.py +10 -18
  8. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_cursor.py +29 -20
  9. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_network.py +4 -1
  10. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_ocsp_snowflake.py +1 -6
  11. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_result_batch.py +22 -7
  12. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_result_set.py +26 -0
  13. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth_code.py +6 -1
  14. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth_credentials.py +6 -1
  15. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_workload_identity.py +2 -0
  16. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_oauth_base.py +171 -26
  17. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/workload_identity.py +74 -0
  18. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/cache.py +31 -2
  19. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/connection.py +39 -19
  20. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/constants.py +17 -0
  21. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/cursor.py +32 -18
  22. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/errorcode.py +3 -0
  23. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/externals_utils/externals_setup.py +12 -4
  24. snowflake_connector_python-4.7.4/src/snowflake/connector/logging_utils/filters.py +160 -0
  25. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/network.py +9 -3
  26. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ocsp_asn1crypto.py +11 -0
  27. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ocsp_snowflake.py +105 -32
  28. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/result_batch.py +80 -9
  29. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/result_set.py +60 -2
  30. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/secret_detector.py +82 -7
  31. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/util_text.py +5 -6
  32. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +24 -8
  33. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/version.py +1 -1
  34. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/PKG-INFO +30 -5
  35. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
  36. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
  37. snowflake_connector_python-4.7.2/src/snowflake/connector/logging_utils/filters.py +0 -72
  38. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/CONTRIBUTING.md +0 -0
  39. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/LICENSE.txt +0 -0
  40. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/MANIFEST.in +0 -0
  41. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/NOTICE +0 -0
  42. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/SECURITY.md +0 -0
  43. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/pyproject.toml +0 -0
  44. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/setup.py +0 -0
  45. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/__init__.py +0 -0
  46. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  47. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_query_context_cache.py +0 -0
  48. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/_sql_util.py +0 -0
  49. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/README.md +0 -0
  50. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/__init__.py +0 -0
  51. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  52. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  53. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_description.py +0 -0
  54. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  55. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  56. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  57. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  58. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
  59. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  60. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_session_manager.py +0 -0
  61. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_storage_client.py +0 -0
  62. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_telemetry.py +0 -0
  63. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_time_util.py +0 -0
  64. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/_wif_util.py +0 -0
  65. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  66. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_auth.py +0 -0
  67. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  68. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_default.py +0 -0
  69. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  70. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  71. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  72. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  73. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_okta.py +0 -0
  74. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  75. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  76. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  77. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/arrow_context.py +0 -0
  78. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/__init__.py +0 -0
  79. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_auth.py +0 -0
  80. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/_http_server.py +0 -0
  81. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/by_plugin.py +0 -0
  82. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/default.py +0 -0
  83. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/idtoken.py +0 -0
  84. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/keypair.py +0 -0
  85. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/no_auth.py +0 -0
  86. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth.py +0 -0
  87. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth_code.py +0 -0
  88. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  89. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/okta.py +0 -0
  90. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/pat.py +0 -0
  91. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  92. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/auth/webbrowser.py +0 -0
  93. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/azure_storage_client.py +0 -0
  94. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/backoff_policies.py +0 -0
  95. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/bind_upload_agent.py +0 -0
  96. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/compat.py +0 -0
  97. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/config_manager.py +0 -0
  98. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/connection_diagnostic.py +0 -0
  99. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter.py +0 -0
  100. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_issue23517.py +0 -0
  101. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_null.py +0 -0
  102. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/converter_snowsql.py +0 -0
  103. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/crl.py +0 -0
  104. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/crl_cache.py +0 -0
  105. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/dbapi.py +0 -0
  106. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/description.py +0 -0
  107. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  108. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/encryption_util.py +0 -0
  109. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/errors.py +0 -0
  110. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  111. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/feature.py +0 -0
  112. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_compression_type.py +0 -0
  113. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_lock.py +0 -0
  114. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_transfer_agent.py +0 -0
  115. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/file_util.py +0 -0
  116. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/gcs_storage_client.py +0 -0
  117. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/gzip_decoder.py +0 -0
  118. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/interval_util.py +0 -0
  119. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/local_storage_client.py +0 -0
  120. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/log_configuration.py +0 -0
  121. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  122. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/minicore/__init__.py +0 -0
  123. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  124. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  125. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  126. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  127. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  128. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  129. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  130. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  131. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  132. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  133. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  134. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  135. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  136. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  137. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  138. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  139. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  140. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  141. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  142. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  143. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  144. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  145. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  146. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  147. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  148. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  149. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  150. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  151. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  152. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  153. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  154. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  155. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  156. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  157. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  158. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  159. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  160. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  161. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  162. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  163. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  164. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  165. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  166. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  167. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  168. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  169. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  170. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  171. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  172. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  173. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  174. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  175. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  176. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  177. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  178. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  179. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  180. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  181. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  182. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  183. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  184. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  185. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  186. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  187. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  188. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  189. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  190. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  191. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  192. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  193. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  194. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  195. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  196. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  197. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  198. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  199. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  200. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  201. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  202. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  203. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  204. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  205. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  206. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  207. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  208. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  209. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  210. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  211. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  212. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  213. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  214. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  215. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/options.py +0 -0
  216. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/os_details.py +0 -0
  217. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/pandas_tools.py +0 -0
  218. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/platform_detection.py +0 -0
  219. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/proxy.py +0 -0
  220. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/py.typed +0 -0
  221. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/s3_storage_client.py +0 -0
  222. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/session_manager.py +0 -0
  223. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sf_dirs.py +0 -0
  224. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sfbinaryformat.py +0 -0
  225. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sfdatetime.py +0 -0
  226. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/snow_logging.py +0 -0
  227. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/sqlstate.py +0 -0
  228. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  229. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  230. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/storage_client.py +0 -0
  231. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/telemetry.py +0 -0
  232. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/telemetry_oob.py +0 -0
  233. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/test_util.py +0 -0
  234. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/time_util.py +0 -0
  235. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/token_cache.py +0 -0
  236. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/__init__.py +0 -0
  237. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_certs.py +0 -0
  238. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  239. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  240. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/tool/probe_connection.py +0 -0
  241. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/url_util.py +0 -0
  242. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/__init__.py +0 -0
  243. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  244. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  245. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  246. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  247. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  248. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/api.py +0 -0
  249. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  250. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  251. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  252. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  253. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  254. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/help.py +0 -0
  255. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  256. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/models.py +0 -0
  257. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  258. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  259. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  260. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  261. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  262. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  263. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  264. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  265. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  266. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  267. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  268. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  269. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  270. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  271. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  272. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  273. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
  274. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  275. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  276. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  277. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  278. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  279. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  280. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  281. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  282. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  283. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  284. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  285. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  286. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  287. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  288. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  289. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  290. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  291. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  292. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  293. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  294. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  295. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  296. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  297. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  298. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  299. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  300. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake/connector/wif_util.py +0 -0
  301. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  302. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  303. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  304. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.4}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,13 +7,39 @@ 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)
10
+ - v4.7.4(Sep 16,2026)
11
+ - Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
12
+ - Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
13
+ - Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
14
+
15
+ - v4.7.3(Sep 3,2026)
16
+ - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
17
+ - Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
18
+ - Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
19
+ - Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
20
+ - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
21
+ - Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
22
+ - DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
23
+ - The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
24
+ - SQL text is masked before it is written to DEBUG logs: `_format_query_for_log()` runs the query through `SecretDetector`, covering the cursor and connection paths on both sync and async. The cancel-query log paths use the same masking (SNOW-3675590).
25
+ - Deferred the SQL-masking cost to log emit-time: query DEBUG lines pass a lazy `_format_query_for_log_lazy()` wrapper whose `__str__` masks only when a handler emits the record (SNOW-3675590).
26
+ - Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
27
+ - The `WORKLOAD_IDENTITY` authenticator runs only against recognized Snowflake hosts: the connection host is normalized and suffix-anchored against `snowflakecomputing.com`, `.cn`, and `.mil` before the workload-identity flow proceeds. The `SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES` environment variable additively extends the recognized-host list (SNOW-3675580).
28
+ - Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
29
+ - When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
30
+ - A PrivateLink OCSP cache URL is derived only for hosts that consist of hostname characters, include a `.privatelink.` label, and end at `snowflakecomputing.com`, `.cn`, or `.mil`. Other hosts use the public default cache URL; set `SF_OCSP_RESPONSE_CACHE_SERVER_URL` to use a different cache server.
31
+ - Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
32
+ - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
33
+ - Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
34
+
35
+ - v4.7.2(Aug 7,2026)
11
36
  - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
12
37
  - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
13
38
  - Fixed large-file PUT uploads to internal Azure stages failing against the Azure 50,000-block-per-blob limit. The Azure multipart chunk size is now scaled up dynamically for very large files (mirroring the existing S3 behavior), and the default Azure chunk size was raised from 4 MB to 8 MB (consistent with S3) for better throughput (SNOW-3839943).
14
39
  - Fixed OAuth cached-credential connections failing with `250001 Invalid OAuth access token` when the cached token was invalid (GS code `390303`); the connector now reauthenticates silently (via refresh token if available, otherwise browser) instead of hard-failing. Also fixed fresh processes holding only a cached refresh token going straight to an interactive browser prompt instead of attempting a silent refresh first.
15
40
  - Fixed Okta/SAML authentication reporting an exhausted `login_timeout` as `250003: Failed to execute request: Attempted to set connect timeout to <negative value>`. Obtaining the one-time token in step 4 can overshoot the login deadline, which made the remaining budget negative; it was then passed to the HTTP layer, which rejected it with an opaque `ValueError`. A timed-out SAML login now raises `250006` with a message naming `login_timeout`. Running out of budget while retrying on `RefreshTokenError` reports the same error instead of failing later with an `AttributeError` on an empty response (SNOW-3891419).
16
41
  - Fixed OAuth authorization code flow failing for accounts with uppercase letters in the account name. `urlparse().hostname` always returns lowercase, but the host was compared case-sensitively in `_is_snowflake_as_idp`, causing Snowflake-as-IdP detection to return `False` and raising error 251013 (`client_id is empty`) even for connections that don't require a client ID.
42
+ - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
17
43
 
18
44
  - v4.7.1(Jul 15,2026)
19
45
  - Added support for Python 3.14t (free-threaded).
@@ -29,7 +55,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
29
55
  - Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
30
56
  - Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
31
57
  - Fixed a bug where a fully-qualified DDL statement (e.g. `CREATE VIEW db.schema.obj`) on a session with no current schema would populate the connector's cached `_schema`/`_database` from the referenced object's namespace. This made `get_current_schema()` diverge from the server's `CURRENT_SCHEMA()` and mis-qualified Snowpark temp objects (SNOW-3665226).
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).
33
58
 
34
59
  - v4.6.0(May 28,2026)
35
60
  - Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-connector-python
3
- Version: 4.7.2
3
+ Version: 4.7.4
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -70,8 +70,8 @@ Requires-Dist: more-itertools; extra == "development"
70
70
  Requires-Dist: numpy<=2.4.3; extra == "development"
71
71
  Requires-Dist: pendulum!=2.1.1; extra == "development"
72
72
  Requires-Dist: pexpect; extra == "development"
73
- Requires-Dist: pytest<7.5.0; extra == "development"
74
- Requires-Dist: pytest-asyncio; extra == "development"
73
+ Requires-Dist: pytest<9,>=8.4; extra == "development"
74
+ Requires-Dist: pytest-asyncio<2,>=1.4.0; extra == "development"
75
75
  Requires-Dist: pytest-cov; extra == "development"
76
76
  Requires-Dist: pytest-rerunfailures<16.0; extra == "development"
77
77
  Requires-Dist: pytest-timeout; extra == "development"
@@ -97,13 +97,39 @@ https://docs.snowflake.com/
97
97
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
98
98
 
99
99
  # Release Notes
100
- - v4.7.2(Aug 6,2026)
100
+ - v4.7.4(Sep 16,2026)
101
+ - Fixed missing retries on transient HTTP failures when fetching an OAuth access token from the IdP token endpoint (`OAUTH_CLIENT_CREDENTIALS` and `OAUTH_AUTHORIZATION_CODE`). Token requests now retry transport errors, HTTP 408/429, and 5xx responses (SNOW-3984430, #3003).
102
+ - Fixed a bug where a TLS handshake terminated by the peer (`SSLError` containing `SysCallError(-1, 'Unexpected EOF')`) was classified as non-retryable and surfaced as an `OperationalError`, unlike `ECONNRESET`. Such handshake `Unexpected EOF` errors are now retried, on both the sync and async request paths (SNOW-4058589).
103
+ - Fixed `fetchone()`, `fetchmany()`, `fetchall()` and cursor iteration silently returning an incomplete result set. A downloaded result chunk holding fewer rows than the back-end reported just ended the iteration, which the fetch methods report as a normal end of results, so callers received fewer rows than the query produced with no exception raised. Such a chunk now raises an `OperationalError` (errno `252013`). Errors raised while iterating a result set are no longer reported as end-of-results either: `_fetchone()` caught every `TypeError` and returned `None`, so a failure anywhere in the download/parse chain was indistinguishable from an exhausted result set. Both the sync and async paths are fixed (SNOW-4109042).
104
+
105
+ - v4.7.3(Sep 3,2026)
106
+ - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
107
+ - Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
108
+ - Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
109
+ - Fixed `split_statements` truncating unquoted URLs containing `://` at the `//`, misreading it as a line comment. The guards added alongside `//` comment support in 4.7.2 (SNOW-3772985) only recognized `file://`, so every other scheme (`http://`, `https://`, `s3://`, `snow://`, `azure://`) was cut short. Any `scheme://` is now recognized, on both the line-comment and block-comment paths (the latter affected globs such as `s3://bucket/*.csv`) (SNOW-3930192).
110
+ - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
111
+ - Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
112
+ - DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
113
+ - The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
114
+ - SQL text is masked before it is written to DEBUG logs: `_format_query_for_log()` runs the query through `SecretDetector`, covering the cursor and connection paths on both sync and async. The cancel-query log paths use the same masking (SNOW-3675590).
115
+ - Deferred the SQL-masking cost to log emit-time: query DEBUG lines pass a lazy `_format_query_for_log_lazy()` wrapper whose `__str__` masks only when a handler emits the record (SNOW-3675590).
116
+ - Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
117
+ - The `WORKLOAD_IDENTITY` authenticator runs only against recognized Snowflake hosts: the connection host is normalized and suffix-anchored against `snowflakecomputing.com`, `.cn`, and `.mil` before the workload-identity flow proceeds. The `SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES` environment variable additively extends the recognized-host list (SNOW-3675580).
118
+ - Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
119
+ - When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
120
+ - A PrivateLink OCSP cache URL is derived only for hosts that consist of hostname characters, include a `.privatelink.` label, and end at `snowflakecomputing.com`, `.cn`, or `.mil`. Other hosts use the public default cache URL; set `SF_OCSP_RESPONSE_CACHE_SERVER_URL` to use a different cache server.
121
+ - Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
122
+ - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
123
+ - Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
124
+
125
+ - v4.7.2(Aug 7,2026)
101
126
  - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
102
127
  - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
103
128
  - Fixed large-file PUT uploads to internal Azure stages failing against the Azure 50,000-block-per-blob limit. The Azure multipart chunk size is now scaled up dynamically for very large files (mirroring the existing S3 behavior), and the default Azure chunk size was raised from 4 MB to 8 MB (consistent with S3) for better throughput (SNOW-3839943).
104
129
  - Fixed OAuth cached-credential connections failing with `250001 Invalid OAuth access token` when the cached token was invalid (GS code `390303`); the connector now reauthenticates silently (via refresh token if available, otherwise browser) instead of hard-failing. Also fixed fresh processes holding only a cached refresh token going straight to an interactive browser prompt instead of attempting a silent refresh first.
105
130
  - Fixed Okta/SAML authentication reporting an exhausted `login_timeout` as `250003: Failed to execute request: Attempted to set connect timeout to <negative value>`. Obtaining the one-time token in step 4 can overshoot the login deadline, which made the remaining budget negative; it was then passed to the HTTP layer, which rejected it with an opaque `ValueError`. A timed-out SAML login now raises `250006` with a message naming `login_timeout`. Running out of budget while retrying on `RefreshTokenError` reports the same error instead of failing later with an `AttributeError` on an empty response (SNOW-3891419).
106
131
  - Fixed OAuth authorization code flow failing for accounts with uppercase letters in the account name. `urlparse().hostname` always returns lowercase, but the host was compared case-sensitively in `_is_snowflake_as_idp`, causing Snowflake-as-IdP detection to return `False` and raising error 251013 (`client_id is empty`) even for connections that don't require a client ID.
132
+ - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
107
133
 
108
134
  - v4.7.1(Jul 15,2026)
109
135
  - Added support for Python 3.14t (free-threaded).
@@ -119,7 +145,6 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
119
145
  - Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
120
146
  - Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
121
147
  - Fixed a bug where a fully-qualified DDL statement (e.g. `CREATE VIEW db.schema.obj`) on a session with no current schema would populate the connector's cached `_schema`/`_database` from the referenced object's namespace. This made `get_current_schema()` diverge from the server's `CURRENT_SCHEMA()` and mis-qualified Snowpark temp objects (SNOW-3665226).
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).
123
148
 
124
149
  - v4.6.0(May 28,2026)
125
150
  - Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
@@ -1,10 +1,7 @@
1
1
  # Snowflake Connector for Python
2
2
 
3
- [![Build and Test](https://github.com/snowflakedb/snowflake-connector-python/actions/workflows/build_test.yml/badge.svg)](https://github.com/snowflakedb/snowflake-connector-python/actions/workflows/build_test.yml)
4
- [![codecov](https://codecov.io/gh/snowflakedb/snowflake-connector-python/branch/main/graph/badge.svg?token=MVKSNtnLr0)](https://codecov.io/gh/snowflakedb/snowflake-connector-python)
5
- [![PyPi](https://img.shields.io/pypi/v/snowflake-connector-python.svg)](https://pypi.python.org/pypi/snowflake-connector-python/)
6
- [![License Apache-2.0](https://img.shields.io/:license-Apache%202-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0.txt)
7
- [![Codestyle Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
3
+ > [!IMPORTANT]
4
+ > A new version of the driver is being developed in [snowflakedb/drivers](https://github.com/snowflakedb/drivers) and is currently in public preview. See the [documentation](https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-universal-core) for more information.
8
5
 
9
6
  This package includes the Snowflake Connector for Python, which conforms to the [Python DB API 2.0](https://www.python.org/dev/peps/pep-0249/) specification.
10
7
 
@@ -53,6 +50,29 @@ These tools are integrated into `tox` to allow us to easily set them up universa
53
50
  and we would like to have an overall coverage data file created for them.
54
51
  * **flake8**: (Deprecated) Similar to `fix_lint`, but only runs `flake8` checks.
55
52
 
53
+ ## Log secret masking
54
+
55
+ By default, the connector masks secrets (tokens, passwords, cloud credentials,
56
+ private keys) in records emitted by `snowflake.connector` loggers and by the
57
+ third-party loggers it uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`,
58
+ `aioboto3`, and vendored `urllib3`). Masking applies even when logging is
59
+ configured with `logging.basicConfig`, not only when Easy Logging
60
+ (`save_logs = true` in `config.toml`) is enabled. The same opt-out covers
61
+ those trees: they also interpolate the message and clear `record.args`.
62
+
63
+ To disable masking, set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING` to `true`.
64
+ The connector reads this on every log record, so it is an escape hatch if
65
+ masking is incompatible with a log pipeline (for example one that depends
66
+ on structured `record.args`). Setting it **before** importing
67
+ `snowflake.connector` also skips installing the masking hook:
68
+
69
+ ```bash
70
+ export SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true
71
+ ```
72
+
73
+ The masker interpolates each log record and clears `record.args`. Leave
74
+ masking enabled unless you need that escape hatch.
75
+
56
76
  ## Disable telemetry
57
77
 
58
78
  By default, the Snowflake Connector for Python collects telemetry data to improve the product.
@@ -97,8 +97,8 @@ development =
97
97
  numpy<=2.4.3
98
98
  pendulum!=2.1.1
99
99
  pexpect
100
- pytest<7.5.0
101
- pytest-asyncio
100
+ pytest>=8.4,<9
101
+ pytest-asyncio>=1.4.0,<2
102
102
  pytest-cov
103
103
  pytest-rerunfailures<16.0
104
104
  pytest-timeout
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # Copyright (c) 2012-2023 Snowflake Computing Inc. All rights reserved.
4
+ #
5
+
6
+ """Host normalization and recognition shared by every subsystem that turns a
7
+ connection host into the authority of a URL the connector builds itself.
8
+
9
+ Kept subsystem-agnostic so that WORKLOAD_IDENTITY attestation and OCSP cache-URL
10
+ derivation match hosts identically; a second, slightly different rule in either
11
+ place is what this module exists to prevent. The suffix list itself lives in
12
+ ``constants`` so the data stays next to the connector's other TLD constants.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import Iterable
18
+
19
+ from .constants import _SNOWFLAKE_ALLOWED_HOST_SUFFIXES
20
+
21
+ # Maps only ASCII A-Z to a-z.
22
+ #
23
+ # Deliberately not str.lower(): full Unicode case folding maps some characters
24
+ # into ASCII, so a host containing U+212A KELVIN SIGN folds
25
+ # "snowfla<U+212A>ecomputing.com" into "snowflakecomputing.com" and would match a
26
+ # recognized suffix while DNS still resolves the original, unrelated name.
27
+ # Leaving non-ASCII untouched lets is_ldh_host reject it instead.
28
+ _ASCII_LOWERCASE_TABLE = str.maketrans(
29
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"
30
+ )
31
+
32
+ # Characters legal in a DNS hostname label, plus '_': account labels
33
+ # legitimately contain one.
34
+ _LDH_CHARACTERS = frozenset("abcdefghijklmnopqrstuvwxyz0123456789-_")
35
+
36
+
37
+ def normalize_host(host: str | None) -> str:
38
+ """Normalizes a host (or a configured host suffix) into the single string that
39
+ every subsequent check and every derived URL must use.
40
+
41
+ Trims, lower-cases ASCII only, drops everything from the first ':' onward,
42
+ then strips exactly one trailing '.' (FQDN form).
43
+
44
+ The port must be dropped before the trailing dot: a host in FQDN form
45
+ carrying an explicit port ("acct.snowflakecomputing.com.:443") still has the
46
+ dot immediately before the colon, and removing the dot first would leave it
47
+ attached to the label and match no suffix.
48
+ """
49
+ if not host:
50
+ return ""
51
+ normalized = host.strip().translate(_ASCII_LOWERCASE_TABLE)
52
+ if ":" in normalized:
53
+ normalized = normalized.split(":", 1)[0]
54
+ if normalized.endswith("."):
55
+ normalized = normalized[:-1]
56
+ return normalized
57
+
58
+
59
+ def is_ldh_host(normalized_host: str) -> bool:
60
+ """Whether an already-normalized host is made only of characters legal in a
61
+ DNS hostname: every dot-separated label non-empty and drawn from
62
+ ``[a-z0-9_-]``.
63
+
64
+ This is an allow-list, not a list of forbidden delimiters, and that
65
+ distinction is load-bearing. A host is only safe to interpolate into a URL
66
+ authority if it cannot carry a character that some URL parser treats as
67
+ ending the host, and enumerating such characters does not work: parsers
68
+ variously terminate the authority at a space, ';', "'", a percent-escape, or
69
+ a full-width look-alike of '.', '#' or '?'. Since a host whose trailing
70
+ labels are a recognized Snowflake domain can still begin with an unrelated
71
+ name, a parser that stops early resolves that unrelated name instead.
72
+
73
+ Args:
74
+ normalized_host: output of :func:`normalize_host`.
75
+ """
76
+ if not normalized_host:
77
+ return False
78
+ return all(
79
+ label and _LDH_CHARACTERS.issuperset(label)
80
+ for label in normalized_host.split(".")
81
+ )
82
+
83
+
84
+ def has_recognized_snowflake_suffix(
85
+ normalized_host: str,
86
+ extra_suffixes: Iterable[str] | None = None,
87
+ ) -> bool:
88
+ """Whether an already-normalized host ends at one of the recognized Snowflake
89
+ suffixes, matched on a label boundary so that only a listed suffix and its
90
+ subdomains qualify. The bare apex is accepted by the equality branch.
91
+
92
+ Args:
93
+ normalized_host: output of :func:`normalize_host`.
94
+ extra_suffixes: additional already-normalized suffixes to accept.
95
+ Additive only: callers cannot use this to disable the built-in list.
96
+ """
97
+ if not normalized_host:
98
+ return False
99
+ suffixes: tuple[str, ...] = _SNOWFLAKE_ALLOWED_HOST_SUFFIXES
100
+ if extra_suffixes:
101
+ suffixes = (*suffixes, *extra_suffixes)
102
+ return any(
103
+ normalized_host == suffix or normalized_host.endswith(f".{suffix}")
104
+ for suffix in suffixes
105
+ if suffix
106
+ )
@@ -9,7 +9,7 @@ import string
9
9
  import threading
10
10
  import time
11
11
  from enum import Enum
12
- from inspect import stack
12
+ from inspect import currentframe
13
13
  from secrets import choice
14
14
  from threading import Timer
15
15
  from uuid import UUID
@@ -101,12 +101,24 @@ class _TrackedQueryCancellationTimer(Timer):
101
101
 
102
102
 
103
103
  def get_application_path() -> str:
104
- """Get the path of the application script using the connector."""
104
+ """Get the path of the application script using the connector.
105
+
106
+ Walks frame.f_back directly instead of using inspect.stack(), which
107
+ reads and parses the source file of every frame on the call stack.
108
+ That per-frame disk I/O made connect() take hundreds of milliseconds
109
+ on deep call stacks (see SNOW-3691001 / GH-2908).
110
+ """
111
+ frame = currentframe()
105
112
  try:
106
- outermost_frame = stack()[-1]
107
- return outermost_frame.filename
113
+ if frame is None:
114
+ return "unknown"
115
+ while frame.f_back is not None:
116
+ frame = frame.f_back
117
+ return frame.f_code.co_filename
108
118
  except Exception:
109
119
  return "unknown"
120
+ finally:
121
+ del frame
110
122
 
111
123
 
112
124
  _SPCS_ENV_VAR = "SNOWFLAKE_RUNNING_INSIDE_SPCS"
@@ -120,7 +120,6 @@ else:
120
120
 
121
121
 
122
122
  class SnowflakeConnection(SnowflakeConnectionSync):
123
- OCSP_ENV_LOCK = asyncio.Lock()
124
123
 
125
124
  def __init__(
126
125
  self,
@@ -233,20 +232,17 @@ class SnowflakeConnection(SnowflakeConnectionSync):
233
232
  )
234
233
  logger.debug("REST API object was created: %s:%s", self.host, self.port)
235
234
 
235
+ # The PrivateLink OCSP cache URL is now derived per-connection inside
236
+ # OCSPServer from this connection's hostname (SNOW-3675581); the driver
237
+ # does not write SF_OCSP_RESPONSE_CACHE_SERVER_URL to the process
238
+ # environment. An operator-set value is still honored (and takes
239
+ # precedence) -- log it if present.
236
240
  if "SF_OCSP_RESPONSE_CACHE_SERVER_URL" in os.environ:
237
241
  logger.debug(
238
242
  "Custom OCSP Cache Server URL found in environment - %s",
239
243
  os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"],
240
244
  )
241
245
 
242
- if ".privatelink.snowflakecomputing." in self.host.lower():
243
- await SnowflakeConnection.setup_ocsp_privatelink(
244
- self.application, self.host
245
- )
246
- else:
247
- if "SF_OCSP_RESPONSE_CACHE_SERVER_URL" in os.environ:
248
- del os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"]
249
-
250
246
  if self._session_parameters is None:
251
247
  self._session_parameters = {}
252
248
  if self._autocommit is not None:
@@ -715,7 +711,11 @@ class SnowflakeConnection(SnowflakeConnectionSync):
715
711
  self, sql: str, request_id: uuid.UUID
716
712
  ) -> dict[str, bool | None]:
717
713
  """Cancels the query with the exact SQL query and requestId."""
718
- logger.debug("_cancel_query sql=[%s], request_id=[%s]", sql, request_id)
714
+ logger.debug(
715
+ "_cancel_query sql=[%s], request_id=[%s]",
716
+ self._format_query_for_log(sql),
717
+ request_id,
718
+ )
719
719
  url_parameters = {REQUEST_ID: str(uuid.uuid4())}
720
720
 
721
721
  return await self.rest.request(
@@ -1233,14 +1233,6 @@ class SnowflakeConnection(SnowflakeConnectionSync):
1233
1233
  self._process_error_query_status(sf_qid, status_resp)
1234
1234
  return status
1235
1235
 
1236
- @staticmethod
1237
- async def setup_ocsp_privatelink(app, hostname) -> None:
1238
- hostname = hostname.lower()
1239
- async with SnowflakeConnection.OCSP_ENV_LOCK:
1240
- ocsp_cache_server = f"http://ocsp.{hostname}/ocsp_response_cache.json"
1241
- os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"] = ocsp_cache_server
1242
- logger.debug("OCSP Cache Server is updated: %s", ocsp_cache_server)
1243
-
1244
1236
  async def rollback(self) -> None:
1245
1237
  """Rolls back the current transaction."""
1246
1238
  await self.cursor().execute("ROLLBACK")
@@ -142,7 +142,11 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
142
142
 
143
143
  async def __cancel_query(self, query) -> None:
144
144
  if self._sequence_counter >= 0 and not self.is_closed():
145
- logger.debug("canceled. %s, request_id: %s", query, self._request_id)
145
+ logger.debug(
146
+ "canceled. %s, request_id: %s",
147
+ self._format_query_for_log_lazy(query),
148
+ self._request_id,
149
+ )
146
150
  async with self._lock_canceling:
147
151
  await self._connection._cancel_query(query, self._request_id)
148
152
 
@@ -234,7 +238,7 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
234
238
 
235
239
  logger.debug(f"Request id: {self._request_id}")
236
240
 
237
- logger.debug("running query [%s]", self._format_query_for_log(query))
241
+ logger.debug("running query [%s]", self._format_query_for_log_lazy(query))
238
242
  if _is_put_get is not None:
239
243
  # if told the query is PUT or GET, use the information
240
244
  self._is_file_transfer = _is_put_get
@@ -375,6 +379,10 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
375
379
  self,
376
380
  result_chunks,
377
381
  self._connection.client_prefetch_threads,
382
+ # SNOW-4109042: a DML reuses "total" for the rows the statement
383
+ # affected, which says nothing about the rows in its result set, so
384
+ # only a query's total is a promise worth holding the back-end to.
385
+ total_row_count=None if is_dml else data.get("total"),
378
386
  )
379
387
  self._rownumber = -1
380
388
  self._result_state = ResultState.VALID
@@ -574,7 +582,7 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
574
582
  logger.warning("execute: no query is given to execute")
575
583
  return None
576
584
 
577
- logger.debug("query: [%s]", self._format_query_for_log(command))
585
+ logger.debug("query: [%s]", self._format_query_for_log_lazy(command))
578
586
 
579
587
  _statement_params = _statement_params or dict()
580
588
  # If we need to add another parameter, please consider introducing a dict for all extra params
@@ -918,24 +926,25 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
918
926
  if self._result is None and self._result_set is not None:
919
927
  self._result: ResultSetIterator = await self._result_set._create_iter()
920
928
  self._result_state = ResultState.VALID
921
- try:
922
- if self._result is None:
923
- raise TypeError("'NoneType' object is not an iterator")
924
- _next = await self._result.get_next()
925
- if isinstance(_next, Exception):
926
- Error.errorhandler_wrapper_from_ready_exception(
927
- self._connection,
928
- self,
929
- _next,
930
- )
931
- if _next is not None:
932
- self._rownumber += 1
933
- return _next
934
- except TypeError as err:
929
+ if self._result is None:
930
+ # SNOW-4109042: a missing result iterator is the only reason to report
931
+ # end-of-results here -- a cursor that was reset has no rows left to
932
+ # hand out. Errors raised while iterating a real result set must reach
933
+ # the caller instead of looking like a result set that ran out.
935
934
  if self._result_state == ResultState.DEFAULT:
936
- raise err
937
- else:
938
- return None
935
+ raise TypeError("'NoneType' object is not an iterator")
936
+ return None
937
+
938
+ _next = await self._result.get_next()
939
+ if isinstance(_next, Exception):
940
+ Error.errorhandler_wrapper_from_ready_exception(
941
+ self._connection,
942
+ self,
943
+ _next,
944
+ )
945
+ if _next is not None:
946
+ self._rownumber += 1
947
+ return _next
939
948
 
940
949
  async def fetchmany(self, size: int | None = None) -> list[FetchRow]:
941
950
  """Fetches the number of specified rows."""
@@ -79,6 +79,7 @@ from ..network import (
79
79
  is_econnreset_exception,
80
80
  is_login_request,
81
81
  is_retryable_http_code,
82
+ is_unexpected_eof_exception,
82
83
  )
83
84
  from ..secret_detector import SecretDetector
84
85
  from ..sqlstate import (
@@ -730,6 +731,8 @@ class SnowflakeRestful(SnowflakeRestfulSync):
730
731
  else:
731
732
  input_data = data
732
733
 
734
+ # Work on a copy so the caller-supplied dict is never mutated.
735
+ headers = dict(headers)
733
736
  if HEADER_AUTHORIZATION_KEY in headers:
734
737
  del headers[HEADER_AUTHORIZATION_KEY]
735
738
  if token != NO_TOKEN:
@@ -814,7 +817,7 @@ class SnowflakeRestful(SnowflakeRestfulSync):
814
817
  finally:
815
818
  raw_ret.close() # ensure response is closed
816
819
  except (aiohttp.ClientSSLError, aiohttp.ClientConnectorSSLError) as se:
817
- if is_econnreset_exception(se):
820
+ if is_econnreset_exception(se) or is_unexpected_eof_exception(se):
818
821
  raise RetryRequest(se.os_error)
819
822
  msg = f"Hit non-retryable SSL error, {str(se)}.\n{_CONNECTIVITY_ERR_MSG}"
820
823
  logger.debug(msg)
@@ -33,7 +33,6 @@ from snowflake.connector.ocsp_snowflake import (
33
33
  from snowflake.connector.ocsp_snowflake import OCSPServer as OCSPServerSync
34
34
  from snowflake.connector.ocsp_snowflake import OCSPTelemetryData
35
35
  from snowflake.connector.ocsp_snowflake import SnowflakeOCSP as SnowflakeOCSPSync
36
- from snowflake.connector.url_util import extract_top_level_domain_from_hostname
37
36
 
38
37
  if TYPE_CHECKING:
39
38
  from snowflake.connector.aio._session_manager import SessionManager
@@ -157,11 +156,7 @@ class SnowflakeOCSP(SnowflakeOCSPSync):
157
156
 
158
157
  self._use_post_method = use_post_method
159
158
  self._root_certs_dict_lock_timeout = root_certs_dict_lock_timeout
160
- self.OCSP_CACHE_SERVER = OCSPServer(
161
- top_level_domain=extract_top_level_domain_from_hostname(
162
- kwargs.pop("hostname", None)
163
- )
164
- )
159
+ self.OCSP_CACHE_SERVER = OCSPServer(hostname=kwargs.pop("hostname", None))
165
160
 
166
161
  self.debug_ocsp_failure_url = None
167
162
 
@@ -86,12 +86,19 @@ def create_batches_from_response(
86
86
  chunk_headers = {}
87
87
  for header_key, header_value in data["chunkHeaders"].items():
88
88
  chunk_headers[header_key] = header_value
89
- if "encryption" not in header_key:
90
- logger.debug(
91
- f"added chunk header: key={header_key}, value={header_value}"
92
- )
89
+ # SNOW-3675590: never log the value — chunk-header values can be
90
+ # secrets (SSE-C customer key). Log the header name plus
91
+ # non-sensitive value metadata only. Capture real headers via a
92
+ # proxy (drivers-usage PROXY=1) when debugging.
93
+ logger.debug(
94
+ f"added chunk header: key={header_key} "
95
+ f"value={SecretDetector.describe_value(header_value)}"
96
+ )
93
97
  elif qrmk is not None:
94
- logger.debug(f"qrmk={SecretDetector.mask_secrets(qrmk)}")
98
+ # SNOW-3675590: never log the qrmk value — it is the AES-256 SSE-C
99
+ # result-encryption key. Log only its presence; do not route it
100
+ # through masking helpers as a substitute.
101
+ logger.debug("qrmk is present in the result response")
95
102
  chunk_headers[SSE_C_ALGORITHM] = SSE_C_AES
96
103
  chunk_headers[SSE_C_KEY] = qrmk
97
104
 
@@ -154,7 +161,12 @@ def create_batches_from_response(
154
161
  session_manager=cursor._connection._session_manager.clone(),
155
162
  )
156
163
  else:
157
- logger.error(f"Don't know how to construct ResultBatches from response: {data}")
164
+ # SNOW-3675590: log only the structural shape — the raw response can
165
+ # carry secrets, and this ERROR line is emitted regardless of DEBUG level.
166
+ logger.error(
167
+ "Don't know how to construct ResultBatches from response: "
168
+ f"format={_format!r}, shape={SecretDetector.describe_value(data)}"
169
+ )
158
170
  first_chunk = ArrowResultBatch.from_data(
159
171
  "",
160
172
  0,
@@ -321,6 +333,7 @@ class JSONResultBatch(ResultBatch, JSONResultBatchSync):
321
333
  async with TimerContextManager() as parse_metric:
322
334
  parsed_data = self._parse(downloaded_data)
323
335
  self._metrics[DownloadMetrics.parse.value] = parse_metric.get_timing_millis()
336
+ self._check_rowcount(len(parsed_data))
324
337
  return iter(parsed_data)
325
338
 
326
339
  async def _load(self, content: bytes, encoding: str) -> list:
@@ -439,4 +452,6 @@ class ArrowResultBatch(ResultBatch, ArrowResultBatchSync):
439
452
  else:
440
453
  return await self._get_arrow_iter(connection=connection)
441
454
  else:
442
- return await self._create_iter(iter_unit=iter_unit, connection=connection)
455
+ return self._iter_checked_rows(
456
+ await self._create_iter(iter_unit=iter_unit, connection=connection)
457
+ )