snowflake-snowpark-python 1.48.1__tar.gz → 1.49.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.48.1 → snowflake_snowpark_python-1.49.0}/CHANGELOG.md +29 -0
  2. {snowflake_snowpark_python-1.48.1/src/snowflake_snowpark_python.egg-info → snowflake_snowpark_python-1.49.0}/PKG-INFO +4 -4
  3. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/setup.py +4 -3
  4. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer.py +11 -3
  5. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/expression.py +3 -2
  6. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/select_statement.py +10 -3
  7. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan.py +6 -4
  8. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe.py +97 -48
  9. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_reader.py +23 -13
  10. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_stat_functions.py +3 -3
  11. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_analyzer.py +11 -5
  12. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_connection.py +4 -1
  13. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_functions.py +1 -1
  14. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan.py +6 -5
  15. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/session.py +1 -1
  16. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/version.py +1 -1
  17. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0/src/snowflake_snowpark_python.egg-info}/PKG-INFO +4 -4
  18. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/requires.txt +4 -2
  19. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/LICENSE.txt +0 -0
  20. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/MANIFEST.in +0 -0
  21. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/README.md +0 -0
  22. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/pyproject.toml +0 -0
  23. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/setup.cfg +0 -0
  24. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/__init__.py +0 -0
  25. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/__init__.py +0 -0
  26. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/general_functions.py +0 -0
  27. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/scalar_functions.py +0 -0
  28. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/__init__.py +0 -0
  29. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/__init__.py +0 -0
  30. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer_utils.py +0 -0
  31. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_expression.py +0 -0
  32. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_plan_node.py +0 -0
  33. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/datatype_mapper.py +0 -0
  34. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/grouping_set.py +0 -0
  35. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/metadata_utils.py +0 -0
  36. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/query_plan_analysis_utils.py +0 -0
  37. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/schema_utils.py +0 -0
  38. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan_node.py +0 -0
  39. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/sort_expression.py +0 -0
  40. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_function.py +0 -0
  41. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_merge_expression.py +0 -0
  42. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_expression.py +0 -0
  43. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_plan_node.py +0 -0
  44. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/window_expression.py +0 -0
  45. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/__init__.py +0 -0
  46. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/batch.py +0 -0
  47. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/builder.py +0 -0
  48. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/utils.py +0 -0
  49. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/code_generation.py +0 -0
  50. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/__init__.py +0 -0
  51. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/cte_utils.py +0 -0
  52. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/large_query_breakdown.py +0 -0
  53. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/plan_compiler.py +0 -0
  54. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/query_generator.py +0 -0
  55. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/repeated_subquery_elimination.py +0 -0
  56. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/telemetry_constants.py +0 -0
  57. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/utils.py +0 -0
  58. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/__init__.py +0 -0
  59. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_partitioner.py +0 -0
  60. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_reader.py +0 -0
  61. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_typing.py +0 -0
  62. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/__init__.py +0 -0
  63. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/base_dialect.py +0 -0
  64. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/databricks_dialect.py +0 -0
  65. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/mysql_dialect.py +0 -0
  66. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/oracledb_dialect.py +0 -0
  67. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/postgresql_dialect.py +0 -0
  68. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/sqlite3_dialect.py +0 -0
  69. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/sqlserver_dialect.py +0 -0
  70. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/__init__.py +0 -0
  71. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/base_driver.py +0 -0
  72. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/databricks_driver.py +0 -0
  73. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/oracledb_driver.py +0 -0
  74. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/psycopg2_driver.py +0 -0
  75. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pymsql_driver.py +0 -0
  76. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pyodbc_driver.py +0 -0
  77. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/sqlite_driver.py +0 -0
  78. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/jdbc.py +0 -0
  79. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/utils.py +0 -0
  80. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/debug_utils.py +0 -0
  81. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/error_message.py +0 -0
  82. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/event_table_telemetry.py +0 -0
  83. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/open_telemetry.py +0 -0
  84. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/packaging_utils.py +0 -0
  85. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/__init__.py +0 -0
  86. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.py +0 -0
  87. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.pyi +0 -0
  88. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/select_projection_complexity_utils.py +0 -0
  89. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/server_connection.py +0 -0
  90. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/snowpark_profiler.py +0 -0
  91. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/telemetry.py +0 -0
  92. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/temp_table_auto_cleaner.py +0 -0
  93. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/type_utils.py +0 -0
  94. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/udf_utils.py +0 -0
  95. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/utils.py +0 -0
  96. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_reader.py +0 -0
  97. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_schema_inference.py +0 -0
  98. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xpath_handlers.py +0 -0
  99. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/async_job.py +0 -0
  100. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/catalog.py +0 -0
  101. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/column.py +0 -0
  102. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/context.py +0 -0
  103. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_ai_functions.py +0 -0
  104. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_analytics_functions.py +0 -0
  105. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_na_functions.py +0 -0
  106. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_profiler.py +0 -0
  107. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_writer.py +0 -0
  108. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/exceptions.py +0 -0
  109. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/file_operation.py +0 -0
  110. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/files.py +0 -0
  111. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/functions.py +0 -0
  112. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/lineage.py +0 -0
  113. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/__init__.py +0 -0
  114. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_constants.py +0 -0
  115. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_analyzer.py +0 -0
  116. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_connection.py +0 -0
  117. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_plan.py +0 -0
  118. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_options.py +0 -0
  119. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_pandas_util.py +0 -0
  120. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan_builder.py +0 -0
  121. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_select_statement.py +0 -0
  122. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_data_type.py +0 -0
  123. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_to_pandas_converter.py +0 -0
  124. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stage_registry.py +0 -0
  125. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stored_procedure.py +0 -0
  126. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_telemetry.py +0 -0
  127. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udaf.py +0 -0
  128. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf.py +0 -0
  129. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf_utils.py +0 -0
  130. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udtf.py +0 -0
  131. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_util.py +0 -0
  132. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_window_utils.py +0 -0
  133. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/exceptions.py +0 -0
  134. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/__init__.py +0 -0
  135. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__init__.py +0 -0
  136. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__main__.py +0 -0
  137. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/envvars.py +0 -0
  138. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/pubsub.py +0 -0
  139. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/conftest.py +0 -0
  140. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/__init__.py +0 -0
  141. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/__init__.py +0 -0
  142. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/aggregation_utils.py +0 -0
  143. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/align_utils.py +0 -0
  144. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/apply_utils.py +0 -0
  145. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/binary_op_utils.py +0 -0
  146. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/concat_utils.py +0 -0
  147. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cumulative_utils.py +0 -0
  148. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cut_utils.py +0 -0
  149. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/frame.py +0 -0
  150. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/generator_utils.py +0 -0
  151. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/get_dummies_utils.py +0 -0
  152. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/groupby_utils.py +0 -0
  153. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/indexing_utils.py +0 -0
  154. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/io_utils.py +0 -0
  155. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/isin_utils.py +0 -0
  156. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/join_utils.py +0 -0
  157. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/ordered_dataframe.py +0 -0
  158. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/pivot_utils.py +0 -0
  159. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/resample_utils.py +0 -0
  160. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/row_count_estimation.py +0 -0
  161. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/session.py +0 -0
  162. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/snowpark_pandas_types.py +0 -0
  163. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/statement_params_constants.py +0 -0
  164. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/telemetry.py +0 -0
  165. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/timestamp_utils.py +0 -0
  166. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/transpose_utils.py +0 -0
  167. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/type_utils.py +0 -0
  168. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/unpivot_utils.py +0 -0
  169. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/utils.py +0 -0
  170. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/where_utils.py +0 -0
  171. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/window_utils.py +0 -0
  172. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_typing.py +0 -0
  173. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/__init__.py +0 -0
  174. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/doc_utils.py +0 -0
  175. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/ray_utils.py +0 -0
  176. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/snowflake_query_compiler.py +0 -0
  177. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/__init__.py +0 -0
  178. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/base.py +0 -0
  179. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/dataframe.py +0 -0
  180. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/datetime_index.py +0 -0
  181. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/general.py +0 -0
  182. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/groupby.py +0 -0
  183. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/index.py +0 -0
  184. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/io.py +0 -0
  185. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/resample.py +0 -0
  186. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series.py +0 -0
  187. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series_utils.py +0 -0
  188. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/shared_docs.py +0 -0
  189. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/timedelta_index.py +0 -0
  190. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/window.py +0 -0
  191. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/__init__.py +0 -0
  192. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/base_overrides.py +0 -0
  193. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_extensions.py +0 -0
  194. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_groupby_overrides.py +0 -0
  195. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_overrides.py +0 -0
  196. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/datetime_index.py +0 -0
  197. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/general_overrides.py +0 -0
  198. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/index.py +0 -0
  199. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/indexing_overrides.py +0 -0
  200. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/io_overrides.py +0 -0
  201. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/pd_extensions.py +0 -0
  202. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resample_overrides.py +0 -0
  203. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resampler_groupby_overrides.py +0 -0
  204. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/rolling_groupby_overrides.py +0 -0
  205. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_extensions.py +0 -0
  206. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_groupby_overrides.py +0 -0
  207. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_overrides.py +0 -0
  208. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/snow_partition_iterator.py +0 -0
  209. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/timedelta_index.py +0 -0
  210. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/utils.py +0 -0
  211. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/window_overrides.py +0 -0
  212. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/__init__.py +0 -0
  213. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/factories.py +0 -0
  214. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/snow_io.py +0 -0
  215. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/__init__.py +0 -0
  216. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/error_message.py +0 -0
  217. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/exceptions.py +0 -0
  218. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/frontend_constants.py +0 -0
  219. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/numpy_to_pandas.py +0 -0
  220. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/warning_message.py +0 -0
  221. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/utils.py +0 -0
  222. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/py.typed +0 -0
  223. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/query_history.py +0 -0
  224. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/relational_grouped_dataframe.py +0 -0
  225. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/row.py +0 -0
  226. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/secrets.py +0 -0
  227. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure.py +0 -0
  228. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure_profiler.py +0 -0
  229. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table.py +0 -0
  230. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table_function.py +0 -0
  231. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/testing.py +0 -0
  232. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/types.py +0 -0
  233. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udaf.py +0 -0
  234. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf.py +0 -0
  235. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf_profiler.py +0 -0
  236. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udtf.py +0 -0
  237. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/window.py +0 -0
  238. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/SOURCES.txt +0 -0
  239. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/dependency_links.txt +0 -0
  240. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/namespace_packages.txt +0 -0
  241. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/not-zip-safe +0 -0
  242. {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/top_level.txt +0 -0
@@ -1,5 +1,33 @@
1
1
  # Release History
2
2
 
3
+ ## 1.49.0 (2026-04-13)
4
+
5
+ ### Snowpark Python API Updates
6
+
7
+ #### New Features
8
+
9
+ - Allow a user-specified schema when reading Parquet files from a stage.
10
+
11
+ #### Improvements
12
+
13
+ - Restored the following query improvements that were reverted in 1.47.0 due to bugs:
14
+ - Reduced the size of queries generated by certain `DataFrame.join` operations.
15
+ - Removed redundant aliases in generated queries (for example, `SELECT "A" AS "A"` is now always simplified to `SELECT "A"`).
16
+ - Removed warning that `DataFrameReader.dbapi` feature was in private preview.
17
+
18
+ #### Bug Fixes
19
+
20
+ - Fixed a bug where `Session.create_dataframe` raised `TypeError` when a `StringType` column was given a non-string Python value (e.g. `int`, `float`, `bool`, `Decimal`) for a small local relation (below the array bind threshold); `VALUES` SQL generation now coerces these types to string literals, consistent with the large-data bind-parameter path.
21
+ - Fixed a bug where `DataFrame.approxQuantile` did not accept a `Column` for the `col` parameter.
22
+
23
+ ### Snowpark Local Testing Updates
24
+
25
+ #### Bug Fixes
26
+
27
+ - Fixed a bug where `concat` produced extra NaN rows and mismatched values after a `filter` operation in local testing.
28
+ - Fixed a bug where `dense_rank()` would fail with `ValueError` on NULL partition values.
29
+ - Fixed a bug where `collect()` raised `KeyError` after `save_as_table(column_order="name")` when the source DataFrame omitted columns with types `VariantType`, `MapType`, or `ArrayType` that were present in the target table schema in local testing.
30
+
3
31
  ## 1.48.1 (2026-03-31)
4
32
 
5
33
  ### Snowpark Python API Updates
@@ -8,6 +36,7 @@
8
36
 
9
37
  - Fixed a bug where chained `DataFrame.filter()` calls with raw SQL text containing `OR` produced incorrect results.
10
38
  - Fixed a Snowflake platform compatibility issue where `concat(lit('"'), ...)` could lose the leading quote through chained set-operation plans.
39
+ - Fixed a bug for XML schema inference session resolution in spark compatible mode.
11
40
 
12
41
  ## 1.48.0 (2026-03-23)
13
42
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-snowpark-python
3
- Version: 1.48.1
3
+ Version: 1.49.0
4
4
  Summary: Snowflake Snowpark for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -33,7 +33,7 @@ Classifier: Topic :: Software Development :: Libraries
33
33
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
34
34
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
35
35
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
36
- Requires-Python: >=3.9, <3.14
36
+ Requires-Python: >=3.9, <3.15
37
37
  Description-Content-Type: text/markdown
38
38
  License-File: LICENSE.txt
39
39
  Requires-Dist: setuptools>=40.6.0
@@ -98,13 +98,13 @@ Requires-Dist: tox; extra == "modin-development"
98
98
  Requires-Dist: snowflake.core<2,>=1.0.0; extra == "modin-development"
99
99
  Requires-Dist: psutil; extra == "modin-development"
100
100
  Requires-Dist: lxml; extra == "modin-development"
101
- Requires-Dist: scipy<=1.16.0; extra == "modin-development"
101
+ Requires-Dist: scipy<=1.16.3; extra == "modin-development"
102
102
  Requires-Dist: statsmodels; extra == "modin-development"
103
103
  Requires-Dist: scikit-learn; extra == "modin-development"
104
104
  Requires-Dist: plotly<6.0.0; extra == "modin-development"
105
105
  Requires-Dist: snowflake-ml-python>=1.8.0; python_version < "3.12" and extra == "modin-development"
106
106
  Requires-Dist: s3fs; extra == "modin-development"
107
- Requires-Dist: ray; extra == "modin-development"
107
+ Requires-Dist: ray; python_version < "3.14" and extra == "modin-development"
108
108
  Provides-Extra: localtest
109
109
  Requires-Dist: pandas; extra == "localtest"
110
110
  Requires-Dist: requests; extra == "localtest"
@@ -32,7 +32,7 @@ INSTALL_REQ_LIST = [
32
32
  "python-dateutil", # Snowpark IR
33
33
  "tzlocal", # Snowpark IR
34
34
  ]
35
- REQUIRED_PYTHON_VERSION = ">=3.9, <3.14"
35
+ REQUIRED_PYTHON_VERSION = ">=3.9, <3.15"
36
36
 
37
37
  if os.getenv("SNOWFLAKE_IS_PYTHON_RUNTIME_TEST", False):
38
38
  REQUIRED_PYTHON_VERSION = ">=3.9"
@@ -71,7 +71,7 @@ MODIN_DEVELOPMENT_REQUIREMENTS = [
71
71
  # Snowpark pandas 3rd party library testing. Cap the scipy version because
72
72
  # Snowflake cannot find newer versions of scipy for python 3.11+. See
73
73
  # SNOW-2452791.
74
- "scipy<=1.16.0",
74
+ "scipy<=1.16.3",
75
75
  "statsmodels", # Snowpark pandas 3rd party library testing
76
76
  "scikit-learn", # Snowpark pandas 3rd party library testing
77
77
  # plotly version restricted due to foreseen change in query counts in version 6.0.0+
@@ -80,7 +80,8 @@ MODIN_DEVELOPMENT_REQUIREMENTS = [
80
80
  # snowflake-ml-python is available on python 3.12.
81
81
  "snowflake-ml-python>=1.8.0; python_version<'3.12'",
82
82
  "s3fs", # Used in tests that read CSV files from s3
83
- "ray", # Used in data movement tests
83
+ # ray currently has no compatible wheels for Python 3.14.
84
+ "ray; python_version<'3.14'", # Used in data movement tests
84
85
  ]
85
86
 
86
87
  # read the version
@@ -763,10 +763,18 @@ class Analyzer:
763
763
  for k, v in df_alias_dict.items():
764
764
  if v == expr.child.name:
765
765
  df_alias_dict[k] = updated_due_to_inheritance # type: ignore
766
+ origin = self.analyze(
767
+ expr.child, df_aliased_col_name_to_real_col_name, parse_local_name
768
+ )
769
+ if (
770
+ isinstance(expr.child, (Attribute, UnresolvedAttribute))
771
+ and origin == quoted_name
772
+ ):
773
+ # If the column name matches the target of the alias (`quoted_name`),
774
+ # we can directly emit the column name without an AS clause.
775
+ return origin
766
776
  return alias_expression(
767
- self.analyze(
768
- expr.child, df_aliased_col_name_to_real_col_name, parse_local_name
769
- ),
777
+ origin,
770
778
  quoted_name,
771
779
  )
772
780
 
@@ -2,7 +2,6 @@
2
2
  # Copyright (c) 2012-2025 Snowflake Computing Inc. All rights reserved.
3
3
  #
4
4
 
5
- import copy
6
5
  import uuid
7
6
  from typing import TYPE_CHECKING, AbstractSet, Any, Dict, List, Optional, Tuple
8
7
 
@@ -158,7 +157,9 @@ class NamedExpression:
158
157
  return self._expr_id
159
158
 
160
159
  def __copy__(self):
161
- new = copy.copy(super())
160
+ cls = self.__class__
161
+ new = cls.__new__(cls)
162
+ new.__dict__.update(self.__dict__)
162
163
  new._expr_id = None # type: ignore
163
164
  return new
164
165
 
@@ -2244,11 +2244,18 @@ def derive_column_states_from_subquery(
2244
2244
  else Attribute(quoted_c_name, DataType())
2245
2245
  )
2246
2246
  from_c_state = from_.column_states.get(quoted_c_name)
2247
+ result_name = analyzer.analyze(
2248
+ c, from_.df_aliased_col_name_to_real_col_name, parse_local_name=True
2249
+ ).strip(" ")
2247
2250
  if from_c_state and from_c_state.change_state != ColumnChangeState.DROPPED:
2248
2251
  # review later. should use parse_column_name
2249
- if c_name != analyzer.analyze(
2250
- c, from_.df_aliased_col_name_to_real_col_name, parse_local_name=True
2251
- ).strip(" "):
2252
+ # SNOW-2895675: Always treat Aliases as "changed", even if it is an identity.
2253
+ # The fact this check is needed may be a bug in column state analysis, and we should revisit it later.
2254
+ # The following tests fail without this check:
2255
+ # - tests/integ/test_cte.py::test_sql_simplifier
2256
+ # - tests/integ/scala/test_dataframe_suite.py::test_rename_join_dataframe
2257
+ # - tests/integ/test_dataframe.py::test_dataframe_alias
2258
+ if c_name != result_name or isinstance(c, Alias):
2252
2259
  column_states[quoted_c_name] = ColumnState(
2253
2260
  quoted_c_name,
2254
2261
  ColumnChangeState.CHANGED_EXP,
@@ -7,7 +7,7 @@ import difflib
7
7
  from logging import getLogger
8
8
  import re
9
9
  import sys
10
- import uuid
10
+ import uuid as uuid_lib
11
11
  from collections import defaultdict, deque
12
12
  from enum import Enum
13
13
  from dataclasses import dataclass
@@ -383,7 +383,7 @@ class SnowflakePlan(LogicalPlan):
383
383
  # and it's a reading XML query.
384
384
 
385
385
  def search_read_file_node(
386
- node: Union[SnowflakePlan, Selectable]
386
+ node: Union[SnowflakePlan, Selectable],
387
387
  ) -> Optional[ReadFileNode]:
388
388
  source_plan = (
389
389
  node.source_plan
@@ -435,7 +435,7 @@ class SnowflakePlan(LogicalPlan):
435
435
  # during the compilation stage.
436
436
  schema_query: Optional[str],
437
437
  post_actions: Optional[List["Query"]] = None,
438
- expr_to_alias: Optional[Dict[uuid.UUID, str]] = None,
438
+ expr_to_alias: Optional[Dict[uuid_lib.UUID, str]] = None,
439
439
  source_plan: Optional[LogicalPlan] = None,
440
440
  is_ddl_on_temp_object: bool = False,
441
441
  api_calls: Optional[List[Dict]] = None,
@@ -479,7 +479,9 @@ class SnowflakePlan(LogicalPlan):
479
479
  if self.session._join_alias_fix
480
480
  else defaultdict(dict)
481
481
  )
482
- self._uuid = from_selectable_uuid if from_selectable_uuid else str(uuid.uuid4())
482
+ self._uuid = (
483
+ from_selectable_uuid if from_selectable_uuid else str(uuid_lib.uuid4())
484
+ )
483
485
  # We set the query line intervals for the last query in the queries list
484
486
  self.set_last_query_line_intervals()
485
487
  # In the placeholder query, subquery (child) is held by the ID of query plan
@@ -277,29 +277,69 @@ def _get_unaliased(col_name: str) -> List[str]:
277
277
  return unaliased
278
278
 
279
279
 
280
+ def _get_aliased_column_names(
281
+ df: "DataFrame",
282
+ cs: List[str],
283
+ prefix: Optional[str],
284
+ suffix: Optional[str],
285
+ common_col_names: List[str],
286
+ ) -> List[str]:
287
+ aliases = []
288
+ for c in cs:
289
+ unquoted_col_name = c.strip('"')
290
+ if c in common_col_names:
291
+ if suffix:
292
+ column_case_insensitive = is_snowflake_quoted_id_case_insensitive(c)
293
+ suffix_unqouted_case_insensitive = (
294
+ is_snowflake_unquoted_suffix_case_insensitive(suffix)
295
+ )
296
+ aliases.append(
297
+ f'"{unquoted_col_name}{suffix.upper()}"'
298
+ if column_case_insensitive and suffix_unqouted_case_insensitive
299
+ else f'''"{unquoted_col_name}{escape_quotes(suffix.strip('"'))}"'''
300
+ )
301
+ else:
302
+ aliases.append(f'"{prefix}{unquoted_col_name}"')
303
+ else:
304
+ # Removal of redundant aliases (like `"A" AS "A"`) is handled at the analyzer level.
305
+ aliases.append(f'"{unquoted_col_name}"')
306
+ return aliases
307
+
308
+
309
+ def _apply_aliases(
310
+ df: "DataFrame",
311
+ cs: List[str],
312
+ c_aliases: List[str],
313
+ ) -> List[Column]:
314
+ return [
315
+ df.col(c, _emit_ast=False).alias(c_alias) for c, c_alias in zip(cs, c_aliases)
316
+ ]
317
+
318
+
280
319
  def _alias_if_needed(
281
320
  df: "DataFrame",
282
- c: str,
321
+ cs: List[str],
283
322
  prefix: Optional[str],
284
323
  suffix: Optional[str],
285
324
  common_col_names: List[str],
286
- ):
287
- col = df.col(c, _emit_ast=False)
288
- unquoted_col_name = c.strip('"')
289
- if c in common_col_names:
290
- if suffix:
291
- column_case_insensitive = is_snowflake_quoted_id_case_insensitive(c)
292
- suffix_unqouted_case_insensitive = (
293
- is_snowflake_unquoted_suffix_case_insensitive(suffix)
294
- )
295
- return col.alias(
296
- f'"{unquoted_col_name}{suffix.upper()}"'
297
- if column_case_insensitive and suffix_unqouted_case_insensitive
298
- else f'''"{unquoted_col_name}{escape_quotes(suffix.strip('"'))}"'''
299
- )
300
- return col.alias(f'"{prefix}{unquoted_col_name}"')
301
- else:
302
- return col.alias(f'"{unquoted_col_name}"')
325
+ ) -> List[Column]:
326
+ return _apply_aliases(
327
+ df, cs, _get_aliased_column_names(df, cs, prefix, suffix, common_col_names)
328
+ )
329
+
330
+
331
+ def _populate_expr_to_alias(df: "DataFrame") -> None:
332
+ """
333
+ Populate expr_to_alias mapping for a DataFrame's output columns.
334
+ This is needed for column lineage tracking when we skip the select() wrapping
335
+ optimization in _disambiguate.
336
+ """
337
+ for attr in df._output:
338
+ # Map each attribute's expr_id to its quoted column name
339
+ # This allows later lookups like df["column_name"] to resolve correctly
340
+ # Use quote_name() for consistency with analyzer.py Alias handling (line 743, 756)
341
+ if attr.expr_id not in df._plan.expr_to_alias:
342
+ df._plan.expr_to_alias[attr.expr_id] = quote_name(attr.name)
303
343
 
304
344
 
305
345
  def _disambiguate(
@@ -328,11 +368,11 @@ def _disambiguate(
328
368
  for n in lhs_names
329
369
  if n in set(rhs_names) and n not in normalized_using_columns
330
370
  ]
371
+
331
372
  all_names = [unquote_if_quoted(n) for n in lhs_names + rhs_names]
332
373
 
333
- if common_col_names:
334
- # We use the session of the LHS DataFrame to report this telemetry
335
- lhs._session._conn._telemetry_client.send_alias_in_join_telemetry()
374
+ # We use the session of the LHS DataFrame to report this telemetry
375
+ lhs._session._conn._telemetry_client.send_alias_in_join_telemetry()
336
376
 
337
377
  lsuffix = lsuffix or lhs._alias
338
378
  rsuffix = rsuffix or rhs._alias
@@ -344,25 +384,37 @@ def _disambiguate(
344
384
  _generate_deterministic_prefix("r", all_names) if not suffix_provided else ""
345
385
  )
346
386
 
387
+ lhs_aliases = _get_aliased_column_names(
388
+ lhs,
389
+ lhs_names,
390
+ lhs_prefix,
391
+ lsuffix,
392
+ [] if isinstance(join_type, (LeftSemi, LeftAnti)) else common_col_names,
393
+ )
394
+ rhs_aliases = _get_aliased_column_names(
395
+ rhs, rhs_names, rhs_prefix, rsuffix, common_col_names
396
+ )
397
+ if all(
398
+ l_name == l_aliased for l_name, l_aliased in zip(lhs_names, lhs_aliases)
399
+ ) and all(r_name == r_aliased for r_name, r_aliased in zip(rhs_names, rhs_aliases)):
400
+ # Optimization: No column name conflicts, so we can skip aliasing and the select() wrapping.
401
+ # But we still need to populate expr_to_alias for column lineage tracking,
402
+ # so that df["column_name"] can resolve correctly after the join.
403
+ # This is identified by the test case
404
+ # tests/integ/scala/test_dataframe_join_suite.py::test_name_alias_on_multiple_join.
405
+ # Note that we must also ensure none of the column names have changed due to internal quote stripping:
406
+ # see tests/integ/compiler/test_query_generator.py::test_disambiguate_skips_quoted_alias for details.
407
+ _populate_expr_to_alias(lhs)
408
+ _populate_expr_to_alias(rhs)
409
+ return lhs, rhs
410
+
347
411
  lhs_remapped = lhs.select(
348
- [
349
- _alias_if_needed(
350
- lhs,
351
- name,
352
- lhs_prefix,
353
- lsuffix,
354
- [] if isinstance(join_type, (LeftSemi, LeftAnti)) else common_col_names,
355
- )
356
- for name in lhs_names
357
- ],
412
+ _apply_aliases(lhs, lhs_names, lhs_aliases),
358
413
  _emit_ast=False,
359
414
  )
360
415
 
361
416
  rhs_remapped = rhs.select(
362
- [
363
- _alias_if_needed(rhs, name, rhs_prefix, rsuffix, common_col_names)
364
- for name in rhs_names
365
- ],
417
+ _apply_aliases(rhs, rhs_names, rhs_aliases),
366
418
  _emit_ast=False,
367
419
  )
368
420
  return lhs_remapped, rhs_remapped
@@ -2062,7 +2114,7 @@ class DataFrame:
2062
2114
  stmt = _ast_stmt
2063
2115
 
2064
2116
  # In snowpark_connect_compatible mode, we need to handle
2065
- # the filtering for dataframe after aggregation without nesting using HAVING
2117
+ # the filtering for dataframe after aggregation without nesting using HAVING.
2066
2118
  if (
2067
2119
  context._is_snowpark_connect_compatible_mode
2068
2120
  and self._ops_after_agg is not None
@@ -2278,7 +2330,7 @@ class DataFrame:
2278
2330
  )
2279
2331
 
2280
2332
  # In snowpark_connect_compatible mode, we need to handle
2281
- # the sorting for dataframe after aggregation without nesting
2333
+ # the sorting for dataframe after aggregation without nesting.
2282
2334
  if (
2283
2335
  context._is_snowpark_connect_compatible_mode
2284
2336
  and self._ops_after_agg is not None
@@ -3005,7 +3057,7 @@ class DataFrame:
3005
3057
  stmt = None
3006
3058
 
3007
3059
  # In snowpark_connect_compatible mode, we need to handle
3008
- # the limit for dataframe after aggregation without nesting
3060
+ # the limit for dataframe after aggregation without nesting.
3009
3061
  if (
3010
3062
  context._is_snowpark_connect_compatible_mode
3011
3063
  and self._ops_after_agg is not None
@@ -5113,16 +5165,13 @@ class DataFrame:
5113
5165
  )
5114
5166
  prefix = _generate_prefix("a")
5115
5167
  child = self.select(
5116
- [
5117
- _alias_if_needed(
5118
- self,
5119
- attr.name,
5120
- prefix,
5121
- suffix=None,
5122
- common_col_names=common_col_names,
5123
- )
5124
- for attr in self._output
5125
- ],
5168
+ _alias_if_needed(
5169
+ self,
5170
+ [attr.name for attr in self._output],
5171
+ prefix,
5172
+ suffix=None,
5173
+ common_col_names=common_col_names,
5174
+ ),
5126
5175
  _emit_ast=False,
5127
5176
  )
5128
5177
  return DataFrame(
@@ -643,10 +643,10 @@ class DataFrameReader:
643
643
 
644
644
  @publicapi
645
645
  def schema(self, schema: StructType, _emit_ast: bool = True) -> "DataFrameReader":
646
- """Define the schema for CSV or XML files that you want to read.
646
+ """Define the schema for CSV, JSON, Parquet, or XML files that you want to read.
647
647
 
648
648
  Args:
649
- schema: Schema configuration for the CSV or XML file to be read.
649
+ schema: Schema configuration for the file to be read.
650
650
 
651
651
  Returns:
652
652
  a :class:`DataFrameReader` instance with the specified schema configuration for the data to be read.
@@ -1457,7 +1457,7 @@ class DataFrameReader:
1457
1457
  name=udtf_name,
1458
1458
  output_schema=output_schema,
1459
1459
  input_types=input_types,
1460
- packages=["snowflake-snowpark-python", "lxml<6"],
1460
+ packages=["snowflake-snowpark-python", "lxml<7"],
1461
1461
  if_not_exists=True,
1462
1462
  skip_upload_on_content_match=True,
1463
1463
  _suppress_local_package_warnings=True,
@@ -1606,7 +1606,7 @@ class DataFrameReader:
1606
1606
  raise_error=NotImplementedError,
1607
1607
  )
1608
1608
 
1609
- if self._user_schema and format.lower() not in ["json", "xml"]:
1609
+ if self._user_schema and format.lower() not in ["json", "xml", "parquet"]:
1610
1610
  raise ValueError(f"Read {format} does not support user schema")
1611
1611
  if (
1612
1612
  self._user_schema
@@ -1634,14 +1634,25 @@ class DataFrameReader:
1634
1634
  use_user_schema = True
1635
1635
 
1636
1636
  elif self._infer_schema:
1637
- (
1638
- new_schema,
1639
- schema_to_cast,
1640
- read_file_transformations,
1641
- _, # we don't check for error in case of infer schema failures. We use $1, Variant type
1642
- ) = self._infer_schema_for_file_format(path, format)
1643
- if new_schema:
1644
- schema = new_schema
1637
+ if not isinstance(self._session._conn, MockServerConnection):
1638
+ (
1639
+ new_schema,
1640
+ schema_to_cast,
1641
+ read_file_transformations,
1642
+ infer_schema_exception,
1643
+ ) = self._infer_schema_for_file_format(path, format)
1644
+ if new_schema:
1645
+ schema = new_schema
1646
+ elif infer_schema_exception is not None:
1647
+ if isinstance(infer_schema_exception, FileNotFoundError):
1648
+ raise infer_schema_exception
1649
+ logger.warning(
1650
+ f"Could not infer schema for {format} file due to exception: "
1651
+ f"{infer_schema_exception}. "
1652
+ "\nFalling back to $1 VARIANT schema. "
1653
+ "Please use DataFrameReader.schema() to specify a user schema for the file."
1654
+ )
1655
+ self._cur_options["INFER_SCHEMA"] = False
1645
1656
 
1646
1657
  metadata_project, metadata_schema = self._get_metadata_project_and_schema()
1647
1658
 
@@ -1930,7 +1941,6 @@ class DataFrameReader:
1930
1941
  set_api_call_source(res_df, DATA_SOURCE_JDBC_SIGNATURE)
1931
1942
  return res_df
1932
1943
 
1933
- @private_preview(version="1.29.0")
1934
1944
  @publicapi
1935
1945
  def dbapi(
1936
1946
  self,
@@ -23,7 +23,7 @@ from snowflake.snowpark._internal.telemetry import (
23
23
  adjust_api_subcalls,
24
24
  )
25
25
  from snowflake.snowpark._internal.type_utils import ColumnOrName, LiteralType
26
- from snowflake.snowpark._internal.utils import publicapi, warning
26
+ from snowflake.snowpark._internal.utils import column_to_bool, publicapi, warning
27
27
  from snowflake.snowpark.functions import (
28
28
  _to_col_if_str,
29
29
  approx_percentile_accumulate,
@@ -91,7 +91,7 @@ class DataFrameStatFunctions:
91
91
  approximate percentile values if ``col`` is a list of column names.
92
92
  """
93
93
 
94
- if not percentile or not col:
94
+ if not percentile or not column_to_bool(col):
95
95
  return []
96
96
 
97
97
  kwargs = {}
@@ -102,7 +102,7 @@ class DataFrameStatFunctions:
102
102
  expr = with_src_position(stmt.expr.dataframe_stat_approx_quantile, stmt)
103
103
  self._dataframe._set_ast_ref(expr.df)
104
104
 
105
- if isinstance(col, Iterable) and not isinstance(col, str):
105
+ if isinstance(col, Iterable) and not isinstance(col, (str, Column)):
106
106
  expr.cols.variadic = False
107
107
  for c in col:
108
108
  build_expr_from_snowpark_column_or_col_name(expr.cols.args.add(), c)
@@ -654,12 +654,18 @@ class MockAnalyzer:
654
654
  if v == expr.child.name:
655
655
  df_alias_dict[k] = quoted_name
656
656
 
657
- alias_exp = alias_expression(
658
- self.analyze(
659
- expr.child, df_aliased_col_name_to_real_col_name, parse_local_name
660
- ),
661
- quoted_name,
657
+ origin = self.analyze(
658
+ expr.child, df_aliased_col_name_to_real_col_name, parse_local_name
662
659
  )
660
+ if (
661
+ isinstance(expr.child, (Attribute, UnresolvedAttribute))
662
+ and origin == quoted_name
663
+ ):
664
+ # If the column name matches the target of the alias (`quoted_name`),
665
+ # we can directly emit the column name without an AS clause.
666
+ return origin
667
+
668
+ alias_exp = alias_expression(origin, quoted_name)
663
669
 
664
670
  expr_str = alias_exp if keep_alias else expr.name or keep_alias
665
671
  expr_str = expr_str.upper() if parse_local_name else expr_str
@@ -186,6 +186,7 @@ class MockServerConnection:
186
186
  table.sf_types[missing_col] = target_table[
187
187
  missing_col
188
188
  ].sf_type
189
+ table._null_rows_idxs_map[missing_col] = []
189
190
  else:
190
191
  invalid_non_nullable_cols.append(missing_col)
191
192
  if invalid_non_nullable_cols:
@@ -666,7 +667,9 @@ class MockServerConnection:
666
667
  else:
667
668
  # snowflake returns Python None instead of the str 'null' for DataType data
668
669
  res.loc[idx, col] = (
669
- "null" if idx in res._null_rows_idxs_map[col] else None
670
+ "null"
671
+ if idx in res._null_rows_idxs_map.get(col, [])
672
+ else None
670
673
  )
671
674
 
672
675
  # when setting output rows, snowpark python running against snowflake don't escape double quotes
@@ -2146,7 +2146,7 @@ def mock_concat(*columns: ColumnEmulator) -> ColumnEmulator:
2146
2146
  SnowparkLocalTestingException.raise_from_error(
2147
2147
  ValueError("concat expects one or more column(s) to be passed in.")
2148
2148
  )
2149
- pdf = pandas.concat(columns, axis=1).reset_index(drop=True)
2149
+ pdf = pandas.concat(columns, axis=1)
2150
2150
  result = pdf.T.apply(
2151
2151
  lambda c: None if c.isnull().values.any() else c.astype(str).str.cat()
2152
2152
  )
@@ -588,9 +588,9 @@ def handle_function_expression(
588
588
  to_pass_kwargs = {}
589
589
  for param_name in parameters_except_ast:
590
590
  if param_name in exp.named_arguments:
591
- type_hint = str(type_hints.get(param_name, ""))
592
- keep_literal = "Column" not in type_hint
593
- if type_hint == "typing.Optional[dict]":
591
+ type_hint = type_hints.get(param_name)
592
+ keep_literal = "Column" not in str(type_hint)
593
+ if type_hint == typing.Optional[dict]:
594
594
  to_pass_kwargs[param_name] = json.loads(
595
595
  exp.named_arguments[param_name].sql.replace("'", '"')
596
596
  )
@@ -1495,8 +1495,8 @@ def execute_mock_plan(
1495
1495
  if isinstance(source_plan, Project):
1496
1496
  return TableEmulator(ColumnEmulator(col) for col in source_plan.project_list)
1497
1497
  if isinstance(source_plan, Join):
1498
- L_expr_to_alias = {}
1499
- R_expr_to_alias = {}
1498
+ L_expr_to_alias = dict(getattr(source_plan.left, "expr_to_alias", None) or {})
1499
+ R_expr_to_alias = dict(getattr(source_plan.right, "expr_to_alias", None) or {})
1500
1500
  left = execute_mock_plan(source_plan.left, L_expr_to_alias).reset_index(
1501
1501
  drop=True
1502
1502
  )
@@ -2626,6 +2626,7 @@ def calculate_expression(
2626
2626
  keys,
2627
2627
  sort=False,
2628
2628
  as_index=False,
2629
+ dropna=False,
2629
2630
  )
2630
2631
  res_index = []
2631
2632
  for r in res:
@@ -4981,7 +4981,7 @@ class Session:
4981
4981
  handler_name,
4982
4982
  return_type=return_type_map[return_type],
4983
4983
  input_types=[StringType(), StringType()],
4984
- packages=["snowflake-snowpark-python", "lxml<6"],
4984
+ packages=["snowflake-snowpark-python", "lxml<7"],
4985
4985
  replace=True,
4986
4986
  _emit_ast=False,
4987
4987
  _suppress_local_package_warnings=True,
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
  # Update this for the versions
5
- VERSION = (1, 48, 1)
5
+ VERSION = (1, 49, 0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-snowpark-python
3
- Version: 1.48.1
3
+ Version: 1.49.0
4
4
  Summary: Snowflake Snowpark for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -33,7 +33,7 @@ Classifier: Topic :: Software Development :: Libraries
33
33
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
34
34
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
35
35
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
36
- Requires-Python: >=3.9, <3.14
36
+ Requires-Python: >=3.9, <3.15
37
37
  Description-Content-Type: text/markdown
38
38
  License-File: LICENSE.txt
39
39
  Requires-Dist: setuptools>=40.6.0
@@ -98,13 +98,13 @@ Requires-Dist: tox; extra == "modin-development"
98
98
  Requires-Dist: snowflake.core<2,>=1.0.0; extra == "modin-development"
99
99
  Requires-Dist: psutil; extra == "modin-development"
100
100
  Requires-Dist: lxml; extra == "modin-development"
101
- Requires-Dist: scipy<=1.16.0; extra == "modin-development"
101
+ Requires-Dist: scipy<=1.16.3; extra == "modin-development"
102
102
  Requires-Dist: statsmodels; extra == "modin-development"
103
103
  Requires-Dist: scikit-learn; extra == "modin-development"
104
104
  Requires-Dist: plotly<6.0.0; extra == "modin-development"
105
105
  Requires-Dist: snowflake-ml-python>=1.8.0; python_version < "3.12" and extra == "modin-development"
106
106
  Requires-Dist: s3fs; extra == "modin-development"
107
- Requires-Dist: ray; extra == "modin-development"
107
+ Requires-Dist: ray; python_version < "3.14" and extra == "modin-development"
108
108
  Provides-Extra: localtest
109
109
  Requires-Dist: pandas; extra == "localtest"
110
110
  Requires-Dist: requests; extra == "localtest"