snowflake-connector-python 3.13.2__tar.gz → 3.14.0__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 (239) hide show
  1. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/DESCRIPTION.md +11 -0
  2. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/MANIFEST.in +1 -0
  3. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/PKG-INFO +14 -3
  4. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/setup.cfg +2 -2
  5. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/__init__.py +3 -0
  6. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/_auth.py +5 -0
  7. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/by_plugin.py +1 -0
  8. snowflake_connector_python-3.14.0/src/snowflake/connector/auth/no_auth.py +43 -0
  9. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/azure_storage_client.py +8 -1
  10. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/config_manager.py +3 -7
  11. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/connection.py +29 -9
  12. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/constants.py +3 -0
  13. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/cursor.py +1 -0
  14. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/encryption_util.py +4 -1
  15. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/file_transfer_agent.py +6 -0
  16. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/gcs_storage_client.py +7 -1
  17. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/local_storage_client.py +4 -1
  18. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/network.py +1 -0
  19. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/options.py +11 -12
  20. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/pandas_tools.py +52 -2
  21. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/s3_storage_client.py +8 -1
  22. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/storage_client.py +4 -1
  23. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/version.py +1 -1
  24. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/PKG-INFO +14 -3
  25. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +1 -0
  26. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/requires.txt +2 -2
  27. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/CONTRIBUTING.md +0 -0
  28. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/LICENSE.txt +0 -0
  29. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/NOTICE +0 -0
  30. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/README.md +0 -0
  31. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/SECURITY.md +0 -0
  32. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/pyproject.toml +0 -0
  33. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/setup.py +0 -0
  34. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/__init__.py +0 -0
  35. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/_query_context_cache.py +0 -0
  36. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/_sql_util.py +0 -0
  37. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/_utils.py +0 -0
  38. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/arrow_context.py +0 -0
  39. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/default.py +0 -0
  40. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/idtoken.py +0 -0
  41. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/keypair.py +0 -0
  42. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/oauth.py +0 -0
  43. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/okta.py +0 -0
  44. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/pat.py +0 -0
  45. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  46. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/auth/webbrowser.py +0 -0
  47. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/backoff_policies.py +0 -0
  48. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
  49. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/cache.py +0 -0
  50. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/compat.py +0 -0
  51. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/connection_diagnostic.py +0 -0
  52. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter.py +0 -0
  53. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter_issue23517.py +0 -0
  54. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter_null.py +0 -0
  55. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/converter_snowsql.py +0 -0
  56. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/dbapi.py +0 -0
  57. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/description.py +0 -0
  58. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/errorcode.py +0 -0
  59. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/errors.py +0 -0
  60. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/feature.py +0 -0
  61. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/file_compression_type.py +0 -0
  62. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/file_util.py +0 -0
  63. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/gzip_decoder.py +0 -0
  64. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/log_configuration.py +0 -0
  65. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
  66. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
  67. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
  68. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
  69. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
  70. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
  71. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
  72. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
  73. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
  74. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
  75. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
  76. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
  77. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
  78. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
  79. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
  80. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
  81. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
  82. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
  83. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
  84. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
  85. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
  86. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
  87. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
  88. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  89. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
  90. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
  91. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
  92. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
  93. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
  94. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
  95. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
  96. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
  97. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
  98. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
  99. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
  100. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
  101. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
  102. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
  103. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
  104. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
  105. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  106. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
  107. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
  108. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  109. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  110. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  111. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  112. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  113. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  114. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  115. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  116. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  117. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  118. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  119. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  120. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  121. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  122. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  123. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  124. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  125. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  126. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  127. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  128. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  129. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  130. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  131. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  132. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  133. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  134. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  135. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  136. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  137. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  138. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  139. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  140. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  141. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
  142. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
  143. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
  144. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
  145. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
  146. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
  147. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
  148. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
  149. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
  150. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
  151. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
  152. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  153. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ocsp_snowflake.py +0 -0
  154. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/proxy.py +0 -0
  155. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/py.typed +0 -0
  156. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/result_batch.py +0 -0
  157. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/result_set.py +0 -0
  158. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/secret_detector.py +0 -0
  159. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sf_dirs.py +0 -0
  160. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
  161. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sfdatetime.py +0 -0
  162. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/snow_logging.py +0 -0
  163. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/sqlstate.py +0 -0
  164. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  165. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  166. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/telemetry.py +0 -0
  167. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/telemetry_oob.py +0 -0
  168. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/test_util.py +0 -0
  169. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/time_util.py +0 -0
  170. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/__init__.py +0 -0
  171. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
  172. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  173. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
  174. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
  175. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/url_util.py +0 -0
  176. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/util_text.py +0 -0
  177. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/__init__.py +0 -0
  178. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  179. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  180. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  181. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  182. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  183. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
  184. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  185. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  186. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  187. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  188. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  189. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
  190. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  191. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
  192. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  193. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  194. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  195. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  196. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  197. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  198. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  199. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  200. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  201. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  202. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  203. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
  204. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
  205. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
  206. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
  207. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
  208. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
  209. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  210. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
  211. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  212. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  213. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  214. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  215. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
  216. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
  217. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
  218. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
  219. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
  220. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  221. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
  222. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  223. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  224. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  225. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  226. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
  227. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  228. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  229. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  230. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  231. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  232. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  233. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  234. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  235. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  236. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  237. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  238. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  239. {snowflake_connector_python-3.13.2 → snowflake_connector_python-3.14.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -7,6 +7,17 @@ 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
+ - v3.14.0(March 03, 2025)
11
+ - Bumped pyOpenSSL dependency upper boundary from <25.0.0 to <26.0.0.
12
+ - Added a <19.0.0 pin to pyarrow as a workaround to a bug affecting Azure Batch.
13
+ - Optimized distribution package lookup to speed up import.
14
+ - Fixed a bug where privatelink OCSP Cache url could not be determined if privatelink account name was specified in uppercase.
15
+ - Added support for iceberg tables to `write_pandas`.
16
+ - Fixed base64 encoded private key tests.
17
+ - Fixed a bug where file permission check happened on Windows.
18
+ - Added support for File types.
19
+ - Added `unsafe_file_write` connection parameter that restores the previous behaviour of saving files downloaded with GET with 644 permissions.
20
+
10
21
  - v3.13.2(January 29, 2025)
11
22
  - Changed not to use scoped temporary objects.
12
23
 
@@ -19,6 +19,7 @@ exclude license_header.txt
19
19
  exclude tox.ini
20
20
  exclude mypy.ini
21
21
  exclude .clang-format
22
+ exclude .wiremock/*
22
23
 
23
24
  prune ci
24
25
  prune benchmark
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: snowflake-connector-python
3
- Version: 3.13.2
3
+ Version: 3.14.0
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -41,7 +41,7 @@ License-File: NOTICE
41
41
  Requires-Dist: asn1crypto<2.0.0,>0.24.0
42
42
  Requires-Dist: cffi<2.0.0,>=1.9
43
43
  Requires-Dist: cryptography>=3.1.0
44
- Requires-Dist: pyOpenSSL<25.0.0,>=22.0.0
44
+ Requires-Dist: pyOpenSSL<26.0.0,>=22.0.0
45
45
  Requires-Dist: pyjwt<3.0.0
46
46
  Requires-Dist: pytz
47
47
  Requires-Dist: requests<3.0.0
@@ -71,7 +71,7 @@ Requires-Dist: pytest-xdist; extra == "development"
71
71
  Requires-Dist: pytzdata; extra == "development"
72
72
  Provides-Extra: pandas
73
73
  Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "pandas"
74
- Requires-Dist: pyarrow; extra == "pandas"
74
+ Requires-Dist: pyarrow<19.0.0; extra == "pandas"
75
75
  Provides-Extra: secure-local-storage
76
76
  Requires-Dist: keyring<26.0.0,>=23.1.0; extra == "secure-local-storage"
77
77
 
@@ -84,6 +84,17 @@ https://docs.snowflake.com/
84
84
  Source code is also available at: https://github.com/snowflakedb/snowflake-connector-python
85
85
 
86
86
  # Release Notes
87
+ - v3.14.0(March 03, 2025)
88
+ - Bumped pyOpenSSL dependency upper boundary from <25.0.0 to <26.0.0.
89
+ - Added a <19.0.0 pin to pyarrow as a workaround to a bug affecting Azure Batch.
90
+ - Optimized distribution package lookup to speed up import.
91
+ - Fixed a bug where privatelink OCSP Cache url could not be determined if privatelink account name was specified in uppercase.
92
+ - Added support for iceberg tables to `write_pandas`.
93
+ - Fixed base64 encoded private key tests.
94
+ - Fixed a bug where file permission check happened on Windows.
95
+ - Added support for File types.
96
+ - Added `unsafe_file_write` connection parameter that restores the previous behaviour of saving files downloaded with GET with 644 permissions.
97
+
87
98
  - v3.13.2(January 29, 2025)
88
99
  - Changed not to use scoped temporary objects.
89
100
 
@@ -46,7 +46,7 @@ install_requires =
46
46
  asn1crypto>0.24.0,<2.0.0
47
47
  cffi>=1.9,<2.0.0
48
48
  cryptography>=3.1.0
49
- pyOpenSSL>=22.0.0,<25.0.0
49
+ pyOpenSSL>=22.0.0,<26.0.0
50
50
  pyjwt<3.0.0
51
51
  pytz
52
52
  requests<3.0.0
@@ -93,7 +93,7 @@ development =
93
93
  pytzdata
94
94
  pandas =
95
95
  pandas>=1.0.0,<3.0.0
96
- pyarrow
96
+ pyarrow<19.0.0
97
97
  secure-local-storage =
98
98
  keyring>=23.1.0,<26.0.0
99
99
 
@@ -9,6 +9,7 @@ from .by_plugin import AuthByPlugin, AuthType
9
9
  from .default import AuthByDefault
10
10
  from .idtoken import AuthByIdToken
11
11
  from .keypair import AuthByKeyPair
12
+ from .no_auth import AuthNoAuth
12
13
  from .oauth import AuthByOAuth
13
14
  from .okta import AuthByOkta
14
15
  from .pat import AuthByPAT
@@ -25,6 +26,7 @@ FIRST_PARTY_AUTHENTICATORS = frozenset(
25
26
  AuthByWebBrowser,
26
27
  AuthByIdToken,
27
28
  AuthByPAT,
29
+ AuthNoAuth,
28
30
  )
29
31
  )
30
32
 
@@ -37,6 +39,7 @@ __all__ = [
37
39
  "AuthByOkta",
38
40
  "AuthByUsrPwdMfa",
39
41
  "AuthByWebBrowser",
42
+ "AuthNoAuth",
40
43
  "Auth",
41
44
  "AuthType",
42
45
  "FIRST_PARTY_AUTHENTICATORS",
@@ -63,6 +63,7 @@ from ..network import (
63
63
  from ..options import installed_keyring, keyring
64
64
  from ..sqlstate import SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED
65
65
  from ..version import VERSION
66
+ from .no_auth import AuthNoAuth
66
67
 
67
68
  if TYPE_CHECKING:
68
69
  from . import AuthByPlugin
@@ -186,6 +187,10 @@ class Auth:
186
187
  ) -> dict[str, str | int | bool]:
187
188
  logger.debug("authenticate")
188
189
 
190
+ # For no-auth connection, authentication is no-op, and we can return early here.
191
+ if isinstance(auth_instance, AuthNoAuth):
192
+ return {}
193
+
189
194
  if timeout is None:
190
195
  timeout = auth_instance.timeout
191
196
 
@@ -55,6 +55,7 @@ class AuthType(Enum):
55
55
  USR_PWD_MFA = "USERNAME_PASSWORD_MFA"
56
56
  OKTA = "OKTA"
57
57
  PAT = "PROGRAMMATIC_ACCESS_TOKEN'"
58
+ NO_AUTH = "NO_AUTH"
58
59
 
59
60
 
60
61
  class AuthByPlugin(ABC):
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # Copyright (c) 2012-2023 Snowflake Computing Inc. All rights reserved.
4
+ #
5
+
6
+ from __future__ import annotations
7
+
8
+ from typing import Any
9
+
10
+ from .by_plugin import AuthByPlugin, AuthType
11
+
12
+
13
+ class AuthNoAuth(AuthByPlugin):
14
+ """No-auth Authentication.
15
+
16
+ It is a dummy auth that requires no extra connection establishment.
17
+ """
18
+
19
+ @property
20
+ def type_(self) -> AuthType:
21
+ return AuthType.NO_AUTH
22
+
23
+ @property
24
+ def assertion_content(self) -> str | None:
25
+ return None
26
+
27
+ def __init__(self) -> None:
28
+ super().__init__()
29
+
30
+ def reset_secrets(self) -> None:
31
+ pass
32
+
33
+ def prepare(
34
+ self,
35
+ **kwargs: Any,
36
+ ) -> None:
37
+ pass
38
+
39
+ def reauthenticate(self, **kwargs: Any) -> dict[str, bool]:
40
+ return {"success": True}
41
+
42
+ def update_body(self, body: dict[Any, Any]) -> None:
43
+ pass
@@ -65,8 +65,15 @@ class SnowflakeAzureRestClient(SnowflakeStorageClient):
65
65
  chunk_size: int,
66
66
  stage_info: dict[str, Any],
67
67
  use_s3_regional_url: bool = False,
68
+ unsafe_file_write: bool = False,
68
69
  ) -> None:
69
- super().__init__(meta, stage_info, chunk_size, credentials=credentials)
70
+ super().__init__(
71
+ meta,
72
+ stage_info,
73
+ chunk_size,
74
+ credentials=credentials,
75
+ unsafe_file_write=unsafe_file_write,
76
+ )
70
77
  end_point: str = stage_info["endPoint"]
71
78
  if end_point.startswith("blob."):
72
79
  end_point = end_point[len("blob.") :]
@@ -330,7 +330,8 @@ class ConfigManager:
330
330
  continue
331
331
 
332
332
  if (
333
- sliceoptions.check_permissions # Skip checking if this file couldn't hold sensitive information
333
+ not IS_WINDOWS # Skip checking on Windows
334
+ and sliceoptions.check_permissions # Skip checking if this file couldn't hold sensitive information
334
335
  # Same check as openssh does for permissions
335
336
  # https://github.com/openssh/openssh-portable/blob/2709809fd616a0991dc18e3a58dea10fb383c3f0/readconf.c#LL2264C1-L2264C1
336
337
  and filep.stat().st_mode & READABLE_BY_OTHERS != 0
@@ -341,12 +342,7 @@ class ConfigManager:
341
342
  and filep.stat().st_uid != os.getuid()
342
343
  )
343
344
  ):
344
- # for non-Windows, suggest change to 0600 permissions.
345
- chmod_message = (
346
- f'.\n * To change owner, run `chown $USER "{str(filep)}"`.\n * To restrict permissions, run `chmod 0600 "{str(filep)}"`.\n'
347
- if not IS_WINDOWS
348
- else ""
349
- )
345
+ chmod_message = f'.\n * To change owner, run `chown $USER "{str(filep)}"`.\n * To restrict permissions, run `chmod 0600 "{str(filep)}"`.\n'
350
346
 
351
347
  warn(f"Bad owner or permissions on {str(filep)}{chmod_message}")
352
348
  LOGGER.debug(f"reading configuration file from {str(filep)}")
@@ -23,7 +23,6 @@ from functools import partial
23
23
  from io import StringIO
24
24
  from logging import getLogger
25
25
  from threading import Lock
26
- from time import strptime
27
26
  from types import TracebackType
28
27
  from typing import Any, Callable, Generator, Iterable, Iterator, NamedTuple, Sequence
29
28
  from uuid import UUID
@@ -45,6 +44,7 @@ from .auth import (
45
44
  AuthByPlugin,
46
45
  AuthByUsrPwdMfa,
47
46
  AuthByWebBrowser,
47
+ AuthNoAuth,
48
48
  )
49
49
  from .auth.idtoken import AuthByIdToken
50
50
  from .backoff_policies import exponential_backoff
@@ -99,6 +99,7 @@ from .network import (
99
99
  DEFAULT_AUTHENTICATOR,
100
100
  EXTERNAL_BROWSER_AUTHENTICATOR,
101
101
  KEY_PAIR_AUTHENTICATOR,
102
+ NO_AUTH_AUTHENTICATOR,
102
103
  OAUTH_AUTHENTICATOR,
103
104
  PROGRAMMATIC_ACCESS_TOKEN,
104
105
  REQUEST_ID,
@@ -312,9 +313,6 @@ APPLICATION_RE = re.compile(r"[\w\d_]+")
312
313
  for m in [method for method in dir(errors) if callable(getattr(errors, method))]:
313
314
  setattr(sys.modules[__name__], m, getattr(errors, m))
314
315
 
315
- # Workaround for https://bugs.python.org/issue7980
316
- strptime("20150102030405", "%Y%m%d%H%M%S")
317
-
318
316
  logger = getLogger(__name__)
319
317
 
320
318
 
@@ -383,6 +381,7 @@ class SnowflakeConnection:
383
381
  server_session_keep_alive: When true, the connector does not destroy the session on the Snowflake server side
384
382
  before the connector shuts down. Default value is false.
385
383
  token_file_path: The file path of the token file. If both token and token_file_path are provided, the token in token_file_path will be used.
384
+ unsafe_file_write: When true, files downloaded by GET will be saved with 644 permissions. Otherwise, files will be saved with safe - owner-only permissions: 600.
386
385
  """
387
386
 
388
387
  OCSP_ENV_LOCK = Lock()
@@ -740,6 +739,14 @@ class SnowflakeConnection:
740
739
  def iobound_tpe_limit(self) -> int | None:
741
740
  return self._iobound_tpe_limit
742
741
 
742
+ @property
743
+ def unsafe_file_write(self) -> bool:
744
+ return self._unsafe_file_write
745
+
746
+ @unsafe_file_write.setter
747
+ def unsafe_file_write(self, value: bool) -> None:
748
+ self._unsafe_file_write = value
749
+
743
750
  def connect(self, **kwargs) -> None:
744
751
  """Establishes connection to Snowflake."""
745
752
  logger.debug("connect")
@@ -930,6 +937,7 @@ class SnowflakeConnection:
930
937
 
931
938
  @staticmethod
932
939
  def setup_ocsp_privatelink(app, hostname) -> None:
940
+ hostname = hostname.lower()
933
941
  SnowflakeConnection.OCSP_ENV_LOCK.acquire()
934
942
  ocsp_cache_server = f"http://ocsp.{hostname}/ocsp_response_cache.json"
935
943
  os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"] = ocsp_cache_server
@@ -961,7 +969,7 @@ class SnowflakeConnection:
961
969
  os.environ["SF_OCSP_RESPONSE_CACHE_SERVER_URL"],
962
970
  )
963
971
 
964
- if ".privatelink.snowflakecomputing." in self.host:
972
+ if ".privatelink.snowflakecomputing." in self.host.lower():
965
973
  SnowflakeConnection.setup_ocsp_privatelink(self.application, self.host)
966
974
  else:
967
975
  if "SF_OCSP_RESPONSE_CACHE_SERVER_URL" in os.environ:
@@ -1210,6 +1218,11 @@ class SnowflakeConnection:
1210
1218
  if "protocol" not in kwargs:
1211
1219
  self._protocol = "https"
1212
1220
 
1221
+ if "unsafe_file_write" in kwargs:
1222
+ self._unsafe_file_write = kwargs["unsafe_file_write"]
1223
+ else:
1224
+ self._unsafe_file_write = False
1225
+
1213
1226
  logger.info(
1214
1227
  f"Connecting to {_DOMAIN_NAME_MAP.get(extract_top_level_domain_from_hostname(self._host), 'GLOBAL')} Snowflake domain"
1215
1228
  )
@@ -1237,9 +1250,15 @@ class SnowflakeConnection:
1237
1250
  with open(token_file_path) as f:
1238
1251
  self._token = f.read()
1239
1252
 
1253
+ # Set of authenticators allowing empty user.
1254
+ empty_user_allowed_authenticators = {OAUTH_AUTHENTICATOR, NO_AUTH_AUTHENTICATOR}
1255
+
1240
1256
  if not (self._master_token and self._session_token):
1241
- if not self.user and self._authenticator != OAUTH_AUTHENTICATOR:
1242
- # OAuth Authentication does not require a username
1257
+ if (
1258
+ not self.user
1259
+ and self._authenticator not in empty_user_allowed_authenticators
1260
+ ):
1261
+ # OAuth and NoAuth Authentications does not require a username
1243
1262
  Error.errorhandler_wrapper(
1244
1263
  self,
1245
1264
  None,
@@ -1268,14 +1287,15 @@ class SnowflakeConnection:
1268
1287
  {"msg": "Password is empty", "errno": ER_NO_PASSWORD},
1269
1288
  )
1270
1289
 
1271
- if not self._account:
1290
+ # Only AuthNoAuth allows account to be omitted.
1291
+ if not self._account and not isinstance(self.auth_class, AuthNoAuth):
1272
1292
  Error.errorhandler_wrapper(
1273
1293
  self,
1274
1294
  None,
1275
1295
  ProgrammingError,
1276
1296
  {"msg": "Account must be specified", "errno": ER_NO_ACCOUNT_NAME},
1277
1297
  )
1278
- if "." in self._account:
1298
+ if self._account and "." in self._account:
1279
1299
  self._account = parse_account(self._account)
1280
1300
 
1281
1301
  if not isinstance(self._backoff_policy, Callable) or not isinstance(
@@ -182,6 +182,9 @@ FIELD_TYPES: tuple[FieldType, ...] = (
182
182
  ),
183
183
  FieldType(name="VECTOR", dbapi_type=[DBAPI_TYPE_BINARY], pa_type=vector_pa_type),
184
184
  FieldType(name="MAP", dbapi_type=[DBAPI_TYPE_BINARY], pa_type=map_pa_type),
185
+ FieldType(
186
+ name="FILE", dbapi_type=[DBAPI_TYPE_STRING], pa_type=lambda _: pa.string()
187
+ ),
185
188
  )
186
189
 
187
190
  FIELD_NAME_TO_ID: DefaultDict[Any, int] = defaultdict(int)
@@ -1060,6 +1060,7 @@ class SnowflakeCursor:
1060
1060
  multipart_threshold=data.get("threshold"),
1061
1061
  use_s3_regional_url=self._connection.enable_stage_s3_privatelink_for_us_east_1,
1062
1062
  iobound_tpe_limit=self._connection.iobound_tpe_limit,
1063
+ unsafe_file_write=self._connection.unsafe_file_write,
1063
1064
  )
1064
1065
  sf_file_transfer_agent.execute()
1065
1066
  data = sf_file_transfer_agent.result()
@@ -195,6 +195,7 @@ class SnowflakeEncryptionUtil:
195
195
  in_filename: str,
196
196
  chunk_size: int = 64 * kilobyte,
197
197
  tmp_dir: str | None = None,
198
+ unsafe_file_write: bool = False,
198
199
  ) -> str:
199
200
  """Decrypts a file and stores the output in the temporary directory.
200
201
 
@@ -213,8 +214,10 @@ class SnowflakeEncryptionUtil:
213
214
  temp_output_file = os.path.join(tmp_dir, temp_output_file)
214
215
 
215
216
  logger.debug("encrypted file: %s, tmp file: %s", in_filename, temp_output_file)
217
+
218
+ file_opener = None if unsafe_file_write else owner_rw_opener
216
219
  with open(in_filename, "rb") as infile:
217
- with open(temp_output_file, "wb", opener=owner_rw_opener) as outfile:
220
+ with open(temp_output_file, "wb", opener=file_opener) as outfile:
218
221
  SnowflakeEncryptionUtil.decrypt_stream(
219
222
  metadata, encryption_material, infile, outfile, chunk_size
220
223
  )
@@ -355,6 +355,7 @@ class SnowflakeFileTransferAgent:
355
355
  source_from_stream: IO[bytes] | None = None,
356
356
  use_s3_regional_url: bool = False,
357
357
  iobound_tpe_limit: int | None = None,
358
+ unsafe_file_write: bool = False,
358
359
  ) -> None:
359
360
  self._cursor = cursor
360
361
  self._command = command
@@ -386,6 +387,7 @@ class SnowflakeFileTransferAgent:
386
387
  self._use_s3_regional_url = use_s3_regional_url
387
388
  self._credentials: StorageCredential | None = None
388
389
  self._iobound_tpe_limit = iobound_tpe_limit
390
+ self._unsafe_file_write = unsafe_file_write
389
391
 
390
392
  def execute(self) -> None:
391
393
  self._parse_command()
@@ -673,6 +675,7 @@ class SnowflakeFileTransferAgent:
673
675
  meta,
674
676
  self._stage_info,
675
677
  4 * megabyte,
678
+ unsafe_file_write=self._unsafe_file_write,
676
679
  )
677
680
  elif self._stage_location_type == AZURE_FS:
678
681
  return SnowflakeAzureRestClient(
@@ -681,6 +684,7 @@ class SnowflakeFileTransferAgent:
681
684
  AZURE_CHUNK_SIZE,
682
685
  self._stage_info,
683
686
  use_s3_regional_url=self._use_s3_regional_url,
687
+ unsafe_file_write=self._unsafe_file_write,
684
688
  )
685
689
  elif self._stage_location_type == S3_FS:
686
690
  return SnowflakeS3RestClient(
@@ -690,6 +694,7 @@ class SnowflakeFileTransferAgent:
690
694
  _chunk_size_calculator(meta.src_file_size),
691
695
  use_accelerate_endpoint=self._use_accelerate_endpoint,
692
696
  use_s3_regional_url=self._use_s3_regional_url,
697
+ unsafe_file_write=self._unsafe_file_write,
693
698
  )
694
699
  elif self._stage_location_type == GCS_FS:
695
700
  return SnowflakeGCSRestClient(
@@ -699,6 +704,7 @@ class SnowflakeFileTransferAgent:
699
704
  self._cursor._connection,
700
705
  self._command,
701
706
  use_s3_regional_url=self._use_s3_regional_url,
707
+ unsafe_file_write=self._unsafe_file_write,
702
708
  )
703
709
  raise Exception(f"{self._stage_location_type} is an unknown stage type")
704
710
 
@@ -54,6 +54,7 @@ class SnowflakeGCSRestClient(SnowflakeStorageClient):
54
54
  cnx: SnowflakeConnection,
55
55
  command: str,
56
56
  use_s3_regional_url: bool = False,
57
+ unsafe_file_write: bool = False,
57
58
  ) -> None:
58
59
  """Creates a client object with given stage credentials.
59
60
 
@@ -64,7 +65,12 @@ class SnowflakeGCSRestClient(SnowflakeStorageClient):
64
65
  The client to communicate with GCS.
65
66
  """
66
67
  super().__init__(
67
- meta, stage_info, -1, credentials=credentials, chunked_transfer=False
68
+ meta,
69
+ stage_info,
70
+ -1,
71
+ credentials=credentials,
72
+ chunked_transfer=False,
73
+ unsafe_file_write=unsafe_file_write,
68
74
  )
69
75
  self.stage_info = stage_info
70
76
  self._command = command
@@ -26,8 +26,11 @@ class SnowflakeLocalStorageClient(SnowflakeStorageClient):
26
26
  meta: SnowflakeFileMeta,
27
27
  stage_info: dict[str, Any],
28
28
  chunk_size: int,
29
+ unsafe_file_write: bool = False,
29
30
  ) -> None:
30
- super().__init__(meta, stage_info, chunk_size)
31
+ super().__init__(
32
+ meta, stage_info, chunk_size, unsafe_file_write=unsafe_file_write
33
+ )
31
34
  self.data_file = meta.src_file_name
32
35
  self.full_dst_file_name: str = os.path.join(
33
36
  stage_info["location"], os.path.basename(meta.dst_file_name)
@@ -188,6 +188,7 @@ OAUTH_AUTHENTICATOR = "OAUTH"
188
188
  ID_TOKEN_AUTHENTICATOR = "ID_TOKEN"
189
189
  USR_PWD_MFA_AUTHENTICATOR = "USERNAME_PASSWORD_MFA"
190
190
  PROGRAMMATIC_ACCESS_TOKEN = "PROGRAMMATIC_ACCESS_TOKEN"
191
+ NO_AUTH_AUTHENTICATOR = "NO_AUTH"
191
192
 
192
193
 
193
194
  def is_retryable_http_code(code: int) -> bool:
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import importlib
8
8
  import os
9
9
  import warnings
10
- from importlib.metadata import distributions
10
+ from importlib.metadata import PackageNotFoundError, distribution
11
11
  from logging import getLogger
12
12
  from types import ModuleType
13
13
  from typing import Union
@@ -85,13 +85,13 @@ def _import_or_missing_pandas_option() -> (
85
85
  os.environ["ARROW_DEFAULT_MEMORY_POOL"] = "system"
86
86
 
87
87
  # Check whether we have the currently supported pyarrow installed
88
- installed_packages = {
89
- package.metadata["Name"]: package for package in distributions()
90
- }
91
- if {"pyarrow", "snowflake-connector-python"} <= installed_packages.keys():
92
- dependencies = installed_packages[
93
- "snowflake-connector-python"
94
- ].metadata.get_all("Requires-Dist", [])
88
+ try:
89
+ pyarrow_dist = distribution("pyarrow")
90
+ snowflake_connector_dist = distribution("snowflake-connector-python")
91
+
92
+ dependencies = snowflake_connector_dist.metadata.get_all(
93
+ "Requires-Dist", []
94
+ )
95
95
  pandas_pyarrow_extra = None
96
96
  for dependency in dependencies:
97
97
  dep = Requirement(dependency)
@@ -103,16 +103,15 @@ def _import_or_missing_pandas_option() -> (
103
103
  pandas_pyarrow_extra = dep
104
104
  break
105
105
 
106
- installed_pyarrow_version = installed_packages["pyarrow"].version
106
+ installed_pyarrow_version = pyarrow_dist.version
107
107
  if not pandas_pyarrow_extra.specifier.contains(installed_pyarrow_version):
108
108
  warn_incompatible_dep(
109
109
  "pyarrow", installed_pyarrow_version, pandas_pyarrow_extra
110
110
  )
111
111
 
112
- else:
112
+ except PackageNotFoundError as e:
113
113
  logger.info(
114
- "Cannot determine if compatible pyarrow is installed because of missing package(s) from "
115
- "{}".format(list(installed_packages.keys()))
114
+ f"Cannot determine if compatible pyarrow is installed because of missing package(s): {e}"
116
115
  )
117
116
  return pandas, pyarrow, True
118
117
  except ImportError:
@@ -215,6 +215,42 @@ def _create_temp_file_format(
215
215
  return file_format_location
216
216
 
217
217
 
218
+ def _convert_value_to_sql_option(value: Union[str, bool, int, float]) -> str:
219
+ if isinstance(value, str):
220
+ if len(value) > 1 and value.startswith("'") and value.endswith("'"):
221
+ return value
222
+ else:
223
+ value = value.replace(
224
+ "'", "''"
225
+ ) # escape single quotes before adding a pair of quotes
226
+ return f"'{value}'"
227
+ else:
228
+ return str(value)
229
+
230
+
231
+ def _iceberg_config_statement_helper(iceberg_config: dict[str, str]) -> str:
232
+ ALLOWED_CONFIGS = {
233
+ "EXTERNAL_VOLUME",
234
+ "CATALOG",
235
+ "BASE_LOCATION",
236
+ "CATALOG_SYNC",
237
+ "STORAGE_SERIALIZATION_POLICY",
238
+ }
239
+
240
+ normalized = {
241
+ k.upper(): _convert_value_to_sql_option(v)
242
+ for k, v in iceberg_config.items()
243
+ if v is not None
244
+ }
245
+
246
+ if invalid_configs := set(normalized.keys()) - ALLOWED_CONFIGS:
247
+ raise ProgrammingError(
248
+ f"Invalid iceberg configurations option(s) provided {', '.join(sorted(invalid_configs))}"
249
+ )
250
+
251
+ return " ".join(f"{k}={v}" for k, v in normalized.items())
252
+
253
+
218
254
  def write_pandas(
219
255
  conn: SnowflakeConnection,
220
256
  df: pandas.DataFrame,
@@ -231,6 +267,7 @@ def write_pandas(
231
267
  overwrite: bool = False,
232
268
  table_type: Literal["", "temp", "temporary", "transient"] = "",
233
269
  use_logical_type: bool | None = None,
270
+ iceberg_config: dict[str, str] | None = None,
234
271
  **kwargs: Any,
235
272
  ) -> tuple[
236
273
  bool,
@@ -295,6 +332,14 @@ def write_pandas(
295
332
  Snowflake can interpret Parquet logical types during data loading. To enable Parquet logical types,
296
333
  set use_logical_type as True. Set to None to use Snowflakes default. For more information, see:
297
334
  https://docs.snowflake.com/en/sql-reference/sql/create-file-format
335
+ iceberg_config: A dictionary that can contain the following iceberg configuration values:
336
+ * external_volume: specifies the identifier for the external volume where
337
+ the Iceberg table stores its metadata files and data in Parquet format
338
+ * catalog: specifies either Snowflake or a catalog integration to use for this table
339
+ * base_location: the base directory that snowflake can write iceberg metadata and files to
340
+ * catalog_sync: optionally sets the catalog integration configured for Polaris Catalog
341
+ * storage_serialization_policy: specifies the storage serialization policy for the table
342
+
298
343
 
299
344
 
300
345
  Returns:
@@ -479,9 +524,14 @@ def write_pandas(
479
524
  quote_identifiers,
480
525
  )
481
526
 
527
+ iceberg = "ICEBERG " if iceberg_config else ""
528
+ iceberg_config_statement = _iceberg_config_statement_helper(
529
+ iceberg_config or {}
530
+ )
531
+
482
532
  create_table_sql = (
483
- f"CREATE {table_type.upper()} TABLE IF NOT EXISTS identifier(?) "
484
- f"({create_table_columns})"
533
+ f"CREATE {table_type.upper()} {iceberg}TABLE IF NOT EXISTS identifier(?) "
534
+ f"({create_table_columns}) {iceberg_config_statement}"
485
535
  f" /* Python:snowflake.connector.pandas_tools.write_pandas() */ "
486
536
  )
487
537
  params = (target_table_location,)
@@ -61,13 +61,20 @@ class SnowflakeS3RestClient(SnowflakeStorageClient):
61
61
  chunk_size: int,
62
62
  use_accelerate_endpoint: bool | None = None,
63
63
  use_s3_regional_url: bool = False,
64
+ unsafe_file_write: bool = False,
64
65
  ) -> None:
65
66
  """Rest client for S3 storage.
66
67
 
67
68
  Args:
68
69
  stage_info:
69
70
  """
70
- super().__init__(meta, stage_info, chunk_size, credentials=credentials)
71
+ super().__init__(
72
+ meta,
73
+ stage_info,
74
+ chunk_size,
75
+ credentials=credentials,
76
+ unsafe_file_write=unsafe_file_write,
77
+ )
71
78
  # Signature version V4
72
79
  # Addressing style Virtual Host
73
80
  self.region_name: str = stage_info["region"]