snowflake-connector-python 3.6.0__tar.gz → 3.7.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 (241) hide show
  1. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/DESCRIPTION.md +11 -0
  2. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/MANIFEST.in +1 -0
  3. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/PKG-INFO +13 -1
  4. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/setup.cfg +1 -0
  5. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/setup.py +30 -44
  6. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/arrow_context.py +5 -3
  7. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/_auth.py +2 -2
  8. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/keypair.py +2 -2
  9. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/webbrowser.py +32 -10
  10. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/azure_storage_client.py +2 -2
  11. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/config_manager.py +1 -1
  12. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/connection.py +147 -107
  13. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/connection_diagnostic.py +1 -1
  14. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter.py +20 -6
  15. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter_issue23517.py +4 -4
  16. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/cursor.py +28 -13
  17. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +7 -10
  18. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +6 -7
  19. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +25 -0
  20. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +6 -7
  21. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +459 -0
  22. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +23 -20
  23. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +129 -0
  24. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +119 -0
  25. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +959 -0
  26. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +141 -0
  27. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +51 -0
  28. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +11 -13
  29. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +40 -51
  30. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +23 -25
  31. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +10 -21
  32. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +4 -6
  33. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +10 -17
  34. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +12 -14
  35. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +4 -6
  36. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +6 -9
  37. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +15 -25
  38. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +3 -5
  39. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +38 -56
  40. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +17 -23
  41. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +4 -5
  42. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +5 -6
  43. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +8 -11
  44. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +7 -10
  45. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +6 -7
  46. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +40 -0
  47. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +6 -7
  48. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +350 -0
  49. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +47 -52
  50. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +69 -0
  51. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +7 -11
  52. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +3204 -0
  53. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +403 -289
  54. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +503 -368
  55. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +55 -31
  56. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +13 -15
  57. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +78 -57
  58. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +53 -37
  59. snowflake-connector-python-3.7.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +33260 -0
  60. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +79 -70
  61. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +19 -26
  62. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +16 -12
  63. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/network.py +8 -3
  64. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ocsp_snowflake.py +3 -3
  65. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/result_set.py +20 -3
  66. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/s3_storage_client.py +2 -2
  67. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/telemetry_oob.py +3 -1
  68. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +2 -2
  69. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/version.py +1 -1
  70. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/PKG-INFO +13 -1
  71. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -29
  72. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -486
  73. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -62
  74. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -156
  75. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -845
  76. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -161
  77. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -59
  78. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -46
  79. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -349
  80. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -76
  81. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -3169
  82. snowflake-connector-python-3.6.0/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -22428
  83. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/CONTRIBUTING.md +0 -0
  84. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/LICENSE.txt +0 -0
  85. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/NOTICE +0 -0
  86. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/README.md +0 -0
  87. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/SECURITY.md +0 -0
  88. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/pyproject.toml +0 -0
  89. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/__init__.py +0 -0
  90. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/_query_context_cache.py +0 -0
  91. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/_sql_util.py +0 -0
  92. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/__init__.py +0 -0
  93. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/by_plugin.py +0 -0
  94. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/default.py +0 -0
  95. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/idtoken.py +0 -0
  96. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/oauth.py +0 -0
  97. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/okta.py +0 -0
  98. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
  99. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/backoff_policies.py +0 -0
  100. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/bind_upload_agent.py +0 -0
  101. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/cache.py +0 -0
  102. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/compat.py +0 -0
  103. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/constants.py +0 -0
  104. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter_null.py +0 -0
  105. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/converter_snowsql.py +0 -0
  106. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/dbapi.py +0 -0
  107. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/description.py +0 -0
  108. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/encryption_util.py +0 -0
  109. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/errorcode.py +0 -0
  110. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/errors.py +0 -0
  111. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/feature.py +0 -0
  112. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/file_compression_type.py +0 -0
  113. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/file_transfer_agent.py +0 -0
  114. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/file_util.py +0 -0
  115. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/gcs_storage_client.py +0 -0
  116. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/gzip_decoder.py +0 -0
  117. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/local_storage_client.py +0 -0
  118. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
  119. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
  120. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
  121. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
  122. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
  123. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
  124. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
  125. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
  126. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
  127. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
  128. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
  129. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
  130. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
  131. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
  132. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
  133. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
  134. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
  135. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
  136. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
  137. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
  138. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
  139. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
  140. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
  141. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
  142. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
  143. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
  144. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
  145. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
  146. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
  147. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
  148. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
  149. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
  150. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
  151. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
  152. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
  153. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
  154. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/options.py +0 -0
  155. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/pandas_tools.py +0 -0
  156. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/proxy.py +0 -0
  157. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/py.typed +0 -0
  158. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/result_batch.py +0 -0
  159. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/secret_detector.py +0 -0
  160. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sf_dirs.py +0 -0
  161. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sfbinaryformat.py +0 -0
  162. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sfdatetime.py +0 -0
  163. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/snow_logging.py +0 -0
  164. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/sqlstate.py +0 -0
  165. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ssd_internal_keys.py +0 -0
  166. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
  167. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/storage_client.py +0 -0
  168. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/telemetry.py +0 -0
  169. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/test_util.py +0 -0
  170. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/time_util.py +0 -0
  171. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/__init__.py +0 -0
  172. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/dump_certs.py +0 -0
  173. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
  174. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/tool/probe_connection.py +0 -0
  175. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/url_util.py +0 -0
  176. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/util_text.py +0 -0
  177. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/__init__.py +0 -0
  178. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
  179. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
  180. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
  181. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
  182. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
  183. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/api.py +0 -0
  184. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/auth.py +0 -0
  185. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/certs.py +0 -0
  186. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/compat.py +0 -0
  187. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
  188. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
  189. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/help.py +0 -0
  190. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
  191. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/models.py +0 -0
  192. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
  193. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
  194. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/structures.py +0 -0
  195. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/requests/utils.py +0 -0
  196. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
  197. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
  198. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
  199. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
  200. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
  201. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
  202. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
  203. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
  204. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
  205. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
  206. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
  207. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
  208. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
  209. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
  210. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
  211. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
  212. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
  213. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
  214. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
  215. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
  216. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
  217. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
  218. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
  219. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
  220. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
  221. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
  222. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
  223. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
  224. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
  225. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
  226. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
  227. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
  228. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
  229. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
  230. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
  231. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
  232. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
  233. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
  234. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
  235. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
  236. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
  237. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
  238. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -0
  239. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
  240. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/requires.txt +0 -0
  241. {snowflake-connector-python-3.6.0 → snowflake-connector-python-3.7.0}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
@@ -8,6 +8,17 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
8
8
 
9
9
  # Release Notes
10
10
 
11
+ - v3.7.0(January 25,2024)
12
+
13
+ - Added a new boolean parameter `force_return_table` to `SnowflakeCursor.fetch_arrow_all` to force returning `pyarrow.Table` in case of zero rows.
14
+ - Cleanup some C++ code warnings and performance issues.
15
+ - Added support for Python 3.12
16
+ - Make local testing more robust against implicit assumptions.
17
+ - Fixed PyArrow Table type hinting
18
+ - Added support for connecting using an existing connection via the session and master token.
19
+ - Added support for connecting to Snowflake by authenticating with multiple SAML IDP using external browser.
20
+ - Fixed compilation issue due to missing cstdint header on gcc13.
21
+ - Improved config permissions warning message.
11
22
 
12
23
  - v3.6.0(December 09,2023)
13
24
 
@@ -18,6 +18,7 @@ exclude .pre-commit-config.yaml
18
18
  exclude license_header.txt
19
19
  exclude tox.ini
20
20
  exclude mypy.ini
21
+ exclude .clang-format
21
22
 
22
23
  prune ci
23
24
  prune benchmark
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: snowflake-connector-python
3
- Version: 3.6.0
3
+ Version: 3.7.0
4
4
  Summary: Snowflake Connector for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -26,6 +26,7 @@ Classifier: Programming Language :: Python :: 3.8
26
26
  Classifier: Programming Language :: Python :: 3.9
27
27
  Classifier: Programming Language :: Python :: 3.10
28
28
  Classifier: Programming Language :: Python :: 3.11
29
+ Classifier: Programming Language :: Python :: 3.12
29
30
  Classifier: Programming Language :: SQL
30
31
  Classifier: Topic :: Database
31
32
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
@@ -84,6 +85,17 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
84
85
 
85
86
  # Release Notes
86
87
 
88
+ - v3.7.0(January 25,2024)
89
+
90
+ - Added a new boolean parameter `force_return_table` to `SnowflakeCursor.fetch_arrow_all` to force returning `pyarrow.Table` in case of zero rows.
91
+ - Cleanup some C++ code warnings and performance issues.
92
+ - Added support for Python 3.12
93
+ - Make local testing more robust against implicit assumptions.
94
+ - Fixed PyArrow Table type hinting
95
+ - Added support for connecting using an existing connection via the session and master token.
96
+ - Added support for connecting to Snowflake by authenticating with multiple SAML IDP using external browser.
97
+ - Fixed compilation issue due to missing cstdint header on gcc13.
98
+ - Improved config permissions warning message.
87
99
 
88
100
  - v3.6.0(December 09,2023)
89
101
 
@@ -24,6 +24,7 @@ classifiers =
24
24
  Programming Language :: Python :: 3.9
25
25
  Programming Language :: Python :: 3.10
26
26
  Programming Language :: Python :: 3.11
27
+ Programming Language :: Python :: 3.12
27
28
  Programming Language :: SQL
28
29
  Topic :: Database
29
30
  Topic :: Scientific/Engineering :: Information Analysis
@@ -75,6 +75,8 @@ if _ABLE_TO_COMPILE_EXTENSIONS and not SNOWFLAKE_DISABLE_COMPILE_ARROW_EXTENSION
75
75
  if options["debug"]:
76
76
  ext.extra_compile_args.append("-g")
77
77
  ext.extra_link_args.append("-g")
78
+ ext.extra_compile_args.append("-O0")
79
+ ext.extra_link_args.append("-O0")
78
80
  current_dir = os.getcwd()
79
81
 
80
82
  if ext.name == "snowflake.connector.nanoarrow_arrow_iterator":
@@ -88,51 +90,35 @@ if _ABLE_TO_COMPILE_EXTENSIONS and not SNOWFLAKE_DISABLE_COMPILE_ARROW_EXTENSION
88
90
 
89
91
  ext.sources += [
90
92
  os.path.join(
91
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "CArrowIterator.cpp"
92
- ),
93
- os.path.join(
94
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "CArrowChunkIterator.cpp"
95
- ),
96
- os.path.join(
97
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "CArrowTableIterator.cpp"
98
- ),
99
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "SnowflakeType.cpp"),
100
- os.path.join(
101
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "BinaryConverter.cpp"
102
- ),
103
- os.path.join(
104
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "BooleanConverter.cpp"
105
- ),
106
- os.path.join(
107
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "DecimalConverter.cpp"
108
- ),
109
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "DateConverter.cpp"),
110
- os.path.join(
111
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "FixedSizeListConverter.cpp"
112
- ),
113
- os.path.join(
114
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "FloatConverter.cpp"
115
- ),
116
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "IntConverter.cpp"),
117
- os.path.join(
118
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "StringConverter.cpp"
119
- ),
120
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "TimeConverter.cpp"),
121
- os.path.join(
122
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "TimeStampConverter.cpp"
123
- ),
124
- os.path.join(
125
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "Python", "Common.cpp"
126
- ),
127
- os.path.join(
128
- NANOARROW_ARROW_ITERATOR_SRC_DIR, "Python", "Helpers.cpp"
129
- ),
130
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "Util", "time.cpp"),
131
- NANOARROW_LOGGING_SRC_DIR + "/logging.cpp",
132
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "nanoarrow.c"),
133
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "nanoarrow_ipc.c"),
134
- os.path.join(NANOARROW_ARROW_ITERATOR_SRC_DIR, "flatcc.c"),
93
+ NANOARROW_ARROW_ITERATOR_SRC_DIR,
94
+ *((file,) if isinstance(file, str) else file)
95
+ )
96
+ for file in {
97
+ "BinaryConverter.cpp",
98
+ "BooleanConverter.cpp",
99
+ "CArrowChunkIterator.cpp",
100
+ "CArrowIterator.cpp",
101
+ "CArrowTableIterator.cpp",
102
+ "DateConverter.cpp",
103
+ "DecimalConverter.cpp",
104
+ "FixedSizeListConverter.cpp",
105
+ "FloatConverter.cpp",
106
+ "IntConverter.cpp",
107
+ "SnowflakeType.cpp",
108
+ "StringConverter.cpp",
109
+ "TimeConverter.cpp",
110
+ "TimeStampConverter.cpp",
111
+ "flatcc.c",
112
+ "nanoarrow.c",
113
+ "nanoarrow_ipc.c",
114
+ ("Python", "Common.cpp"),
115
+ ("Python", "Helpers.cpp"),
116
+ ("Util", "time.cpp"),
117
+ }
135
118
  ]
119
+ ext.sources.append(
120
+ os.path.join(NANOARROW_LOGGING_SRC_DIR, "logging.cpp")
121
+ )
136
122
  ext.include_dirs.append(NANOARROW_ARROW_ITERATOR_SRC_DIR)
137
123
  ext.include_dirs.append(NANOARROW_LOGGING_SRC_DIR)
138
124
 
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  import decimal
9
9
  import time
10
- from datetime import datetime, timedelta, tzinfo
10
+ from datetime import datetime, timedelta, timezone, tzinfo
11
11
  from logging import getLogger
12
12
  from sys import byteorder
13
13
  from typing import TYPE_CHECKING
@@ -33,7 +33,7 @@ try:
33
33
  except ImportError:
34
34
  tzlocal = None
35
35
 
36
- ZERO_EPOCH = datetime.utcfromtimestamp(0)
36
+ ZERO_EPOCH = datetime.fromtimestamp(0, timezone.utc).replace(tzinfo=None)
37
37
 
38
38
  logger = getLogger(__name__)
39
39
 
@@ -99,7 +99,9 @@ class ArrowConverterContext:
99
99
  return t.replace(tzinfo=tzinfo)
100
100
 
101
101
  def TIMESTAMP_NTZ_to_python(self, epoch: int, microseconds: int) -> datetime:
102
- return datetime.utcfromtimestamp(epoch) + timedelta(microseconds=microseconds)
102
+ return datetime.fromtimestamp(epoch, timezone.utc).replace(
103
+ tzinfo=None
104
+ ) + timedelta(microseconds=microseconds)
103
105
 
104
106
  def TIMESTAMP_NTZ_to_python_windows(
105
107
  self, epoch: int, microseconds: int
@@ -11,7 +11,7 @@ import logging
11
11
  import tempfile
12
12
  import time
13
13
  import uuid
14
- from datetime import datetime
14
+ from datetime import datetime, timezone
15
15
  from os import getenv, makedirs, mkdir, path, remove, removedirs, rmdir
16
16
  from os.path import expanduser
17
17
  from threading import Lock, Thread
@@ -392,7 +392,7 @@ class Auth:
392
392
  "Token expires at: %s. "
393
393
  "Current Time: %s",
394
394
  str(auth_instance._jwt_token_exp),
395
- str(datetime.utcnow()),
395
+ str(datetime.now(timezone.utc).replace(tzinfo=None)),
396
396
  )
397
397
  from . import AuthByUsrPwdMfa
398
398
 
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
  import base64
9
9
  import hashlib
10
10
  import os
11
- from datetime import datetime, timedelta
11
+ from datetime import datetime, timedelta, timezone
12
12
  from logging import getLogger
13
13
  from typing import Any
14
14
 
@@ -103,7 +103,7 @@ class AuthByKeyPair(AuthByPlugin):
103
103
  account = account.upper()
104
104
  user = user.upper()
105
105
 
106
- now = datetime.utcnow()
106
+ now = datetime.now(timezone.utc).replace(tzinfo=None)
107
107
 
108
108
  if isinstance(self._private_key, bytes):
109
109
  try:
@@ -5,16 +5,18 @@
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ import base64
8
9
  import json
9
10
  import logging
10
11
  import os
12
+ import secrets
11
13
  import socket
12
14
  import time
13
15
  import webbrowser
14
16
  from types import ModuleType
15
17
  from typing import TYPE_CHECKING, Any
16
18
 
17
- from ..compat import parse_qs, urlparse, urlsplit
19
+ from ..compat import parse_qs, urlencode, urlparse, urlsplit
18
20
  from ..constants import (
19
21
  HTTP_HEADER_ACCEPT,
20
22
  HTTP_HEADER_CONTENT_TYPE,
@@ -134,10 +136,14 @@ class AuthByWebBrowser(AuthByPlugin):
134
136
  socket_connection.listen(0) # no backlog
135
137
  callback_port = socket_connection.getsockname()[1]
136
138
 
137
- logger.debug("step 1: query GS to obtain SSO url")
138
- sso_url = self._get_sso_url(
139
- conn, authenticator, service_name, account, callback_port, user
140
- )
139
+ if conn._disable_console_login:
140
+ logger.debug("step 1: query GS to obtain SSO url")
141
+ sso_url = self._get_sso_url(
142
+ conn, authenticator, service_name, account, callback_port, user
143
+ )
144
+ else:
145
+ logger.debug("step 1: constructing console login url")
146
+ sso_url = self._get_console_login_url(conn, callback_port, user)
141
147
 
142
148
  logger.debug("Validate SSO URL")
143
149
  if not is_valid_url(sso_url):
@@ -274,15 +280,13 @@ class AuthByWebBrowser(AuthByPlugin):
274
280
  content.append(f"Access-Control-Allow-Origin: {self._origin}")
275
281
  content.append("Vary: Accept-Encoding, Origin")
276
282
  else:
277
- msg = """
283
+ msg = f"""
278
284
  <!DOCTYPE html><html><head><meta charset="UTF-8"/>
279
285
  <title>SAML Response for Snowflake</title></head>
280
286
  <body>
281
- Your identity was confirmed and propagated to Snowflake {}.
287
+ Your identity was confirmed and propagated to Snowflake {self._application}.
282
288
  You can close this window now and go back where you started from.
283
- </body></html>""".format(
284
- self._application
285
- )
289
+ </body></html>"""
286
290
  content.append(f"Content-Length: {len(msg)}")
287
291
  content.append("")
288
292
  content.append(msg)
@@ -415,3 +419,21 @@ You can close this window now and go back where you started from.
415
419
  sso_url = data["ssoUrl"]
416
420
  self._proof_key = data["proofKey"]
417
421
  return sso_url
422
+
423
+ def _get_console_login_url(
424
+ self, conn: SnowflakeConnection, port: int, user: str
425
+ ) -> str:
426
+ self._proof_key = base64.b64encode(secrets.token_bytes(32)).decode("ascii")
427
+ url = (
428
+ conn._rest.server_url
429
+ + "/console/login?"
430
+ + urlencode(
431
+ {
432
+ "login_name": user,
433
+ "browser_mode_redirect_port": port,
434
+ "proof_key": self._proof_key,
435
+ }
436
+ )
437
+ )
438
+ logger.debug(f"Console Log In URL: {url}")
439
+ return url
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  import json
8
8
  import os
9
9
  import xml.etree.ElementTree as ET
10
- from datetime import datetime
10
+ from datetime import datetime, timezone
11
11
  from logging import getLogger
12
12
  from random import choice
13
13
  from string import hexdigits
@@ -90,7 +90,7 @@ class SnowflakeAzureRestClient(SnowflakeStorageClient):
90
90
  headers = {}
91
91
 
92
92
  def generate_authenticated_url_and_rest_args() -> tuple[bytes, dict[str, Any]]:
93
- curtime = datetime.utcnow()
93
+ curtime = datetime.now(timezone.utc).replace(tzinfo=None)
94
94
  timestamp = curtime.strftime("YYYY-MM-DD")
95
95
  sas_token = self.credentials.creds["AZURE_SAS_TOKEN"]
96
96
  if sas_token and sas_token.startswith("?"):
@@ -336,7 +336,7 @@ class ConfigManager:
336
336
  ):
337
337
  # for non-Windows, suggest change to 0600 permissions.
338
338
  chmod_message = (
339
- f". To change owner, run `chown $USER {str(filep)}`. To restrict permissions, run `chmod 0600 {str(filep)}`."
339
+ f'.\n * To change owner, run `chown $USER "{str(filep)}"`.\n * To restrict permissions, run `chmod 0600 "{str(filep)}"`.\n'
340
340
  if not IS_WINDOWS
341
341
  else ""
342
342
  )
@@ -256,6 +256,22 @@ DEFAULT_CONFIGURATION: dict[str, tuple[Any, type | tuple[type, ...]]] = {
256
256
  True,
257
257
  bool,
258
258
  ), # Enable sending retryReason in response header for query-requests
259
+ "session_token": (
260
+ None,
261
+ (type(None), str),
262
+ ), # session token from another connection, to be provided together with master token
263
+ "master_token": (
264
+ None,
265
+ (type(None), str),
266
+ ), # master token from another connection, to be provided together with session token
267
+ "master_validity_in_seconds": (
268
+ None,
269
+ (type(None), int),
270
+ ), # master token validity in seconds
271
+ "disable_console_login": (
272
+ True,
273
+ bool,
274
+ ), # Disable console login and fall back to getting SSO URL from GS
259
275
  }
260
276
 
261
277
  APPLICATION_RE = re.compile(r"[\w\d_]+")
@@ -913,100 +929,123 @@ class SnowflakeConnection:
913
929
 
914
930
  # Setup authenticator
915
931
  auth = Auth(self.rest)
916
- if self.auth_class is not None:
917
- if type(
918
- self.auth_class
919
- ) not in FIRST_PARTY_AUTHENTICATORS and not issubclass(
920
- type(self.auth_class), AuthByKeyPair
921
- ):
922
- raise TypeError("auth_class must be a child class of AuthByKeyPair")
923
- # TODO: add telemetry for custom auth
924
- self.auth_class = self.auth_class
925
- elif self._authenticator == DEFAULT_AUTHENTICATOR:
926
- self.auth_class = AuthByDefault(
927
- password=self._password,
928
- timeout=self._login_timeout,
929
- backoff_generator=self._backoff_generator,
930
- )
931
- elif self._authenticator == EXTERNAL_BROWSER_AUTHENTICATOR:
932
- self._session_parameters[PARAMETER_CLIENT_STORE_TEMPORARY_CREDENTIAL] = (
933
- self._client_store_temporary_credential if IS_LINUX else True
934
- )
935
- auth.read_temporary_credentials(
936
- self.host,
937
- self.user,
938
- self._session_parameters,
932
+
933
+ if self._session_token and self._master_token:
934
+ auth._rest.update_tokens(
935
+ self._session_token,
936
+ self._master_token,
937
+ self._master_validity_in_seconds,
939
938
  )
940
- # Depending on whether self._rest.id_token is available we do different
941
- # auth_instance
942
- if self._rest.id_token is None:
943
- self.auth_class = AuthByWebBrowser(
944
- application=self.application,
945
- protocol=self._protocol,
946
- host=self.host,
947
- port=self.port,
948
- timeout=self._login_timeout,
949
- backoff_generator=self._backoff_generator,
939
+ heartbeat_ret = auth._rest._heartbeat()
940
+ logger.debug(heartbeat_ret)
941
+ if not heartbeat_ret or not heartbeat_ret.get("success"):
942
+ Error.errorhandler_wrapper(
943
+ self,
944
+ None,
945
+ ProgrammingError,
946
+ {
947
+ "msg": "Session and master tokens invalid",
948
+ "errno": ER_INVALID_VALUE,
949
+ },
950
950
  )
951
951
  else:
952
- self.auth_class = AuthByIdToken(
953
- id_token=self._rest.id_token,
954
- application=self.application,
955
- protocol=self._protocol,
956
- host=self.host,
957
- port=self.port,
952
+ logger.debug("Session and master token validation successful.")
953
+
954
+ else:
955
+ if self.auth_class is not None:
956
+ if type(
957
+ self.auth_class
958
+ ) not in FIRST_PARTY_AUTHENTICATORS and not issubclass(
959
+ type(self.auth_class), AuthByKeyPair
960
+ ):
961
+ raise TypeError("auth_class must be a child class of AuthByKeyPair")
962
+ # TODO: add telemetry for custom auth
963
+ self.auth_class = self.auth_class
964
+ elif self._authenticator == DEFAULT_AUTHENTICATOR:
965
+ self.auth_class = AuthByDefault(
966
+ password=self._password,
958
967
  timeout=self._login_timeout,
959
968
  backoff_generator=self._backoff_generator,
960
969
  )
961
-
962
- elif self._authenticator == KEY_PAIR_AUTHENTICATOR:
963
- private_key = self._private_key
964
-
965
- if self._private_key_file:
966
- private_key = _get_private_bytes_from_file(
967
- self._private_key_file,
968
- self._private_key_file_pwd,
969
- )
970
-
971
- self.auth_class = AuthByKeyPair(
972
- private_key=private_key,
973
- timeout=self._login_timeout,
974
- backoff_generator=self._backoff_generator,
975
- )
976
- elif self._authenticator == OAUTH_AUTHENTICATOR:
977
- self.auth_class = AuthByOAuth(
978
- oauth_token=self._token,
979
- timeout=self._login_timeout,
980
- backoff_generator=self._backoff_generator,
981
- )
982
- elif self._authenticator == USR_PWD_MFA_AUTHENTICATOR:
983
- self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN] = (
984
- self._client_request_mfa_token if IS_LINUX else True
985
- )
986
- if self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN]:
970
+ elif self._authenticator == EXTERNAL_BROWSER_AUTHENTICATOR:
971
+ self._session_parameters[
972
+ PARAMETER_CLIENT_STORE_TEMPORARY_CREDENTIAL
973
+ ] = (self._client_store_temporary_credential if IS_LINUX else True)
987
974
  auth.read_temporary_credentials(
988
975
  self.host,
989
976
  self.user,
990
977
  self._session_parameters,
991
978
  )
992
- self.auth_class = AuthByUsrPwdMfa(
993
- password=self._password,
994
- mfa_token=self.rest.mfa_token,
995
- timeout=self._login_timeout,
996
- backoff_generator=self._backoff_generator,
997
- )
998
- else:
999
- # okta URL, e.g., https://<account>.okta.com/
1000
- self.auth_class = AuthByOkta(
1001
- application=self.application,
1002
- timeout=self._login_timeout,
1003
- backoff_generator=self._backoff_generator,
1004
- )
979
+ # Depending on whether self._rest.id_token is available we do different
980
+ # auth_instance
981
+ if self._rest.id_token is None:
982
+ self.auth_class = AuthByWebBrowser(
983
+ application=self.application,
984
+ protocol=self._protocol,
985
+ host=self.host,
986
+ port=self.port,
987
+ timeout=self._login_timeout,
988
+ backoff_generator=self._backoff_generator,
989
+ )
990
+ else:
991
+ self.auth_class = AuthByIdToken(
992
+ id_token=self._rest.id_token,
993
+ application=self.application,
994
+ protocol=self._protocol,
995
+ host=self.host,
996
+ port=self.port,
997
+ timeout=self._login_timeout,
998
+ backoff_generator=self._backoff_generator,
999
+ )
1000
+
1001
+ elif self._authenticator == KEY_PAIR_AUTHENTICATOR:
1002
+ private_key = self._private_key
1003
+
1004
+ if self._private_key_file:
1005
+ private_key = _get_private_bytes_from_file(
1006
+ self._private_key_file,
1007
+ self._private_key_file_pwd,
1008
+ )
1009
+
1010
+ self.auth_class = AuthByKeyPair(
1011
+ private_key=private_key,
1012
+ timeout=self._login_timeout,
1013
+ backoff_generator=self._backoff_generator,
1014
+ )
1015
+ elif self._authenticator == OAUTH_AUTHENTICATOR:
1016
+ self.auth_class = AuthByOAuth(
1017
+ oauth_token=self._token,
1018
+ timeout=self._login_timeout,
1019
+ backoff_generator=self._backoff_generator,
1020
+ )
1021
+ elif self._authenticator == USR_PWD_MFA_AUTHENTICATOR:
1022
+ self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN] = (
1023
+ self._client_request_mfa_token if IS_LINUX else True
1024
+ )
1025
+ if self._session_parameters[PARAMETER_CLIENT_REQUEST_MFA_TOKEN]:
1026
+ auth.read_temporary_credentials(
1027
+ self.host,
1028
+ self.user,
1029
+ self._session_parameters,
1030
+ )
1031
+ self.auth_class = AuthByUsrPwdMfa(
1032
+ password=self._password,
1033
+ mfa_token=self.rest.mfa_token,
1034
+ timeout=self._login_timeout,
1035
+ backoff_generator=self._backoff_generator,
1036
+ )
1037
+ else:
1038
+ # okta URL, e.g., https://<account>.okta.com/
1039
+ self.auth_class = AuthByOkta(
1040
+ application=self.application,
1041
+ timeout=self._login_timeout,
1042
+ backoff_generator=self._backoff_generator,
1043
+ )
1005
1044
 
1006
- self.authenticate_with_retry(self.auth_class)
1045
+ self.authenticate_with_retry(self.auth_class)
1007
1046
 
1008
- self._password = None # ensure password won't persist
1009
- self.auth_class.reset_secrets()
1047
+ self._password = None # ensure password won't persist
1048
+ self.auth_class.reset_secrets()
1010
1049
 
1011
1050
  self.initialize_query_context_cache()
1012
1051
 
@@ -1115,34 +1154,35 @@ class SnowflakeConnection:
1115
1154
  ]:
1116
1155
  self._authenticator = auth_tmp
1117
1156
 
1118
- if not self.user and self._authenticator != OAUTH_AUTHENTICATOR:
1119
- # OAuth Authentication does not require a username
1120
- Error.errorhandler_wrapper(
1121
- self,
1122
- None,
1123
- ProgrammingError,
1124
- {"msg": "User is empty", "errno": ER_NO_USER},
1125
- )
1157
+ if not (self._master_token and self._session_token):
1158
+ if not self.user and self._authenticator != OAUTH_AUTHENTICATOR:
1159
+ # OAuth Authentication does not require a username
1160
+ Error.errorhandler_wrapper(
1161
+ self,
1162
+ None,
1163
+ ProgrammingError,
1164
+ {"msg": "User is empty", "errno": ER_NO_USER},
1165
+ )
1126
1166
 
1127
- if self._private_key or self._private_key_file:
1128
- self._authenticator = KEY_PAIR_AUTHENTICATOR
1167
+ if self._private_key or self._private_key_file:
1168
+ self._authenticator = KEY_PAIR_AUTHENTICATOR
1129
1169
 
1130
- if (
1131
- self.auth_class is None
1132
- and self._authenticator
1133
- not in [
1134
- EXTERNAL_BROWSER_AUTHENTICATOR,
1135
- OAUTH_AUTHENTICATOR,
1136
- KEY_PAIR_AUTHENTICATOR,
1137
- ]
1138
- and not self._password
1139
- ):
1140
- Error.errorhandler_wrapper(
1141
- self,
1142
- None,
1143
- ProgrammingError,
1144
- {"msg": "Password is empty", "errno": ER_NO_PASSWORD},
1145
- )
1170
+ if (
1171
+ self.auth_class is None
1172
+ and self._authenticator
1173
+ not in [
1174
+ EXTERNAL_BROWSER_AUTHENTICATOR,
1175
+ OAUTH_AUTHENTICATOR,
1176
+ KEY_PAIR_AUTHENTICATOR,
1177
+ ]
1178
+ and not self._password
1179
+ ):
1180
+ Error.errorhandler_wrapper(
1181
+ self,
1182
+ None,
1183
+ ProgrammingError,
1184
+ {"msg": "Password is empty", "errno": ER_NO_PASSWORD},
1185
+ )
1146
1186
 
1147
1187
  if not self._account:
1148
1188
  Error.errorhandler_wrapper(
@@ -211,7 +211,7 @@ class ConnectionDiagnostic:
211
211
  conn.send(str.encode(connect))
212
212
  conn.recv(4096).decode("utf-8")
213
213
 
214
- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
214
+ context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
215
215
  sock = context.wrap_socket(conn, server_hostname=host)
216
216
  certificate = ssl.DER_cert_to_PEM_cert(sock.getpeercert(True))
217
217
  conn.close()