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 9fb79e0bdf598..4ce8fcc3b10cf 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 @@ -730,7 +730,7 @@ class Analyzer( case class ResolveNamespace(catalogManager: CatalogManager) extends Rule[LogicalPlan] with LookupCatalog { def apply(plan: LogicalPlan): LogicalPlan = plan resolveOperators { - case s @ ShowTablesStatement(UnresolvedNamespace(Seq()), _) => + case s @ ShowTables(UnresolvedNamespace(Seq()), _) => s.copy(namespace = ResolvedNamespace(currentCatalog.asNamespaceCatalog, catalogManager.currentNamespace)) case UnresolvedNamespace(Seq()) => diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveCatalogs.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveCatalogs.scala index 0a8b085e75057..5a7e0a02b15fa 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveCatalogs.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveCatalogs.scala @@ -106,15 +106,6 @@ class ResolveCatalogs(val catalogManager: CatalogManager) s"Can not specify catalog `${catalog.name}` for view ${tbl.quoted} " + s"because view support in catalog has not been implemented yet") - case AlterNamespaceSetPropertiesStatement( - NonSessionCatalogAndNamespace(catalog, ns), properties) => - AlterNamespaceSetProperties(catalog, ns, properties) - - case AlterNamespaceSetLocationStatement( - NonSessionCatalogAndNamespace(catalog, ns), location) => - AlterNamespaceSetProperties(catalog, ns, - Map(SupportsNamespaces.PROP_LOCATION -> location)) - case RenameTableStatement(NonSessionCatalogAndTable(catalog, oldName), newNameParts, isView) => if (isView) { throw new AnalysisException("Renaming view is not supported in v2 catalogs.") @@ -194,18 +185,6 @@ class ResolveCatalogs(val catalogManager: CatalogManager) if !isSessionCatalog(catalog) => CreateNamespace(catalog.asNamespaceCatalog, ns, c.ifNotExists, c.properties) - case DropNamespaceStatement(NonSessionCatalogAndNamespace(catalog, ns), ifExists, cascade) => - DropNamespace(catalog, ns, ifExists, cascade) - - case DescribeNamespaceStatement(NonSessionCatalogAndNamespace(catalog, ns), extended) => - DescribeNamespace(catalog, ns, extended) - - case ShowNamespacesStatement(NonSessionCatalogAndNamespace(catalog, ns), pattern) => - ShowNamespaces(catalog, ns, pattern) - - case ShowTablesStatement(NonSessionCatalogAndNamespace(catalog, ns), pattern) => - ShowTables(catalog.asTableCatalog, ns, pattern) - case UseStatement(isNamespaceSet, nameParts) => if (isNamespaceSet) { SetCatalogAndNamespace(catalogManager, None, Some(nameParts)) @@ -231,13 +210,4 @@ class ResolveCatalogs(val catalogManager: CatalogManager) case _ => None } } - - object NonSessionCatalogAndNamespace { - def unapply(resolved: ResolvedNamespace): Option[(SupportsNamespaces, Seq[String])] = - if (!isSessionCatalog(resolved.catalog)) { - Some(resolved.catalog -> resolved.namespace) - } else { - None - } - } } diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala index bbd6326a8ea16..fe7dbe16131af 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala @@ -2563,7 +2563,7 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging } /** - * Create a [[DropNamespaceStatement]] command. + * Create a [[DropNamespace]] command. * * For example: * {{{ @@ -2571,14 +2571,14 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging * }}} */ override def visitDropNamespace(ctx: DropNamespaceContext): LogicalPlan = withOrigin(ctx) { - DropNamespaceStatement( + DropNamespace( UnresolvedNamespace(visitMultipartIdentifier(ctx.multipartIdentifier)), ctx.EXISTS != null, ctx.CASCADE != null) } /** - * Create an [[AlterNamespaceSetPropertiesStatement]] logical plan. + * Create an [[AlterNamespaceSetProperties]] logical plan. * * For example: * {{{ @@ -2588,14 +2588,14 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging */ override def visitSetNamespaceProperties(ctx: SetNamespacePropertiesContext): LogicalPlan = { withOrigin(ctx) { - AlterNamespaceSetPropertiesStatement( + AlterNamespaceSetProperties( UnresolvedNamespace(visitMultipartIdentifier(ctx.multipartIdentifier)), visitPropertyKeyValues(ctx.tablePropertyList)) } } /** - * Create an [[AlterNamespaceSetLocationStatement]] logical plan. + * Create an [[AlterNamespaceSetLocation]] logical plan. * * For example: * {{{ @@ -2604,14 +2604,14 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging */ override def visitSetNamespaceLocation(ctx: SetNamespaceLocationContext): LogicalPlan = { withOrigin(ctx) { - AlterNamespaceSetLocationStatement( + AlterNamespaceSetLocation( UnresolvedNamespace(visitMultipartIdentifier(ctx.multipartIdentifier)), visitLocationSpec(ctx.locationSpec)) } } /** - * Create a [[ShowNamespacesStatement]] command. + * Create a [[ShowNamespaces]] command. */ override def visitShowNamespaces(ctx: ShowNamespacesContext): LogicalPlan = withOrigin(ctx) { if (ctx.DATABASES != null && ctx.multipartIdentifier != null) { @@ -2619,13 +2619,13 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging } val multiPart = Option(ctx.multipartIdentifier).map(visitMultipartIdentifier) - ShowNamespacesStatement( + ShowNamespaces( UnresolvedNamespace(multiPart.getOrElse(Seq.empty[String])), Option(ctx.pattern).map(string)) } /** - * Create a [[DescribeNamespaceStatement]]. + * Create a [[DescribeNamespace]]. * * For example: * {{{ @@ -2634,7 +2634,7 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging */ override def visitDescribeNamespace(ctx: DescribeNamespaceContext): LogicalPlan = withOrigin(ctx) { - DescribeNamespaceStatement( + DescribeNamespace( UnresolvedNamespace(visitMultipartIdentifier(ctx.multipartIdentifier())), ctx.EXTENDED != null) } @@ -2802,11 +2802,11 @@ class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging } /** - * Create a [[ShowTablesStatement]] command. + * Create a [[ShowTables]] command. */ override def visitShowTables(ctx: ShowTablesContext): LogicalPlan = withOrigin(ctx) { val multiPart = Option(ctx.multipartIdentifier).map(visitMultipartIdentifier) - ShowTablesStatement( + ShowTables( UnresolvedNamespace(multiPart.getOrElse(Seq.empty[String])), Option(ctx.pattern).map(string)) } diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/statements.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/statements.scala index bfa3b4e4003c6..de3d8585dcc91 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/statements.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/statements.scala @@ -298,15 +298,6 @@ case class DescribeTableStatement( partitionSpec: TablePartitionSpec, isExtended: Boolean) extends ParsedStatement -/** - * A DESCRIBE NAMESPACE statement, as parsed from SQL. - */ -case class DescribeNamespaceStatement( - namespace: LogicalPlan, - extended: Boolean) extends ParsedStatement { - override def children: Seq[LogicalPlan] = Seq(namespace) -} - /** * A DESCRIBE TABLE tbl_name col_name statement, as parsed from SQL. */ @@ -345,15 +336,6 @@ case class InsertIntoStatement( override def children: Seq[LogicalPlan] = query :: Nil } -/** - * A SHOW TABLES statement, as parsed from SQL. - */ -case class ShowTablesStatement( - namespace: LogicalPlan, - pattern: Option[String]) extends ParsedStatement { - override def children: Seq[LogicalPlan] = Seq(namespace) -} - /** * A SHOW TABLE EXTENDED statement, as parsed from SQL. */ @@ -371,43 +353,6 @@ case class CreateNamespaceStatement( ifNotExists: Boolean, properties: Map[String, String]) extends ParsedStatement -/** - * A DROP NAMESPACE statement, as parsed from SQL. - */ -case class DropNamespaceStatement( - namespace: LogicalPlan, - ifExists: Boolean, - cascade: Boolean) extends ParsedStatement { - override def children: Seq[LogicalPlan] = Seq(namespace) -} - -/** - * ALTER (DATABASE|SCHEMA|NAMESPACE) ... SET (DBPROPERTIES|PROPERTIES) command, as parsed from SQL. - */ -case class AlterNamespaceSetPropertiesStatement( - namespace: LogicalPlan, - properties: Map[String, String]) extends ParsedStatement { - override def children: Seq[LogicalPlan] = Seq(namespace) -} - -/** - * ALTER (DATABASE|SCHEMA|NAMESPACE) ... SET LOCATION command, as parsed from SQL. - */ -case class AlterNamespaceSetLocationStatement( - namespace: LogicalPlan, - location: String) extends ParsedStatement { - override def children: Seq[LogicalPlan] = Seq(namespace) -} - -/** - * A SHOW NAMESPACES statement, as parsed from SQL. - */ -case class ShowNamespacesStatement( - namespace: LogicalPlan, - pattern: Option[String]) extends ParsedStatement { - override def children: Seq[LogicalPlan] = Seq(namespace) -} - /** * A USE statement, as parsed from SQL. */ 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 f1f98c244370e..b414a969c92de 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 @@ -250,18 +250,19 @@ case class CreateNamespace( * The logical plan of the DROP NAMESPACE command that works for v2 catalogs. */ case class DropNamespace( - catalog: CatalogPlugin, - namespace: Seq[String], + namespace: LogicalPlan, ifExists: Boolean, - cascade: Boolean) extends Command + cascade: Boolean) extends Command { + override def children: Seq[LogicalPlan] = Seq(namespace) +} /** * The logical plan of the DESCRIBE NAMESPACE command that works for v2 catalogs. */ case class DescribeNamespace( - catalog: SupportsNamespaces, - namespace: Seq[String], + namespace: LogicalPlan, extended: Boolean) extends Command { + override def children: Seq[LogicalPlan] = Seq(namespace) override def output: Seq[Attribute] = Seq( AttributeReference("name", StringType, nullable = false, @@ -275,17 +276,29 @@ case class DescribeNamespace( * command that works for v2 catalogs. */ case class AlterNamespaceSetProperties( - catalog: SupportsNamespaces, - namespace: Seq[String], - properties: Map[String, String]) extends Command + namespace: LogicalPlan, + properties: Map[String, String]) extends Command { + override def children: Seq[LogicalPlan] = Seq(namespace) +} + +/** + * The logical plan of the ALTER (DATABASE|SCHEMA|NAMESPACE) ... SET LOCATION + * command that works for v2 catalogs. + */ +case class AlterNamespaceSetLocation( + namespace: LogicalPlan, + location: String) extends Command { + override def children: Seq[LogicalPlan] = Seq(namespace) +} /** * The logical plan of the SHOW NAMESPACES command that works for v2 catalogs. */ case class ShowNamespaces( - catalog: SupportsNamespaces, - namespace: Seq[String], + namespace: LogicalPlan, pattern: Option[String]) extends Command { + override def children: Seq[LogicalPlan] = Seq(namespace) + override val output: Seq[Attribute] = Seq( AttributeReference("namespace", StringType, nullable = false)()) } @@ -412,9 +425,10 @@ case class RenameTable( * The logical plan of the SHOW TABLE command that works for v2 catalogs. */ case class ShowTables( - catalog: TableCatalog, - namespace: Seq[String], + namespace: LogicalPlan, pattern: Option[String]) extends Command { + override def children: Seq[LogicalPlan] = Seq(namespace) + override val output: Seq[Attribute] = Seq( AttributeReference("namespace", StringType, nullable = false)(), AttributeReference("tableName", StringType, nullable = false)()) diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/DDLParserSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/DDLParserSuite.scala index 6e26e0f48a43f..2e815202c93cb 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/DDLParserSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/DDLParserSuite.scala @@ -746,9 +746,9 @@ class DDLParserSuite extends AnalysisTest { val sql1 = "DESCRIBE DATABASE EXTENDED a.b" val sql2 = "DESCRIBE DATABASE a.b" comparePlans(parsePlan(sql1), - DescribeNamespaceStatement(UnresolvedNamespace(Seq("a", "b")), extended = true)) + DescribeNamespace(UnresolvedNamespace(Seq("a", "b")), extended = true)) comparePlans(parsePlan(sql2), - DescribeNamespaceStatement(UnresolvedNamespace(Seq("a", "b")), extended = false)) + DescribeNamespace(UnresolvedNamespace(Seq("a", "b")), extended = false)) } test("SPARK-17328 Fix NPE with EXPLAIN DESCRIBE TABLE") { @@ -1108,16 +1108,16 @@ class DDLParserSuite extends AnalysisTest { test("show tables") { comparePlans( parsePlan("SHOW TABLES"), - ShowTablesStatement(UnresolvedNamespace(Seq.empty[String]), None)) + ShowTables(UnresolvedNamespace(Seq.empty[String]), None)) comparePlans( parsePlan("SHOW TABLES FROM testcat.ns1.ns2.tbl"), - ShowTablesStatement(UnresolvedNamespace(Seq("testcat", "ns1", "ns2", "tbl")), None)) + ShowTables(UnresolvedNamespace(Seq("testcat", "ns1", "ns2", "tbl")), None)) comparePlans( parsePlan("SHOW TABLES IN testcat.ns1.ns2.tbl"), - ShowTablesStatement(UnresolvedNamespace(Seq("testcat", "ns1", "ns2", "tbl")), None)) + ShowTables(UnresolvedNamespace(Seq("testcat", "ns1", "ns2", "tbl")), None)) comparePlans( parsePlan("SHOW TABLES IN tbl LIKE '*dog*'"), - ShowTablesStatement(UnresolvedNamespace(Seq("tbl")), Some("*dog*"))) + ShowTables(UnresolvedNamespace(Seq("tbl")), Some("*dog*"))) } test("show table extended") { @@ -1232,86 +1232,86 @@ class DDLParserSuite extends AnalysisTest { test("drop namespace") { comparePlans( parsePlan("DROP NAMESPACE a.b.c"), - DropNamespaceStatement( + DropNamespace( UnresolvedNamespace(Seq("a", "b", "c")), ifExists = false, cascade = false)) comparePlans( parsePlan("DROP NAMESPACE IF EXISTS a.b.c"), - DropNamespaceStatement( + DropNamespace( UnresolvedNamespace(Seq("a", "b", "c")), ifExists = true, cascade = false)) comparePlans( parsePlan("DROP NAMESPACE IF EXISTS a.b.c RESTRICT"), - DropNamespaceStatement( + DropNamespace( UnresolvedNamespace(Seq("a", "b", "c")), ifExists = true, cascade = false)) comparePlans( parsePlan("DROP NAMESPACE IF EXISTS a.b.c CASCADE"), - DropNamespaceStatement( + DropNamespace( UnresolvedNamespace(Seq("a", "b", "c")), ifExists = true, cascade = true)) comparePlans( parsePlan("DROP NAMESPACE a.b.c CASCADE"), - DropNamespaceStatement( + DropNamespace( UnresolvedNamespace(Seq("a", "b", "c")), ifExists = false, cascade = true)) } test("set namespace properties") { comparePlans( parsePlan("ALTER DATABASE a.b.c SET PROPERTIES ('a'='a', 'b'='b', 'c'='c')"), - AlterNamespaceSetPropertiesStatement( + AlterNamespaceSetProperties( UnresolvedNamespace(Seq("a", "b", "c")), Map("a" -> "a", "b" -> "b", "c" -> "c"))) comparePlans( parsePlan("ALTER SCHEMA a.b.c SET PROPERTIES ('a'='a')"), - AlterNamespaceSetPropertiesStatement( + AlterNamespaceSetProperties( UnresolvedNamespace(Seq("a", "b", "c")), Map("a" -> "a"))) comparePlans( parsePlan("ALTER NAMESPACE a.b.c SET PROPERTIES ('b'='b')"), - AlterNamespaceSetPropertiesStatement( + AlterNamespaceSetProperties( UnresolvedNamespace(Seq("a", "b", "c")), Map("b" -> "b"))) comparePlans( parsePlan("ALTER DATABASE a.b.c SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c')"), - AlterNamespaceSetPropertiesStatement( + AlterNamespaceSetProperties( UnresolvedNamespace(Seq("a", "b", "c")), Map("a" -> "a", "b" -> "b", "c" -> "c"))) comparePlans( parsePlan("ALTER SCHEMA a.b.c SET DBPROPERTIES ('a'='a')"), - AlterNamespaceSetPropertiesStatement( + AlterNamespaceSetProperties( UnresolvedNamespace(Seq("a", "b", "c")), Map("a" -> "a"))) comparePlans( parsePlan("ALTER NAMESPACE a.b.c SET DBPROPERTIES ('b'='b')"), - AlterNamespaceSetPropertiesStatement( + AlterNamespaceSetProperties( UnresolvedNamespace(Seq("a", "b", "c")), Map("b" -> "b"))) } test("set namespace location") { comparePlans( parsePlan("ALTER DATABASE a.b.c SET LOCATION '/home/user/db'"), - AlterNamespaceSetLocationStatement( + AlterNamespaceSetLocation( UnresolvedNamespace(Seq("a", "b", "c")), "/home/user/db")) comparePlans( parsePlan("ALTER SCHEMA a.b.c SET LOCATION '/home/user/db'"), - AlterNamespaceSetLocationStatement( + AlterNamespaceSetLocation( UnresolvedNamespace(Seq("a", "b", "c")), "/home/user/db")) comparePlans( parsePlan("ALTER NAMESPACE a.b.c SET LOCATION '/home/user/db'"), - AlterNamespaceSetLocationStatement( + AlterNamespaceSetLocation( UnresolvedNamespace(Seq("a", "b", "c")), "/home/user/db")) } test("show databases: basic") { comparePlans( parsePlan("SHOW DATABASES"), - ShowNamespacesStatement(UnresolvedNamespace(Seq.empty[String]), None)) + ShowNamespaces(UnresolvedNamespace(Seq.empty[String]), None)) comparePlans( parsePlan("SHOW DATABASES LIKE 'defau*'"), - ShowNamespacesStatement(UnresolvedNamespace(Seq.empty[String]), Some("defau*"))) + ShowNamespaces(UnresolvedNamespace(Seq.empty[String]), Some("defau*"))) } test("show databases: FROM/IN operator is not allowed") { @@ -1327,16 +1327,16 @@ class DDLParserSuite extends AnalysisTest { test("show namespaces") { comparePlans( parsePlan("SHOW NAMESPACES"), - ShowNamespacesStatement(UnresolvedNamespace(Seq.empty[String]), None)) + ShowNamespaces(UnresolvedNamespace(Seq.empty[String]), None)) comparePlans( parsePlan("SHOW NAMESPACES FROM testcat.ns1.ns2"), - ShowNamespacesStatement(UnresolvedNamespace(Seq("testcat", "ns1", "ns2")), None)) + ShowNamespaces(UnresolvedNamespace(Seq("testcat", "ns1", "ns2")), None)) comparePlans( parsePlan("SHOW NAMESPACES IN testcat.ns1.ns2"), - ShowNamespacesStatement(UnresolvedNamespace(Seq("testcat", "ns1", "ns2")), None)) + ShowNamespaces(UnresolvedNamespace(Seq("testcat", "ns1", "ns2")), None)) comparePlans( parsePlan("SHOW NAMESPACES IN testcat.ns1 LIKE '*pattern*'"), - ShowNamespacesStatement(UnresolvedNamespace(Seq("testcat", "ns1")), Some("*pattern*"))) + ShowNamespaces(UnresolvedNamespace(Seq("testcat", "ns1")), Some("*pattern*"))) } test("analyze table statistics") { diff --git a/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala b/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala index ab5b8c5d37827..9f0567dabecb4 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/catalyst/analysis/ResolveSessionCatalog.scala @@ -177,21 +177,21 @@ class ResolveSessionCatalog( case AlterViewUnsetPropertiesStatement(SessionCatalogAndTable(_, tbl), keys, ifExists) => AlterTableUnsetPropertiesCommand(tbl.asTableIdentifier, keys, ifExists, isView = true) - case d @ DescribeNamespaceStatement(SessionCatalogAndNamespace(_, ns), _) => + case d @ DescribeNamespace(SessionCatalogAndNamespace(_, ns), _) => if (ns.length != 1) { throw new AnalysisException( s"The database name is not valid: ${ns.quoted}") } DescribeDatabaseCommand(ns.head, d.extended) - case AlterNamespaceSetPropertiesStatement(SessionCatalogAndNamespace(_, ns), properties) => + case AlterNamespaceSetProperties(SessionCatalogAndNamespace(_, ns), properties) => if (ns.length != 1) { throw new AnalysisException( s"The database name is not valid: ${ns.quoted}") } AlterDatabasePropertiesCommand(ns.head, properties) - case AlterNamespaceSetLocationStatement(SessionCatalogAndNamespace(_, ns), location) => + case AlterNamespaceSetLocation(SessionCatalogAndNamespace(_, ns), location) => if (ns.length != 1) { throw new AnalysisException( s"The database name is not valid: ${ns.quoted}") @@ -327,17 +327,14 @@ class ResolveSessionCatalog( val newProperties = c.properties -- SupportsNamespaces.RESERVED_PROPERTIES.asScala CreateDatabaseCommand(ns.head, c.ifNotExists, location, comment, newProperties) - case d @ DropNamespaceStatement(SessionCatalogAndNamespace(_, ns), _, _) => + case d @ DropNamespace(SessionCatalogAndNamespace(_, ns), _, _) => if (ns.length != 1) { throw new AnalysisException( s"The database name is not valid: ${ns.quoted}") } DropDatabaseCommand(ns.head, d.ifExists, d.cascade) - case ShowNamespacesStatement(SessionCatalogAndNamespace(catalog, ns), pattern) => - ShowNamespaces(catalog, ns, pattern) - - case ShowTablesStatement(SessionCatalogAndNamespace(_, ns), pattern) => + case ShowTables(SessionCatalogAndNamespace(_, ns), pattern) => assert(ns.nonEmpty) if (ns.length != 1) { throw new AnalysisException( diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/DataSourceV2Strategy.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/DataSourceV2Strategy.scala index 938af1d87ddc0..8ee404e72b642 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/DataSourceV2Strategy.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/DataSourceV2Strategy.scala @@ -23,7 +23,7 @@ import org.apache.spark.sql.{AnalysisException, Strategy} import org.apache.spark.sql.catalyst.analysis.{ResolvedNamespace, ResolvedTable} import org.apache.spark.sql.catalyst.expressions.{And, PredicateHelper, SubqueryExpression} import org.apache.spark.sql.catalyst.planning.PhysicalOperation -import org.apache.spark.sql.catalyst.plans.logical.{AlterNamespaceSetProperties, AlterTable, AppendData, CommentOnNamespace, CommentOnTable, CreateNamespace, CreateTableAsSelect, CreateV2Table, DeleteFromTable, DescribeNamespace, DescribeTable, DropNamespace, DropTable, LogicalPlan, OverwriteByExpression, OverwritePartitionsDynamic, RefreshTable, RenameTable, Repartition, ReplaceTable, ReplaceTableAsSelect, SetCatalogAndNamespace, ShowCurrentNamespace, ShowNamespaces, ShowTableProperties, ShowTables} +import org.apache.spark.sql.catalyst.plans.logical.{AlterNamespaceSetLocation, AlterNamespaceSetProperties, AlterTable, AppendData, CommentOnNamespace, CommentOnTable, CreateNamespace, CreateTableAsSelect, CreateV2Table, DeleteFromTable, DescribeNamespace, DescribeTable, DropNamespace, DropTable, LogicalPlan, OverwriteByExpression, OverwritePartitionsDynamic, RefreshTable, RenameTable, Repartition, ReplaceTable, ReplaceTableAsSelect, SetCatalogAndNamespace, ShowCurrentNamespace, ShowNamespaces, ShowTableProperties, ShowTables} import org.apache.spark.sql.connector.catalog.{Identifier, StagingTableCatalog, SupportsNamespaces, TableCapability, TableCatalog, TableChange} import org.apache.spark.sql.connector.read.streaming.{ContinuousStream, MicroBatchStream} import org.apache.spark.sql.execution.{FilterExec, ProjectExec, SparkPlan} @@ -194,8 +194,8 @@ object DataSourceV2Strategy extends Strategy with PredicateHelper { Nil } - case desc @ DescribeNamespace(catalog, namespace, extended) => - DescribeNamespaceExec(desc.output, catalog, namespace, extended) :: Nil + case desc @ DescribeNamespace(ResolvedNamespace(catalog, ns), extended) => + DescribeNamespaceExec(desc.output, catalog, ns, extended) :: Nil case desc @ DescribeTable(DataSourceV2Relation(table, _, _), isExtended) => DescribeTableExec(desc.output, table, isExtended) :: Nil @@ -209,13 +209,19 @@ object DataSourceV2Strategy extends Strategy with PredicateHelper { case RenameTable(catalog, oldIdent, newIdent) => RenameTableExec(catalog, oldIdent, newIdent) :: Nil - case AlterNamespaceSetProperties(catalog, namespace, properties) => - AlterNamespaceSetPropertiesExec(catalog, namespace, properties) :: Nil + case AlterNamespaceSetProperties(ResolvedNamespace(catalog, ns), properties) => + AlterNamespaceSetPropertiesExec(catalog, ns, properties) :: Nil - case CommentOnNamespace(ResolvedNamespace(catalog, namespace), comment) => + case AlterNamespaceSetLocation(ResolvedNamespace(catalog, ns), location) => AlterNamespaceSetPropertiesExec( catalog, - namespace, + ns, + Map(SupportsNamespaces.PROP_LOCATION -> location)) :: Nil + + case CommentOnNamespace(ResolvedNamespace(catalog, ns), comment) => + AlterNamespaceSetPropertiesExec( + catalog, + ns, Map(SupportsNamespaces.PROP_COMMENT -> comment)) :: Nil case CommentOnTable(ResolvedTable(catalog, identifier, _), comment) => @@ -225,17 +231,17 @@ object DataSourceV2Strategy extends Strategy with PredicateHelper { case CreateNamespace(catalog, namespace, ifNotExists, properties) => CreateNamespaceExec(catalog, namespace, ifNotExists, properties) :: Nil - case DropNamespace(catalog, namespace, ifExists, cascade) => - DropNamespaceExec(catalog, namespace, ifExists, cascade) :: Nil + case DropNamespace(ResolvedNamespace(catalog, ns), ifExists, cascade) => + DropNamespaceExec(catalog, ns, ifExists, cascade) :: Nil - case r: ShowNamespaces => - ShowNamespacesExec(r.output, r.catalog, r.namespace, r.pattern) :: Nil + case r @ ShowNamespaces(ResolvedNamespace(catalog, ns), pattern) => + ShowNamespacesExec(r.output, catalog, ns, pattern) :: Nil - case r : ShowTables => - ShowTablesExec(r.output, r.catalog, r.namespace, r.pattern) :: Nil + case r @ ShowTables(ResolvedNamespace(catalog, ns), pattern) => + ShowTablesExec(r.output, catalog.asTableCatalog, ns, pattern) :: Nil - case SetCatalogAndNamespace(catalogManager, catalogName, namespace) => - SetCatalogAndNamespaceExec(catalogManager, catalogName, namespace) :: Nil + case SetCatalogAndNamespace(catalogManager, catalogName, ns) => + SetCatalogAndNamespaceExec(catalogManager, catalogName, ns) :: Nil case r: ShowCurrentNamespace => ShowCurrentNamespaceExec(r.output, r.catalogManager) :: Nil