prestodb/presto · error · PrestoException
FUNCTION_IMPLEMENTATION_MISSING
FUNCTION_IMPLEMENTATION_MISSING
Error message
%s not found
What it means
After no candidate in any namespace matches the signature, FunctionAndTypeManager throws FUNCTION_IMPLEMENTATION_MISSING ('<signature> not found') unless the function is a magic literal in JAVA_BUILTIN_NAMESPACE, in which case a last-chance resolution is attempted.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java:1066
boolean nonTypeOnlyCoercion = false;
for (int i = 0; i < argumentTypes.size(); i++) {
Type expectedType = getType(boundSignature.getArgumentTypes().get(i));
if (!isTypeOnlyCoercion(argumentTypes.get(i), expectedType)) {
nonTypeOnlyCoercion = true;
break;
}
}
if (nonTypeOnlyCoercion) {
continue;
}
return new SpecializedFunctionKey(candidate, boundVariables.get(), argumentTypes.size());
}
// One final check for magic literal functions.
// Magic literal functions are only present in the JAVA_BUILTIN_NAMESPACE function namespace.
if (!signature.getName().getCatalogSchemaName().equals(JAVA_BUILTIN_NAMESPACE)) {
throw new PrestoException(FUNCTION_IMPLEMENTATION_MISSING, format("%s not found", signature));
}
return builtInTypeAndFunctionNamespaceManager.doGetSpecializedFunctionKeyForMagicLiteralFunctions(signature, this);
}
public BuiltInPluginFunctionNamespaceManager getBuiltInPluginFunctionNamespaceManager()
{
return builtInPluginFunctionNamespaceManager;
}
private CatalogSchemaName configureDefaultNamespace(String defaultNamespacePrefixString)
{
if (!defaultNamespacePrefixString.matches(DEFAULT_NAMESPACE_PREFIX_PATTERN.pattern())) {
throw new PrestoException(GENERIC_USER_ERROR, format("Default namespace prefix string should be in the form of 'catalog.schema', found: %s", defaultNamespacePrefixString));
}
String[] catalogSchemaNameString = defaultNamespacePrefixString.split("\\.");
return new CatalogSchemaName(catalogSchemaNameString[0], catalogSchemaNameString[1]);
}
View on GitHub (pinned to 55bb57d202)
Solutions
- Install/enable the plugin that provides the function on all nodes
- Verify the function name and namespace in the signature are correct
- Rebuild/redeploy the plan after fixing function registration
- If it is a magic literal path issue, ensure the signature belongs to the java builtin namespace
Example fix
// before SELECT my_udf(x) -- plugin not deployed to workers, FUNCTION_IMPLEMENTATION_MISSING // after deploy the plugin jar to every worker's plugin/ dir and restart, then rerun
Defensive patterns
Strategy: try-catch
Validate before calling
// verify the plugin providing the function is installed on the node before running queries using it
Try / catch
try { fam.getSpecializedFunctionKey(sig); } catch (PrestoException e) { if (e.getErrorCode().getCode() == FUNCTION_IMPLEMENTATION_MISSING) { /* report missing function/plugin to user */ } } Prevention
- Install required plugin jars on every node
- Version-check function availability before shipping SQL
- Keep function registration and plans in the same deployment
When it happens
Trigger: getSpecializedFunctionKey is called with a Signature for which no candidate SqlFunction exists (candidates collection matched nothing), and the name is not a magic literal function.
Common situations: Function not installed (plugin missing) on the node specializing the query; function deregistered between planning and execution; typo'd or internal-only signature reaching specialization.
Related errors
- FUNCTION_IMPLEMENTATION_ERROR
- FUNCTION_IMPLEMENTATION_ERROR
- FUNCTION_IMPLEMENTATION_ERROR
- NOT_SUPPORTED
- Query Prerequisites '%s' is already registered
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/bba3468bd4d10656.
Report an issue: GitHub.