diff --git a/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/HijackViewCommands.scala b/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/RewriteViewCommands.scala similarity index 76% rename from spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/HijackViewCommands.scala rename to spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/RewriteViewCommands.scala index a878f912c65b..2b35db33c0c5 100644 --- a/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/HijackViewCommands.scala +++ b/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/analysis/RewriteViewCommands.scala @@ -33,14 +33,13 @@ import org.apache.spark.sql.connector.catalog.ViewCatalog * ResolveSessionCatalog exits early for some v2 View commands, * thus they are pre-substituted here and then handled in ResolveViews */ -case class HijackViewCommands(spark: SparkSession) extends Rule[LogicalPlan] with LookupCatalog { +case class RewriteViewCommands(spark: SparkSession) extends Rule[LogicalPlan] with LookupCatalog { protected lazy val catalogManager: CatalogManager = spark.sessionState.catalogManager override def apply(plan: LogicalPlan): LogicalPlan = plan.resolveOperatorsUp { - case DropView(UnresolvedIdentifier(nameParts, allowTemp), ifExists) - if isViewCatalog(catalogManager.currentCatalog) && !isTempView(nameParts) => - DropIcebergView(UnresolvedIdentifier(nameParts, allowTemp), ifExists) + case DropView(ResolvedView(resolved), ifExists) => + DropIcebergView(resolved, ifExists) } private def isTempView(nameParts: Seq[String]): Boolean = { @@ -50,4 +49,17 @@ case class HijackViewCommands(spark: SparkSession) extends Rule[LogicalPlan] wit private def isViewCatalog(catalog: CatalogPlugin): Boolean = { catalog.isInstanceOf[ViewCatalog] } + + object ResolvedView { + def unapply(unresolved: UnresolvedIdentifier): Option[ResolvedIdentifier] = unresolved match { + case UnresolvedIdentifier(nameParts, true) if isTempView(nameParts) => + None + + case UnresolvedIdentifier(CatalogAndIdentifier(catalog, ident), _) if isViewCatalog(catalog) => + Some(ResolvedIdentifier(catalog, ident)) + + case _ => + None + } + } } diff --git a/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/parser/extensions/IcebergSparkSqlExtensionsParser.scala b/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/parser/extensions/IcebergSparkSqlExtensionsParser.scala index db1193cc1aac..46782816186f 100644 --- a/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/parser/extensions/IcebergSparkSqlExtensionsParser.scala +++ b/spark/v3.5/spark-extensions/src/main/scala/org/apache/spark/sql/catalyst/parser/extensions/IcebergSparkSqlExtensionsParser.scala @@ -35,7 +35,7 @@ import org.apache.spark.sql.SparkSession import org.apache.spark.sql.catalyst.FunctionIdentifier import org.apache.spark.sql.catalyst.TableIdentifier import org.apache.spark.sql.catalyst.analysis.EliminateSubqueryAliases -import org.apache.spark.sql.catalyst.analysis.HijackViewCommands +import org.apache.spark.sql.catalyst.analysis.RewriteViewCommands import org.apache.spark.sql.catalyst.analysis.UnresolvedRelation import org.apache.spark.sql.catalyst.expressions.Expression import org.apache.spark.sql.catalyst.parser.ParserInterface @@ -123,7 +123,7 @@ class IcebergSparkSqlExtensionsParser(delegate: ParserInterface) extends ParserI if (isIcebergCommand(sqlTextAfterSubstitution)) { parse(sqlTextAfterSubstitution) { parser => astBuilder.visit(parser.singleStatement()) }.asInstanceOf[LogicalPlan] } else { - HijackViewCommands(SparkSession.active).apply(delegate.parsePlan(sqlText)) + RewriteViewCommands(SparkSession.active).apply(delegate.parsePlan(sqlText)) } } @@ -335,4 +335,4 @@ class IcebergParseException( def withCommand(cmd: String): IcebergParseException = { new IcebergParseException(Option(cmd), message, start, stop) } -} \ No newline at end of file +} diff --git a/spark/v3.5/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestViews.java b/spark/v3.5/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestViews.java index c986fbcde76c..8419b8a7aed5 100644 --- a/spark/v3.5/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestViews.java +++ b/spark/v3.5/spark-extensions/src/test/java/org/apache/iceberg/spark/extensions/TestViews.java @@ -717,12 +717,13 @@ public void dropV1View() { sql("CREATE NAMESPACE IF NOT EXISTS %s", NAMESPACE); sql("CREATE TABLE %s (id INT, data STRING)", tableName); sql("CREATE VIEW %s AS SELECT id FROM %s", v1View, tableName); + sql("USE %s", catalogName); assertThat( v1SessionCatalog() .tableExists(new org.apache.spark.sql.catalyst.TableIdentifier(v1View))) .isTrue(); - sql("DROP VIEW %s", v1View); + sql("DROP VIEW spark_catalog.%s.%s", NAMESPACE, v1View); assertThat( v1SessionCatalog() .tableExists(new org.apache.spark.sql.catalyst.TableIdentifier(v1View)))