snowflake-snowpark-python 1.51.0__tar.gz → 1.52.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 (242) hide show
  1. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/CHANGELOG.md +29 -1
  2. {snowflake_snowpark_python-1.51.0/src/snowflake_snowpark_python.egg-info → snowflake_snowpark_python-1.52.0}/PKG-INFO +4 -5
  3. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/README.md +2 -2
  4. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/setup.py +2 -3
  5. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/analyzer_utils.py +1 -8
  6. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/datatype_mapper.py +0 -2
  7. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/select_statement.py +2 -9
  8. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan.py +1 -7
  9. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan_node.py +1 -9
  10. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/table_function.py +1 -9
  11. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/code_generation.py +1 -7
  12. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/cte_utils.py +6 -1
  13. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/repeated_subquery_elimination.py +38 -10
  14. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/debug_utils.py +1 -1
  15. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/type_utils.py +1 -7
  16. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/udf_utils.py +2 -8
  17. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/utils.py +27 -3
  18. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/xml_schema_inference.py +1 -1
  19. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/column.py +1 -8
  20. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/context.py +28 -20
  21. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe.py +17 -10
  22. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe_ai_functions.py +4 -4
  23. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe_na_functions.py +1 -9
  24. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe_reader.py +59 -11
  25. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe_stat_functions.py +1 -9
  26. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe_writer.py +1 -9
  27. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/files.py +1 -8
  28. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/functions.py +5 -12
  29. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/__init__.py +2 -2
  30. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/ordered_dataframe.py +1 -8
  31. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/indexing_overrides.py +1 -1
  32. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/pd_extensions.py +1 -1
  33. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/utils.py +2 -2
  34. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/row.py +1 -9
  35. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/secrets.py +39 -0
  36. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/session.py +134 -48
  37. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/stored_procedure.py +1 -7
  38. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/table.py +13 -8
  39. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/types.py +3 -9
  40. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/udaf.py +1 -7
  41. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/udf.py +1 -7
  42. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/udtf.py +1 -7
  43. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/version.py +1 -1
  44. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/window.py +1 -7
  45. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0/src/snowflake_snowpark_python.egg-info}/PKG-INFO +4 -5
  46. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/LICENSE.txt +0 -0
  47. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/MANIFEST.in +0 -0
  48. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/pyproject.toml +0 -0
  49. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/setup.cfg +0 -0
  50. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/__init__.py +0 -0
  51. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_functions/__init__.py +0 -0
  52. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_functions/general_functions.py +0 -0
  53. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_functions/scalar_functions.py +0 -0
  54. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/__init__.py +0 -0
  55. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/__init__.py +0 -0
  56. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/analyzer.py +0 -0
  57. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/binary_expression.py +0 -0
  58. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/binary_plan_node.py +0 -0
  59. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/expression.py +0 -0
  60. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/grouping_set.py +0 -0
  61. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/metadata_utils.py +0 -0
  62. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/query_plan_analysis_utils.py +0 -0
  63. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/schema_utils.py +0 -0
  64. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/sort_expression.py +0 -0
  65. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/table_merge_expression.py +0 -0
  66. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/unary_expression.py +0 -0
  67. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/unary_plan_node.py +0 -0
  68. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/analyzer/window_expression.py +0 -0
  69. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/ast/__init__.py +0 -0
  70. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/ast/batch.py +0 -0
  71. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/ast/builder.py +0 -0
  72. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/ast/utils.py +0 -0
  73. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/__init__.py +0 -0
  74. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/large_query_breakdown.py +0 -0
  75. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/plan_compiler.py +0 -0
  76. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/query_generator.py +0 -0
  77. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/telemetry_constants.py +0 -0
  78. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/compiler/utils.py +0 -0
  79. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/__init__.py +0 -0
  80. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/datasource_partitioner.py +0 -0
  81. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/datasource_reader.py +0 -0
  82. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/datasource_typing.py +0 -0
  83. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/__init__.py +0 -0
  84. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/base_dialect.py +0 -0
  85. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/databricks_dialect.py +0 -0
  86. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/mysql_dialect.py +0 -0
  87. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/oracledb_dialect.py +0 -0
  88. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/postgresql_dialect.py +0 -0
  89. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/sqlite3_dialect.py +0 -0
  90. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/sqlserver_dialect.py +0 -0
  91. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/__init__.py +0 -0
  92. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/base_driver.py +0 -0
  93. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/databricks_driver.py +0 -0
  94. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/oracledb_driver.py +0 -0
  95. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/psycopg2_driver.py +0 -0
  96. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/pymsql_driver.py +0 -0
  97. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/pyodbc_driver.py +0 -0
  98. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/drivers/sqlite_driver.py +0 -0
  99. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/jdbc.py +0 -0
  100. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/data_source/utils.py +0 -0
  101. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/error_message.py +0 -0
  102. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/event_table_telemetry.py +0 -0
  103. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/open_telemetry.py +0 -0
  104. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/packaging_utils.py +0 -0
  105. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/proto/generated/__init__.py +0 -0
  106. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.py +0 -0
  107. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.pyi +0 -0
  108. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/select_projection_complexity_utils.py +0 -0
  109. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/server_connection.py +0 -0
  110. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/snowpark_profiler.py +0 -0
  111. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/telemetry.py +0 -0
  112. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/temp_table_auto_cleaner.py +0 -0
  113. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/xml_reader.py +0 -0
  114. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/_internal/xpath_handlers.py +0 -0
  115. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/async_job.py +0 -0
  116. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/catalog.py +0 -0
  117. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe_analytics_functions.py +0 -0
  118. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/dataframe_profiler.py +0 -0
  119. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/exceptions.py +0 -0
  120. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/file_operation.py +0 -0
  121. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/lineage.py +0 -0
  122. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/__init__.py +0 -0
  123. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_analyzer.py +0 -0
  124. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_connection.py +0 -0
  125. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_constants.py +0 -0
  126. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_functions.py +0 -0
  127. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_nop_analyzer.py +0 -0
  128. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_nop_connection.py +0 -0
  129. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_nop_plan.py +0 -0
  130. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_options.py +0 -0
  131. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_pandas_util.py +0 -0
  132. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_plan.py +0 -0
  133. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_plan_builder.py +0 -0
  134. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_select_statement.py +0 -0
  135. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_snowflake_data_type.py +0 -0
  136. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_snowflake_to_pandas_converter.py +0 -0
  137. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_stage_registry.py +0 -0
  138. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_stored_procedure.py +0 -0
  139. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_telemetry.py +0 -0
  140. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_udaf.py +0 -0
  141. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_udf.py +0 -0
  142. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_udf_utils.py +0 -0
  143. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_udtf.py +0 -0
  144. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_util.py +0 -0
  145. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/_window_utils.py +0 -0
  146. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/mock/exceptions.py +0 -0
  147. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/__init__.py +0 -0
  148. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/config/__init__.py +0 -0
  149. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/config/__main__.py +0 -0
  150. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/config/envvars.py +0 -0
  151. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/config/pubsub.py +0 -0
  152. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/conftest.py +0 -0
  153. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/__init__.py +0 -0
  154. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/aggregation_utils.py +0 -0
  155. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/align_utils.py +0 -0
  156. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/apply_utils.py +0 -0
  157. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/binary_op_utils.py +0 -0
  158. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/concat_utils.py +0 -0
  159. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/cumulative_utils.py +0 -0
  160. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/cut_utils.py +0 -0
  161. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/frame.py +0 -0
  162. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/generator_utils.py +0 -0
  163. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/get_dummies_utils.py +0 -0
  164. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/groupby_utils.py +0 -0
  165. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/indexing_utils.py +0 -0
  166. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/io_utils.py +0 -0
  167. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/isin_utils.py +0 -0
  168. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/join_utils.py +0 -0
  169. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/pivot_utils.py +0 -0
  170. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/resample_utils.py +0 -0
  171. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/row_count_estimation.py +0 -0
  172. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/session.py +0 -0
  173. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/snowpark_pandas_types.py +0 -0
  174. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/statement_params_constants.py +0 -0
  175. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/telemetry.py +0 -0
  176. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/timestamp_utils.py +0 -0
  177. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/transpose_utils.py +0 -0
  178. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/type_utils.py +0 -0
  179. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/unpivot_utils.py +0 -0
  180. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/utils.py +0 -0
  181. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/where_utils.py +0 -0
  182. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_internal/window_utils.py +0 -0
  183. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/_typing.py +0 -0
  184. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/compiler/__init__.py +0 -0
  185. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/compiler/doc_utils.py +0 -0
  186. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/compiler/ray_utils.py +0 -0
  187. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/compiler/snowflake_query_compiler.py +0 -0
  188. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/__init__.py +0 -0
  189. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/base.py +0 -0
  190. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/dataframe.py +0 -0
  191. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/datetime_index.py +0 -0
  192. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/general.py +0 -0
  193. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/groupby.py +0 -0
  194. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/index.py +0 -0
  195. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/io.py +0 -0
  196. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/resample.py +0 -0
  197. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/series.py +0 -0
  198. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/series_utils.py +0 -0
  199. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/shared_docs.py +0 -0
  200. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/timedelta_index.py +0 -0
  201. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/docstrings/window.py +0 -0
  202. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/__init__.py +0 -0
  203. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/base_overrides.py +0 -0
  204. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_extensions.py +0 -0
  205. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_groupby_overrides.py +0 -0
  206. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_overrides.py +0 -0
  207. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/datetime_index.py +0 -0
  208. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/general_overrides.py +0 -0
  209. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/index.py +0 -0
  210. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/io_overrides.py +0 -0
  211. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/resample_overrides.py +0 -0
  212. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/resampler_groupby_overrides.py +0 -0
  213. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/rolling_groupby_overrides.py +0 -0
  214. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/series_extensions.py +0 -0
  215. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/series_groupby_overrides.py +0 -0
  216. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/series_overrides.py +0 -0
  217. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/snow_partition_iterator.py +0 -0
  218. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/timedelta_index.py +0 -0
  219. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/extensions/window_overrides.py +0 -0
  220. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/io/__init__.py +0 -0
  221. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/io/factories.py +0 -0
  222. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/io/snow_io.py +0 -0
  223. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/utils/__init__.py +0 -0
  224. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/utils/error_message.py +0 -0
  225. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/utils/exceptions.py +0 -0
  226. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/utils/frontend_constants.py +0 -0
  227. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/utils/numpy_to_pandas.py +0 -0
  228. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/plugin/utils/warning_message.py +0 -0
  229. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/modin/utils.py +0 -0
  230. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/py.typed +0 -0
  231. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/query_history.py +0 -0
  232. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/relational_grouped_dataframe.py +0 -0
  233. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/stored_procedure_profiler.py +0 -0
  234. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/table_function.py +0 -0
  235. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/testing.py +0 -0
  236. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake/snowpark/udf_profiler.py +0 -0
  237. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake_snowpark_python.egg-info/SOURCES.txt +0 -0
  238. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake_snowpark_python.egg-info/dependency_links.txt +0 -0
  239. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake_snowpark_python.egg-info/namespace_packages.txt +0 -0
  240. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake_snowpark_python.egg-info/not-zip-safe +0 -0
  241. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake_snowpark_python.egg-info/requires.txt +0 -0
  242. {snowflake_snowpark_python-1.51.0 → snowflake_snowpark_python-1.52.0}/src/snowflake_snowpark_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,34 @@
1
1
  # Release History
2
2
 
3
- ## 1.51.0 (2026-05-14)
3
+ ## 1.52.0 (2026-06-10)
4
+
5
+ ### Snowpark Python API Updates
6
+
7
+ #### New Features
8
+
9
+ - Added `get_wif_token` to `snowflake.snowpark.secrets` for workload identity federation tokens on the Snowflake server (not available in SPCS file-based secret environments).
10
+
11
+ #### Bug Fixes
12
+
13
+ - Fixed a bug where copying a `DataFrame` via `copy.copy()` lost post-aggregate state, causing subsequent `.limit()` or `.sort()` to generate incorrect SQL.
14
+ - Fixed a bug where calling `DataFrame.alias()` twice on the same DataFrame (e.g. for a self-join) caused both aliases to share the same internal column-mapping dictionary. This made `col("R", "col")` resolve to the same column as `col("L", "col")`, producing incorrect join conditions and filter expressions.
15
+ - Fixed a bug where `cloudpickle` could not be resolved when registering a Python stored procedure or UDF with `runtime_version='3.13'`.
16
+
17
+ #### Improvements
18
+
19
+ - Improved CTE optimization to deduplicate identical subtrees in self-joins, which were previously emitted as repeated subqueries.
20
+
21
+ #### Deprecations
22
+
23
+ - Removed support for Python 3.9.
24
+
25
+ ## 1.51.1 (2026-05-28)
26
+
27
+ #### Documentation
28
+
29
+ - Clarified that the JDBC driver JAR referenced via `udtf_configs.imports` in `DataFrameReader.jdbc()` must be downloaded from the database vendor and uploaded to a Snowflake stage.
30
+
31
+ ## 1.51.0 (2026-05-18)
4
32
 
5
33
  ### Snowpark Python API Updates
6
34
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-snowpark-python
3
- Version: 1.51.0
3
+ Version: 1.52.0
4
4
  Summary: Snowflake Snowpark for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -22,7 +22,6 @@ Classifier: License :: OSI Approved :: Apache Software License
22
22
  Classifier: Operating System :: OS Independent
23
23
  Classifier: Programming Language :: SQL
24
24
  Classifier: Programming Language :: Python :: 3 :: Only
25
- Classifier: Programming Language :: Python :: 3.9
26
25
  Classifier: Programming Language :: Python :: 3.10
27
26
  Classifier: Programming Language :: Python :: 3.11
28
27
  Classifier: Programming Language :: Python :: 3.12
@@ -33,7 +32,7 @@ Classifier: Topic :: Software Development :: Libraries
33
32
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
34
33
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
35
34
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
36
- Requires-Python: >=3.9, <3.15
35
+ Requires-Python: >=3.10, <3.15
37
36
  Description-Content-Type: text/markdown
38
37
  License-File: LICENSE.txt
39
38
  Requires-Dist: setuptools>=40.6.0
@@ -149,9 +148,9 @@ If you don't have a Snowflake account yet, you can [sign up for a 30-day free tr
149
148
 
150
149
  ### Create a Python virtual environment
151
150
  You can use [miniconda][miniconda], [anaconda][anaconda], or [virtualenv][virtualenv]
152
- to create a Python 3.9, 3.10, 3.11, 3.12 or 3.13 virtual environment.
151
+ to create a Python 3.10, 3.11, 3.12 or 3.13 virtual environment.
153
152
 
154
- For Snowpark pandas, only Python 3.9, 3.10, or 3.11 is supported.
153
+ For Snowpark pandas, only Python 3.10 or 3.11 is supported.
155
154
 
156
155
  To have the best experience when using it with UDFs, [creating a local conda environment with the Snowflake channel][use snowflake channel] is recommended.
157
156
 
@@ -18,9 +18,9 @@ If you don't have a Snowflake account yet, you can [sign up for a 30-day free tr
18
18
 
19
19
  ### Create a Python virtual environment
20
20
  You can use [miniconda][miniconda], [anaconda][anaconda], or [virtualenv][virtualenv]
21
- to create a Python 3.9, 3.10, 3.11, 3.12 or 3.13 virtual environment.
21
+ to create a Python 3.10, 3.11, 3.12 or 3.13 virtual environment.
22
22
 
23
- For Snowpark pandas, only Python 3.9, 3.10, or 3.11 is supported.
23
+ For Snowpark pandas, only Python 3.10 or 3.11 is supported.
24
24
 
25
25
  To have the best experience when using it with UDFs, [creating a local conda environment with the Snowflake channel][use snowflake channel] is recommended.
26
26
 
@@ -32,10 +32,10 @@ INSTALL_REQ_LIST = [
32
32
  "python-dateutil", # Snowpark IR
33
33
  "tzlocal", # Snowpark IR
34
34
  ]
35
- REQUIRED_PYTHON_VERSION = ">=3.9, <3.15"
35
+ REQUIRED_PYTHON_VERSION = ">=3.10, <3.15"
36
36
 
37
37
  if os.getenv("SNOWFLAKE_IS_PYTHON_RUNTIME_TEST", False):
38
- REQUIRED_PYTHON_VERSION = ">=3.9"
38
+ REQUIRED_PYTHON_VERSION = ">=3.10"
39
39
 
40
40
  PANDAS_REQUIREMENTS = [
41
41
  f"snowflake-connector-python[pandas]{CONNECTOR_DEPENDENCY_VERSION}",
@@ -246,7 +246,6 @@ setup(
246
246
  "Operating System :: OS Independent",
247
247
  "Programming Language :: SQL",
248
248
  "Programming Language :: Python :: 3 :: Only",
249
- "Programming Language :: Python :: 3.9",
250
249
  "Programming Language :: Python :: 3.10",
251
250
  "Programming Language :: Python :: 3.11",
252
251
  "Programming Language :: Python :: 3.12",
@@ -6,7 +6,6 @@
6
6
  import json
7
7
  import math
8
8
  import os
9
- import sys
10
9
  import tempfile
11
10
  from typing import Any, Dict, List, Optional, Tuple, Union, Literal, Sequence
12
11
 
@@ -52,13 +51,7 @@ from snowflake.snowpark._internal.utils import (
52
51
  from snowflake.snowpark.row import Row
53
52
  from snowflake.snowpark.types import DataType
54
53
 
55
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
56
- # Python 3.9 can use both
57
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
58
- if sys.version_info <= (3, 9):
59
- from typing import Iterable
60
- else:
61
- from collections.abc import Iterable
54
+ from collections.abc import Iterable
62
55
 
63
56
  LEFT_PARENTHESIS = "("
64
57
  RIGHT_PARENTHESIS = ")"
@@ -518,8 +518,6 @@ def schema_expression(data_type: DataType, is_nullable: bool) -> str:
518
518
  return "PARSE_JSON('NULL') :: VARIANT"
519
519
  return "NULL :: " + convert_sp_to_sf_type(data_type)
520
520
 
521
- if isinstance(data_type, DecFloatType):
522
- return "DECFLOAT '0'"
523
521
  if isinstance(data_type, _NumericType):
524
522
  return "0 :: " + convert_sp_to_sf_type(data_type)
525
523
  if isinstance(data_type, StringType):
@@ -2,7 +2,6 @@
2
2
  # Copyright (c) 2012-2025 Snowflake Computing Inc. All rights reserved.
3
3
  #
4
4
 
5
- import sys
6
5
  import uuid
7
6
  import re
8
7
  from abc import ABC, abstractmethod
@@ -90,13 +89,7 @@ from snowflake.snowpark._internal.utils import (
90
89
  )
91
90
  import snowflake.snowpark.context as context
92
91
 
93
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
94
- # Python 3.9 can use both
95
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
96
- if sys.version_info <= (3, 9):
97
- from typing import Iterable
98
- else:
99
- from collections.abc import Iterable
92
+ from collections.abc import Iterable
100
93
 
101
94
  SET_UNION = analyzer_utils.UNION
102
95
  SET_UNION_ALL = analyzer_utils.UNION_ALL
@@ -963,7 +956,7 @@ class SelectStatement(Selectable):
963
956
  new._snowflake_plan = None
964
957
  new.flatten_disabled = False # by default a SelectStatement can be flattened.
965
958
  new._api_calls = self._api_calls.copy() if self._api_calls is not None else None
966
- new.df_aliased_col_name_to_real_col_name = (
959
+ new.df_aliased_col_name_to_real_col_name = deepcopy(
967
960
  self.df_aliased_col_name_to_real_col_name
968
961
  )
969
962
  new._merge_projection_complexity_with_subquery = (
@@ -143,13 +143,7 @@ from snowflake.snowpark.row import Row
143
143
  from snowflake.snowpark.types import StructType
144
144
  import snowflake.snowpark.context as context
145
145
 
146
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
147
- # Python 3.9 can use both
148
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
149
- if sys.version_info <= (3, 9):
150
- from typing import Iterable
151
- else:
152
- from collections.abc import Iterable
146
+ from collections.abc import Iterable
153
147
 
154
148
  _logger = getLogger(__name__)
155
149
 
@@ -3,7 +3,7 @@
3
3
  # Copyright (c) 2012-2025 Snowflake Computing Inc. All rights reserved.
4
4
  #
5
5
 
6
- import sys
6
+ from collections.abc import Iterable
7
7
  from enum import Enum
8
8
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple
9
9
 
@@ -17,14 +17,6 @@ from snowflake.snowpark._internal.analyzer.query_plan_analysis_utils import (
17
17
  from snowflake.snowpark.row import Row
18
18
  from snowflake.snowpark.types import StructType
19
19
 
20
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
21
- # Python 3.9 can use both
22
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
23
- if sys.version_info <= (3, 9):
24
- from typing import Iterable
25
- else:
26
- from collections.abc import Iterable
27
-
28
20
  if TYPE_CHECKING:
29
21
  from snowflake.snowpark import Session
30
22
  from snowflake.snowpark.udtf import UserDefinedTableFunction
@@ -2,7 +2,7 @@
2
2
  # Copyright (c) 2012-2025 Snowflake Computing Inc. All rights reserved.
3
3
  #
4
4
 
5
- import sys
5
+ from collections.abc import Iterable
6
6
  from typing import Dict, List, Optional
7
7
 
8
8
  from snowflake.snowpark._internal.analyzer.expression import Expression
@@ -13,14 +13,6 @@ from snowflake.snowpark._internal.analyzer.query_plan_analysis_utils import (
13
13
  from snowflake.snowpark._internal.analyzer.snowflake_plan_node import LogicalPlan
14
14
  from snowflake.snowpark._internal.analyzer.sort_expression import SortOrder
15
15
 
16
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
17
- # Python 3.9 can use both
18
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
19
- if sys.version_info <= (3, 9):
20
- from typing import Iterable
21
- else:
22
- from collections.abc import Iterable
23
-
24
16
 
25
17
  class TableFunctionPartitionSpecDefinition(Expression):
26
18
  def __init__(
@@ -17,13 +17,7 @@ from typing import Any, Dict, List, Set, Tuple, Union
17
17
 
18
18
  import opcode
19
19
 
20
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
21
- # Python 3.9 can use both
22
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
23
- if sys.version_info <= (3, 9):
24
- from typing import Iterable
25
- else:
26
- from collections.abc import Iterable
20
+ from collections.abc import Iterable
27
21
 
28
22
  logger = getLogger(__name__)
29
23
 
@@ -307,7 +307,12 @@ def encode_query_id(node: "TreeNode") -> Optional[str]:
307
307
  if query_params:
308
308
  string = f"{string}#{query_params}"
309
309
  if hasattr(node, "expr_to_alias") and node.expr_to_alias:
310
- string = f"{string}#{stringify(node.expr_to_alias)}"
310
+ # Hash by alias values only, not the UUID keys, since UUID keys are regenerated on every deep-copy/re-resolve (e.g. the two
311
+ # branches of a self-join). This lets nodes representing the same computation hash identically, enabling CTE dedup for self-joins.
312
+ # NOTE: since nodes with different UUID keys can now share a CTE, _replace_duplicate_node_with_cte must merge each duplicate's
313
+ # UUID→alias entries into the shared CTE so parent re-resolution can resolve any UUID variant (see companion comment there).
314
+ # Different alias values (e.g. a "_WITH_AD_GROUP" join suffix from _disambiguate) still hash differently, preserving SNOW-2261400.
315
+ string = f"{string}#{sorted(set(node.expr_to_alias.values()))}"
311
316
  if (
312
317
  hasattr(node, "df_aliased_col_name_to_real_col_name")
313
318
  and node.df_aliased_col_name_to_real_col_name
@@ -108,6 +108,24 @@ class RepeatedSubqueryElimination:
108
108
  total_num_ctes=self._total_number_ctes,
109
109
  )
110
110
 
111
+ @staticmethod
112
+ def _has_alias_conflict(
113
+ node: TreeNode, existing_cte: Optional[SnowflakePlan]
114
+ ) -> bool:
115
+ """Whether sharing ``existing_cte`` for ``node`` would map the same expr_id to a
116
+ different alias. encode_query_id hashes expr_to_alias by alias values only, so
117
+ nodes mapping the same expr_id to different aliases can collide. Merging such a
118
+ node into the shared CTE would silently drop an entry and corrupt parent column
119
+ resolution, so in that case we skip the CTE and render the node inline."""
120
+ if existing_cte is None:
121
+ return False
122
+ node_expr_to_alias = getattr(node, "expr_to_alias", None) or {}
123
+ return any(
124
+ key in existing_cte.expr_to_alias
125
+ and existing_cte.expr_to_alias[key] != alias
126
+ for key, alias in node_expr_to_alias.items()
127
+ )
128
+
111
129
  def _replace_duplicate_node_with_cte(
112
130
  self,
113
131
  root: TreeNode,
@@ -159,16 +177,20 @@ class RepeatedSubqueryElimination:
159
177
  if node in visited_nodes:
160
178
  continue
161
179
 
162
- # if the node is a duplicated node and deduplication is not done for the node,
163
- # start the deduplication transformation use CTE
164
- if node.encoded_node_id_with_query in duplicated_node_ids:
165
- if node.encoded_node_id_with_query in resolved_with_block_map:
166
- # if the corresponding CTE block has been created, use the existing
167
- # one.
168
- resolved_with_block = resolved_with_block_map[
169
- node.encoded_node_id_with_query
170
- ]
171
- else:
180
+ # Decide whether this node should be represented by a (new or shared) CTE:
181
+ # it must be a detected duplicate, and sharing the CTE must not introduce an
182
+ # alias conflict (see _has_alias_conflict). When it cannot be a CTE, the node
183
+ # is left inline and only the parent-propagation path applies, exactly like a
184
+ # non-duplicated node.
185
+ resolved_with_block = resolved_with_block_map.get(
186
+ node.encoded_node_id_with_query
187
+ )
188
+ is_cte_node = node.encoded_node_id_with_query in duplicated_node_ids and (
189
+ not self._has_alias_conflict(node, resolved_with_block)
190
+ )
191
+ if is_cte_node:
192
+ if resolved_with_block is None:
193
+ # no CTE block has been created for this node yet, create one.
172
194
  if (
173
195
  self._query_generator.session.reduce_describe_query_enabled
174
196
  and context._is_snowpark_connect_compatible_mode
@@ -187,6 +209,12 @@ class RepeatedSubqueryElimination:
187
209
  node.encoded_node_id_with_query
188
210
  ] = resolved_with_block
189
211
  self._total_number_ctes += 1
212
+ elif getattr(node, "expr_to_alias", None):
213
+ # reuse the existing CTE block. expr_ids are regenerated on copy, so
214
+ # this node's keys differ from the node the CTE was built from; merge
215
+ # this node's entries so every expr_id variant stays resolvable during
216
+ # parent re-resolution.
217
+ resolved_with_block.expr_to_alias.update(node.expr_to_alias)
190
218
  _update_parents(
191
219
  node, should_replace_child=True, new_child=resolved_with_block
192
220
  )
@@ -64,7 +64,7 @@ class DataFrameTraceNode:
64
64
  code_lines[0] = code_lines[0][start_column:]
65
65
  code_lines[-1] = code_lines[-1][:end_column]
66
66
  else:
67
- # For python 3.9/3.10, we do not extract the end line from the source code
67
+ # For python 3.10, we do not extract the end line from the source code
68
68
  # so we just read the start line and return.
69
69
  for line in itertools.islice(f, start_line - 1, start_line):
70
70
  code_lines.append(line)
@@ -83,13 +83,7 @@ from snowflake.snowpark.types import (
83
83
  File,
84
84
  )
85
85
 
86
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
87
- # Python 3.9 can use both
88
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
89
- try:
90
- from typing import Iterable # noqa: F401
91
- except ImportError:
92
- from collections.abc import Iterable # noqa: F401
86
+ from collections.abc import Iterable # noqa: F401
93
87
 
94
88
  if installed_pandas:
95
89
  from snowflake.snowpark.types import (
@@ -71,13 +71,7 @@ if installed_pandas:
71
71
  PandasSeriesType,
72
72
  )
73
73
 
74
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
75
- # Python 3.9 can use both
76
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
77
- if sys.version_info <= (3, 9):
78
- from typing import Iterable
79
- else:
80
- from collections.abc import Iterable
74
+ from collections.abc import Iterable
81
75
 
82
76
  logger = getLogger(__name__)
83
77
 
@@ -1276,7 +1270,7 @@ def resolve_imports_and_packages(
1276
1270
  any(pkg.startswith("cloudpickle") for pkg in packages)
1277
1271
  )
1278
1272
  resolved_packages = packages + (
1279
- [f"cloudpickle=={cloudpickle.__version__}"]
1273
+ [f"cloudpickle>={cloudpickle.__version__}"]
1280
1274
  if not has_cloudpickle
1281
1275
  else []
1282
1276
  )
@@ -1955,6 +1955,7 @@ class TimeTravelConfig(NamedTuple):
1955
1955
  timestamp: Optional[str] = None
1956
1956
  timestamp_type: Optional[str] = None
1957
1957
  stream: Optional[str] = None
1958
+ version: Optional[int] = None
1958
1959
 
1959
1960
  @staticmethod
1960
1961
  def validate_and_normalize_params(
@@ -1964,6 +1965,7 @@ class TimeTravelConfig(NamedTuple):
1964
1965
  timestamp: Optional[Union[str, datetime.datetime]] = None,
1965
1966
  timestamp_type: Optional[Union[str, "TimestampTimeZone"]] = None,
1966
1967
  stream: Optional[str] = None,
1968
+ version: Optional[int] = None,
1967
1969
  ) -> Optional["TimeTravelConfig"]:
1968
1970
  """
1969
1971
  Validates and normalizes time travel parameters.
@@ -1986,7 +1988,7 @@ class TimeTravelConfig(NamedTuple):
1986
1988
  ValueError: If parameters are invalid.
1987
1989
  """
1988
1990
  time_travel_arg_count = sum(
1989
- arg is not None for arg in (statement, offset, timestamp, stream)
1991
+ arg is not None for arg in (statement, offset, timestamp, stream, version)
1990
1992
  )
1991
1993
 
1992
1994
  # Validate mode
@@ -2003,10 +2005,28 @@ class TimeTravelConfig(NamedTuple):
2003
2005
  f"Invalid time travel mode: {time_travel_mode}. Must be 'at' or 'before'."
2004
2006
  )
2005
2007
 
2008
+ # version (Iceberg snapshot id) only works with 'at' mode — matches
2009
+ # Snowflake's ``AT(VERSION => <id>)`` grammar and Spark Iceberg's
2010
+ # ``snapshot-id`` option semantics ("read snapshot N", not "before N").
2011
+ if version is not None and time_travel_mode.lower() != "at":
2012
+ raise ValueError(
2013
+ "Iceberg snapshot version time travel can only be used with "
2014
+ "time_travel_mode='at', not 'before'."
2015
+ )
2016
+
2017
+ # Validate version type — snapshot IDs are 64-bit integers in Iceberg.
2018
+ # Reject bool explicitly because ``isinstance(True, int)`` is True in Python.
2019
+ if version is not None and (
2020
+ not isinstance(version, int) or isinstance(version, bool)
2021
+ ):
2022
+ raise ValueError(
2023
+ f"'version' must be an int Iceberg snapshot id, got {type(version).__name__}."
2024
+ )
2025
+
2006
2026
  # Validate exactly one parameter is provided
2007
2027
  if time_travel_arg_count != 1:
2008
2028
  raise ValueError(
2009
- "Exactly one of 'statement', 'offset', 'timestamp', or 'stream' must be provided."
2029
+ "Exactly one of 'statement', 'offset', 'timestamp', 'stream', or 'version' must be provided."
2010
2030
  )
2011
2031
 
2012
2032
  # Normalize timestamp
@@ -2040,6 +2060,7 @@ class TimeTravelConfig(NamedTuple):
2040
2060
  timestamp=normalized_timestamp,
2041
2061
  timestamp_type=timestamp_type,
2042
2062
  stream=stream,
2063
+ version=version,
2043
2064
  )
2044
2065
 
2045
2066
  def generate_sql_clause(self) -> str:
@@ -2048,7 +2069,8 @@ class TimeTravelConfig(NamedTuple):
2048
2069
  Args:
2049
2070
  config: Time travel configuration.
2050
2071
  Returns:
2051
- SQL clause like " AT (TIMESTAMP => TO_TIMESTAMP_NTZ('...'))"
2072
+ SQL clause like " AT (TIMESTAMP => TO_TIMESTAMP_NTZ('...'))" or
2073
+ " AT (VERSION => 1234567890)" for Iceberg snapshot id time travel.
2052
2074
  """
2053
2075
  clause = f" {self.time_travel_mode.upper()} "
2054
2076
 
@@ -2058,6 +2080,8 @@ class TimeTravelConfig(NamedTuple):
2058
2080
  clause += f"(OFFSET => {self.offset})"
2059
2081
  elif self.stream is not None:
2060
2082
  clause += f"(STREAM => '{self.stream}')"
2083
+ elif self.version is not None:
2084
+ clause += f"(VERSION => {self.version})"
2061
2085
  elif self.timestamp is not None:
2062
2086
  if self.timestamp_type is not None:
2063
2087
  timestamp_type = self.timestamp_type.upper()
@@ -112,7 +112,7 @@ def _infer_primitive_type(text: str) -> DataType:
112
112
  pass
113
113
 
114
114
  # Timestamp (Spark default: TimestampFormatter with CAST logic)
115
- # Backward compatibility: Python 3.9 fromisoformat doesn't support 'Z' suffix; replace with +00:00
115
+ # Backward compatibility: Python 3.10 fromisoformat doesn't support 'Z' suffix; replace with +00:00
116
116
  try:
117
117
  ts_text = text.replace("Z", "+00:00") if text.endswith("Z") else text
118
118
  datetime.fromisoformat(ts_text)
@@ -3,7 +3,6 @@
3
3
  # Copyright (c) 2012-2025 Snowflake Computing Inc. All rights reserved.
4
4
  #
5
5
 
6
- import sys
7
6
  import typing
8
7
  from typing import Any, Optional, Union
9
8
 
@@ -100,13 +99,7 @@ from snowflake.snowpark.types import (
100
99
  )
101
100
  from snowflake.snowpark.window import Window, WindowSpec
102
101
 
103
- # Python 3.8 needs to use typing.Iterable because collections.abc.Iterable is not subscriptable
104
- # Python 3.9 can use both
105
- # Python 3.10 needs to use collections.abc.Iterable because typing.Iterable is removed
106
- if sys.version_info <= (3, 9):
107
- from typing import Iterable
108
- else:
109
- from collections.abc import Iterable
102
+ from collections.abc import Iterable
110
103
 
111
104
 
112
105
  def _to_col_if_lit(
@@ -6,7 +6,7 @@
6
6
  """Context module for Snowpark."""
7
7
  import logging
8
8
  import sys
9
- from typing import Callable, Optional
9
+ from typing import Any, Callable, Optional
10
10
 
11
11
  import snowflake.snowpark
12
12
  import threading
@@ -45,6 +45,11 @@ _aggregation_function_set = (
45
45
  set()
46
46
  ) # lower cased names of aggregation functions, used in sql simplification
47
47
  _aggregation_function_set_lock = threading.RLock()
48
+ _aggregation_function_prefetch_state: dict[str, Any] = {
49
+ "lock": threading.RLock(),
50
+ "event": None,
51
+ "job": None,
52
+ }
48
53
 
49
54
  # Hardcoded fallback for system built-in aggregation functions.
50
55
  # Used when the dynamic query fails to retrieve the list from the database.
@@ -62,9 +67,6 @@ _KNOWN_AGGREGATION_FUNCTIONS = frozenset(
62
67
  "ai_agg",
63
68
  "ai_summarize_agg",
64
69
  "any_value",
65
- "approximate_count_distinct",
66
- "approximate_jaccard_index",
67
- "approximate_similarity",
68
70
  "approx_count_distinct",
69
71
  "approx_percentile",
70
72
  "approx_percentile_accumulate",
@@ -72,25 +74,29 @@ _KNOWN_AGGREGATION_FUNCTIONS = frozenset(
72
74
  "approx_top_k",
73
75
  "approx_top_k_accumulate",
74
76
  "approx_top_k_combine",
75
- "arrayagg",
77
+ "approximate_count_distinct",
78
+ "approximate_jaccard_index",
79
+ "approximate_similarity",
76
80
  "array_agg",
77
81
  "array_union_agg",
78
82
  "array_unique_agg",
83
+ "arrayagg",
79
84
  "avg",
80
- "bitandagg",
85
+ "bit_and_agg",
86
+ "bit_andagg",
87
+ "bit_or_agg",
88
+ "bit_oragg",
89
+ "bit_xor_agg",
90
+ "bit_xoragg",
81
91
  "bitand_agg",
92
+ "bitandagg",
93
+ "bitmap_and_agg",
82
94
  "bitmap_construct_agg",
83
95
  "bitmap_or_agg",
84
- "bitoragg",
85
96
  "bitor_agg",
86
- "bitxoragg",
97
+ "bitoragg",
87
98
  "bitxor_agg",
88
- "bit_andagg",
89
- "bit_and_agg",
90
- "bit_oragg",
91
- "bit_or_agg",
92
- "bit_xoragg",
93
- "bit_xor_agg",
99
+ "bitxoragg",
94
100
  "booland_agg",
95
101
  "boolor_agg",
96
102
  "boolxor_agg",
@@ -115,12 +121,12 @@ _KNOWN_AGGREGATION_FUNCTIONS = frozenset(
115
121
  "max_by",
116
122
  "median",
117
123
  "min",
124
+ "min_by",
118
125
  "minhash",
119
126
  "minhash_combine",
120
- "min_by",
121
127
  "mode",
122
- "objectagg",
123
128
  "object_agg",
129
+ "objectagg",
124
130
  "percentile_cont",
125
131
  "percentile_disc",
126
132
  "regr_avgx",
@@ -133,20 +139,21 @@ _KNOWN_AGGREGATION_FUNCTIONS = frozenset(
133
139
  "regr_sxy",
134
140
  "regr_syy",
135
141
  "skew",
142
+ "st_intersection_agg_geography_internal",
143
+ "st_union_agg_geography_internal",
136
144
  "stddev",
137
145
  "stddev_pop",
138
146
  "stddev_samp",
139
- "st_intersection_agg_geography_internal",
140
- "st_union_agg_geography_internal",
141
147
  "sum",
142
148
  "sum_internal",
143
149
  "sum_internal_real",
144
150
  "sum_real",
151
+ "summarize_agg",
152
+ "var_pop",
153
+ "var_samp",
145
154
  "variance",
146
155
  "variance_pop",
147
156
  "variance_samp",
148
- "var_pop",
149
- "var_samp",
150
157
  "vector_avg",
151
158
  "vector_max",
152
159
  "vector_min",
@@ -154,6 +161,7 @@ _KNOWN_AGGREGATION_FUNCTIONS = frozenset(
154
161
  ]
155
162
  )
156
163
 
164
+
157
165
  _cte_error_threshold = 3 # 0 to disable auto-cte-disable, otherwise the number of times CTE optimization can fail before it is automatically disabled for the remainder of the session.
158
166
 
159
167
  # Following are internal-only global flags, used to enable development features.