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

  1. Install/enable the plugin that provides the function on all nodes
  2. Verify the function name and namespace in the signature are correct
  3. Rebuild/redeploy the plan after fixing function registration
  4. 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

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


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/bba3468bd4d10656. Report an issue: GitHub.