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.
Files changed (242) hide show
  1. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/CHANGELOG.md +38 -0
  2. {snowflake_snowpark_python-1.48.0/src/snowflake_snowpark_python.egg-info → snowflake_snowpark_python-1.49.0}/PKG-INFO +4 -4
  3. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/setup.py +4 -3
  4. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer.py +21 -6
  5. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/expression.py +3 -2
  6. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/select_statement.py +10 -3
  7. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan.py +6 -4
  8. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_schema_inference.py +2 -2
  9. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe.py +97 -48
  10. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_reader.py +37 -17
  11. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_stat_functions.py +3 -3
  12. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/functions.py +22 -1
  13. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_analyzer.py +11 -5
  14. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_connection.py +4 -1
  15. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_functions.py +1 -1
  16. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan.py +6 -5
  17. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/groupby.py +18 -18
  18. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/session.py +1 -1
  19. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/version.py +1 -1
  20. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0/src/snowflake_snowpark_python.egg-info}/PKG-INFO +4 -4
  21. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/requires.txt +4 -2
  22. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/LICENSE.txt +0 -0
  23. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/MANIFEST.in +0 -0
  24. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/README.md +0 -0
  25. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/pyproject.toml +0 -0
  26. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/setup.cfg +0 -0
  27. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/__init__.py +0 -0
  28. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/__init__.py +0 -0
  29. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/general_functions.py +0 -0
  30. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_functions/scalar_functions.py +0 -0
  31. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/__init__.py +0 -0
  32. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/__init__.py +0 -0
  33. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/analyzer_utils.py +0 -0
  34. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_expression.py +0 -0
  35. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/binary_plan_node.py +0 -0
  36. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/datatype_mapper.py +0 -0
  37. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/grouping_set.py +0 -0
  38. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/metadata_utils.py +0 -0
  39. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/query_plan_analysis_utils.py +0 -0
  40. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/schema_utils.py +0 -0
  41. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/snowflake_plan_node.py +0 -0
  42. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/sort_expression.py +0 -0
  43. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_function.py +0 -0
  44. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/table_merge_expression.py +0 -0
  45. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_expression.py +0 -0
  46. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/unary_plan_node.py +0 -0
  47. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/analyzer/window_expression.py +0 -0
  48. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/__init__.py +0 -0
  49. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/batch.py +0 -0
  50. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/builder.py +0 -0
  51. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/ast/utils.py +0 -0
  52. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/code_generation.py +0 -0
  53. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/__init__.py +0 -0
  54. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/cte_utils.py +0 -0
  55. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/large_query_breakdown.py +0 -0
  56. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/plan_compiler.py +0 -0
  57. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/query_generator.py +0 -0
  58. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/repeated_subquery_elimination.py +0 -0
  59. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/telemetry_constants.py +0 -0
  60. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/compiler/utils.py +0 -0
  61. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/__init__.py +0 -0
  62. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_partitioner.py +0 -0
  63. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_reader.py +0 -0
  64. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/datasource_typing.py +0 -0
  65. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/dbms_dialects/__init__.py +0 -0
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/__init__.py +0 -0
  74. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/base_driver.py +0 -0
  75. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/databricks_driver.py +0 -0
  76. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/oracledb_driver.py +0 -0
  77. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/psycopg2_driver.py +0 -0
  78. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pymsql_driver.py +0 -0
  79. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/pyodbc_driver.py +0 -0
  80. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/drivers/sqlite_driver.py +0 -0
  81. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/jdbc.py +0 -0
  82. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/data_source/utils.py +0 -0
  83. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/debug_utils.py +0 -0
  84. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/error_message.py +0 -0
  85. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/event_table_telemetry.py +0 -0
  86. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/open_telemetry.py +0 -0
  87. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/packaging_utils.py +0 -0
  88. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/__init__.py +0 -0
  89. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.py +0 -0
  90. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/proto/generated/ast_pb2.pyi +0 -0
  91. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/select_projection_complexity_utils.py +0 -0
  92. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/server_connection.py +0 -0
  93. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/snowpark_profiler.py +0 -0
  94. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/telemetry.py +0 -0
  95. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/temp_table_auto_cleaner.py +0 -0
  96. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/type_utils.py +0 -0
  97. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/udf_utils.py +0 -0
  98. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/utils.py +0 -0
  99. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xml_reader.py +0 -0
  100. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/_internal/xpath_handlers.py +0 -0
  101. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/async_job.py +0 -0
  102. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/catalog.py +0 -0
  103. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/column.py +0 -0
  104. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/context.py +0 -0
  105. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_ai_functions.py +0 -0
  106. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_analytics_functions.py +0 -0
  107. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_na_functions.py +0 -0
  108. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_profiler.py +0 -0
  109. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/dataframe_writer.py +0 -0
  110. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/exceptions.py +0 -0
  111. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/file_operation.py +0 -0
  112. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/files.py +0 -0
  113. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/lineage.py +0 -0
  114. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/__init__.py +0 -0
  115. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_constants.py +0 -0
  116. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_analyzer.py +0 -0
  117. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_connection.py +0 -0
  118. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_nop_plan.py +0 -0
  119. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_options.py +0 -0
  120. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_pandas_util.py +0 -0
  121. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_plan_builder.py +0 -0
  122. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_select_statement.py +0 -0
  123. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_data_type.py +0 -0
  124. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_snowflake_to_pandas_converter.py +0 -0
  125. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stage_registry.py +0 -0
  126. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_stored_procedure.py +0 -0
  127. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_telemetry.py +0 -0
  128. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udaf.py +0 -0
  129. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf.py +0 -0
  130. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udf_utils.py +0 -0
  131. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_udtf.py +0 -0
  132. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_util.py +0 -0
  133. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/_window_utils.py +0 -0
  134. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/mock/exceptions.py +0 -0
  135. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/__init__.py +0 -0
  136. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__init__.py +0 -0
  137. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/__main__.py +0 -0
  138. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/envvars.py +0 -0
  139. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/config/pubsub.py +0 -0
  140. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/conftest.py +0 -0
  141. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/__init__.py +0 -0
  142. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/__init__.py +0 -0
  143. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/aggregation_utils.py +0 -0
  144. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/align_utils.py +0 -0
  145. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/apply_utils.py +0 -0
  146. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/binary_op_utils.py +0 -0
  147. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/concat_utils.py +0 -0
  148. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cumulative_utils.py +0 -0
  149. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/cut_utils.py +0 -0
  150. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/frame.py +0 -0
  151. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/generator_utils.py +0 -0
  152. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/get_dummies_utils.py +0 -0
  153. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/groupby_utils.py +0 -0
  154. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/indexing_utils.py +0 -0
  155. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/io_utils.py +0 -0
  156. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/isin_utils.py +0 -0
  157. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/join_utils.py +0 -0
  158. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/ordered_dataframe.py +0 -0
  159. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/pivot_utils.py +0 -0
  160. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/resample_utils.py +0 -0
  161. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/row_count_estimation.py +0 -0
  162. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/session.py +0 -0
  163. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/snowpark_pandas_types.py +0 -0
  164. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/statement_params_constants.py +0 -0
  165. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/telemetry.py +0 -0
  166. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/timestamp_utils.py +0 -0
  167. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/transpose_utils.py +0 -0
  168. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/type_utils.py +0 -0
  169. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/unpivot_utils.py +0 -0
  170. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/utils.py +0 -0
  171. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/where_utils.py +0 -0
  172. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_internal/window_utils.py +0 -0
  173. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/_typing.py +0 -0
  174. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/__init__.py +0 -0
  175. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/doc_utils.py +0 -0
  176. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/ray_utils.py +0 -0
  177. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/compiler/snowflake_query_compiler.py +0 -0
  178. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/__init__.py +0 -0
  179. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/base.py +0 -0
  180. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/dataframe.py +0 -0
  181. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/datetime_index.py +0 -0
  182. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/general.py +0 -0
  183. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/index.py +0 -0
  184. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/io.py +0 -0
  185. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/resample.py +0 -0
  186. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series.py +0 -0
  187. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/series_utils.py +0 -0
  188. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/shared_docs.py +0 -0
  189. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/timedelta_index.py +0 -0
  190. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/docstrings/window.py +0 -0
  191. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/__init__.py +0 -0
  192. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/base_overrides.py +0 -0
  193. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_extensions.py +0 -0
  194. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_groupby_overrides.py +0 -0
  195. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/dataframe_overrides.py +0 -0
  196. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/datetime_index.py +0 -0
  197. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/general_overrides.py +0 -0
  198. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/index.py +0 -0
  199. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/indexing_overrides.py +0 -0
  200. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/io_overrides.py +0 -0
  201. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/pd_extensions.py +0 -0
  202. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resample_overrides.py +0 -0
  203. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/resampler_groupby_overrides.py +0 -0
  204. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/rolling_groupby_overrides.py +0 -0
  205. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_extensions.py +0 -0
  206. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_groupby_overrides.py +0 -0
  207. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/series_overrides.py +0 -0
  208. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/snow_partition_iterator.py +0 -0
  209. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/timedelta_index.py +0 -0
  210. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/utils.py +0 -0
  211. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/extensions/window_overrides.py +0 -0
  212. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/__init__.py +0 -0
  213. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/factories.py +0 -0
  214. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/io/snow_io.py +0 -0
  215. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/__init__.py +0 -0
  216. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/error_message.py +0 -0
  217. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/exceptions.py +0 -0
  218. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/frontend_constants.py +0 -0
  219. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/numpy_to_pandas.py +0 -0
  220. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/plugin/utils/warning_message.py +0 -0
  221. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/modin/utils.py +0 -0
  222. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/py.typed +0 -0
  223. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/query_history.py +0 -0
  224. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/relational_grouped_dataframe.py +0 -0
  225. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/row.py +0 -0
  226. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/secrets.py +0 -0
  227. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure.py +0 -0
  228. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/stored_procedure_profiler.py +0 -0
  229. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table.py +0 -0
  230. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/table_function.py +0 -0
  231. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/testing.py +0 -0
  232. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/types.py +0 -0
  233. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udaf.py +0 -0
  234. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf.py +0 -0
  235. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udf_profiler.py +0 -0
  236. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/udtf.py +0 -0
  237. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake/snowpark/window.py +0 -0
  238. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/SOURCES.txt +0 -0
  239. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/dependency_links.txt +0 -0
  240. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/namespace_packages.txt +0 -0
  241. {snowflake_snowpark_python-1.48.0 → snowflake_snowpark_python-1.49.0}/src/snowflake_snowpark_python.egg-info/not-zip-safe +0 -0
  242. {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.48.0
3
+ Version: 1.49.0
4
4
  Summary: Snowflake Snowpark for Python
5
5
  Home-page: https://www.snowflake.com/
6
6
  Author: Snowflake, Inc
@@ -33,7 +33,7 @@ Classifier: Topic :: Software Development :: Libraries
33
33
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
34
34
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
35
35
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
36
- Requires-Python: >=3.9, <3.14
36
+ Requires-Python: >=3.9, <3.15
37
37
  Description-Content-Type: text/markdown
38
38
  License-File: LICENSE.txt
39
39
  Requires-Dist: setuptools>=40.6.0
@@ -98,13 +98,13 @@ Requires-Dist: tox; extra == "modin-development"
98
98
  Requires-Dist: snowflake.core<2,>=1.0.0; extra == "modin-development"
99
99
  Requires-Dist: psutil; extra == "modin-development"
100
100
  Requires-Dist: lxml; extra == "modin-development"
101
- Requires-Dist: scipy<=1.16.0; extra == "modin-development"
101
+ Requires-Dist: scipy<=1.16.3; extra == "modin-development"
102
102
  Requires-Dist: statsmodels; extra == "modin-development"
103
103
  Requires-Dist: scikit-learn; extra == "modin-development"
104
104
  Requires-Dist: plotly<6.0.0; extra == "modin-development"
105
105
  Requires-Dist: snowflake-ml-python>=1.8.0; python_version < "3.12" and extra == "modin-development"
106
106
  Requires-Dist: s3fs; extra == "modin-development"
107
- Requires-Dist: ray; extra == "modin-development"
107
+ Requires-Dist: ray; python_version < "3.14" and extra == "modin-development"
108
108
  Provides-Extra: localtest
109
109
  Requires-Dist: pandas; extra == "localtest"
110
110
  Requires-Dist: requests; extra == "localtest"
@@ -32,7 +32,7 @@ INSTALL_REQ_LIST = [
32
32
  "python-dateutil", # Snowpark IR
33
33
  "tzlocal", # Snowpark IR
34
34
  ]
35
- REQUIRED_PYTHON_VERSION = ">=3.9, <3.14"
35
+ REQUIRED_PYTHON_VERSION = ">=3.9, <3.15"
36
36
 
37
37
  if os.getenv("SNOWFLAKE_IS_PYTHON_RUNTIME_TEST", False):
38
38
  REQUIRED_PYTHON_VERSION = ">=3.9"
@@ -71,7 +71,7 @@ MODIN_DEVELOPMENT_REQUIREMENTS = [
71
71
  # Snowpark pandas 3rd party library testing. Cap the scipy version because
72
72
  # Snowflake cannot find newer versions of scipy for python 3.11+. See
73
73
  # SNOW-2452791.
74
- "scipy<=1.16.0",
74
+ "scipy<=1.16.3",
75
75
  "statsmodels", # Snowpark pandas 3rd party library testing
76
76
  "scikit-learn", # Snowpark pandas 3rd party library testing
77
77
  # plotly version restricted due to foreseen change in query counts in version 6.0.0+
@@ -80,7 +80,8 @@ MODIN_DEVELOPMENT_REQUIREMENTS = [
80
80
  # snowflake-ml-python is available on python 3.12.
81
81
  "snowflake-ml-python>=1.8.0; python_version<'3.12'",
82
82
  "s3fs", # Used in tests that read CSV files from s3
83
- "ray", # Used in data movement tests
83
+ # ray currently has no compatible wheels for Python 3.14.
84
+ "ray; python_version<'3.14'", # Used in data movement tests
84
85
  ]
85
86
 
86
87
  # read the version
@@ -763,10 +763,18 @@ class Analyzer:
763
763
  for k, v in df_alias_dict.items():
764
764
  if v == expr.child.name:
765
765
  df_alias_dict[k] = updated_due_to_inheritance # type: ignore
766
+ origin = self.analyze(
767
+ expr.child, df_aliased_col_name_to_real_col_name, parse_local_name
768
+ )
769
+ if (
770
+ isinstance(expr.child, (Attribute, UnresolvedAttribute))
771
+ and origin == quoted_name
772
+ ):
773
+ # If the column name matches the target of the alias (`quoted_name`),
774
+ # we can directly emit the column name without an AS clause.
775
+ return origin
766
776
  return alias_expression(
767
- self.analyze(
768
- expr.child, df_aliased_col_name_to_real_col_name, parse_local_name
769
- ),
777
+ origin,
770
778
  quoted_name,
771
779
  )
772
780
 
@@ -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
- self.analyze(
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
- new = copy.copy(super())
160
+ cls = self.__class__
161
+ new = cls.__new__(cls)
162
+ new.__dict__.update(self.__dict__)
162
163
  new._expr_id = None # type: ignore
163
164
  return new
164
165
 
@@ -2244,11 +2244,18 @@ def derive_column_states_from_subquery(
2244
2244
  else Attribute(quoted_c_name, DataType())
2245
2245
  )
2246
2246
  from_c_state = from_.column_states.get(quoted_c_name)
2247
+ result_name = analyzer.analyze(
2248
+ c, from_.df_aliased_col_name_to_real_col_name, parse_local_name=True
2249
+ ).strip(" ")
2247
2250
  if from_c_state and from_c_state.change_state != ColumnChangeState.DROPPED:
2248
2251
  # review later. should use parse_column_name
2249
- if c_name != analyzer.analyze(
2250
- c, from_.df_aliased_col_name_to_real_col_name, parse_local_name=True
2251
- ).strip(" "):
2252
+ # SNOW-2895675: Always treat Aliases as "changed", even if it is an identity.
2253
+ # The fact this check is needed may be a bug in column state analysis, and we should revisit it later.
2254
+ # The following tests fail without this check:
2255
+ # - tests/integ/test_cte.py::test_sql_simplifier
2256
+ # - tests/integ/scala/test_dataframe_suite.py::test_rename_join_dataframe
2257
+ # - tests/integ/test_dataframe.py::test_dataframe_alias
2258
+ if c_name != result_name or isinstance(c, Alias):
2252
2259
  column_states[quoted_c_name] = ColumnState(
2253
2260
  quoted_c_name,
2254
2261
  ColumnChangeState.CHANGED_EXP,
@@ -7,7 +7,7 @@ import difflib
7
7
  from logging import getLogger
8
8
  import re
9
9
  import sys
10
- import uuid
10
+ import uuid as uuid_lib
11
11
  from collections import defaultdict, deque
12
12
  from enum import Enum
13
13
  from dataclasses import dataclass
@@ -383,7 +383,7 @@ class SnowflakePlan(LogicalPlan):
383
383
  # and it's a reading XML query.
384
384
 
385
385
  def search_read_file_node(
386
- node: Union[SnowflakePlan, Selectable]
386
+ node: Union[SnowflakePlan, Selectable],
387
387
  ) -> Optional[ReadFileNode]:
388
388
  source_plan = (
389
389
  node.source_plan
@@ -435,7 +435,7 @@ class SnowflakePlan(LogicalPlan):
435
435
  # during the compilation stage.
436
436
  schema_query: Optional[str],
437
437
  post_actions: Optional[List["Query"]] = None,
438
- expr_to_alias: Optional[Dict[uuid.UUID, str]] = None,
438
+ expr_to_alias: Optional[Dict[uuid_lib.UUID, str]] = None,
439
439
  source_plan: Optional[LogicalPlan] = None,
440
440
  is_ddl_on_temp_object: bool = False,
441
441
  api_calls: Optional[List[Dict]] = None,
@@ -479,7 +479,9 @@ class SnowflakePlan(LogicalPlan):
479
479
  if self.session._join_alias_fix
480
480
  else defaultdict(dict)
481
481
  )
482
- self._uuid = from_selectable_uuid if from_selectable_uuid else str(uuid.uuid4())
482
+ self._uuid = (
483
+ from_selectable_uuid if from_selectable_uuid else str(uuid_lib.uuid4())
484
+ )
483
485
  # We set the query line intervals for the last query in the queries list
484
486
  self.set_last_query_line_intervals()
485
487
  # In the placeholder query, subquery (child) is held by the ID of query plan
@@ -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
- c: str,
321
+ cs: List[str],
283
322
  prefix: Optional[str],
284
323
  suffix: Optional[str],
285
324
  common_col_names: List[str],
286
- ):
287
- col = df.col(c, _emit_ast=False)
288
- unquoted_col_name = c.strip('"')
289
- if c in common_col_names:
290
- if suffix:
291
- column_case_insensitive = is_snowflake_quoted_id_case_insensitive(c)
292
- suffix_unqouted_case_insensitive = (
293
- is_snowflake_unquoted_suffix_case_insensitive(suffix)
294
- )
295
- return col.alias(
296
- f'"{unquoted_col_name}{suffix.upper()}"'
297
- if column_case_insensitive and suffix_unqouted_case_insensitive
298
- else f'''"{unquoted_col_name}{escape_quotes(suffix.strip('"'))}"'''
299
- )
300
- return col.alias(f'"{prefix}{unquoted_col_name}"')
301
- else:
302
- return col.alias(f'"{unquoted_col_name}"')
325
+ ) -> List[Column]:
326
+ return _apply_aliases(
327
+ df, cs, _get_aliased_column_names(df, cs, prefix, suffix, common_col_names)
328
+ )
329
+
330
+
331
+ def _populate_expr_to_alias(df: "DataFrame") -> None:
332
+ """
333
+ Populate expr_to_alias mapping for a DataFrame's output columns.
334
+ This is needed for column lineage tracking when we skip the select() wrapping
335
+ optimization in _disambiguate.
336
+ """
337
+ for attr in df._output:
338
+ # Map each attribute's expr_id to its quoted column name
339
+ # This allows later lookups like df["column_name"] to resolve correctly
340
+ # Use quote_name() for consistency with analyzer.py Alias handling (line 743, 756)
341
+ if attr.expr_id not in df._plan.expr_to_alias:
342
+ df._plan.expr_to_alias[attr.expr_id] = quote_name(attr.name)
303
343
 
304
344
 
305
345
  def _disambiguate(
@@ -328,11 +368,11 @@ def _disambiguate(
328
368
  for n in lhs_names
329
369
  if n in set(rhs_names) and n not in normalized_using_columns
330
370
  ]
371
+
331
372
  all_names = [unquote_if_quoted(n) for n in lhs_names + rhs_names]
332
373
 
333
- if common_col_names:
334
- # We use the session of the LHS DataFrame to report this telemetry
335
- lhs._session._conn._telemetry_client.send_alias_in_join_telemetry()
374
+ # We use the session of the LHS DataFrame to report this telemetry
375
+ lhs._session._conn._telemetry_client.send_alias_in_join_telemetry()
336
376
 
337
377
  lsuffix = lsuffix or lhs._alias
338
378
  rsuffix = rsuffix or rhs._alias
@@ -344,25 +384,37 @@ def _disambiguate(
344
384
  _generate_deterministic_prefix("r", all_names) if not suffix_provided else ""
345
385
  )
346
386
 
387
+ lhs_aliases = _get_aliased_column_names(
388
+ lhs,
389
+ lhs_names,
390
+ lhs_prefix,
391
+ lsuffix,
392
+ [] if isinstance(join_type, (LeftSemi, LeftAnti)) else common_col_names,
393
+ )
394
+ rhs_aliases = _get_aliased_column_names(
395
+ rhs, rhs_names, rhs_prefix, rsuffix, common_col_names
396
+ )
397
+ if all(
398
+ l_name == l_aliased for l_name, l_aliased in zip(lhs_names, lhs_aliases)
399
+ ) and all(r_name == r_aliased for r_name, r_aliased in zip(rhs_names, rhs_aliases)):
400
+ # Optimization: No column name conflicts, so we can skip aliasing and the select() wrapping.
401
+ # But we still need to populate expr_to_alias for column lineage tracking,
402
+ # so that df["column_name"] can resolve correctly after the join.
403
+ # This is identified by the test case
404
+ # tests/integ/scala/test_dataframe_join_suite.py::test_name_alias_on_multiple_join.
405
+ # Note that we must also ensure none of the column names have changed due to internal quote stripping:
406
+ # see tests/integ/compiler/test_query_generator.py::test_disambiguate_skips_quoted_alias for details.
407
+ _populate_expr_to_alias(lhs)
408
+ _populate_expr_to_alias(rhs)
409
+ return lhs, rhs
410
+
347
411
  lhs_remapped = lhs.select(
348
- [
349
- _alias_if_needed(
350
- lhs,
351
- name,
352
- lhs_prefix,
353
- lsuffix,
354
- [] if isinstance(join_type, (LeftSemi, LeftAnti)) else common_col_names,
355
- )
356
- for name in lhs_names
357
- ],
412
+ _apply_aliases(lhs, lhs_names, lhs_aliases),
358
413
  _emit_ast=False,
359
414
  )
360
415
 
361
416
  rhs_remapped = rhs.select(
362
- [
363
- _alias_if_needed(rhs, name, rhs_prefix, rsuffix, common_col_names)
364
- for name in rhs_names
365
- ],
417
+ _apply_aliases(rhs, rhs_names, rhs_aliases),
366
418
  _emit_ast=False,
367
419
  )
368
420
  return lhs_remapped, rhs_remapped
@@ -2062,7 +2114,7 @@ class DataFrame:
2062
2114
  stmt = _ast_stmt
2063
2115
 
2064
2116
  # In snowpark_connect_compatible mode, we need to handle
2065
- # the filtering for dataframe after aggregation without nesting using HAVING
2117
+ # the filtering for dataframe after aggregation without nesting using HAVING.
2066
2118
  if (
2067
2119
  context._is_snowpark_connect_compatible_mode
2068
2120
  and self._ops_after_agg is not None
@@ -2278,7 +2330,7 @@ class DataFrame:
2278
2330
  )
2279
2331
 
2280
2332
  # In snowpark_connect_compatible mode, we need to handle
2281
- # the sorting for dataframe after aggregation without nesting
2333
+ # the sorting for dataframe after aggregation without nesting.
2282
2334
  if (
2283
2335
  context._is_snowpark_connect_compatible_mode
2284
2336
  and self._ops_after_agg is not None
@@ -3005,7 +3057,7 @@ class DataFrame:
3005
3057
  stmt = None
3006
3058
 
3007
3059
  # In snowpark_connect_compatible mode, we need to handle
3008
- # the limit for dataframe after aggregation without nesting
3060
+ # the limit for dataframe after aggregation without nesting.
3009
3061
  if (
3010
3062
  context._is_snowpark_connect_compatible_mode
3011
3063
  and self._ops_after_agg is not None
@@ -5113,16 +5165,13 @@ class DataFrame:
5113
5165
  )
5114
5166
  prefix = _generate_prefix("a")
5115
5167
  child = self.select(
5116
- [
5117
- _alias_if_needed(
5118
- self,
5119
- attr.name,
5120
- prefix,
5121
- suffix=None,
5122
- common_col_names=common_col_names,
5123
- )
5124
- for attr in self._output
5125
- ],
5168
+ _alias_if_needed(
5169
+ self,
5170
+ [attr.name for attr in self._output],
5171
+ prefix,
5172
+ suffix=None,
5173
+ common_col_names=common_col_names,
5174
+ ),
5126
5175
  _emit_ast=False,
5127
5176
  )
5128
5177
  return DataFrame(
@@ -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 CSV or XML file to be read.
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
- session_stage = self._session.get_session_stage()
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
- session_stage,
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"{session_stage}/{os.path.basename(local_file_path)}"
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"SNOWPARK_TEMP_XML_{handler_name}"
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<6"],
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
- new_schema,
1629
- schema_to_cast,
1630
- read_file_transformations,
1631
- _, # we don't check for error in case of infer schema failures. We use $1, Variant type
1632
- ) = self._infer_schema_for_file_format(path, format)
1633
- if new_schema:
1634
- schema = new_schema
1637
+ if not isinstance(self._session._conn, MockServerConnection):
1638
+ (
1639
+ new_schema,
1640
+ schema_to_cast,
1641
+ read_file_transformations,
1642
+ infer_schema_exception,
1643
+ ) = self._infer_schema_for_file_format(path, format)
1644
+ if new_schema:
1645
+ schema = new_schema
1646
+ elif infer_schema_exception is not None:
1647
+ if isinstance(infer_schema_exception, FileNotFoundError):
1648
+ raise infer_schema_exception
1649
+ logger.warning(
1650
+ f"Could not infer schema for {format} file due to exception: "
1651
+ f"{infer_schema_exception}. "
1652
+ "\nFalling back to $1 VARIANT schema. "
1653
+ "Please use DataFrameReader.schema() to specify a user schema for the file."
1654
+ )
1655
+ self._cur_options["INFER_SCHEMA"] = False
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 = [_to_col_if_str(c, "concat") for c in cols]
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