snowflake-connector-python 4.7.1__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.1 → snowflake_connector_python-4.7.3}/DESCRIPTION.md +29 -0
  2. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/PKG-INFO +32 -2
  3. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/README.md +23 -0
  4. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/pyproject.toml +10 -1
  5. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/setup.cfg +2 -1
  6. snowflake_connector_python-4.7.3/src/snowflake/connector/_host_util.py +106 -0
  7. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_utils.py +16 -4
  8. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_connection.py +10 -18
  9. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_cursor.py +7 -3
  10. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_network.py +2 -0
  11. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_ocsp_snowflake.py +1 -6
  12. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_result_batch.py +18 -6
  13. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_auth.py +11 -3
  14. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_okta.py +11 -1
  15. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_workload_identity.py +2 -0
  16. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_auth.py +31 -9
  17. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_oauth_base.py +58 -1
  18. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth_code.py +1 -1
  19. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/okta.py +29 -2
  20. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/workload_identity.py +74 -0
  21. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/cache.py +31 -2
  22. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/connection.py +55 -20
  23. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/constants.py +24 -1
  24. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/cursor.py +10 -3
  25. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/errorcode.py +2 -0
  26. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/externals_utils/externals_setup.py +12 -4
  27. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_transfer_agent.py +70 -46
  28. snowflake_connector_python-4.7.3/src/snowflake/connector/logging_utils/filters.py +160 -0
  29. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +5 -2
  30. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +5 -2
  31. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +6 -2
  32. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +1 -0
  33. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +1 -3
  34. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +4 -0
  35. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/network.py +26 -2
  36. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ocsp_asn1crypto.py +11 -0
  37. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ocsp_snowflake.py +105 -32
  38. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/platform_detection.py +30 -10
  39. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/result_batch.py +18 -6
  40. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/secret_detector.py +82 -7
  41. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sqlstate.py +1 -0
  42. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/util_text.py +8 -4
  43. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +24 -8
  44. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/version.py +1 -1
  45. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/PKG-INFO +32 -2
  46. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
  47. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/requires.txt +1 -1
  48. snowflake_connector_python-4.7.1/src/snowflake/connector/logging_utils/filters.py +0 -72
  49. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/CONTRIBUTING.md +0 -0
  50. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/LICENSE.txt +0 -0
  51. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/MANIFEST.in +0 -0
  52. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/NOTICE +0 -0
  53. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/SECURITY.md +0 -0
  54. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/setup.py +0 -0
  55. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/__init__.py +0 -0
  56. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  57. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_query_context_cache.py +0 -0
  58. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/_sql_util.py +0 -0
  59. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/README.md +0 -0
  60. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/__init__.py +0 -0
  61. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  62. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  63. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_description.py +0 -0
  64. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  65. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  66. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  67. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  68. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_pandas_tools.py +0 -0
  69. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_result_set.py +0 -0
  70. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  71. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_session_manager.py +0 -0
  72. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_storage_client.py +0 -0
  73. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_telemetry.py +0 -0
  74. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_time_util.py +0 -0
  75. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/_wif_util.py +0 -0
  76. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  77. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  78. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_default.py +0 -0
  79. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  80. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  81. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  82. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  83. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
  84. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
  85. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  86. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  87. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  88. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/arrow_context.py +0 -0
  89. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/__init__.py +0 -0
  90. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/_http_server.py +0 -0
  91. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/by_plugin.py +0 -0
  92. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/default.py +0 -0
  93. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/idtoken.py +0 -0
  94. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/keypair.py +0 -0
  95. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/no_auth.py +0 -0
  96. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth.py +0 -0
  97. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  98. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/pat.py +0 -0
  99. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  100. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/auth/webbrowser.py +0 -0
  101. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/azure_storage_client.py +0 -0
  102. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/backoff_policies.py +0 -0
  103. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/bind_upload_agent.py +0 -0
  104. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/compat.py +0 -0
  105. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/config_manager.py +0 -0
  106. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/connection_diagnostic.py +0 -0
  107. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter.py +0 -0
  108. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_issue23517.py +0 -0
  109. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_null.py +0 -0
  110. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/converter_snowsql.py +0 -0
  111. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/crl.py +0 -0
  112. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/crl_cache.py +0 -0
  113. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/dbapi.py +0 -0
  114. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/description.py +0 -0
  115. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  116. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/encryption_util.py +0 -0
  117. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/errors.py +0 -0
  118. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  119. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/feature.py +0 -0
  120. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_compression_type.py +0 -0
  121. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_lock.py +0 -0
  122. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/file_util.py +0 -0
  123. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/gcs_storage_client.py +0 -0
  124. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/gzip_decoder.py +0 -0
  125. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/interval_util.py +0 -0
  126. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/local_storage_client.py +0 -0
  127. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/log_configuration.py +0 -0
  128. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  129. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/minicore/__init__.py +0 -0
  130. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  131. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  132. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  133. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  134. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  135. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  136. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  137. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  138. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  139. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  140. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  141. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  142. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  143. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  144. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  145. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  146. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  147. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  148. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  149. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  150. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  151. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  152. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  153. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  154. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  155. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  156. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  157. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  158. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  159. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  160. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  161. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  162. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  163. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  164. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  165. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  166. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  167. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  168. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  169. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  170. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  171. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  172. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  173. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  174. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  175. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  176. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  177. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  178. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  179. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  180. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  181. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  182. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  183. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  184. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  185. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  186. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  187. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  188. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  189. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  190. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  191. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  192. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  193. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  194. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  195. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  196. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  197. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  198. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  199. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  200. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  201. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  202. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  203. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  204. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  205. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  206. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  207. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  208. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  209. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  210. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  211. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  212. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  213. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  214. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  215. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  216. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/options.py +0 -0
  217. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/os_details.py +0 -0
  218. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/pandas_tools.py +0 -0
  219. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/proxy.py +0 -0
  220. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/py.typed +0 -0
  221. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/result_set.py +0 -0
  222. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/s3_storage_client.py +0 -0
  223. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/session_manager.py +0 -0
  224. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sf_dirs.py +0 -0
  225. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sfbinaryformat.py +0 -0
  226. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/sfdatetime.py +0 -0
  227. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/snow_logging.py +0 -0
  228. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  229. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  230. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/storage_client.py +0 -0
  231. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/telemetry.py +0 -0
  232. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/telemetry_oob.py +0 -0
  233. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/test_util.py +0 -0
  234. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/time_util.py +0 -0
  235. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/token_cache.py +0 -0
  236. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/__init__.py +0 -0
  237. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_certs.py +0 -0
  238. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  239. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  240. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/tool/probe_connection.py +0 -0
  241. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/url_util.py +0 -0
  242. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/__init__.py +0 -0
  243. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  244. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  245. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  246. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  247. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  248. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/api.py +0 -0
  249. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  250. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  251. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  252. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  253. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  254. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/help.py +0 -0
  255. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  256. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/models.py +0 -0
  257. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  258. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  259. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  260. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  261. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  262. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  263. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  264. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  265. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  266. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  267. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  268. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  269. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  270. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  271. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  272. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  273. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
  274. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  275. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  276. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  277. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  278. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  279. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  280. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  281. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  282. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/connection.py +0 -0
  283. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  284. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  285. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  286. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  287. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  288. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  289. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  290. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  291. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  292. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  293. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  294. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  295. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  296. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  297. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  298. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  299. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  300. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake/connector/wif_util.py +0 -0
  301. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  302. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  303. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  304. {snowflake_connector_python-4.7.1 → snowflake_connector_python-4.7.3}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,6 +7,34 @@ 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
+
30
+ - v4.7.2(Aug 6,2026)
31
+ - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
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).
33
+ - 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).
34
+ - 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.
35
+ - 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).
36
+ - 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.
37
+
10
38
  - v4.7.1(Jul 15,2026)
11
39
  - Added support for Python 3.14t (free-threaded).
12
40
  - **Note:** Python 3.14t CI testing excludes `win_arm64` (no `cryptography` wheels available) and `mitmproxy` proxy tests on all platforms (transitive dependencies `aioquic`/`pylsqpack` lack free-threaded-compatible wheels).
@@ -21,6 +49,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
21
49
  - Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
22
50
  - Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
23
51
  - 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).
52
+ - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
24
53
 
25
54
  - v4.6.0(May 28,2026)
26
55
  - Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-connector-python
3
- Version: 4.7.1
3
+ Version: 4.7.3
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -27,6 +27,7 @@ Classifier: Programming Language :: Python :: 3.11
27
27
  Classifier: Programming Language :: Python :: 3.12
28
28
  Classifier: Programming Language :: Python :: 3.13
29
29
  Classifier: Programming Language :: Python :: 3.14
30
+ Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
30
31
  Classifier: Programming Language :: SQL
31
32
  Classifier: Topic :: Database
32
33
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
@@ -61,7 +62,7 @@ Requires-Dist: botocore>=1.24; extra == "boto"
61
62
  Provides-Extra: azure
62
63
  Requires-Dist: azure-identity>=1.16; extra == "azure"
63
64
  Provides-Extra: development
64
- Requires-Dist: Cython; extra == "development"
65
+ Requires-Dist: Cython>=3.1; extra == "development"
65
66
  Requires-Dist: azure-identity>=1.16; extra == "development"
66
67
  Requires-Dist: coverage; extra == "development"
67
68
  Requires-Dist: mitmproxy>=12.0.0; (python_version >= "3.12" and python_version < "3.14") and extra == "development"
@@ -96,6 +97,34 @@ https://docs.snowflake.com/
96
97
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
97
98
 
98
99
  # Release Notes
100
+ - v4.7.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
+
120
+ - v4.7.2(Aug 6,2026)
121
+ - Fixed a thread leak in the file transfer agent by properly shutting down ThreadPoolExecutors after PUT/GET transfers (SNOW-3556240, #2878).
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).
123
+ - 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).
124
+ - 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.
125
+ - 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).
126
+ - 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.
127
+
99
128
  - v4.7.1(Jul 15,2026)
100
129
  - Added support for Python 3.14t (free-threaded).
101
130
  - **Note:** Python 3.14t CI testing excludes `win_arm64` (no `cryptography` wheels available) and `mitmproxy` proxy tests on all platforms (transitive dependencies `aioquic`/`pylsqpack` lack free-threaded-compatible wheels).
@@ -110,6 +139,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
110
139
  - Added native AKS (Azure Kubernetes Service) workload identity support. When running on AKS with workload identity configured, the connector automatically uses `WorkloadIdentityCredential` to authenticate via the injected service account credentials. OIDC backward compatibility is also supported.
111
140
  - Added the `workload_identity_aws_use_outbound_token` connection option (default `false`) to opt into AWS WIF JWT attestation via STS `GetWebIdentityToken` instead of the default SigV4 `GetCallerIdentity` method.
112
141
  - 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).
142
+ - Fixed JWT key-pair authentication errors to surface the server's specific error code (e.g. `394304` for fingerprint mismatch, `394303` for clock skew) instead of always reporting the generic `250001`. Auth-rejection failures now also use SQLState `28000` (invalid authorization) instead of `08001` (SNOW-3775156).
113
143
 
114
144
  - v4.6.0(May 28,2026)
115
145
  - Dropped support for Python 3.9. The minimum supported version is now Python 3.10.
@@ -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.
@@ -4,7 +4,9 @@ requires = [
4
4
  # and may be stricter than the version required in `setup.py`
5
5
  "setuptools>=40.6.0",
6
6
  "wheel",
7
- "cython",
7
+ # cython>=3.1 is required for the `freethreading_compatible` directive
8
+ # used by src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx
9
+ "cython>=3.1",
8
10
  ]
9
11
 
10
12
  [tool.cibuildwheel]
@@ -12,6 +14,13 @@ test-skip = "*"
12
14
  manylinux-x86_64-image = "manylinux2014"
13
15
  environment = {AUDITWHEEL_PLAT="manylinux2014_$(uname -m)"}
14
16
  build-verbosity = 1
17
+ # Opt in to free-threaded CPython wheel builds (cp313t, cp314t, ...).
18
+ # Without this, cibuildwheel silently skips every `cp*t-*` target even when
19
+ # the matrix and CIBW_BUILD env var ask for them. Requires cibuildwheel>=2.20.
20
+ # Paired with the `freethreading_compatible` Cython directive in
21
+ # src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx
22
+ # so the produced wheel actually keeps the GIL disabled at import time.
23
+ enable = ["cpython-freethreading"]
15
24
 
16
25
  [tool.cibuildwheel.linux]
17
26
  archs = ["x86_64", "aarch64"]
@@ -25,6 +25,7 @@ classifiers =
25
25
  Programming Language :: Python :: 3.12
26
26
  Programming Language :: Python :: 3.13
27
27
  Programming Language :: Python :: 3.14
28
+ Programming Language :: Python :: Free Threading :: 2 - Beta
28
29
  Programming Language :: SQL
29
30
  Topic :: Database
30
31
  Topic :: Scientific/Engineering :: Information Analysis
@@ -88,7 +89,7 @@ boto =
88
89
  azure =
89
90
  azure-identity>=1.16
90
91
  development =
91
- Cython
92
+ Cython>=3.1
92
93
  azure-identity>=1.16
93
94
  coverage
94
95
  mitmproxy>=12.0.0; python_version >= '3.12' and python_version < '3.14'
@@ -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,
@@ -29,12 +29,16 @@ from ...errors import (
29
29
  from ...network import (
30
30
  ACCEPT_TYPE_APPLICATION_SNOWFLAKE,
31
31
  CONTENT_TYPE_APPLICATION_JSON,
32
+ CREDENTIAL_REJECTION_GS_CODES,
32
33
  ID_TOKEN_INVALID_LOGIN_REQUEST_GS_CODE,
33
34
  OAUTH_ACCESS_TOKEN_EXPIRED_GS_CODE,
34
35
  PYTHON_CONNECTOR_USER_AGENT,
35
36
  ReauthenticationRequest,
36
37
  )
37
- from ...sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
38
+ from ...sqlstate import (
39
+ SQLSTATE_AUTHORIZATION_FAILURE,
40
+ SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
41
+ )
38
42
  from ...token_cache import TokenType
39
43
  from ._no_auth import AuthNoAuth
40
44
 
@@ -334,8 +338,12 @@ class Auth(AuthSync):
334
338
  port=self._rest._port,
335
339
  message=ret["message"],
336
340
  ),
337
- "errno": ER_FAILED_TO_CONNECT_TO_DB,
338
- "sqlstate": SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
341
+ "errno": int(errno),
342
+ "sqlstate": (
343
+ SQLSTATE_AUTHORIZATION_FAILURE
344
+ if str(errno) in CREDENTIAL_REJECTION_GS_CODES
345
+ else SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
346
+ ),
339
347
  },
340
348
  )
341
349
  else:
@@ -212,7 +212,7 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
212
212
  ) -> dict[Any, Any]:
213
213
  logger.debug("step 4: query IDP URL snowflake app to get SAML " "response")
214
214
  timeout_time = time.time() + conn.login_timeout if conn.login_timeout else None
215
- response_html = {}
215
+ response_html = None
216
216
  origin_sso_url = sso_url
217
217
  while timeout_time is None or time.time() < timeout_time:
218
218
  try:
@@ -225,6 +225,12 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
225
225
  HTTP_HEADER_ACCEPT: "*/*",
226
226
  }
227
227
  remaining_timeout = timeout_time - time.time() if timeout_time else None
228
+ if remaining_timeout is not None and remaining_timeout <= 0:
229
+ # Obtaining the one time token consumed the whole login budget.
230
+ # The HTTP layer rejects a non-positive timeout with an opaque
231
+ # ValueError, so stop here and report the timeout that actually
232
+ # happened.
233
+ break
228
234
  response_html = await conn.rest.fetch(
229
235
  "get",
230
236
  sso_url,
@@ -237,6 +243,10 @@ class AuthByOkta(AuthByPluginAsync, AuthByOktaSync):
237
243
  break
238
244
  except RefreshTokenError:
239
245
  logger.debug("step4: refresh token for re-authentication")
246
+ if response_html is None:
247
+ # Every way out of the loop above without a response means the
248
+ # login_timeout budget ran out.
249
+ AuthByOktaSync._handle_login_timeout(conn)
240
250
  return response_html
241
251
 
242
252
  async def _step5(
@@ -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,