From 59c60a6d2d2d59f1a7656fd197442934fbc06a11 Mon Sep 17 00:00:00 2001 From: Joshi Date: Tue, 5 Apr 2016 14:37:45 -0700 Subject: [PATCH 1/2] SessionCatalog function/database existence checks, metadata --- .../sql/catalyst/catalog/SessionCatalog.scala | 28 +++++++++---------- .../catalog/SessionCatalogSuite.scala | 8 +++--- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala index c08ffbb235e41..7f6b002a90405 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala @@ -84,19 +84,25 @@ class SessionCatalog( // ---------------------------------------------------------------------------- def createDatabase(dbDefinition: CatalogDatabase, ignoreIfExists: Boolean): Unit = { - externalCatalog.createDatabase(dbDefinition, ignoreIfExists) + if (!databaseExists(dbDefinition.name)) { + externalCatalog.createDatabase(dbDefinition, ignoreIfExists) + } } def dropDatabase(db: String, ignoreIfNotExists: Boolean, cascade: Boolean): Unit = { - externalCatalog.dropDatabase(db, ignoreIfNotExists, cascade) + if (databaseExists(db)) { + externalCatalog.dropDatabase(db, ignoreIfNotExists, cascade) + } } def alterDatabase(dbDefinition: CatalogDatabase): Unit = { - externalCatalog.alterDatabase(dbDefinition) + if (databaseExists(dbDefinition.name)) { + externalCatalog.alterDatabase(dbDefinition) + } } def getDatabase(db: String): CatalogDatabase = { - externalCatalog.getDatabase(db) + externalCatalog.getDatabase(db) } def databaseExists(db: String): Boolean = { @@ -460,8 +466,7 @@ class SessionCatalog( * If a database is specified in `name`, this will return the function in that database. * If no database is specified, this will return the function in the current database. */ - // TODO: have a better name. This method is actually for fetching the metadata of a function. - def getFunction(name: FunctionIdentifier): CatalogFunction = { + def getMetadataOfFunction(name: FunctionIdentifier): CatalogFunction = { val db = name.database.getOrElse(currentDb) externalCatalog.getFunction(db, name.funcName) } @@ -474,15 +479,8 @@ class SessionCatalog( // This function exists in the FunctionRegistry. true } else { - // Need to check if this function exists in the metastore. - try { - // TODO: It's better to ask external catalog if this function exists. - // So, we can avoid of having this hacky try/catch block. - getFunction(name) != null - } catch { - case _: NoSuchFunctionException => false - case _: AnalysisException => false // HiveExternalCatalog wraps all exceptions with it. - } + val db = name.database.getOrElse(currentDb) + externalCatalog.listFunctions(db,name.unquotedString).size > 0 } } diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalogSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalogSuite.scala index 4d56d001b3e7d..a476521d9eb72 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalogSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalogSuite.scala @@ -753,19 +753,19 @@ class SessionCatalogSuite extends SparkFunSuite { val expected = CatalogFunction(FunctionIdentifier("func1", Some("db2")), funcClass, Seq.empty[(String, String)]) - assert(catalog.getFunction(FunctionIdentifier("func1", Some("db2"))) == expected) + assert(catalog.getMetadataOfFunction(FunctionIdentifier("func1", Some("db2"))) == expected) // Get function without explicitly specifying database catalog.setCurrentDatabase("db2") - assert(catalog.getFunction(FunctionIdentifier("func1")) == expected) + assert(catalog.getMetadataOfFunction(FunctionIdentifier("func1")) == expected) } test("get function when database/function does not exist") { val catalog = new SessionCatalog(newBasicCatalog()) intercept[AnalysisException] { - catalog.getFunction(FunctionIdentifier("func1", Some("does_not_exist"))) + catalog.getMetadataOfFunction(FunctionIdentifier("func1", Some("does_not_exist"))) } intercept[AnalysisException] { - catalog.getFunction(FunctionIdentifier("does_not_exist", Some("db2"))) + catalog.getMetadataOfFunction(FunctionIdentifier("does_not_exist", Some("db2"))) } } From e040216efc19f111371883989f8df5b34dc032db Mon Sep 17 00:00:00 2001 From: Joshi Date: Tue, 5 Apr 2016 14:40:13 -0700 Subject: [PATCH 2/2] SessionCatalog function/database existence checks, metadata --- .../org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala index 7f6b002a90405..6224d0bc61b61 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/catalog/SessionCatalog.scala @@ -102,7 +102,7 @@ class SessionCatalog( } def getDatabase(db: String): CatalogDatabase = { - externalCatalog.getDatabase(db) + externalCatalog.getDatabase(db) } def databaseExists(db: String): Boolean = {