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.
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/CHANGELOG.md +29 -0
- {snowflake_snowpark_python-1.48.1/src/snowflake_snowpark_python.egg-info → snowflake_snowpark_python-1.49.0}/PKG-INFO +4 -4
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/setup.py +4 -3
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer.py +11 -3
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/expression.py +3 -2
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/select_statement.py +10 -3
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan.py +6 -4
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe.py +97 -48
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_reader.py +23 -13
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_stat_functions.py +3 -3
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_analyzer.py +11 -5
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_connection.py +4 -1
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_functions.py +1 -1
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan.py +6 -5
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/session.py +1 -1
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/version.py +1 -1
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0/src/snowflake_snowpark_python.egg-info}/PKG-INFO +4 -4
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/requires.txt +4 -2
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/LICENSE.txt +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/MANIFEST.in +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/README.md +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/pyproject.toml +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/setup.cfg +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/general_functions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/scalar_functions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_expression.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_plan_node.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/datatype_mapper.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/grouping_set.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/metadata_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/query_plan_analysis_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/schema_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan_node.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/sort_expression.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_function.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_merge_expression.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_expression.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_plan_node.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/window_expression.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/batch.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/builder.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/code_generation.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/cte_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/large_query_breakdown.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/plan_compiler.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/query_generator.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/repeated_subquery_elimination.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/telemetry_constants.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_partitioner.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_reader.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_typing.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/base_driver.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/databricks_driver.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/oracledb_driver.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/psycopg2_driver.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pymsql_driver.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pyodbc_driver.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/sqlite_driver.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/jdbc.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/debug_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/error_message.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/event_table_telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/open_telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/packaging_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.pyi +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/select_projection_complexity_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/server_connection.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/snowpark_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/temp_table_auto_cleaner.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/type_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/udf_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_reader.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_schema_inference.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xpath_handlers.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/async_job.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/catalog.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/column.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/context.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_ai_functions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_analytics_functions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_na_functions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_writer.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/exceptions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/file_operation.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/files.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/functions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/lineage.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_constants.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_analyzer.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_connection.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_plan.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_options.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_pandas_util.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan_builder.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_select_statement.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_data_type.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_to_pandas_converter.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stage_registry.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stored_procedure.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udaf.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udtf.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_util.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_window_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/exceptions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__main__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/envvars.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/pubsub.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/conftest.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/aggregation_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/align_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/apply_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/binary_op_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/concat_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cumulative_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cut_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/frame.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/generator_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/get_dummies_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/groupby_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/indexing_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/io_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/isin_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/join_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/ordered_dataframe.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/pivot_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/resample_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/row_count_estimation.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/session.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/snowpark_pandas_types.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/statement_params_constants.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/timestamp_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/transpose_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/type_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/unpivot_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/where_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/window_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_typing.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/doc_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/ray_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/snowflake_query_compiler.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/base.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/dataframe.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/datetime_index.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/general.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/groupby.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/index.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/io.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/resample.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series_utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/shared_docs.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/timedelta_index.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/window.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/base_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_extensions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/datetime_index.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/general_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/index.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/indexing_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/io_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/pd_extensions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resample_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resampler_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/rolling_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_extensions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/snow_partition_iterator.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/timedelta_index.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/window_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/factories.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/snow_io.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/error_message.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/exceptions.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/frontend_constants.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/numpy_to_pandas.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/warning_message.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/utils.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/py.typed +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/query_history.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/relational_grouped_dataframe.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/row.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/secrets.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table_function.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/testing.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/types.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udaf.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udtf.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/window.py +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/SOURCES.txt +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/dependency_links.txt +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/namespace_packages.txt +0 -0
- {snowflake_snowpark_python-1.48.1 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/not-zip-safe +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
2250
|
-
|
|
2251
|
-
|
|
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[
|
|
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 =
|
|
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
|
-
|
|
321
|
+
cs: List[str],
|
|
283
322
|
prefix: Optional[str],
|
|
284
323
|
suffix: Optional[str],
|
|
285
324
|
common_col_names: List[str],
|
|
286
|
-
):
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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
|
-
|
|
334
|
-
|
|
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
|
-
|
|
5118
|
-
|
|
5119
|
-
|
|
5120
|
-
|
|
5121
|
-
|
|
5122
|
-
|
|
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
|
|
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<
|
|
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
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
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
|
-
|
|
658
|
-
|
|
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"
|
|
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)
|
|
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 =
|
|
592
|
-
keep_literal = "Column" not in type_hint
|
|
593
|
-
if type_hint ==
|
|
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<
|
|
4984
|
+
packages=["snowflake-snowpark-python", "lxml<7"],
|
|
4985
4985
|
replace=True,
|
|
4986
4986
|
_emit_ast=False,
|
|
4987
4987
|
_suppress_local_package_warnings=True,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: snowflake-snowpark-python
|
|
3
|
-
Version: 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.
|
|
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.
|
|
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"
|