This is an automated email from the ASF dual-hosted git repository. yihua pushed a commit to branch release-1.2.0 in repository https://gitbox.apache.org/repos/asf/hudi.git
commit 17d45ca763d3b9732fb1834c0cc54a48ec8aec00 Author: Rahil C <[email protected]> AuthorDate: Tue May 19 16:59:10 2026 -0700 fix: Fix SQL syntax parser for CREATE TABLE on Spark 4.1 (#18779) --- .../org/apache/spark/sql/hudi/ddl/TestCreateTable.scala | 12 +----------- .../hudi-spark4.1.x/src/main/antlr4/imports/SqlBase.g4 | 2 +- .../sql/parser/HoodieSpark4_1ExtendedSqlAstBuilder.scala | 2 +- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/ddl/TestCreateTable.scala b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/ddl/TestCreateTable.scala index 5062421487f8..ead994342162 100644 --- a/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/ddl/TestCreateTable.scala +++ b/hudi-spark-datasource/hudi-spark/src/test/scala/org/apache/spark/sql/hudi/ddl/TestCreateTable.scala @@ -17,7 +17,7 @@ package org.apache.spark.sql.hudi.ddl -import org.apache.hudi.{DataSourceWriteOptions, HoodieSparkUtils} +import org.apache.hudi.DataSourceWriteOptions import org.apache.hudi.DataSourceWriteOptions._ import org.apache.hudi.common.model.{HoodieRecord, HoodieTableType, WriteOperationType} import org.apache.hudi.common.schema.{HoodieSchema, HoodieSchemaType} @@ -42,21 +42,11 @@ import org.apache.spark.sql.hudi.common.HoodieSparkSqlTestBase import org.apache.spark.sql.hudi.common.HoodieSparkSqlTestBase.{disableComplexKeygenValidation, getLastCommitMetadata} import org.apache.spark.sql.types._ import org.junit.jupiter.api.Assertions.{assertEquals, assertFalse, assertNull, assertTrue} -import org.scalatest.{Canceled, Outcome} import scala.collection.JavaConverters._ class TestCreateTable extends HoodieSparkSqlTestBase { - // TODO(SPARK-4.1): Re-enable after fixing inline compaction hang on Spark 4.1 - override def withFixture(test: NoArgTest): Outcome = { - if (HoodieSparkUtils.gteqSpark4_1) { - Canceled("Disabled on Spark 4.1 due to inline compaction hang during MOR table creation") - } else { - super.withFixture(test) - } - } - test("Test Create Managed Hoodie Table") { val databaseName = "hudi_database" spark.sql(s"create database if not exists $databaseName") diff --git a/hudi-spark-datasource/hudi-spark4.1.x/src/main/antlr4/imports/SqlBase.g4 b/hudi-spark-datasource/hudi-spark4.1.x/src/main/antlr4/imports/SqlBase.g4 index 8f15fab16b0a..3572d73af038 100644 --- a/hudi-spark-datasource/hudi-spark4.1.x/src/main/antlr4/imports/SqlBase.g4 +++ b/hudi-spark-datasource/hudi-spark4.1.x/src/main/antlr4/imports/SqlBase.g4 @@ -948,7 +948,7 @@ dataType | INTERVAL from=(YEAR | MONTH) (TO to=MONTH)? #yearMonthIntervalDataType | INTERVAL from=(DAY | HOUR | MINUTE | SECOND) (TO to=(HOUR | MINUTE | SECOND))? #dayTimeIntervalDataType - | identifier ('(' INTEGER_VALUE (',' INTEGER_VALUE)* ')')? #primitiveDataType + | typeName=identifier ('(' (INTEGER_VALUE | identifier) (',' (INTEGER_VALUE | identifier))* ')')? #primitiveDataType ; qualifiedColTypeWithPositionList diff --git a/hudi-spark-datasource/hudi-spark4.1.x/src/main/scala/org/apache/spark/sql/parser/HoodieSpark4_1ExtendedSqlAstBuilder.scala b/hudi-spark-datasource/hudi-spark4.1.x/src/main/scala/org/apache/spark/sql/parser/HoodieSpark4_1ExtendedSqlAstBuilder.scala index 2db7472f98a5..bdf78781e699 100644 --- a/hudi-spark-datasource/hudi-spark4.1.x/src/main/scala/org/apache/spark/sql/parser/HoodieSpark4_1ExtendedSqlAstBuilder.scala +++ b/hudi-spark-datasource/hudi-spark4.1.x/src/main/scala/org/apache/spark/sql/parser/HoodieSpark4_1ExtendedSqlAstBuilder.scala @@ -2618,7 +2618,7 @@ class HoodieSpark4_1ExtendedSqlAstBuilder(conf: SQLConf, delegate: ParserInterfa * Resolve/create a primitive type. */ override def visitPrimitiveDataType(ctx: PrimitiveDataTypeContext): DataType = withOrigin(ctx) { - val dataType = ctx.identifier.getText.toLowerCase(Locale.ROOT) + val dataType = ctx.typeName.getText.toLowerCase(Locale.ROOT) (dataType, ctx.INTEGER_VALUE().asScala.toList) match { case ("boolean", Nil) => BooleanType case ("tinyint" | "byte", Nil) => ByteType
