snowflake-connector-python 4.8.0__tar.gz → 4.8.1__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.8.0 → snowflake_connector_python-4.8.1}/CONTRIBUTING.md +2 -2
  2. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/DESCRIPTION.md +10 -0
  3. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/PKG-INFO +14 -5
  4. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/README.md +3 -3
  5. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/setup.cfg +3 -4
  6. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_pandas_tools.py +17 -19
  7. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_result_batch.py +11 -2
  8. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/pandas_tools.py +57 -29
  9. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/result_batch.py +33 -2
  10. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/__init__.py +4 -4
  11. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_collections.py +4 -0
  12. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_version.py +2 -2
  13. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/connection.py +150 -45
  14. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/connectionpool.py +29 -9
  15. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +61 -21
  16. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +5 -7
  17. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/http2/connection.py +3 -2
  18. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/poolmanager.py +28 -4
  19. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/response.py +42 -9
  20. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/request.py +40 -4
  21. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/retry.py +13 -1
  22. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +12 -8
  23. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/url.py +158 -50
  24. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/version.py +1 -1
  25. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/PKG-INFO +14 -5
  26. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
  27. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/LICENSE.txt +0 -0
  28. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/MANIFEST.in +0 -0
  29. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/NOTICE +0 -0
  30. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/SECURITY.md +0 -0
  31. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/pyproject.toml +0 -0
  32. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/setup.py +0 -0
  33. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/__init__.py +0 -0
  34. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_connection_identifier_shape.py +0 -0
  35. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_host_util.py +0 -0
  36. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_ocsp_mode.py +0 -0
  37. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_query_context_cache.py +0 -0
  38. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_sql_util.py +0 -0
  39. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/_utils.py +0 -0
  40. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/README.md +0 -0
  41. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/__init__.py +0 -0
  42. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_azure_storage_client.py +0 -0
  43. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_bind_upload_agent.py +0 -0
  44. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_connection.py +0 -0
  45. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_cursor.py +0 -0
  46. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_description.py +0 -0
  47. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_direct_file_operation_utils.py +0 -0
  48. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_file_transfer_agent.py +0 -0
  49. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_gcs_storage_client.py +0 -0
  50. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_network.py +0 -0
  51. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_ocsp_asn1crypto.py +0 -0
  52. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_ocsp_snowflake.py +0 -0
  53. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_result_set.py +0 -0
  54. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_s3_storage_client.py +0 -0
  55. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_session_manager.py +0 -0
  56. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_storage_client.py +0 -0
  57. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_telemetry.py +0 -0
  58. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_time_util.py +0 -0
  59. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/_wif_util.py +0 -0
  60. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/__init__.py +0 -0
  61. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_auth.py +0 -0
  62. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_by_plugin.py +0 -0
  63. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_default.py +0 -0
  64. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_idtoken.py +0 -0
  65. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_keypair.py +0 -0
  66. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_no_auth.py +0 -0
  67. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_oauth.py +0 -0
  68. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_oauth_code.py +0 -0
  69. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_oauth_credentials.py +0 -0
  70. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_okta.py +0 -0
  71. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_pat.py +0 -0
  72. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_usrpwdmfa.py +0 -0
  73. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_webbrowser.py +0 -0
  74. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/aio/auth/_workload_identity.py +0 -0
  75. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/arrow_context.py +0 -0
  76. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/__init__.py +0 -0
  77. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/_auth.py +0 -0
  78. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/_http_server.py +0 -0
  79. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/_oauth_base.py +0 -0
  80. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/by_plugin.py +0 -0
  81. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/default.py +0 -0
  82. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/idtoken.py +0 -0
  83. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/keypair.py +0 -0
  84. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/no_auth.py +0 -0
  85. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/oauth.py +0 -0
  86. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/oauth_code.py +0 -0
  87. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/oauth_credentials.py +0 -0
  88. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/okta.py +0 -0
  89. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/pat.py +0 -0
  90. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  91. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/webbrowser.py +0 -0
  92. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/auth/workload_identity.py +0 -0
  93. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/azure_storage_client.py +0 -0
  94. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/backoff_policies.py +0 -0
  95. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/bind_upload_agent.py +0 -0
  96. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/cache.py +0 -0
  97. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/compat.py +0 -0
  98. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/config_manager.py +0 -0
  99. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/connection.py +0 -0
  100. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/connection_diagnostic.py +0 -0
  101. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/constants.py +0 -0
  102. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter.py +0 -0
  103. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter_issue23517.py +0 -0
  104. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter_null.py +0 -0
  105. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/converter_snowsql.py +0 -0
  106. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/crl.py +0 -0
  107. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/crl_cache.py +0 -0
  108. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/cursor.py +0 -0
  109. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/dbapi.py +0 -0
  110. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/description.py +0 -0
  111. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/direct_file_operation_utils.py +0 -0
  112. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/encryption_util.py +0 -0
  113. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/errorcode.py +0 -0
  114. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/errors.py +0 -0
  115. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/externals_utils/__init__.py +0 -0
  116. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/externals_utils/externals_setup.py +0 -0
  117. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/feature.py +0 -0
  118. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_compression_type.py +0 -0
  119. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_lock.py +0 -0
  120. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_transfer_agent.py +0 -0
  121. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/file_util.py +0 -0
  122. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/gcs_storage_client.py +0 -0
  123. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/gzip_decoder.py +0 -0
  124. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/interval_util.py +0 -0
  125. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/local_storage_client.py +0 -0
  126. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/log_configuration.py +0 -0
  127. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/logging_utils/__init__.py +0 -0
  128. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/logging_utils/filters.py +0 -0
  129. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/minicore/__init__.py +0 -0
  130. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/minicore/linux_x86_64_glibc/libsf_mini_core.so +0 -0
  131. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  132. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  133. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  134. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  135. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  136. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  137. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  138. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  139. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  140. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  141. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  142. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  143. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  144. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  145. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.cpp +0 -0
  146. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecFloatConverter.hpp +0 -0
  147. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  148. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  149. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  150. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  151. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  152. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  153. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  154. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  155. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  156. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.cpp +0 -0
  157. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntervalConverter.hpp +0 -0
  158. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  159. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  160. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  161. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  162. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  163. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  164. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  165. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  166. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  167. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  168. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  169. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  170. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  171. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  172. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  173. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  174. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  175. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  176. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  177. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  178. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  179. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  180. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  181. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  182. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  183. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  184. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  185. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  186. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  187. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  188. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  189. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  190. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  191. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  192. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  193. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  194. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  195. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  196. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  197. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  198. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  199. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  200. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  201. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  202. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  203. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  204. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  205. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  206. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  207. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  208. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  209. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  210. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  211. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  212. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  213. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  214. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  215. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  216. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  217. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  218. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  219. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  220. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  221. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  222. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/network.py +0 -0
  223. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  224. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  225. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/options.py +0 -0
  226. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/os_details.py +0 -0
  227. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/platform_detection.py +0 -0
  228. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/proxy.py +0 -0
  229. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/py.typed +0 -0
  230. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/result_set.py +0 -0
  231. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/s3_storage_client.py +0 -0
  232. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/secret_detector.py +0 -0
  233. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/session_manager.py +0 -0
  234. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sf_dirs.py +0 -0
  235. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sfbinaryformat.py +0 -0
  236. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sfdatetime.py +0 -0
  237. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/snow_logging.py +0 -0
  238. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/sqlstate.py +0 -0
  239. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  240. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  241. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/storage_client.py +0 -0
  242. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/telemetry.py +0 -0
  243. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/telemetry_oob.py +0 -0
  244. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/test_util.py +0 -0
  245. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/time_util.py +0 -0
  246. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/token_cache.py +0 -0
  247. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/__init__.py +0 -0
  248. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/dump_certs.py +0 -0
  249. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  250. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  251. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/tool/probe_connection.py +0 -0
  252. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/url_util.py +0 -0
  253. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/util_text.py +0 -0
  254. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/__init__.py +0 -0
  255. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  256. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  257. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  258. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  259. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/api.py +0 -0
  260. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  261. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  262. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  263. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  264. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  265. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/help.py +0 -0
  266. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  267. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/models.py +0 -0
  268. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/packages.py +0 -0
  269. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  270. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  271. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  272. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  273. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  274. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  275. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_base_connection.py +0 -0
  276. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/_request_methods.py +0 -0
  277. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  278. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/__init__.py +0 -0
  279. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/connection.py +0 -0
  280. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/emscripten_fetch_worker.js +0 -0
  281. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/fetch.py +0 -0
  282. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/request.py +0 -0
  283. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/contrib/emscripten/response.py +0 -0
  284. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  285. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  286. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  287. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/http2/__init__.py +0 -0
  288. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/http2/probe.py +0 -0
  289. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/py.typed +0 -0
  290. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  291. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  292. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  293. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  294. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  295. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  296. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  297. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/util.py +0 -0
  298. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  299. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake/connector/wif_util.py +0 -0
  300. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  301. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  302. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  303. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  304. {snowflake_connector_python-4.8.0 → snowflake_connector_python-4.8.1}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -30,8 +30,8 @@ dependencies installed with `snowflake-connector-python` installed as an editabl
30
30
  Setting up a development environment is super easy with this [one simple tox command](https://tox.wiki/en/legacy/example/devenv.html).
31
31
 
32
32
  ```shell
33
- tox --devenv venv310 -e py310
34
- . venv310/bin/activate
33
+ tox --devenv venv311 -e py311
34
+ . venv311/bin/activate
35
35
  ```
36
36
 
37
37
  Note: we suggest using the lowest supported Python version for development.
@@ -7,6 +7,15 @@ 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.8.1(Oct 26,2026)
11
+ - Fixed `write_pandas` identifier quoting. Parquet field paths are quoted, Iceberg option values are escaped string literals, and `quote_identifiers=False` accepts only valid unquoted identifiers.
12
+ - Dropped support for Python 3.10. The minimum supported version is now Python 3.11.
13
+ - Bumped vendored `urllib3` to `2.8.0`. This includes the upstream fix for importing the connector on Python built against OpenSSL 4, where `ssl.PROTOCOL_TLSv1` no longer exists (SNOW-4232077).
14
+ - Fixed large result set batch chunk download logging every transient retry at ERROR level with a traceback. Intermediate retries now log at WARNING; only the final failure after all retries are exhausted logs at ERROR with a traceback. These retry and failure logs now also include the S3 request IDs (`x-amz-request-id` / `x-amz-id-2`) when present, to aid troubleshooting and correlation with AWS-side records (SNOW-4218352).
15
+ - Fixed a spurious `RequestsDependencyWarning` emitted at import time by the vendored `requests` when a newer `chardet` (7.x) or `charset_normalizer` is installed. `check_compatibility()` still requires `chardet >= 3.0.2` and `charset_normalizer >= 2.0.0`, but no longer rejects newer majors (SNOW-3559506).
16
+ - Raised the minimum certifi requirement to 2026.10.18
17
+ - Raised filelock upper bound dependency to allow installation of filelock 4.X.
18
+
10
19
  - v4.8.0(Sep 30,2026)
11
20
  - Fixed external-browser (SSO) authentication to validate the `Origin` header on the local callback server, rejecting tokens delivered from unexpected origins. A trailing slash in the origin (e.g. `https://account.snowflakecomputing.com/`) is now accepted on par with the bare origin, matching JDBC and other driver behaviour. Preconnect probe connections (empty recv) no longer count against the retry budget and no longer abort the login flow.
12
21
  - Added the `SNOWFLAKE_TLS_CIPHERS` environment variable to restrict which TLS ciphers the connector offers. It takes a colon-separated list; names beginning with `TLS_` are applied as TLS 1.3 cipher suites and the remainder as the cipher list for TLS 1.2 and below, so a single variable covers both. Leaving it unset keeps OpenSSL's defaults unchanged, and an unrecognized cipher name is rejected rather than silently ignored. The restriction covers Snowflake API traffic, cloud-storage (stage) transfers, OCSP/CRL fetches and IdP requests. Requests issued by the AWS and Azure SDKs, and asynchronous connections, are not covered — for TLS 1.3 suites specifically they cannot be, because the Python standard library exposes no API for restricting them.
@@ -39,6 +48,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
39
48
  - Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
40
49
  - When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
41
50
  - 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.
51
+ - Please review [Snowflake documentation](https://docs.snowflake.com/en/release-notes/clients-drivers/python-connector-2026#version-473-sep-3-2026) for possible implications to your workflow
42
52
  - 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.
43
53
  - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
44
54
  - 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).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-connector-python
3
- Version: 4.8.0
3
+ Version: 4.8.1
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -22,7 +22,6 @@ Classifier: License :: OSI Approved :: Apache Software License
22
22
  Classifier: Operating System :: OS Independent
23
23
  Classifier: Programming Language :: Python :: 3
24
24
  Classifier: Programming Language :: Python :: 3 :: Only
25
- Classifier: Programming Language :: Python :: 3.10
26
25
  Classifier: Programming Language :: Python :: 3.11
27
26
  Classifier: Programming Language :: Python :: 3.12
28
27
  Classifier: Programming Language :: Python :: 3.13
@@ -35,7 +34,7 @@ Classifier: Topic :: Software Development
35
34
  Classifier: Topic :: Software Development :: Libraries
36
35
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
37
36
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
38
- Requires-Python: >=3.10
37
+ Requires-Python: >=3.11
39
38
  Description-Content-Type: text/markdown
40
39
  License-File: LICENSE.txt
41
40
  License-File: NOTICE
@@ -48,9 +47,9 @@ Requires-Dist: requests<3.0.0,>=2.32.4
48
47
  Requires-Dist: packaging
49
48
  Requires-Dist: charset_normalizer<4,>=2
50
49
  Requires-Dist: idna<4,>=3.7
51
- Requires-Dist: certifi>=2024.7.4
50
+ Requires-Dist: certifi>=2026.10.18
52
51
  Requires-Dist: typing_extensions<5,>=4.3
53
- Requires-Dist: filelock<4,>=3.5
52
+ Requires-Dist: filelock<5,>=3.12
54
53
  Requires-Dist: sortedcontainers>=2.4.0
55
54
  Requires-Dist: platformdirs<5.0.0,>=2.6.0
56
55
  Requires-Dist: tomlkit
@@ -97,6 +96,15 @@ https://docs.snowflake.com/
97
96
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
98
97
 
99
98
  # Release Notes
99
+ - v4.8.1(Oct 26,2026)
100
+ - Fixed `write_pandas` identifier quoting. Parquet field paths are quoted, Iceberg option values are escaped string literals, and `quote_identifiers=False` accepts only valid unquoted identifiers.
101
+ - Dropped support for Python 3.10. The minimum supported version is now Python 3.11.
102
+ - Bumped vendored `urllib3` to `2.8.0`. This includes the upstream fix for importing the connector on Python built against OpenSSL 4, where `ssl.PROTOCOL_TLSv1` no longer exists (SNOW-4232077).
103
+ - Fixed large result set batch chunk download logging every transient retry at ERROR level with a traceback. Intermediate retries now log at WARNING; only the final failure after all retries are exhausted logs at ERROR with a traceback. These retry and failure logs now also include the S3 request IDs (`x-amz-request-id` / `x-amz-id-2`) when present, to aid troubleshooting and correlation with AWS-side records (SNOW-4218352).
104
+ - Fixed a spurious `RequestsDependencyWarning` emitted at import time by the vendored `requests` when a newer `chardet` (7.x) or `charset_normalizer` is installed. `check_compatibility()` still requires `chardet >= 3.0.2` and `charset_normalizer >= 2.0.0`, but no longer rejects newer majors (SNOW-3559506).
105
+ - Raised the minimum certifi requirement to 2026.10.18
106
+ - Raised filelock upper bound dependency to allow installation of filelock 4.X.
107
+
100
108
  - v4.8.0(Sep 30,2026)
101
109
  - Fixed external-browser (SSO) authentication to validate the `Origin` header on the local callback server, rejecting tokens delivered from unexpected origins. A trailing slash in the origin (e.g. `https://account.snowflakecomputing.com/`) is now accepted on par with the bare origin, matching JDBC and other driver behaviour. Preconnect probe connections (empty recv) no longer count against the retry budget and no longer abort the login flow.
102
110
  - Added the `SNOWFLAKE_TLS_CIPHERS` environment variable to restrict which TLS ciphers the connector offers. It takes a colon-separated list; names beginning with `TLS_` are applied as TLS 1.3 cipher suites and the remainder as the cipher list for TLS 1.2 and below, so a single variable covers both. Leaving it unset keeps OpenSSL's defaults unchanged, and an unrecognized cipher name is rejected rather than silently ignored. The restriction covers Snowflake API traffic, cloud-storage (stage) transfers, OCSP/CRL fetches and IdP requests. Requests issued by the AWS and Azure SDKs, and asynchronous connections, are not covered — for TLS 1.3 suites specifically they cannot be, because the Python standard library exposes no API for restricting them.
@@ -129,6 +137,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
129
137
  - Improved the robustness and correctness of OCSP revocation checking (SNOW-3675581).
130
138
  - When `SF_OCSP_RESPONSE_CACHE_SERVER_URL` is set, the connector uses it as the OCSP cache server, including on PrivateLink hosts.
131
139
  - 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.
140
+ - Please review [Snowflake documentation](https://docs.snowflake.com/en/release-notes/clients-drivers/python-connector-2026#version-473-sep-3-2026) for possible implications to your workflow
132
141
  - 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.
133
142
  - Request headers are copied before mutation on the async path, and masking is applied to the `Authorization` header in error logs (SNOW-3675593).
134
143
  - 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).
@@ -1,7 +1,7 @@
1
1
  # Snowflake Connector for Python
2
2
 
3
3
  > [!IMPORTANT]
4
- > A new version of the driver is being developed in [snowflakedb/drivers](https://github.com/snowflakedb/drivers) and is currently in public preview. See the [documentation](https://docs.snowflake.com/en/developer-guide/python-connector/python-connector-universal-core) for more information.
4
+ > Version 5.0.0 of the Snowflake Connector for Python has been released. Development has moved to [snowflakedb/drivers](https://github.com/snowflakedb/drivers). See the [documentation](https://docs.snowflake.com/en/developer-guide/universal-core/universal-core) for more information.
5
5
 
6
6
  This package includes the Snowflake Connector for Python, which conforms to the [Python DB API 2.0](https://www.python.org/dev/peps/pep-0249/) specification.
7
7
 
@@ -12,7 +12,7 @@ using the Snowflake JDBC or ODBC drivers.
12
12
 
13
13
  The connector has **no** dependencies on JDBC or ODBC.
14
14
  It can be installed using ``pip`` on Linux, Mac OSX, and Windows platforms
15
- where Python 3.10.0 (or higher) is installed.
15
+ where Python 3.11.0 (or higher) is installed.
16
16
 
17
17
  Snowflake Documentation is available at:
18
18
  https://docs.snowflake.com/
@@ -39,7 +39,7 @@ Find the `snowflake_connector_python*.whl` package in the `./dist` directory.
39
39
  ### In Docker
40
40
  Or use our Dockerized build script `ci/build_docker.sh` and find the built wheel files in `dist/repaired_wheels`.
41
41
 
42
- Note: `ci/build_docker.sh` can be used to compile only certain versions, like this: `ci/build_docker.sh "3.10 3.11"`
42
+ Note: `ci/build_docker.sh` can be used to compile only certain versions, like this: `ci/build_docker.sh "3.11 3.12"`
43
43
 
44
44
  ## Code hygiene and other utilities
45
45
  These tools are integrated into `tox` to allow us to easily set them up universally on any computer.
@@ -20,7 +20,6 @@ classifiers =
20
20
  Operating System :: OS Independent
21
21
  Programming Language :: Python :: 3
22
22
  Programming Language :: Python :: 3 :: Only
23
- Programming Language :: Python :: 3.10
24
23
  Programming Language :: Python :: 3.11
25
24
  Programming Language :: Python :: 3.12
26
25
  Programming Language :: Python :: 3.13
@@ -41,7 +40,7 @@ project_urls =
41
40
  Changelog=https://github.com/snowflakedb/snowflake-connector-python/blob/main/DESCRIPTION.md
42
41
 
43
42
  [options]
44
- python_requires = >=3.10
43
+ python_requires = >=3.11
45
44
  packages = find_namespace:
46
45
  install_requires =
47
46
  asn1crypto>0.24.0,<2.0.0
@@ -53,9 +52,9 @@ install_requires =
53
52
  packaging
54
53
  charset_normalizer>=2,<4
55
54
  idna>=3.7,<4
56
- certifi>=2024.7.4
55
+ certifi>=2026.10.18
57
56
  typing_extensions>=4.3,<5
58
- filelock>=3.5,<4
57
+ filelock>=3.12,<5
59
58
  sortedcontainers>=2.4.0
60
59
  platformdirs>=2.6.0,<5.0.0
61
60
  tomlkit
@@ -12,6 +12,8 @@ from snowflake.connector.options import pandas
12
12
  # Import utilities from sync version
13
13
  from snowflake.connector.pandas_tools import (
14
14
  _iceberg_config_statement_helper,
15
+ _quote_sql_identifier,
16
+ _sql_column_identifier,
15
17
  build_location_helper,
16
18
  chunk_helper,
17
19
  )
@@ -240,7 +242,8 @@ async def write_pandas(
240
242
  https://docs.snowflake.com/en/sql-reference/sql/put.html#optional-parameters (Default value = 4).
241
243
  quote_identifiers: By default, identifiers, specifically database, schema, table and column names
242
244
  (from df.columns) will be quoted. If set to False, identifiers are passed on to Snowflake without quoting.
243
- I.e. identifiers will be coerced to uppercase by Snowflake. (Default value = True)
245
+ I.e. identifiers will be coerced to uppercase by Snowflake. Column names in this mode must be valid
246
+ Snowflake unquoted identifiers. (Default value = True)
244
247
  infer_schema: Perform explicit schema inference on the data in the DataFrame and use the inferred data types
245
248
  when selecting columns from the DataFrame. (Default value = False)
246
249
  auto_create_table: When true, will automatically create a table with corresponding columns for each column in
@@ -335,6 +338,15 @@ async def write_pandas(
335
338
  else:
336
339
  sql_use_logical_type = " USE_LOGICAL_TYPE = FALSE"
337
340
 
341
+ # Validate/quote column names before creating temp objects or uploading.
342
+ # `$1:"field"` path syntax does not support IDENTIFIER(?) or ? bindings; always quote it.
343
+ # quote_identifiers only controls CREATE/COPY column lists (case-folding), not the parquet path.
344
+ snowflake_column_names = [
345
+ _sql_column_identifier(c, quote_identifiers) for c in df.columns
346
+ ]
347
+ parquet_field_names = [_quote_sql_identifier(c) for c in df.columns]
348
+ columns = ",".join(snowflake_column_names)
349
+
338
350
  cursor = conn.cursor()
339
351
  stage_location = await _create_temp_stage(
340
352
  cursor,
@@ -373,18 +385,6 @@ async def write_pandas(
373
385
  options={"parallel": parallel, "source_compression": "auto_detect"},
374
386
  )
375
387
 
376
- # in Snowflake, all parquet data is stored in a single column, $1, so we must select columns explicitly
377
- # see (https://docs.snowflake.com/en/user-guide/script-data-load-transform-parquet.html)
378
- if quote_identifiers:
379
- quote = '"'
380
- # if the column name contains a double quote, we need to escape it by replacing with two double quotes
381
- # https://docs.snowflake.com/en/sql-reference/identifiers-syntax#double-quoted-identifiers
382
- snowflake_column_names = [str(c).replace('"', '""') for c in df.columns]
383
- else:
384
- quote = ""
385
- snowflake_column_names = list(df.columns)
386
- columns = quote + f"{quote},{quote}".join(snowflake_column_names) + quote
387
-
388
388
  async def drop_object(name: str, object_type: str) -> None:
389
389
  drop_sql = f"DROP {object_type.upper()} IF EXISTS identifier(?) /* Python:snowflake.connector.aio._pandas_tools.write_pandas() */"
390
390
  params = (name,)
@@ -427,7 +427,7 @@ async def write_pandas(
427
427
  # columns in order
428
428
  create_table_columns = ", ".join(
429
429
  [
430
- f"{quote}{snowflake_col}{quote} {column_type_mapping[col]}"
430
+ f"{snowflake_col} {column_type_mapping[col]}"
431
431
  for snowflake_col, col in zip(snowflake_column_names, df.columns)
432
432
  ]
433
433
  )
@@ -468,8 +468,8 @@ async def write_pandas(
468
468
 
469
469
  # need explicit casting when the underlying table schema is inferred
470
470
  parquet_columns = "$1:" + ",$1:".join(
471
- f"{quote}{snowflake_col}{quote}::{column_type_mapping[col]}"
472
- for snowflake_col, col in zip(snowflake_column_names, df.columns)
471
+ f"{parquet_field}::{column_type_mapping[col]}"
472
+ for parquet_field, col in zip(parquet_field_names, df.columns)
473
473
  )
474
474
  else:
475
475
  target_table_location = build_location_helper(
@@ -478,9 +478,7 @@ async def write_pandas(
478
478
  name=table_name,
479
479
  quote_identifiers=quote_identifiers,
480
480
  )
481
- parquet_columns = "$1:" + ",$1:".join(
482
- f"{quote}{snowflake_col}{quote}" for snowflake_col in snowflake_column_names
483
- )
481
+ parquet_columns = "$1:" + ",$1:".join(parquet_field_names)
484
482
 
485
483
  try:
486
484
  if overwrite and (not auto_create_table):
@@ -34,6 +34,7 @@ from snowflake.connector.result_batch import RemoteChunkInfo
34
34
  from snowflake.connector.result_batch import ResultBatch as ResultBatchSync
35
35
  from snowflake.connector.result_batch import (
36
36
  _create_nanoarrow_iterator,
37
+ _s3_request_id_log_suffix,
37
38
  inline_first_chunk_rowcount,
38
39
  )
39
40
  from snowflake.connector.secret_detector import SecretDetector
@@ -232,6 +233,7 @@ class ResultBatch(ResultBatchSync):
232
233
 
233
234
  content, encoding = None, None
234
235
  for retry in range(max(MAX_DOWNLOAD_RETRY, 1)):
236
+ amz_request_id_suffix = ""
235
237
  try:
236
238
 
237
239
  async with TimerContextManager() as download_metric:
@@ -284,6 +286,7 @@ class ResultBatch(ResultBatchSync):
284
286
  ) as session:
285
287
  response, content, encoding = await download_chunk(session)
286
288
 
289
+ amz_request_id_suffix = _s3_request_id_log_suffix(response)
287
290
  if response.status == OK:
288
291
  break
289
292
  # Raise error here to correctly go in to exception clause
@@ -301,12 +304,18 @@ class ResultBatch(ResultBatchSync):
301
304
  if retry == MAX_DOWNLOAD_RETRY - 1:
302
305
  # Re-throw if we failed on the last retry
303
306
  e = e.args[0] if isinstance(e, RetryRequest) else e
307
+ logger.error(
308
+ f"Failed to fetch the large result set batch "
309
+ f"{self.id} after {MAX_DOWNLOAD_RETRY} attempts, "
310
+ f"giving up for the reason: '{e}'{amz_request_id_suffix}",
311
+ exc_info=True,
312
+ )
304
313
  raise e
305
314
  sleep_timer = next(backoff)
306
- logger.exception(
315
+ logger.warning(
307
316
  f"Failed to fetch the large result set batch "
308
317
  f"{self.id} for the {retry + 1} th time, "
309
- f"backing off for {sleep_timer}s for the reason: '{e}'"
318
+ f"backing off for {sleep_timer}s for the reason: '{e}'{amz_request_id_suffix}"
310
319
  )
311
320
  await asyncio.sleep(sleep_timer)
312
321
 
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import collections.abc
4
4
  import os
5
+ import re
5
6
  import warnings
6
7
  from functools import partial
7
8
  from logging import getLogger
@@ -41,6 +42,36 @@ T = TypeVar("T", bound=collections.abc.Sequence)
41
42
 
42
43
  logger = getLogger(__name__)
43
44
 
45
+ # Snowflake unquoted identifiers: start with letter/underscore, then alnum/_/$.
46
+ # https://docs.snowflake.com/en/sql-reference/identifiers-syntax
47
+ _UNQUOTED_IDENTIFIER_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_$]*$")
48
+
49
+
50
+ def _quote_sql_identifier(name: str) -> str:
51
+ """Double-quote a SQL identifier, escaping internal double quotes."""
52
+ return '"' + str(name).replace('"', '""') + '"'
53
+
54
+
55
+ def _sql_column_identifier(name: str, quote_identifiers: bool) -> str:
56
+ """Format a DataFrame column name for interpolation into DDL/DML.
57
+
58
+ When quote_identifiers is True, the name is always emitted as a quoted
59
+ identifier. When False, the name is left unquoted so Snowflake can
60
+ case-fold it, but only if it is a valid unquoted identifier — otherwise
61
+ SQL metacharacters in the name would be interpolated as SQL.
62
+ """
63
+ name = str(name)
64
+ if quote_identifiers:
65
+ return _quote_sql_identifier(name)
66
+ if not _UNQUOTED_IDENTIFIER_RE.fullmatch(name):
67
+ raise ProgrammingError(
68
+ f"Invalid unquoted identifier {name!r}. Column names used with "
69
+ "quote_identifiers=False must be valid Snowflake unquoted identifiers "
70
+ "(letter or underscore, then letters, digits, underscores, or dollar "
71
+ "signs). Set quote_identifiers=True to use arbitrary column names."
72
+ )
73
+ return name
74
+
44
75
 
45
76
  def chunk_helper(
46
77
  lst: pandas.DataFrame, n: int
@@ -207,17 +238,18 @@ def _create_temp_file_format(
207
238
  return file_format_location
208
239
 
209
240
 
210
- def _convert_value_to_sql_option(value: Union[str, bool, int, float]) -> str:
241
+ def _convert_value_to_sql_option(value: str | bool | int | float) -> str:
242
+ """Convert a Python value to a SQL option literal for iceberg config.
243
+
244
+ String values are always emitted as one escaped single-quoted literal,
245
+ including values that already start and end with quotes. Backslashes are
246
+ doubled before quotes because Snowflake treats ``\\`` as an escape inside
247
+ ``'...'``.
248
+ """
211
249
  if isinstance(value, str):
212
- if len(value) > 1 and value.startswith("'") and value.endswith("'"):
213
- return value
214
- else:
215
- value = value.replace(
216
- "'", "''"
217
- ) # escape single quotes before adding a pair of quotes
218
- return f"'{value}'"
219
- else:
220
- return str(value)
250
+ escaped = value.replace("\\", "\\\\").replace("'", "''")
251
+ return f"'{escaped}'"
252
+ return str(value)
221
253
 
222
254
 
223
255
  def _iceberg_config_statement_helper(iceberg_config: dict[str, str]) -> str:
@@ -316,7 +348,8 @@ def write_pandas(
316
348
  https://docs.snowflake.com/en/sql-reference/sql/put.html#optional-parameters (Default value = 4).
317
349
  quote_identifiers: By default, identifiers, specifically database, schema, table and column names
318
350
  (from df.columns) will be quoted. If set to False, identifiers are passed on to Snowflake without quoting.
319
- I.e. identifiers will be coerced to uppercase by Snowflake. (Default value = True)
351
+ I.e. identifiers will be coerced to uppercase by Snowflake. Column names in this mode must be valid
352
+ Snowflake unquoted identifiers. (Default value = True)
320
353
  infer_schema: Perform explicit schema inference on the data in the DataFrame and use the inferred data types
321
354
  when selecting columns from the DataFrame. (Default value = False)
322
355
  auto_create_table: When true, will automatically create a table with corresponding columns for each column in
@@ -422,6 +455,15 @@ def write_pandas(
422
455
  else:
423
456
  sql_use_logical_type = " USE_LOGICAL_TYPE = FALSE"
424
457
 
458
+ # Validate/quote column names before creating temp objects or uploading.
459
+ # `$1:"field"` path syntax does not support IDENTIFIER(?) or ? bindings; always quote it.
460
+ # quote_identifiers only controls CREATE/COPY column lists (case-folding), not the parquet path.
461
+ snowflake_column_names = [
462
+ _sql_column_identifier(c, quote_identifiers) for c in df.columns
463
+ ]
464
+ parquet_field_names = [_quote_sql_identifier(c) for c in df.columns]
465
+ columns = ",".join(snowflake_column_names)
466
+
425
467
  cursor = conn.cursor()
426
468
  stage_location = _create_temp_stage(
427
469
  cursor,
@@ -460,18 +502,6 @@ def write_pandas(
460
502
  options={"parallel": parallel, "source_compression": "auto_detect"},
461
503
  )
462
504
 
463
- # in Snowflake, all parquet data is stored in a single column, $1, so we must select columns explicitly
464
- # see (https://docs.snowflake.com/en/user-guide/script-data-load-transform-parquet.html)
465
- if quote_identifiers:
466
- quote = '"'
467
- # if the column name contains a double quote, we need to escape it by replacing with two double quotes
468
- # https://docs.snowflake.com/en/sql-reference/identifiers-syntax#double-quoted-identifiers
469
- snowflake_column_names = [str(c).replace('"', '""') for c in df.columns]
470
- else:
471
- quote = ""
472
- snowflake_column_names = list(df.columns)
473
- columns = quote + f"{quote},{quote}".join(snowflake_column_names) + quote
474
-
475
505
  def drop_object(name: str, object_type: str) -> None:
476
506
  drop_sql = f"DROP {object_type.upper()} IF EXISTS identifier(?) /* Python:snowflake.connector.pandas_tools.write_pandas() */"
477
507
  params = (name,)
@@ -512,7 +542,7 @@ def write_pandas(
512
542
  # columns in order
513
543
  create_table_columns = ", ".join(
514
544
  [
515
- f"{quote}{snowflake_col}{quote} {column_type_mapping[col]}"
545
+ f"{snowflake_col} {column_type_mapping[col]}"
516
546
  for snowflake_col, col in zip(snowflake_column_names, df.columns)
517
547
  ]
518
548
  )
@@ -553,8 +583,8 @@ def write_pandas(
553
583
 
554
584
  # need explicit casting when the underlying table schema is inferred
555
585
  parquet_columns = "$1:" + ",$1:".join(
556
- f"{quote}{snowflake_col}{quote}::{column_type_mapping[col]}"
557
- for snowflake_col, col in zip(snowflake_column_names, df.columns)
586
+ f"{parquet_field}::{column_type_mapping[col]}"
587
+ for parquet_field, col in zip(parquet_field_names, df.columns)
558
588
  )
559
589
  else:
560
590
  target_table_location = build_location_helper(
@@ -563,9 +593,7 @@ def write_pandas(
563
593
  name=table_name,
564
594
  quote_identifiers=quote_identifiers,
565
595
  )
566
- parquet_columns = "$1:" + ",$1:".join(
567
- f"{quote}{snowflake_col}{quote}" for snowflake_col in snowflake_column_names
568
- )
596
+ parquet_columns = "$1:" + ",$1:".join(parquet_field_names)
569
597
 
570
598
  try:
571
599
  if overwrite and (not auto_create_table):
@@ -55,6 +55,29 @@ MAX_INLINE_RESULT_RETRY = 1
55
55
  MAX_INCOMPLETE_CHUNK_RETRY = 1
56
56
 
57
57
 
58
+ def _s3_request_id_log_suffix(response: Response | None) -> str:
59
+ """Return a ``', S3 request id: ..., S3 extended request id: ...'`` log suffix, or ``''``.
60
+
61
+ S3 returns these trace headers (``x-amz-request-id`` / ``x-amz-id-2``) on every
62
+ response, including error responses, so surfacing them in the retry/failure logs
63
+ lets support correlate a failed chunk download with AWS-side records. Empty string
64
+ when no response arrived (pure network failure) or the headers are absent (non-S3
65
+ stage).
66
+ """
67
+ headers = getattr(response, "headers", None)
68
+ if headers is None or not hasattr(headers, "get"):
69
+ return ""
70
+ parts = []
71
+ for name, label in (
72
+ ("x-amz-request-id", "S3 request id"),
73
+ ("x-amz-id-2", "S3 extended request id"),
74
+ ):
75
+ value = headers.get(name)
76
+ if isinstance(value, str) and value:
77
+ parts.append(f"{label}: {value}")
78
+ return f", {', '.join(parts)}" if parts else ""
79
+
80
+
58
81
  def inline_first_chunk_rowcount(data: dict[str, Any]) -> int:
59
82
  """Rows attributed to the inline first chunk: ``total`` minus remote chunk rowCounts.
60
83
 
@@ -520,6 +543,7 @@ class ResultBatch(abc.ABC):
520
543
  else exponential_backoff()()
521
544
  )
522
545
  for retry in range(MAX_DOWNLOAD_RETRY):
546
+ amz_request_id_suffix = ""
523
547
  try:
524
548
  with TimerContextManager() as download_metric:
525
549
  logger.debug(f"started downloading result batch id: {self.id}")
@@ -560,6 +584,7 @@ class ResultBatch(abc.ABC):
560
584
  )
561
585
  response = local_session_manager.get(**request_data)
562
586
 
587
+ amz_request_id_suffix = _s3_request_id_log_suffix(response)
563
588
  if response.status_code == OK:
564
589
  logger.debug(
565
590
  f"successfully downloaded result batch id: {self.id}"
@@ -581,12 +606,18 @@ class ResultBatch(abc.ABC):
581
606
  if retry == MAX_DOWNLOAD_RETRY - 1:
582
607
  # Re-throw if we failed on the last retry
583
608
  e = e.args[0] if isinstance(e, RetryRequest) else e
609
+ logger.error(
610
+ f"Failed to fetch the large result set batch "
611
+ f"{self.id} after {MAX_DOWNLOAD_RETRY} attempts, "
612
+ f"giving up for the reason: '{e}'{amz_request_id_suffix}",
613
+ exc_info=True,
614
+ )
584
615
  raise e
585
616
  sleep_timer = next(backoff)
586
- logger.exception(
617
+ logger.warning(
587
618
  f"Failed to fetch the large result set batch "
588
619
  f"{self.id} for the {retry + 1} th time, "
589
- f"backing off for {sleep_timer}s for the reason: '{e}'"
620
+ f"backing off for {sleep_timer}s for the reason: '{e}'{amz_request_id_suffix}"
590
621
  )
591
622
  time.sleep(sleep_timer)
592
623
 
@@ -75,13 +75,13 @@ def check_compatibility(urllib3_version, chardet_version, charset_normalizer_ver
75
75
  if chardet_version:
76
76
  major, minor, patch = chardet_version.split(".")[:3]
77
77
  major, minor, patch = int(major), int(minor), int(patch)
78
- # chardet_version >= 3.0.2, < 6.0.0
79
- assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0)
78
+ # chardet_version >= 3.0.2
79
+ assert (3, 0, 2) <= (major, minor, patch)
80
80
  elif charset_normalizer_version:
81
81
  major, minor, patch = charset_normalizer_version.split(".")[:3]
82
82
  major, minor, patch = int(major), int(minor), int(patch)
83
- # charset_normalizer >= 2.0.0 < 4.0.0
84
- assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)
83
+ # charset_normalizer >= 2.0.0
84
+ assert (2, 0, 0) <= (major, minor, patch)
85
85
  else:
86
86
  warnings.warn(
87
87
  "Unable to find acceptable character detection dependency "
@@ -400,6 +400,9 @@ class HTTPHeaderDict(typing.MutableMapping[str, str]):
400
400
  """
401
401
  Remove content-specific header fields before changing the request
402
402
  method to GET or HEAD according to RFC 9110, Section 15.4.
403
+
404
+ ``Transfer-Encoding`` goes as well: it frames a request body that is
405
+ no longer going to be sent.
403
406
  """
404
407
  content_specific_headers = [
405
408
  "Content-Encoding",
@@ -409,6 +412,7 @@ class HTTPHeaderDict(typing.MutableMapping[str, str]):
409
412
  "Content-Length",
410
413
  "Digest",
411
414
  "Last-Modified",
415
+ "Transfer-Encoding",
412
416
  ]
413
417
  for header in content_specific_headers:
414
418
  self.discard(header)
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.7.0'
22
- __version_tuple__ = version_tuple = (2, 7, 0)
21
+ __version__ = version = '2.8.0'
22
+ __version_tuple__ = version_tuple = (2, 8, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None