Skip to content
Prev Previous commit
Next Next commit
changing the APIs in SessionCatalog
  • Loading branch information
kevinyu98 committed Jul 10, 2018
commit 74b01a5c9534f651be5605c9e8f5bcf1bd74e1d7
Original file line number Diff line number Diff line change
Expand Up @@ -1218,8 +1218,8 @@ class Analyzer(
plan.transformAllExpressions {
case f: UnresolvedFunction
if externalFunctionNameSet.contains(normalizeFuncName(f.name)) => f
case f: UnresolvedFunction if catalog.builtinFunctionExists(f.name) => f
case f: UnresolvedFunction if catalog.externalFunctionExists(f.name) =>
case f: UnresolvedFunction if catalog.isRegisteredFunction(f.name) => f
case f: UnresolvedFunction if catalog.isPersistentFunction(f.name) =>
externalFunctionNameSet.add(normalizeFuncName(f.name))
f
case f: UnresolvedFunction =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1099,17 +1099,8 @@ class SessionCatalog(
def functionExists(name: FunctionIdentifier): Boolean = {
val db = formatDatabaseName(name.database.getOrElse(getCurrentDatabase))
requireDbExists(db)
builtinFunctionExists(name) || externalFunctionExists(name)
}

def builtinFunctionExists(name: FunctionIdentifier): Boolean = {
functionRegistry.functionExists(name)
}

def externalFunctionExists(name: FunctionIdentifier): Boolean = {
val db = formatDatabaseName(name.database.getOrElse(getCurrentDatabase))
requireDbExists(db)
externalCatalog.functionExists(db, name.funcName)
functionRegistry.functionExists(name) ||
externalCatalog.functionExists(db, name.funcName)
}

// ----------------------------------------------------------------
Expand Down Expand Up @@ -1202,6 +1193,22 @@ class SessionCatalog(
!hiveFunctions.contains(name.funcName.toLowerCase(Locale.ROOT))
}

/**
* Return whether this function has been registered in the function registry of the current
* session. If not existed, return false.
*/
def isRegisteredFunction(name: FunctionIdentifier): Boolean = {
functionRegistry.functionExists(name)
}

/**
* Returns whether it is a persistent function. If not existed, returns false.
*/
def isPersistentFunction(name: FunctionIdentifier): Boolean = {
val db = formatDatabaseName(name.database.getOrElse(getCurrentDatabase))
databaseExists(db) && externalCatalog.functionExists(db, name.funcName)
}

protected def failFunctionLookup(name: FunctionIdentifier): Nothing = {
throw new NoSuchFunctionException(
db = name.database.getOrElse(getCurrentDatabase), func = name.funcName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,42 @@ abstract class SessionCatalogSuite extends AnalysisTest {
}
}

test("isRegisteredFunction") {
withBasicCatalog { catalog =>
// Returns false when the function does not register
assert(!catalog.isRegisteredFunction(FunctionIdentifier("temp1")))

// Returns true when the function does register
val tempFunc1 = (e: Seq[Expression]) => e.head
catalog.registerFunction(newFunc("iff", None), overrideIfExists = false,
functionBuilder = Some(tempFunc1) )
assert(catalog.isRegisteredFunction(FunctionIdentifier("iff")))

// Returns false when using the createFunction
catalog.createFunction(newFunc("sum", Some("db2")), ignoreIfExists = false)
assert(!catalog.isRegisteredFunction(FunctionIdentifier("sum")))
assert(!catalog.isRegisteredFunction(FunctionIdentifier("sum", Some("db2"))))
}
}

test("isPersistentFunction") {
withBasicCatalog { catalog =>
// Returns false when the function does not register
assert(!catalog.isPersistentFunction(FunctionIdentifier("temp2")))

// Returns false when the function does register
val tempFunc2 = (e: Seq[Expression]) => e.head
catalog.registerFunction(newFunc("iff", None), overrideIfExists = false,
functionBuilder = Some(tempFunc2))
assert(!catalog.isPersistentFunction(FunctionIdentifier("iff")))

// Return true when using the createFunction
catalog.createFunction(newFunc("sum", Some("db2")), ignoreIfExists = false)
assert(catalog.isPersistentFunction(FunctionIdentifier("sum", Some("db2"))))
assert(!catalog.isPersistentFunction(FunctionIdentifier("db2.sum")))
}
}

test("drop function") {
withBasicCatalog { catalog =>
assert(catalog.externalCatalog.listFunctions("db2", "*").toSet == Set("func1"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,8 @@ private[sql] class HiveSessionCatalog(
super.functionExists(name) || hiveFunctions.contains(name.funcName)
}

override def externalFunctionExists(name: FunctionIdentifier): Boolean = {
super.externalFunctionExists(name) || hiveFunctions.contains(name.funcName)
override def isPersistentFunction(name: FunctionIdentifier): Boolean = {
super.isPersistentFunction(name) || hiveFunctions.contains(name.funcName)
}

/** List of functions we pass over to Hive. Note that over time this list should go to 0. */
Expand Down