diff --git a/hudi-spark-datasource/hudi-spark/src/main/scala/org/apache/spark/sql/hudi/command/UpdateHoodieTableCommand.scala b/hudi-spark-datasource/hudi-spark/src/main/scala/org/apache/spark/sql/hudi/command/UpdateHoodieTableCommand.scala index 20a827400ee4c..8cdce67aeaaa9 100644 --- a/hudi-spark-datasource/hudi-spark/src/main/scala/org/apache/spark/sql/hudi/command/UpdateHoodieTableCommand.scala +++ b/hudi-spark-datasource/hudi-spark/src/main/scala/org/apache/spark/sql/hudi/command/UpdateHoodieTableCommand.scala @@ -51,7 +51,10 @@ case class UpdateHoodieTableCommand(updateTable: UpdateTable) extends RunnableCo }.toMap val updateExpressions = table.output - .map(attr => name2UpdateValue.getOrElse(attr.name, attr)) + .map(attr => { + val UpdateValueOption = name2UpdateValue.find(f => sparkSession.sessionState.conf.resolver(f._1, attr.name)) + if(UpdateValueOption.isEmpty) attr else UpdateValueOption.get._2 + }) .filter { // filter the meta columns case attr: AttributeReference => !HoodieRecord.HOODIE_META_COLUMNS.asScala.toSet.contains(attr.name) diff --git a/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/TestUpdateTable.scala b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/TestUpdateTable.scala index 8e9c81b12cb7a..0f8eda174e58e 100644 --- a/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/TestUpdateTable.scala +++ b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/TestUpdateTable.scala @@ -20,6 +20,47 @@ package org.apache.spark.sql.hudi class TestUpdateTable extends TestHoodieSqlBase { test("Test Update Table") { + withTempDir { tmp => + Seq("cow", "mor").foreach {tableType => + val tableName = generateTableName + // create table + spark.sql( + s""" + |create table $tableName ( + | ID int, + | NAME string, + | PRICE double, + | TS long + |) using hudi + | location '${tmp.getCanonicalPath}/$tableName' + | options ( + | type = '$tableType', + | primaryKey = 'ID', + | preCombineField = 'TS' + | ) + """.stripMargin) + // insert data to table + spark.sql(s"insert into $tableName select 1, 'a1', 10, 1000") + checkAnswer(s"select id, name, price, ts from $tableName")( + Seq(1, "a1", 10.0, 1000) + ) + + // update data + spark.sql(s"update $tableName set price = 20 where id = 1") + checkAnswer(s"select id, name, price, ts from $tableName")( + Seq(1, "a1", 20.0, 1000) + ) + + // update data + spark.sql(s"update $tableName set price = price * 2 where id = 1") + checkAnswer(s"select id, name, price, ts from $tableName")( + Seq(1, "a1", 40.0, 1000) + ) + } + } + } + + test("Test ignoring case for Update Table") { withTempDir { tmp => Seq("cow", "mor").foreach {tableType => val tableName = generateTableName @@ -46,13 +87,13 @@ class TestUpdateTable extends TestHoodieSqlBase { ) // update data - spark.sql(s"update $tableName set price = 20 where id = 1") + spark.sql(s"update $tableName set PRICE = 20 where ID = 1") checkAnswer(s"select id, name, price, ts from $tableName")( Seq(1, "a1", 20.0, 1000) ) // update data - spark.sql(s"update $tableName set price = price * 2 where id = 1") + spark.sql(s"update $tableName set PRICE = PRICE * 2 where ID = 1") checkAnswer(s"select id, name, price, ts from $tableName")( Seq(1, "a1", 40.0, 1000) )