-
Notifications
You must be signed in to change notification settings - Fork 28.9k
[SPARK-14124] [SQL] [FOLLOWUP] Implement Database-related DDL Commands #12081
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
108 commits
Select commit
Hold shift + click to select a range
01e4cdf
Merge remote-tracking branch 'upstream/master'
gatorsmile 6835704
Merge remote-tracking branch 'upstream/master'
gatorsmile 9180687
Merge remote-tracking branch 'upstream/master'
gatorsmile b38a21e
SPARK-11633
gatorsmile d2b84af
Merge remote-tracking branch 'upstream/master' into joinMakeCopy
gatorsmile fda8025
Merge remote-tracking branch 'upstream/master'
gatorspark ac0dccd
Merge branch 'master' of https://github.com/gatorsmile/spark
gatorspark 6e0018b
Merge remote-tracking branch 'upstream/master'
0546772
converge
gatorsmile b37a64f
converge
gatorsmile c2a872c
Merge remote-tracking branch 'upstream/master'
gatorsmile ab6dbd7
Merge remote-tracking branch 'upstream/master'
gatorsmile 4276356
Merge remote-tracking branch 'upstream/master'
gatorsmile 2dab708
Merge remote-tracking branch 'upstream/master'
gatorsmile 0458770
Merge remote-tracking branch 'upstream/master'
gatorsmile 1debdfa
Merge remote-tracking branch 'upstream/master'
gatorsmile 763706d
Merge remote-tracking branch 'upstream/master'
gatorsmile 4de6ec1
Merge remote-tracking branch 'upstream/master'
gatorsmile 9422a4f
Merge remote-tracking branch 'upstream/master'
gatorsmile 52bdf48
Merge remote-tracking branch 'upstream/master'
gatorsmile 1e95df3
Merge remote-tracking branch 'upstream/master'
gatorsmile fab24cf
Merge remote-tracking branch 'upstream/master'
gatorsmile 8b2e33b
Merge remote-tracking branch 'upstream/master'
gatorsmile 2ee1876
Merge remote-tracking branch 'upstream/master'
gatorsmile b9f0090
Merge remote-tracking branch 'upstream/master'
gatorsmile ade6f7e
Merge remote-tracking branch 'upstream/master'
gatorsmile 9fd63d2
Merge remote-tracking branch 'upstream/master'
gatorsmile 5199d49
Merge remote-tracking branch 'upstream/master'
gatorsmile 404214c
Merge remote-tracking branch 'upstream/master'
gatorsmile c001dd9
Merge remote-tracking branch 'upstream/master'
gatorsmile 59daa48
Merge remote-tracking branch 'upstream/master'
gatorsmile 41d5f64
Merge remote-tracking branch 'upstream/master'
gatorsmile 472a6e3
Merge remote-tracking branch 'upstream/master'
gatorsmile 0fba10a
Merge remote-tracking branch 'upstream/master'
gatorsmile cbf73b3
Merge remote-tracking branch 'upstream/master'
gatorsmile c08f561
Merge remote-tracking branch 'upstream/master'
gatorsmile 474df88
Merge remote-tracking branch 'upstream/master'
gatorsmile 3d9828d
Merge remote-tracking branch 'upstream/master'
gatorsmile 72d2361
Merge remote-tracking branch 'upstream/master'
gatorsmile 07afea5
Merge remote-tracking branch 'upstream/master'
gatorsmile 8bf2007
Merge remote-tracking branch 'upstream/master'
gatorsmile 7cd839e
correct the database path.
gatorsmile a9ddedc
fixed the test case.
gatorsmile 87a165b
Merge remote-tracking branch 'upstream/master'
gatorsmile 7e4b4dc
Merge remote-tracking branch 'upstream/master' into mkdir
gatorsmile 522a494
address comments.
gatorsmile 16ac0b1
address comments.
gatorsmile b9359cd
Merge remote-tracking branch 'upstream/master'
gatorsmile 65bd090
Merge remote-tracking branch 'upstream/master'
gatorsmile babf2da
Merge remote-tracking branch 'upstream/master'
gatorsmile 9e09469
Merge remote-tracking branch 'upstream/master'
gatorsmile 35f9b42
Merge branch 'mkdir' into mkdirNew
gatorsmile 3c03dbf
Merge branch 'mkdir' into mkdirNew
gatorsmile 8b6f86b
style fix.
gatorsmile 50a8e4a
Merge remote-tracking branch 'upstream/master'
gatorsmile f666fa2
added test cases
gatorsmile b120b77
style fix
gatorsmile f1fb8bb
Merge remote-tracking branch 'upstream/master' into mkdirNew
gatorsmile b2cb03d
compilation error fix
gatorsmile d0b541b
Merge remote-tracking branch 'upstream/master' into mkdirNew
gatorsmile d1f6792
Merge remote-tracking branch 'upstream/master' into mkdirNew
gatorsmile 2ba5a73
unable to reproduce it in the local environment and print more info t…
gatorsmile f3337fa
Merge remote-tracking branch 'upstream/master'
gatorsmile 4a57a80
Merge branch 'mkdirNew' into mkdirNewNewNew
gatorsmile 4890c65
one more try
gatorsmile 1618f50
style fix.
gatorsmile 924f132
print more
gatorsmile 04e1d83
clear the cache!!!!
gatorsmile 3ae138b
code clean and avoid dropping the function current_database when rese…
gatorsmile ec4f595
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNew
gatorsmile 9cf48e1
address comments.
gatorsmile 38130a8
address comments.
gatorsmile eeec2c1
fix os specific separator
gatorsmile 09cc36d
Merge remote-tracking branch 'upstream/master'
gatorsmile 592ba1c
Merge branch 'mkdirNewNewNew' into mkdirNewNewNewNew
gatorsmile 3353a39
address comments
gatorsmile 807abaf
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew
gatorsmile 4989110
address comments.
gatorsmile 83a1915
Merge remote-tracking branch 'upstream/master'
gatorsmile 0483145
Merge remote-tracking branch 'upstream/master'
gatorsmile 236a5f4
Merge remote-tracking branch 'upstream/master'
gatorsmile 8a3e230
merge
gatorsmile 8f185be
merge
gatorsmile 08aaa4d
Merge remote-tracking branch 'upstream/master'
gatorsmile fa5f124
Merge branch 'mkdirNewNewNewNewNew' into mkdirNewNewNewNewNewNew
gatorsmile 44fdf83
address comments.
gatorsmile 64f704e
Merge remote-tracking branch 'upstream/master'
gatorsmile 206b7e2
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile 006ea2d
Merge remote-tracking branch 'upstream/master'
gatorsmile 3350529
Merge branch 'mkdirNewNewNewNewNewNew' into mkdirNewNewNewNewNewNewNew
gatorsmile bd1caa5
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile 4c8af84
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile a2d71fd
address comments.
gatorsmile 375b692
Unable to reproduce it in my local environment. Print more info.
gatorsmile 1da261a
reload the conf after reset
gatorsmile 0c0dc8a
Merge remote-tracking branch 'upstream/master'
gatorsmile 7c4b2f0
Merge remote-tracking branch 'upstream/master'
gatorsmile 38f3af9
Merge remote-tracking branch 'upstream/master'
gatorsmile ae6285f
address comments.
gatorsmile 95d9a00
address comments.
gatorsmile 2ec4d59
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile 59a9805
address comments.
gatorsmile b885f7b
added a new test case
gatorsmile 8089c6f
Merge remote-tracking branch 'upstream/master'
gatorsmile a6c7518
Merge remote-tracking branch 'upstream/master'
gatorsmile 838eaeb
Merge branch 'mkdirNewNewNewNewNewNewNewNew' into mkdirNewNewNewNewNe…
gatorsmile 55cf518
address comments
gatorsmile b190b86
address comments
gatorsmile File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -95,49 +95,81 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach { | |
| catalog.createPartitions(tableName, Seq(part), ignoreIfExists = false) | ||
| } | ||
|
|
||
| private def appendTrailingSlash(path: String): String = { | ||
| if (!path.endsWith(File.separator)) path + File.separator else path | ||
| } | ||
|
|
||
| test("the qualified path of a database is stored in the catalog") { | ||
| val catalog = sqlContext.sessionState.catalog | ||
|
|
||
| val path = System.getProperty("java.io.tmpdir") | ||
| // The generated temp path is not qualified. | ||
| assert(!path.startsWith("file:/")) | ||
| sql(s"CREATE DATABASE db1 LOCATION '$path'") | ||
| val pathInCatalog = new Path(catalog.getDatabaseMetadata("db1").locationUri).toUri | ||
| assert("file" === pathInCatalog.getScheme) | ||
| assert(path === pathInCatalog.getPath) | ||
|
|
||
| withSQLConf( | ||
| SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir"))) { | ||
| sql(s"CREATE DATABASE db2") | ||
| val pathInCatalog = new Path(catalog.getDatabaseMetadata("db2").locationUri).toUri | ||
| withTempDir { tmpDir => | ||
| val path = tmpDir.toString | ||
| // The generated temp path is not qualified. | ||
| assert(!path.startsWith("file:/")) | ||
| sql(s"CREATE DATABASE db1 LOCATION '$path'") | ||
| val pathInCatalog = new Path(catalog.getDatabaseMetadata("db1").locationUri).toUri | ||
| assert("file" === pathInCatalog.getScheme) | ||
| assert(s"${sqlContext.conf.warehousePath}/db2.db" === pathInCatalog.getPath) | ||
| } | ||
| val expectedPath = if (path.endsWith(File.separator)) path.dropRight(1) else path | ||
| assert(expectedPath === pathInCatalog.getPath) | ||
|
|
||
| withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) { | ||
| sql(s"CREATE DATABASE db2") | ||
| val pathInCatalog = new Path(catalog.getDatabaseMetadata("db2").locationUri).toUri | ||
| assert("file" === pathInCatalog.getScheme) | ||
| val expectedPath = appendTrailingSlash(sqlContext.conf.warehousePath) + "db2.db" | ||
| assert(expectedPath === pathInCatalog.getPath) | ||
| } | ||
|
|
||
| sql("DROP DATABASE db1") | ||
| sql("DROP DATABASE db2") | ||
| sql("DROP DATABASE db1") | ||
| sql("DROP DATABASE db2") | ||
| } | ||
| } | ||
|
|
||
| test("Create/Drop Database") { | ||
| withSQLConf( | ||
| SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir") + File.separator)) { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| withTempDir { tmpDir => | ||
| val path = tmpDir.toString | ||
| withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val databaseNames = Seq("db1", "`database`") | ||
|
|
||
| databaseNames.foreach { dbName => | ||
| try { | ||
| val dbNameWithoutBackTicks = cleanIdentifier(dbName) | ||
|
|
||
| val databaseNames = Seq("db1", "`database`") | ||
| sql(s"CREATE DATABASE $dbName") | ||
| val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks) | ||
| val expectedLocation = | ||
| "file:" + appendTrailingSlash(path) + s"$dbNameWithoutBackTicks.db" | ||
| assert(db1 == CatalogDatabase( | ||
| dbNameWithoutBackTicks, | ||
| "", | ||
| expectedLocation, | ||
| Map.empty)) | ||
| sql(s"DROP DATABASE $dbName CASCADE") | ||
| assert(!catalog.databaseExists(dbNameWithoutBackTicks)) | ||
| } finally { | ||
| catalog.reset() | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| test("Create/Drop Database - location") { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val databaseNames = Seq("db1", "`database`") | ||
| withTempDir { tmpDir => | ||
| val path = tmpDir.toString | ||
| val dbPath = "file:" + path | ||
| databaseNames.foreach { dbName => | ||
| try { | ||
| val dbNameWithoutBackTicks = cleanIdentifier(dbName) | ||
|
|
||
| sql(s"CREATE DATABASE $dbName") | ||
| sql(s"CREATE DATABASE $dbName Location '$path'") | ||
| val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks) | ||
| val expectedLocation = | ||
| "file:" + System.getProperty("java.io.tmpdir") + | ||
| File.separator + s"$dbNameWithoutBackTicks.db" | ||
| assert(db1 == CatalogDatabase( | ||
| dbNameWithoutBackTicks, | ||
| "", | ||
| expectedLocation, | ||
| if (dbPath.endsWith(File.separator)) dbPath.dropRight(1) else dbPath, | ||
| Map.empty)) | ||
| sql(s"DROP DATABASE $dbName CASCADE") | ||
| assert(!catalog.databaseExists(dbNameWithoutBackTicks)) | ||
|
|
@@ -149,77 +181,78 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach { | |
| } | ||
|
|
||
| test("Create Database - database already exists") { | ||
| withSQLConf( | ||
| SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir") + File.separator)) { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val databaseNames = Seq("db1", "`database`") | ||
|
|
||
| databaseNames.foreach { dbName => | ||
| try { | ||
| val dbNameWithoutBackTicks = cleanIdentifier(dbName) | ||
| sql(s"CREATE DATABASE $dbName") | ||
| val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks) | ||
| val expectedLocation = | ||
| "file:" + System.getProperty("java.io.tmpdir") + | ||
| File.separator + s"$dbNameWithoutBackTicks.db" | ||
| assert(db1 == CatalogDatabase( | ||
| dbNameWithoutBackTicks, | ||
| "", | ||
| expectedLocation, | ||
| Map.empty)) | ||
|
|
||
| val message = intercept[AnalysisException] { | ||
| withTempDir { tmpDir => | ||
| val path = tmpDir.toString | ||
| withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val databaseNames = Seq("db1", "`database`") | ||
|
|
||
| databaseNames.foreach { dbName => | ||
| try { | ||
| val dbNameWithoutBackTicks = cleanIdentifier(dbName) | ||
| sql(s"CREATE DATABASE $dbName") | ||
| }.getMessage | ||
| assert(message.contains(s"Database '$dbNameWithoutBackTicks' already exists.")) | ||
| } finally { | ||
| catalog.reset() | ||
| val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks) | ||
| val expectedLocation = | ||
| "file:" + appendTrailingSlash(path) + s"$dbNameWithoutBackTicks.db" | ||
| assert(db1 == CatalogDatabase( | ||
| dbNameWithoutBackTicks, | ||
| "", | ||
| expectedLocation, | ||
| Map.empty)) | ||
|
|
||
| val message = intercept[AnalysisException] { | ||
| sql(s"CREATE DATABASE $dbName") | ||
| }.getMessage | ||
| assert(message.contains(s"Database '$dbNameWithoutBackTicks' already exists.")) | ||
| } finally { | ||
| catalog.reset() | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| test("Alter/Describe Database") { | ||
| withSQLConf( | ||
| SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir") + File.separator)) { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val databaseNames = Seq("db1", "`database`") | ||
| withTempDir { tmpDir => | ||
| val path = tmpDir.toString | ||
| withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val databaseNames = Seq("db1", "`database`") | ||
|
|
||
| databaseNames.foreach { dbName => | ||
| try { | ||
| val dbNameWithoutBackTicks = cleanIdentifier(dbName) | ||
| val location = | ||
| "file:" + System.getProperty("java.io.tmpdir") + | ||
| File.separator + s"$dbNameWithoutBackTicks.db" | ||
|
|
||
| sql(s"CREATE DATABASE $dbName") | ||
|
|
||
| checkAnswer( | ||
| sql(s"DESCRIBE DATABASE EXTENDED $dbName"), | ||
| Row("Database Name", dbNameWithoutBackTicks) :: | ||
| Row("Description", "") :: | ||
| Row("Location", location) :: | ||
| Row("Properties", "") :: Nil) | ||
|
|
||
| sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c')") | ||
|
|
||
| checkAnswer( | ||
| sql(s"DESCRIBE DATABASE EXTENDED $dbName"), | ||
| Row("Database Name", dbNameWithoutBackTicks) :: | ||
| Row("Description", "") :: | ||
| Row("Location", location) :: | ||
| Row("Properties", "((a,a), (b,b), (c,c))") :: Nil) | ||
|
|
||
| sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('d'='d')") | ||
|
|
||
| checkAnswer( | ||
| sql(s"DESCRIBE DATABASE EXTENDED $dbName"), | ||
| Row("Database Name", dbNameWithoutBackTicks) :: | ||
| Row("Description", "") :: | ||
| Row("Location", location) :: | ||
| Row("Properties", "((a,a), (b,b), (c,c), (d,d))") :: Nil) | ||
| } finally { | ||
| catalog.reset() | ||
| databaseNames.foreach { dbName => | ||
| try { | ||
| val dbNameWithoutBackTicks = cleanIdentifier(dbName) | ||
| val location = "file:" + appendTrailingSlash(path) + s"$dbNameWithoutBackTicks.db" | ||
|
|
||
| sql(s"CREATE DATABASE $dbName") | ||
|
|
||
| checkAnswer( | ||
| sql(s"DESCRIBE DATABASE EXTENDED $dbName"), | ||
| Row("Database Name", dbNameWithoutBackTicks) :: | ||
| Row("Description", "") :: | ||
| Row("Location", location) :: | ||
| Row("Properties", "") :: Nil) | ||
|
|
||
| sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c')") | ||
|
|
||
| checkAnswer( | ||
| sql(s"DESCRIBE DATABASE EXTENDED $dbName"), | ||
| Row("Database Name", dbNameWithoutBackTicks) :: | ||
| Row("Description", "") :: | ||
| Row("Location", location) :: | ||
| Row("Properties", "((a,a), (b,b), (c,c))") :: Nil) | ||
|
|
||
| sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('d'='d')") | ||
|
|
||
| checkAnswer( | ||
| sql(s"DESCRIBE DATABASE EXTENDED $dbName"), | ||
| Row("Database Name", dbNameWithoutBackTicks) :: | ||
| Row("Description", "") :: | ||
| Row("Location", location) :: | ||
| Row("Properties", "((a,a), (b,b), (c,c), (d,d))") :: Nil) | ||
| } finally { | ||
| catalog.reset() | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
@@ -251,7 +284,43 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach { | |
| } | ||
| } | ||
|
|
||
| // TODO: test drop database in restrict mode | ||
| test("drop non-empty database in restrict mode") { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val dbName = "db1" | ||
| sql(s"CREATE DATABASE $dbName") | ||
|
|
||
| // create a table in database | ||
| val tableIdent1 = TableIdentifier("tab1", Some(dbName)) | ||
| createTable(catalog, tableIdent1) | ||
|
|
||
| // drop a non-empty database in Restrict mode | ||
| val message = intercept[AnalysisException] { | ||
| sql(s"DROP DATABASE $dbName RESTRICT") | ||
| }.getMessage | ||
| assert(message.contains(s"Database '$dbName' is not empty. One or more tables exist")) | ||
|
|
||
| catalog.dropTable(tableIdent1, ignoreIfNotExists = false) | ||
|
|
||
| assert(catalog.listDatabases().contains(dbName)) | ||
| sql(s"DROP DATABASE $dbName RESTRICT") | ||
| assert(!catalog.listDatabases().contains(dbName)) | ||
| } | ||
|
|
||
| test("drop non-empty database in cascade mode") { | ||
| val catalog = sqlContext.sessionState.catalog | ||
| val dbName = "db1" | ||
| sql(s"CREATE DATABASE $dbName") | ||
|
|
||
| // create a table in database | ||
| val tableIdent1 = TableIdentifier("tab1", Some(dbName)) | ||
| createTable(catalog, tableIdent1) | ||
|
|
||
| // drop a non-empty database in CASCADE mode | ||
| assert(catalog.listTables(dbName).contains(tableIdent1)) | ||
| assert(catalog.listDatabases().contains(dbName)) | ||
| sql(s"DROP DATABASE $dbName CASCADE") | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We need to check this both this table and db is removed, right?
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, will do. Thanks! |
||
| assert(!catalog.listDatabases().contains(dbName)) | ||
| } | ||
|
|
||
| test("create table in default db") { | ||
| val catalog = sqlContext.sessionState.catalog | ||
|
|
||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need to check this db is removed, right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, will do. Thanks!