snowflake-connector-python 4.7.2__tar.gz → 4.7.3__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.3}/DESCRIPTION.md +20 -0
  2. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/PKG-INFO +21 -1
  3. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/README.md +23 -0
  4. snowflake_connector_python-4.7.3/src/snowflake/connector/_host_util.py +106 -0
  5. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_utils.py +16 -4
  6. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_connection.py +10 -18
  7. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_cursor.py +7 -3
  8. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_network.py +2 -0
  9. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_ocsp_snowflake.py +1 -6
  10. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_result_batch.py +18 -6
  11. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_workload_identity.py +2 -0
  12. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/workload_identity.py +74 -0
  13. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/cache.py +31 -2
  14. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/connection.py +39 -19
  15. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/constants.py +17 -0
  16. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/cursor.py +10 -3
  17. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/errorcode.py +2 -0
  18. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/externals_utils/externals_setup.py +12 -4
  19. snowflake_connector_python-4.7.3/src/snowflake/connector/logging_utils/filters.py +160 -0
  20. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/network.py +4 -2
  21. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ocsp_asn1crypto.py +11 -0
  22. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ocsp_snowflake.py +105 -32
  23. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/result_batch.py +18 -6
  24. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/secret_detector.py +82 -7
  25. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/util_text.py +5 -6
  26. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +24 -8
  27. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/version.py +1 -1
  28. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/PKG-INFO +21 -1
  29. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
  30. snowflake_connector_python-4.7.2/src/snowflake/connector/logging_utils/filters.py +0 -72
  31. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/CONTRIBUTING.md +0 -0
  32. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/LICENSE.txt +0 -0
  33. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/MANIFEST.in +0 -0
  34. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/NOTICE +0 -0
  35. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/SECURITY.md +0 -0
  36. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/pyproject.toml +0 -0
  37. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/setup.cfg +0 -0
  38. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/setup.py +0 -0
  39. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/__init__.py +0 -0
  40. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  41. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_query_context_cache.py +0 -0
  42. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_sql_util.py +0 -0
  43. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/README.md +0 -0
  44. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/__init__.py +0 -0
  45. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  46. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  47. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_description.py +0 -0
  48. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  49. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  50. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  51. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  52. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
  53. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_result_set.py +0 -0
  54. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  55. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_session_manager.py +0 -0
  56. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_storage_client.py +0 -0
  57. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_telemetry.py +0 -0
  58. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_time_util.py +0 -0
  59. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_wif_util.py +0 -0
  60. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  61. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_auth.py +0 -0
  62. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  63. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_default.py +0 -0
  64. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  65. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  66. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  67. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  68. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
  69. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
  70. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_okta.py +0 -0
  71. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  72. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  73. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  74. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/arrow_context.py +0 -0
  75. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/__init__.py +0 -0
  76. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_auth.py +0 -0
  77. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_http_server.py +0 -0
  78. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_oauth_base.py +0 -0
  79. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/by_plugin.py +0 -0
  80. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/default.py +0 -0
  81. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/idtoken.py +0 -0
  82. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/keypair.py +0 -0
  83. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/no_auth.py +0 -0
  84. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth.py +0 -0
  85. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth_code.py +0 -0
  86. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  87. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/okta.py +0 -0
  88. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/pat.py +0 -0
  89. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  90. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/webbrowser.py +0 -0
  91. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/azure_storage_client.py +0 -0
  92. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/backoff_policies.py +0 -0
  93. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/bind_upload_agent.py +0 -0
  94. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/compat.py +0 -0
  95. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/config_manager.py +0 -0
  96. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/connection_diagnostic.py +0 -0
  97. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter.py +0 -0
  98. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_issue23517.py +0 -0
  99. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_null.py +0 -0
  100. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_snowsql.py +0 -0
  101. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/crl.py +0 -0
  102. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/crl_cache.py +0 -0
  103. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/dbapi.py +0 -0
  104. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/description.py +0 -0
  105. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  106. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/encryption_util.py +0 -0
  107. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/errors.py +0 -0
  108. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  109. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/feature.py +0 -0
  110. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_compression_type.py +0 -0
  111. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_lock.py +0 -0
  112. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_transfer_agent.py +0 -0
  113. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_util.py +0 -0
  114. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/gcs_storage_client.py +0 -0
  115. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/gzip_decoder.py +0 -0
  116. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/interval_util.py +0 -0
  117. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/local_storage_client.py +0 -0
  118. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/log_configuration.py +0 -0
  119. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  120. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/minicore/__init__.py +0 -0
  121. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  122. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  123. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  124. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  125. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  126. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  127. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  128. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  129. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  130. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  131. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  132. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  133. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  134. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  135. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  136. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  137. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  138. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  139. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  140. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  141. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  142. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  143. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  144. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  145. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  146. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  147. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  148. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  149. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  150. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  151. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  152. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  153. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  154. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  155. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  156. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  157. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  158. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  159. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  160. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  161. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  162. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  163. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  164. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  165. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  166. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  167. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  168. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  169. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  170. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  171. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  172. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  173. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  174. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  175. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  176. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  177. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  178. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  179. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  180. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  181. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  182. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  183. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  184. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  185. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  186. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  187. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  188. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  189. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  190. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  191. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  192. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  193. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  194. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  195. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  196. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  197. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  198. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  199. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  200. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  201. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  202. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  203. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  204. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  205. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  206. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  207. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  208. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  209. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  210. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  211. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  212. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  213. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/options.py +0 -0
  214. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/os_details.py +0 -0
  215. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/pandas_tools.py +0 -0
  216. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/platform_detection.py +0 -0
  217. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/proxy.py +0 -0
  218. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/py.typed +0 -0
  219. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/result_set.py +0 -0
  220. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/s3_storage_client.py +0 -0
  221. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/session_manager.py +0 -0
  222. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sf_dirs.py +0 -0
  223. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sfbinaryformat.py +0 -0
  224. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sfdatetime.py +0 -0
  225. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/snow_logging.py +0 -0
  226. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sqlstate.py +0 -0
  227. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  228. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  229. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/storage_client.py +0 -0
  230. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/telemetry.py +0 -0
  231. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/telemetry_oob.py +0 -0
  232. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/test_util.py +0 -0
  233. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/time_util.py +0 -0
  234. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/token_cache.py +0 -0
  235. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/__init__.py +0 -0
  236. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_certs.py +0 -0
  237. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  238. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  239. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/probe_connection.py +0 -0
  240. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/url_util.py +0 -0
  241. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/__init__.py +0 -0
  242. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  243. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  244. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  245. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  246. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  247. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/api.py +0 -0
  248. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  249. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  250. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  251. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  252. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  253. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/help.py +0 -0
  254. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  255. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/models.py +0 -0
  256. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  257. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  258. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  259. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  260. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  261. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  262. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  263. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  264. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  265. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  266. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  267. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  268. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  269. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  270. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  271. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  272. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
  273. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  274. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  275. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  276. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  277. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  278. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  279. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  280. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  281. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  282. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  283. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  284. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  285. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  286. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  287. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  288. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  289. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  290. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  291. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  292. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  293. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  294. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  295. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  296. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  297. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  298. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  299. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake/connector/wif_util.py +0 -0
  300. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  301. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  302. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  303. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
  304. {snowflake_connector_python-4.7.2 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,6 +7,26 @@ 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.3(Sep 3,2026)
11
+ - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
12
+ - Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
13
+ - Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
14
+ - 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).
15
+ - Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
16
+ - DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
17
+ - The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
18
+ - 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).
19
+ - 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).
20
+ - Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
21
+ - 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).
22
+ - Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
23
+ - When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
24
+ - 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.
25
+ - Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
26
+ - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
27
+ - Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
28
+ - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
29
+
10
30
  - v4.7.2(Aug 6,2026)
11
31
  - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
12
32
  - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
@@ -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.3
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -97,6 +97,26 @@ 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.3(Sep 3,2026)
101
+ - Added experimental Python 3.14t (free-threaded CPython) wheel support. **Experimental — not intended for production use.**
102
+ - Fixed TLS hostname verification rejecting matching certificate SANs when a Snowflake account locator contains an underscore (SNOW-4011646).
103
+ - Fixed `connect()` being significantly slower on deep call stacks (e.g. Django apps with several middleware/decorator layers) because `get_application_path()` used `inspect.stack()`, which reads and parses the source file of every frame on the stack. It now walks frame references directly instead (SNOW-3691001, #2908).
104
+ - 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).
105
+ - Result batch construction now logs only whether a `qrmk` is present, for both the sync and async result paths (SNOW-3675590).
106
+ - DEBUG logging in `create_batches_from_response()` reports chunk-header names with type/length value metadata (SNOW-3675590).
107
+ - The malformed-response ERROR log in `create_batches_from_response()` reports a structural summary of the response (SNOW-3675590).
108
+ - 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).
109
+ - 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).
110
+ - Corrected the invalid-account-identifier error message so it matches the validator, which allows '.' as a label separator.
111
+ - 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).
112
+ - Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
113
+ - When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
114
+ - 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.
115
+ - Extended log secret masking coverage (SNOW-3675583). The connection-token pattern accepts `:` and `%` in the token value. Added patterns for OAuth access and refresh tokens in serialized JSON, for one-time passcodes, and for OAuth client identifiers and secrets. The passcode pattern accepts quoted values. The password pattern requires at least six characters in the value, so ordinary prose following the word "password" is not redacted.
116
+ - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
117
+ - Applied secret masking to the `snowflake.connector` loggers by default, independent of how application logging is configured. The same filter also covers the third-party loggers the connector uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`, `aioboto3`, vendored `urllib3`). Set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true` to opt out; it is honored at emit time, including after import (SNOW-3675583).
118
+ - Fixed the on-disk OCSP response validation cache failing with `RuntimeError: UnixFileLock on ... was inherited across fork; construct a new instance` when it was written from a forked child process. This could surface on fork-based platforms when fetching results with `client_fetch_use_mp=True`, where chunk downloads run in worker processes that perform their own certificate revocation checks. The cache's file lock is now re-created when the owning process changes, matching what already happened for the `spawn` start method.
119
+
100
120
  - v4.7.2(Aug 6,2026)
101
121
  - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
102
122
  - Fixed `split_statements` treating `//` as SQL instead of a line comment, which could merge multiple statements when a `//` comment contained an apostrophe (SNOW-3772985).
@@ -53,6 +53,29 @@ These tools are integrated into `tox` to allow us to easily set them up universa
53
53
  and we would like to have an overall coverage data file created for them.
54
54
  * **flake8**: (Deprecated) Similar to `fix_lint`, but only runs `flake8` checks.
55
55
 
56
+ ## Log secret masking
57
+
58
+ By default, the connector masks secrets (tokens, passwords, cloud credentials,
59
+ private keys) in records emitted by `snowflake.connector` loggers and by the
60
+ third-party loggers it uses (`botocore`, `boto3`, `aiohttp`, `aiobotocore`,
61
+ `aioboto3`, and vendored `urllib3`). Masking applies even when logging is
62
+ configured with `logging.basicConfig`, not only when Easy Logging
63
+ (`save_logs = true` in `config.toml`) is enabled. The same opt-out covers
64
+ those trees: they also interpolate the message and clear `record.args`.
65
+
66
+ To disable masking, set `SNOWFLAKE_DISABLE_LOG_SECRET_MASKING` to `true`.
67
+ The connector reads this on every log record, so it is an escape hatch if
68
+ masking is incompatible with a log pipeline (for example one that depends
69
+ on structured `record.args`). Setting it **before** importing
70
+ `snowflake.connector` also skips installing the masking hook:
71
+
72
+ ```bash
73
+ export SNOWFLAKE_DISABLE_LOG_SECRET_MASKING=true
74
+ ```
75
+
76
+ The masker interpolates each log record and clears `record.args`. Leave
77
+ masking enabled unless you need that escape hatch.
78
+
56
79
  ## Disable telemetry
57
80
 
58
81
  By default, the Snowflake Connector for Python collects telemetry data to improve the product.
@@ -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
@@ -574,7 +578,7 @@ class SnowflakeCursorBase(SnowflakeCursorBaseSync, abc.ABC, typing.Generic[Fetch
574
578
  logger.warning("execute: no query is given to execute")
575
579
  return None
576
580
 
577
- logger.debug("query: [%s]", self._format_query_for_log(command))
581
+ logger.debug("query: [%s]", self._format_query_for_log_lazy(command))
578
582
 
579
583
  _statement_params = _statement_params or dict()
580
584
  # If we need to add another parameter, please consider introducing a dict for all extra params
@@ -730,6 +730,8 @@ class SnowflakeRestful(SnowflakeRestfulSync):
730
730
  else:
731
731
  input_data = data
732
732
 
733
+ # Work on a copy so the caller-supplied dict is never mutated.
734
+ headers = dict(headers)
733
735
  if HEADER_AUTHORIZATION_KEY in headers:
734
736
  del headers[HEADER_AUTHORIZATION_KEY]
735
737
  if token != NO_TOKEN:
@@ -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,
@@ -9,6 +9,7 @@ if TYPE_CHECKING:
9
9
  from ...auth.workload_identity import (
10
10
  AuthByWorkloadIdentity as AuthByWorkloadIdentitySync,
11
11
  )
12
+ from ...auth.workload_identity import _verify_host_allowed_for_workload_identity
12
13
  from .._wif_util import AttestationProvider, create_attestation
13
14
  from ._by_plugin import AuthByPlugin as AuthByPluginAsync
14
15
 
@@ -42,6 +43,7 @@ class AuthByWorkloadIdentity(AuthByPluginAsync, AuthByWorkloadIdentitySync):
42
43
  self, *, conn: SnowflakeConnection | None, **kwargs: typing.Any
43
44
  ) -> None:
44
45
  """Fetch the token using async wif_util."""
46
+ _verify_host_allowed_for_workload_identity(conn)
45
47
  self.attestation = await create_attestation(
46
48
  self.provider,
47
49
  self.entra_resource,
@@ -1,12 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ import logging
5
+ import os
4
6
  import typing
5
7
  from enum import Enum, unique
6
8
 
7
9
  if typing.TYPE_CHECKING:
8
10
  from snowflake.connector.connection import SnowflakeConnection
9
11
 
12
+ from .._host_util import has_recognized_snowflake_suffix, normalize_host
13
+ from ..errorcode import ER_WIF_UNTRUSTED_HOST
14
+ from ..errors import ProgrammingError
10
15
  from ..network import WORKLOAD_IDENTITY_AUTHENTICATOR
11
16
  from ..wif_util import (
12
17
  AttestationProvider,
@@ -15,6 +20,72 @@ from ..wif_util import (
15
20
  )
16
21
  from .by_plugin import AuthByPlugin, AuthType
17
22
 
23
+ logger = logging.getLogger(__name__)
24
+
25
+ # Additive escape hatch for on-prem / air-gapped Snowflake deployments whose host
26
+ # does not end in a recognized Snowflake suffix.
27
+ #
28
+ # Read only from the process environment - never from the DSN, connection
29
+ # parameters or configuration files - so connection configuration cannot
30
+ # influence the allowlist. Entries are additive: they extend the
31
+ # recognized-host list and cannot disable it.
32
+ #
33
+ # Scoped to WORKLOAD_IDENTITY on purpose. Widening the hosts an ambient cloud
34
+ # credential may be sent to is a different decision from widening the hosts an
35
+ # OCSP cache may be fetched from, so the OCSP gate passes no extra suffixes.
36
+ _SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES_ENV_VAR = "SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES"
37
+
38
+
39
+ def _extra_wif_allowed_suffixes() -> list[str]:
40
+ """Reads the additive SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES env-var allow-list.
41
+
42
+ Comma-separated, additive-only (never disables the built-in allow-list),
43
+ normalized the same way as the candidate host. Logs at INFO naming the
44
+ extra suffixes whenever the env var is used, since this widens the set of
45
+ hosts the ambient cloud credential may be sent to.
46
+ """
47
+ raw = os.environ.get(_SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES_ENV_VAR, "")
48
+ if not raw:
49
+ return []
50
+ suffixes = [normalize_host(entry) for entry in raw.split(",") if entry.strip()]
51
+ suffixes = [s for s in suffixes if s]
52
+ if suffixes:
53
+ logger.info(
54
+ "SNOWFLAKE_WIF_ALLOWED_HOST_SUFFIXES is set; extending the WORKLOAD_IDENTITY "
55
+ "recognized-host allow-list with additional suffixes: %s.",
56
+ suffixes,
57
+ )
58
+ return suffixes
59
+
60
+
61
+ def _is_host_allowed_for_workload_identity(host: str) -> bool:
62
+ """Returns True if `host` (already-normalized or not) is a trusted WIF destination."""
63
+ return has_recognized_snowflake_suffix(
64
+ normalize_host(host), _extra_wif_allowed_suffixes()
65
+ )
66
+
67
+
68
+ def _verify_host_allowed_for_workload_identity(
69
+ conn: SnowflakeConnection | None,
70
+ ) -> None:
71
+ """Suffix-anchored allowlist that restricts Workload Identity attestation to
72
+ recognized Snowflake hosts before any cloud credential is fetched.
73
+
74
+ When ``conn`` is None there is no destination to send the credential to (e.g.
75
+ unit tests that only exercise attestation creation), so the check is skipped.
76
+ """
77
+ if conn is None:
78
+ return
79
+ host = conn.host or ""
80
+ if not _is_host_allowed_for_workload_identity(host):
81
+ raise ProgrammingError(
82
+ msg=(
83
+ f"WORKLOAD_IDENTITY requires a recognized Snowflake host "
84
+ f"(*.snowflakecomputing.com, .cn or .mil). Got: '{host}'."
85
+ ),
86
+ errno=ER_WIF_UNTRUSTED_HOST,
87
+ )
88
+
18
89
 
19
90
  @unique
20
91
  class ApiFederatedAuthenticationType(Enum):
@@ -88,6 +159,9 @@ class AuthByWorkloadIdentity(AuthByPlugin):
88
159
  self, *, conn: SnowflakeConnection | None, **kwargs: typing.Any
89
160
  ) -> None:
90
161
  """Fetch the token."""
162
+ # Verify the host is a recognized Snowflake endpoint before fetching
163
+ # cloud credentials.
164
+ _verify_host_allowed_for_workload_identity(conn)
91
165
  self.attestation = create_attestation(
92
166
  self.provider,
93
167
  self.entra_resource,
@@ -451,7 +451,8 @@ class SFDictFileCache(SFDictCache):
451
451
  os.unlink(tmp_file_path)
452
452
  self.file_timeout = file_timeout
453
453
  self._file_lock_path = f"{self.file_path}.lock"
454
- self._file_lock = FileLock(self._file_lock_path, timeout=self.file_timeout)
454
+ self._file_lock_rebuild_lock = Lock()
455
+ self._new_file_lock()
455
456
  self.last_loaded: datetime.datetime | None = None
456
457
  if os.path.exists(self.file_path) and load_if_file_exists:
457
458
  with self._lock:
@@ -460,6 +461,33 @@ class SFDictFileCache(SFDictCache):
460
461
  # SFDictFileCache to determine whether to dump cache to file when _save is called
461
462
  self._cache_modified = False
462
463
 
464
+ def _new_file_lock(self) -> None:
465
+ """Creates the inter-process file lock owned by the current process."""
466
+ self._file_lock_instance = FileLock(
467
+ self._file_lock_path, timeout=self.file_timeout
468
+ )
469
+ self._file_lock_pid = os.getpid()
470
+
471
+ @property
472
+ def _file_lock(self) -> FileLock:
473
+ """The inter-process file lock, re-created when we crossed a fork().
474
+
475
+ A FileLock remembers the pid that created it and refuses to be acquired
476
+ by any other process: the underlying OS lock stays owned by the creator,
477
+ so it would grant the caller no mutual exclusion at all. Rebuilding it
478
+ for the multiprocessing "spawn" start method is handled by __setstate__,
479
+ but fork() copies the object without pickling it, so __setstate__ never
480
+ runs and the inherited lock is unusable. Notice the pid change here and
481
+ rebuild instead, which keeps the guarantee the lock is meant to provide.
482
+ """
483
+ if self._file_lock_pid != os.getpid():
484
+ # Held only for the object construction below, never across I/O.
485
+ with self._file_lock_rebuild_lock:
486
+ # Another thread may have rebuilt the lock in the meantime.
487
+ if self._file_lock_pid != os.getpid():
488
+ self._new_file_lock()
489
+ return self._file_lock_instance
490
+
463
491
  def _getitem_non_locking(
464
492
  self,
465
493
  k: K,
@@ -684,7 +712,8 @@ class SFDictFileCache(SFDictCache):
684
712
  self.__dict__.update(state)
685
713
  self._cache_modified = False
686
714
  self._lock = Lock()
687
- self._file_lock = FileLock(self._file_lock_path, timeout=self.file_timeout)
715
+ self._file_lock_rebuild_lock = Lock()
716
+ self._new_file_lock()
688
717
 
689
718
  def _add_or_remove(self) -> None:
690
719
  """This function gets called when an element is added, or removed.