From fda91c7f63cccc4aeeee41d4ceb79a8f1a2a9805 Mon Sep 17 00:00:00 2001 From: Wenchen Fan Date: Wed, 30 Oct 2019 16:47:44 +0800 Subject: [PATCH] AlterTable/DescribeTable should not list the table as a child --- .../spark/sql/catalyst/analysis/Analyzer.scala | 16 +++++++++++++--- .../sql/catalyst/analysis/CheckAnalysis.scala | 14 ++++++++++++++ .../sql/catalyst/plans/logical/v2Commands.scala | 6 ++---- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala index d92987887b70c..7d91925a5288a 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/Analyzer.scala @@ -681,10 +681,20 @@ class Analyzer( .map(v2Relation => i.copy(table = v2Relation)) .getOrElse(i) + case desc @ DescribeTable(u: UnresolvedV2Relation, _) => + resolveV2Relation(u).map(relation => desc.copy(table = relation)).getOrElse(desc) + + case alter @ AlterTable(_, _, u: UnresolvedV2Relation, _) => + resolveV2Relation(u).map(relation => alter.copy(table = relation)).getOrElse(alter) + case u: UnresolvedV2Relation => - CatalogV2Util.loadTable(u.catalog, u.tableName).map { table => - DataSourceV2Relation.create(table) - }.getOrElse(u) + resolveV2Relation(u).getOrElse(u) + } + + private def resolveV2Relation(u: UnresolvedV2Relation): Option[DataSourceV2Relation] = { + CatalogV2Util.loadTable(u.catalog, u.tableName).map { table => + DataSourceV2Relation.create(table) + } } } diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala index d9dc9ebbcaf3c..eaa69e48136b0 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala @@ -97,6 +97,20 @@ trait CheckAnalysis extends PredicateHelper { case InsertIntoStatement(u: UnresolvedRelation, _, _, _, _) => failAnalysis(s"Table not found: ${u.multipartIdentifier.quoted}") + case AlterTable(_, _, u: UnresolvedV2Relation, _) if isView(u.originalNameParts) => + u.failAnalysis( + s"Invalid command: '${u.originalNameParts.quoted}' is a view not a table.") + + case AlterTable(_, _, u: UnresolvedV2Relation, _) => + failAnalysis(s"Table not found: ${u.originalNameParts.quoted}") + + case DescribeTable(u: UnresolvedV2Relation, _) if isView(u.originalNameParts) => + u.failAnalysis( + s"Invalid command: '${u.originalNameParts.quoted}' is a view not a table.") + + case DescribeTable(u: UnresolvedV2Relation, _) => + failAnalysis(s"Table not found: ${u.originalNameParts.quoted}") + case u: UnresolvedV2Relation if isView(u.originalNameParts) => u.failAnalysis( s"Invalid command: '${u.originalNameParts.quoted}' is a view not a table.") diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2Commands.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2Commands.scala index f587ee2928fc2..3c625e9acb5a7 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2Commands.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/v2Commands.scala @@ -271,7 +271,7 @@ case class ShowNamespaces( */ case class DescribeTable(table: NamedRelation, isExtended: Boolean) extends Command { - override def children: Seq[LogicalPlan] = Seq(table) + override lazy val resolved: Boolean = table.resolved override def output: Seq[Attribute] = DescribeTableSchema.describeTableAttributes() } @@ -313,9 +313,7 @@ case class AlterTable( table: NamedRelation, changes: Seq[TableChange]) extends Command { - override def children: Seq[LogicalPlan] = Seq(table) - - override lazy val resolved: Boolean = childrenResolved && { + override lazy val resolved: Boolean = table.resolved && { changes.forall { case add: AddColumn => add.fieldNames match {