This is an automated email from the ASF dual-hosted git repository.

dongjoon pushed a commit to branch branch-3.4
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/branch-3.4 by this push:
     new ed6c1b33a0a [SPARK-45075][SQL][3.4] Fix alter table with invalid 
default value will not report error
ed6c1b33a0a is described below

commit ed6c1b33a0a763680182b29baedebb241e0139a4
Author: Jia Fan <fanjiaemi...@qq.com>
AuthorDate: Mon Sep 11 23:28:20 2023 -0700

    [SPARK-45075][SQL][3.4] Fix alter table with invalid default value will not 
report error
    
    ### What changes were proposed in this pull request?
    This is a backporting PR to branch-3.4 from 
https://github.com/apache/spark/pull/42810
    
    Changed the way of assert the error to adapt to 3.4
    
    ### Why are the changes needed?
    Fix bug on 3.4
    
    ### Does this PR introduce _any_ user-facing change?
    No
    
    ### How was this patch tested?
    add new test.
    
    ### Was this patch authored or co-authored using generative AI tooling?
    No
    
    Closes #42876 from Hisoka-X/SPARK-45075_followup_3.4_alter_column.
    
    Authored-by: Jia Fan <fanjiaemi...@qq.com>
    Signed-off-by: Dongjoon Hyun <dh...@apple.com>
---
 .../spark/sql/connector/catalog/TableChange.java   |  3 +--
 .../plans/logical/v2AlterTableCommands.scala       | 11 +++++++++--
 .../spark/sql/connector/AlterTableTests.scala      | 23 ++++++++++++++++++++++
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git 
a/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/TableChange.java
 
b/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/TableChange.java
index 609cfab2d56..ebecb6f507e 100644
--- 
a/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/TableChange.java
+++ 
b/sql/catalyst/src/main/java/org/apache/spark/sql/connector/catalog/TableChange.java
@@ -696,9 +696,8 @@ public interface TableChange {
     /**
      * Returns the column default value SQL string (Spark SQL dialect). The 
default value literal
      * is not provided as updating column default values does not need to 
back-fill existing data.
-     * Null means dropping the column default value.
+     * Empty string means dropping the column default value.
      */
-    @Nullable
     public String newDefaultValue() { return newDefaultValue; }
 
     @Override
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2AlterTableCommands.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2AlterTableCommands.scala
index eb9d45f06ec..b02c4fac12d 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2AlterTableCommands.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2AlterTableCommands.scala
@@ -17,9 +17,9 @@
 
 package org.apache.spark.sql.catalyst.plans.logical
 
-import org.apache.spark.sql.catalyst.analysis.{FieldName, FieldPosition}
+import org.apache.spark.sql.catalyst.analysis.{FieldName, FieldPosition, 
ResolvedFieldName}
 import org.apache.spark.sql.catalyst.catalog.CatalogTypes.TablePartitionSpec
-import org.apache.spark.sql.catalyst.util.TypeUtils
+import org.apache.spark.sql.catalyst.util.{ResolveDefaultColumns, TypeUtils}
 import org.apache.spark.sql.connector.catalog.{TableCatalog, TableChange}
 import org.apache.spark.sql.errors.QueryCompilationErrors
 import org.apache.spark.sql.types.DataType
@@ -228,6 +228,13 @@ case class AlterColumn(
       TableChange.updateColumnPosition(colName, newPosition.position)
     }
     val defaultValueChange = setDefaultExpression.map { newDefaultExpression =>
+      if (newDefaultExpression.nonEmpty) {
+        // SPARK-45075: We call 'ResolveDefaultColumns.analyze' here to make 
sure that the default
+        // value parses successfully, and return an error otherwise
+        val newDataType = 
dataType.getOrElse(column.asInstanceOf[ResolvedFieldName].field.dataType)
+        ResolveDefaultColumns.analyze(column.name.last, newDataType, 
newDefaultExpression,
+          "ALTER TABLE ALTER COLUMN")
+      }
       TableChange.updateColumnDefaultValue(colName, newDefaultExpression)
     }
     typeChange.toSeq ++ nullabilityChange ++ commentChange ++ positionChange 
++ defaultValueChange
diff --git 
a/sql/core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala 
b/sql/core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala
index 2047212a4ea..8f1faa18933 100644
--- 
a/sql/core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala
+++ 
b/sql/core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala
@@ -366,6 +366,29 @@ trait AlterTableTests extends SharedSparkSession with 
QueryErrorsBase {
     }
   }
 
+  test("SPARK-45075: ALTER COLUMN with invalid default value") {
+    withSQLConf(SQLConf.DEFAULT_COLUMN_ALLOWED_PROVIDERS.key -> s"$v2Format, 
") {
+      withTable("t") {
+        sql(s"create table t(i boolean) using $v2Format")
+        // The default value fails to analyze.
+        assert(intercept[AnalysisException](
+          sql("alter table t add column s bigint default badvalue")
+        ).getMessage.contains("Failed to execute ALTER TABLE command because 
the destination" +
+                " table column s has a DEFAULT value of badvalue which fails 
to resolve as a" +
+                " valid expression: [UNRESOLVED_COLUMN.WITHOUT_SUGGESTION] A 
column or function" +
+                " parameter with name `badvalue` cannot be resolved. ;"))
+
+        sql("alter table t add column s bigint default 3L")
+        assert(intercept[AnalysisException](
+          sql("alter table t alter column s set default badvalue")
+        ).getMessage.contains("Failed to execute ALTER TABLE ALTER COLUMN 
command because the" +
+                " destination table column s has a DEFAULT value of badvalue 
which fails to" +
+                " resolve as a valid expression: 
[UNRESOLVED_COLUMN.WITHOUT_SUGGESTION] A" +
+                " column or function parameter with name `badvalue` cannot be 
resolved. ;"))
+      }
+    }
+  }
+
   test("AlterTable: add complex column") {
     val t = s"${catalogAndNamespace}table_name"
     withTable(t) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org
For additional commands, e-mail: commits-h...@spark.apache.org

Reply via email to