snowflake-snowpark-python 1.48.0__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.0 → snowflake_snowpark_python-1.49.0}/CHANGELOG.md +38 -0
- {snowflake_snowpark_python-1.48.0/src/snowflake_snowpark_python.egg-info → snowflake_snowpark_python-1.49.0}/PKG-INFO +4 -4
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/setup.py +4 -3
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer.py +21 -6
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/expression.py +3 -2
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/select_statement.py +10 -3
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan.py +6 -4
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_schema_inference.py +2 -2
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe.py +97 -48
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_reader.py +37 -17
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_stat_functions.py +3 -3
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/functions.py +22 -1
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_analyzer.py +11 -5
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_connection.py +4 -1
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_functions.py +1 -1
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan.py +6 -5
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/groupby.py +18 -18
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/session.py +1 -1
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/version.py +1 -1
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0/src/snowflake_snowpark_python.egg-info}/PKG-INFO +4 -4
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/requires.txt +4 -2
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/LICENSE.txt +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/MANIFEST.in +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/README.md +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/pyproject.toml +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/setup.cfg +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/general_functions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/scalar_functions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_expression.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_plan_node.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/datatype_mapper.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/grouping_set.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/metadata_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/query_plan_analysis_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/schema_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan_node.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/sort_expression.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_function.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_merge_expression.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_expression.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_plan_node.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/window_expression.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/batch.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/builder.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/code_generation.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/cte_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/large_query_breakdown.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/plan_compiler.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/query_generator.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/repeated_subquery_elimination.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/telemetry_constants.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_partitioner.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_reader.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_typing.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/base_dialect.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/databricks_dialect.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/mysql_dialect.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/oracledb_dialect.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/postgresql_dialect.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/sqlite3_dialect.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/sqlserver_dialect.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/base_driver.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/databricks_driver.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/oracledb_driver.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/psycopg2_driver.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pymsql_driver.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pyodbc_driver.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/sqlite_driver.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/jdbc.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/debug_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/error_message.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/event_table_telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/open_telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/packaging_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.pyi +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/select_projection_complexity_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/server_connection.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/snowpark_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/temp_table_auto_cleaner.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/type_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/udf_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_reader.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xpath_handlers.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/async_job.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/catalog.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/column.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/context.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_ai_functions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_analytics_functions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_na_functions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_writer.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/exceptions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/file_operation.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/files.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/lineage.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_constants.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_analyzer.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_connection.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_plan.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_options.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_pandas_util.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan_builder.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_select_statement.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_data_type.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_to_pandas_converter.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stage_registry.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stored_procedure.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udaf.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udtf.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_util.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_window_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/exceptions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__main__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/envvars.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/pubsub.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/conftest.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/aggregation_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/align_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/apply_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/binary_op_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/concat_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cumulative_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cut_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/frame.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/generator_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/get_dummies_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/groupby_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/indexing_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/io_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/isin_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/join_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/ordered_dataframe.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/pivot_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/resample_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/row_count_estimation.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/session.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/snowpark_pandas_types.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/statement_params_constants.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/telemetry.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/timestamp_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/transpose_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/type_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/unpivot_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/where_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/window_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_typing.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/doc_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/ray_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/snowflake_query_compiler.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/base.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/dataframe.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/datetime_index.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/general.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/index.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/io.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/resample.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series_utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/shared_docs.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/timedelta_index.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/window.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/base_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_extensions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/datetime_index.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/general_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/index.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/indexing_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/io_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/pd_extensions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resample_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resampler_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/rolling_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_extensions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_groupby_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/snow_partition_iterator.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/timedelta_index.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/window_overrides.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/factories.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/snow_io.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/__init__.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/error_message.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/exceptions.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/frontend_constants.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/numpy_to_pandas.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/warning_message.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/utils.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/py.typed +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/query_history.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/relational_grouped_dataframe.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/row.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/secrets.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table_function.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/testing.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/types.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udaf.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf_profiler.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udtf.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/window.py +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/SOURCES.txt +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/dependency_links.txt +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/namespace_packages.txt +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/not-zip-safe +0 -0
- {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/top_level.txt +0 -0
|
@@ -1,5 +1,43 @@
|
|
|
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
|
+
|
|
31
|
+
## 1.48.1 (2026-03-31)
|
|
32
|
+
|
|
33
|
+
### Snowpark Python API Updates
|
|
34
|
+
|
|
35
|
+
#### Bug Fixes
|
|
36
|
+
|
|
37
|
+
- Fixed a bug where chained `DataFrame.filter()` calls with raw SQL text containing `OR` produced incorrect results.
|
|
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.
|
|
40
|
+
|
|
3
41
|
## 1.48.0 (2026-03-23)
|
|
4
42
|
|
|
5
43
|
### Snowpark Python API Updates
|
|
@@ -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
|
|
|
@@ -790,10 +798,13 @@ class Analyzer:
|
|
|
790
798
|
expr.is_permissive,
|
|
791
799
|
)
|
|
792
800
|
else:
|
|
801
|
+
child_sql = self.analyze(
|
|
802
|
+
child, df_aliased_col_name_to_real_col_name, parse_local_name
|
|
803
|
+
)
|
|
804
|
+
if isinstance(child, UnresolvedAttribute) and child.is_sql_text:
|
|
805
|
+
child_sql = f"({child_sql})"
|
|
793
806
|
return unary_expression(
|
|
794
|
-
|
|
795
|
-
child, df_aliased_col_name_to_real_col_name, parse_local_name
|
|
796
|
-
),
|
|
807
|
+
child_sql,
|
|
797
808
|
expr.sql_operator,
|
|
798
809
|
expr.operator_first,
|
|
799
810
|
)
|
|
@@ -822,6 +833,10 @@ class Analyzer:
|
|
|
822
833
|
right_sql_expr = self.analyze(
|
|
823
834
|
right, df_aliased_col_name_to_real_col_name, parse_local_name
|
|
824
835
|
)
|
|
836
|
+
if isinstance(left, UnresolvedAttribute) and left.is_sql_text:
|
|
837
|
+
left_sql_expr = f"({left_sql_expr})"
|
|
838
|
+
if isinstance(right, UnresolvedAttribute) and right.is_sql_text:
|
|
839
|
+
right_sql_expr = f"({right_sql_expr})"
|
|
825
840
|
if isinstance(expr, BinaryArithmeticExpression):
|
|
826
841
|
return binary_arithmetic_expression(
|
|
827
842
|
expr.sql_operator,
|
|
@@ -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
|
|
@@ -9,7 +9,6 @@ from typing import Optional, Dict, List
|
|
|
9
9
|
|
|
10
10
|
from snowflake.snowpark._internal.xml_reader import (
|
|
11
11
|
DEFAULT_CHUNK_SIZE,
|
|
12
|
-
get_file_size,
|
|
13
12
|
find_next_opening_tag_pos,
|
|
14
13
|
tag_is_self_closing,
|
|
15
14
|
find_next_closing_tag_pos,
|
|
@@ -650,6 +649,7 @@ class XMLSchemaInference:
|
|
|
650
649
|
null_value: str,
|
|
651
650
|
charset: str,
|
|
652
651
|
ignore_surrounding_whitespace: bool,
|
|
652
|
+
file_size: int,
|
|
653
653
|
):
|
|
654
654
|
"""
|
|
655
655
|
Infer XML schema for a byte-range partition of the file.
|
|
@@ -667,8 +667,8 @@ class XMLSchemaInference:
|
|
|
667
667
|
null_value: Value to treat as null.
|
|
668
668
|
charset: Character encoding of the XML file.
|
|
669
669
|
ignore_surrounding_whitespace: Whether to strip whitespace from values.
|
|
670
|
+
file_size: Size of the file in bytes (provided by the client via LS).
|
|
670
671
|
"""
|
|
671
|
-
file_size = get_file_size(filename)
|
|
672
672
|
if not file_size or file_size <= 0:
|
|
673
673
|
yield ("",)
|
|
674
674
|
return
|
|
@@ -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(
|
|
@@ -62,6 +62,7 @@ from snowflake.snowpark._internal.xml_schema_inference import (
|
|
|
62
62
|
)
|
|
63
63
|
from snowflake.snowpark._internal.utils import (
|
|
64
64
|
SNOWURL_PREFIX,
|
|
65
|
+
STAGE_PREFIX,
|
|
65
66
|
XML_ROW_TAG_STRING,
|
|
66
67
|
XML_ROW_DATA_COLUMN_NAME,
|
|
67
68
|
XML_READER_FILE_PATH,
|
|
@@ -642,10 +643,10 @@ class DataFrameReader:
|
|
|
642
643
|
|
|
643
644
|
@publicapi
|
|
644
645
|
def schema(self, schema: StructType, _emit_ast: bool = True) -> "DataFrameReader":
|
|
645
|
-
"""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.
|
|
646
647
|
|
|
647
648
|
Args:
|
|
648
|
-
schema: Schema configuration for the
|
|
649
|
+
schema: Schema configuration for the file to be read.
|
|
649
650
|
|
|
650
651
|
Returns:
|
|
651
652
|
a :class:`DataFrameReader` instance with the specified schema configuration for the data to be read.
|
|
@@ -1422,15 +1423,23 @@ class DataFrameReader:
|
|
|
1422
1423
|
"""Register a session-scoped XML UDTF with a deterministic fully-qualified
|
|
1423
1424
|
name, cached per session and schema"""
|
|
1424
1425
|
if is_in_stored_procedure(): # pragma: no cover
|
|
1425
|
-
|
|
1426
|
+
# Use TEMPORARY instead of SCOPED TEMPORARY session stage
|
|
1427
|
+
import_stage_name = self._session.get_fully_qualified_name_if_possible(
|
|
1428
|
+
"SNOWPARK_TEMP_STAGE_XMLIMPORTS"
|
|
1429
|
+
)
|
|
1430
|
+
self._session._run_query(
|
|
1431
|
+
f"CREATE TEMPORARY STAGE IF NOT EXISTS {import_stage_name}",
|
|
1432
|
+
is_ddl_on_temp_object=True,
|
|
1433
|
+
)
|
|
1434
|
+
import_stage = f"{STAGE_PREFIX}{import_stage_name}"
|
|
1426
1435
|
self._session._conn.upload_file(
|
|
1427
1436
|
local_file_path,
|
|
1428
|
-
|
|
1437
|
+
import_stage,
|
|
1429
1438
|
compress_data=False,
|
|
1430
1439
|
overwrite=True,
|
|
1431
1440
|
skip_upload_on_content_match=True,
|
|
1432
1441
|
)
|
|
1433
|
-
python_file_path = f"{
|
|
1442
|
+
python_file_path = f"{import_stage}/{os.path.basename(local_file_path)}"
|
|
1434
1443
|
else:
|
|
1435
1444
|
python_file_path = local_file_path
|
|
1436
1445
|
|
|
@@ -1439,7 +1448,7 @@ class DataFrameReader:
|
|
|
1439
1448
|
)
|
|
1440
1449
|
|
|
1441
1450
|
udtf_name = self._session.get_fully_qualified_name_if_possible(
|
|
1442
|
-
f"
|
|
1451
|
+
f"SNOWPARK_TEMP_TABLE_FUNCTION_{handler_name.upper()}"
|
|
1443
1452
|
)
|
|
1444
1453
|
|
|
1445
1454
|
return self._session.udtf.register_from_file(
|
|
@@ -1448,7 +1457,7 @@ class DataFrameReader:
|
|
|
1448
1457
|
name=udtf_name,
|
|
1449
1458
|
output_schema=output_schema,
|
|
1450
1459
|
input_types=input_types,
|
|
1451
|
-
packages=["snowflake-snowpark-python", "lxml<
|
|
1460
|
+
packages=["snowflake-snowpark-python", "lxml<7"],
|
|
1452
1461
|
if_not_exists=True,
|
|
1453
1462
|
skip_upload_on_content_match=True,
|
|
1454
1463
|
_suppress_local_package_warnings=True,
|
|
@@ -1506,6 +1515,7 @@ class DataFrameReader:
|
|
|
1506
1515
|
lit(null_value),
|
|
1507
1516
|
lit(charset),
|
|
1508
1517
|
lit(ignore_surrounding_whitespace),
|
|
1518
|
+
lit(file_size),
|
|
1509
1519
|
)
|
|
1510
1520
|
)
|
|
1511
1521
|
|
|
@@ -1596,7 +1606,7 @@ class DataFrameReader:
|
|
|
1596
1606
|
raise_error=NotImplementedError,
|
|
1597
1607
|
)
|
|
1598
1608
|
|
|
1599
|
-
if self._user_schema and format.lower() not in ["json", "xml"]:
|
|
1609
|
+
if self._user_schema and format.lower() not in ["json", "xml", "parquet"]:
|
|
1600
1610
|
raise ValueError(f"Read {format} does not support user schema")
|
|
1601
1611
|
if (
|
|
1602
1612
|
self._user_schema
|
|
@@ -1624,14 +1634,25 @@ class DataFrameReader:
|
|
|
1624
1634
|
use_user_schema = True
|
|
1625
1635
|
|
|
1626
1636
|
elif self._infer_schema:
|
|
1627
|
-
(
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
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
|
|
1635
1656
|
|
|
1636
1657
|
metadata_project, metadata_schema = self._get_metadata_project_and_schema()
|
|
1637
1658
|
|
|
@@ -1920,7 +1941,6 @@ class DataFrameReader:
|
|
|
1920
1941
|
set_api_call_source(res_df, DATA_SOURCE_JDBC_SIGNATURE)
|
|
1921
1942
|
return res_df
|
|
1922
1943
|
|
|
1923
|
-
@private_preview(version="1.29.0")
|
|
1924
1944
|
@publicapi
|
|
1925
1945
|
def dbapi(
|
|
1926
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)
|
|
@@ -3712,6 +3712,22 @@ def collation(e: ColumnOrName, _emit_ast: bool = True) -> Column:
|
|
|
3712
3712
|
return _call_function("collation", c, _emit_ast=_emit_ast)
|
|
3713
3713
|
|
|
3714
3714
|
|
|
3715
|
+
def _rewrite_concat_arg_if_double_quote_string_literal(
|
|
3716
|
+
c: Column, *, _emit_ast: bool
|
|
3717
|
+
) -> Column:
|
|
3718
|
+
# SNOW-3259059: Some Snowflake releases (10.7.1–10.9.2 per JIRA) dropped CONCAT's leading
|
|
3719
|
+
# lit('"') through EXCEPT / chained set-op plans. CHR(34) is the same VARCHAR character in SQL
|
|
3720
|
+
# without that specific single-character literal form.
|
|
3721
|
+
expr = c._expression
|
|
3722
|
+
if (
|
|
3723
|
+
isinstance(expr, Literal)
|
|
3724
|
+
and isinstance(expr.datatype, StringType)
|
|
3725
|
+
and expr.value == '"'
|
|
3726
|
+
):
|
|
3727
|
+
return _call_function("chr", lit(34, _emit_ast=_emit_ast), _emit_ast=_emit_ast)
|
|
3728
|
+
return c
|
|
3729
|
+
|
|
3730
|
+
|
|
3715
3731
|
@publicapi
|
|
3716
3732
|
def concat(*cols: ColumnOrName, _emit_ast: bool = True) -> Column:
|
|
3717
3733
|
"""Concatenates one or more strings, or concatenates one or more binary values. If any of the values is null, the result is also null.
|
|
@@ -3726,7 +3742,12 @@ def concat(*cols: ColumnOrName, _emit_ast: bool = True) -> Column:
|
|
|
3726
3742
|
--------------------------
|
|
3727
3743
|
<BLANKLINE>
|
|
3728
3744
|
"""
|
|
3729
|
-
columns = [
|
|
3745
|
+
columns = [
|
|
3746
|
+
_rewrite_concat_arg_if_double_quote_string_literal(
|
|
3747
|
+
_to_col_if_str(c, "concat"), _emit_ast=_emit_ast
|
|
3748
|
+
)
|
|
3749
|
+
for c in cols
|
|
3750
|
+
]
|
|
3730
3751
|
return _call_function("concat", *columns, _emit_ast=_emit_ast)
|
|
3731
3752
|
|
|
3732
3753
|
|