@@ -25,6 +25,7 @@ import scala.collection.JavaConverters._
2525import org .scalatest .{BeforeAndAfter , BeforeAndAfterAll }
2626
2727import org .apache .spark .SparkFunSuite
28+ import org .apache .spark .sql .AnalysisException
2829import org .apache .spark .sql .catalog .v2 .{Catalogs , Identifier , TableCatalog , TableChange }
2930import org .apache .spark .sql .catalyst .analysis .{NoSuchTableException , TableAlreadyExistsException }
3031import org .apache .spark .sql .catalyst .parser .CatalystSqlParser
@@ -45,20 +46,23 @@ class V2SessionCatalogSuite
4546 override protected def beforeAll (): Unit = {
4647 super .beforeAll()
4748 spark.sql(""" CREATE DATABASE IF NOT EXISTS db""" )
49+ spark.sql(""" CREATE DATABASE IF NOT EXISTS db2""" )
4850 spark.sql(""" CREATE DATABASE IF NOT EXISTS ns""" )
4951 spark.sql(""" CREATE DATABASE IF NOT EXISTS ns2""" )
5052 }
5153
5254 override protected def afterAll (): Unit = {
5355 spark.sql(""" DROP TABLE IF EXISTS db.test_table""" )
5456 spark.sql(""" DROP DATABASE IF EXISTS db""" )
57+ spark.sql(""" DROP DATABASE IF EXISTS db2""" )
5558 spark.sql(""" DROP DATABASE IF EXISTS ns""" )
5659 spark.sql(""" DROP DATABASE IF EXISTS ns2""" )
5760 super .afterAll()
5861 }
5962
6063 after {
6164 newCatalog().dropTable(testIdent)
65+ newCatalog().dropTable(testIdentNew)
6266 }
6367
6468 private def newCatalog (): TableCatalog = {
@@ -67,7 +71,9 @@ class V2SessionCatalogSuite
6771 newCatalog
6872 }
6973
70- private val testIdent = Identifier .of(Array (" db" ), " test_table" )
74+ private val testNs = Array (" db" )
75+ private val testIdent = Identifier .of(testNs, " test_table" )
76+ private val testIdentNew = Identifier .of(testNs, " test_table_new" )
7177
7278 test(" Catalogs can load the catalog" ) {
7379 val catalog = newCatalog()
@@ -680,4 +686,70 @@ class V2SessionCatalogSuite
680686 assert(! wasDropped)
681687 assert(! catalog.tableExists(testIdent))
682688 }
689+
690+ test(" renameTable" ) {
691+ val catalog = newCatalog()
692+
693+ assert(! catalog.tableExists(testIdent))
694+ assert(! catalog.tableExists(testIdentNew))
695+
696+ catalog.createTable(testIdent, schema, Array .empty, emptyProps)
697+
698+ assert(catalog.tableExists(testIdent))
699+ catalog.renameTable(testIdent, testIdentNew)
700+
701+ assert(! catalog.tableExists(testIdent))
702+ assert(catalog.tableExists(testIdentNew))
703+ }
704+
705+ test(" renameTable: fail if table does not exist" ) {
706+ val catalog = newCatalog()
707+
708+ val exc = intercept[NoSuchTableException ] {
709+ catalog.renameTable(testIdent, testIdentNew)
710+ }
711+
712+ assert(exc.message.contains(testIdent.quoted))
713+ assert(exc.message.contains(" not found" ))
714+ }
715+
716+ test(" renameTable: fail if new table name already exists" ) {
717+ val catalog = newCatalog()
718+
719+ assert(! catalog.tableExists(testIdent))
720+ assert(! catalog.tableExists(testIdentNew))
721+
722+ catalog.createTable(testIdent, schema, Array .empty, emptyProps)
723+ catalog.createTable(testIdentNew, schema, Array .empty, emptyProps)
724+
725+ assert(catalog.tableExists(testIdent))
726+ assert(catalog.tableExists(testIdentNew))
727+
728+ val exc = intercept[TableAlreadyExistsException ] {
729+ catalog.renameTable(testIdent, testIdentNew)
730+ }
731+
732+ assert(exc.message.contains(testIdentNew.quoted))
733+ assert(exc.message.contains(" already exists" ))
734+ }
735+
736+ test(" renameTable: fail if db does not match for old and new table names" ) {
737+ val catalog = newCatalog()
738+ val testIdentNewOtherDb = Identifier .of(Array (" db2" ), " test_table_new" )
739+
740+ assert(! catalog.tableExists(testIdent))
741+ assert(! catalog.tableExists(testIdentNewOtherDb))
742+
743+ catalog.createTable(testIdent, schema, Array .empty, emptyProps)
744+
745+ assert(catalog.tableExists(testIdent))
746+
747+ val exc = intercept[AnalysisException ] {
748+ catalog.renameTable(testIdent, testIdentNewOtherDb)
749+ }
750+
751+ assert(exc.message.contains(testIdent.namespace.quoted))
752+ assert(exc.message.contains(testIdentNewOtherDb.namespace.quoted))
753+ assert(exc.message.contains(" RENAME TABLE source and destination databases do not match" ))
754+ }
683755}
0 commit comments