prestodb/presto · error · PrestoException

FUNCTION_IMPLEMENTATION_ERROR

FUNCTION_IMPLEMENTATION_ERROR

Error message

Failed to get function body for method [%s]

What it means

For SQL-invoked scalar functions (declared with @SqlInvokedScalarFunction), the parser reflectively invokes a static method to retrieve the SQL function body string. If that invocation fails with a ReflectiveOperationException, the parser throws FUNCTION_IMPLEMENTATION_ERROR stating it failed to get the function body for the method. This occurs at function-registration/catalog-initialization time, before any query runs.

Source

Thrown at presto-main-base/src/main/java/com/facebook/presto/operator/scalar/annotations/SqlInvokedScalarFromAnnotationsParser.java:161

                    .collect(toImmutableList());
        }
        else {
            parameters = ImmutableList.of();
        }

        // Routine characteristics
        RoutineCharacteristics routineCharacteristics = RoutineCharacteristics.builder()
                .setLanguage(RoutineCharacteristics.Language.SQL)
                .setDeterminism(functionHeader.deterministic() ? DETERMINISTIC : NOT_DETERMINISTIC)
                .setNullCallClause(functionHeader.calledOnNullInput() ? CALLED_ON_NULL_INPUT : RETURNS_NULL_ON_NULL_INPUT)
                .build();

        String body;
        try {
            body = (String) method.invoke(null);
        }
        catch (ReflectiveOperationException e) {
            throw new PrestoException(FUNCTION_IMPLEMENTATION_ERROR, format("Failed to get function body for method [%s]", method), e);
        }

        List<TypeVariableConstraint> typeVariableConstraints = stream(method.getAnnotationsByType(TypeParameter.class))
                .map(t -> withVariadicBound(t.value(), t.boundedBy().isEmpty() ? null : t.boundedBy()))
                .collect(toImmutableList());

        return Stream.concat(Stream.of(functionHeader.value()), stream(functionHeader.alias()))
                .map(name -> new SqlInvokedFunction(
                        QualifiedObjectName.valueOf(defaultNamespace, name),
                        parameters,
                        typeVariableConstraints,
                        emptyList(),
                        returnType,
                        functionDescription,
                        routineCharacteristics,
                        body,
                        false,
                        notVersioned(),

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Inspect the server log for the cause chain attached to this PrestoException.
  2. Ensure the body method is public static, takes no arguments, and returns String.
  3. Verify the function definition class is on the plugin classpath and loads without errors.
  4. Rebuild the plugin against the server's Presto version to align with API changes.

Example fix

// before (instance method, wrong contract)
private String myFuncBody() { return "..."; }
// after
public static String myFuncBody() { return "..."; }
Defensive patterns

Strategy: try-catch

Type guard

// pre-check body method contract
boolean validBodyMethod(java.lang.reflect.Method m) {
    return java.lang.reflect.Modifier.isStatic(m.getModifiers())
        && m.getParameterCount() == 0
        && m.getReturnType() == String.class;
}

Try / catch

try { catalog.registerFunctions(funcClasses); } catch (PrestoException e) { if (e.getErrorCode().getName().equals("FUNCTION_IMPLEMENTATION_ERROR")) { log.error("SQL function body extraction failed: " + e.getCause(), e); throw e; } }

Prevention

When it happens

Trigger: A function-definition class where the body-providing method is not static/public, has unexpected parameters, or throws when invoked; class initialization failures inside the function-definition class also surface here.

Common situations: Hand-written SQL function plugins with a typo in the method contract; bytecode/dependency issues preventing class loading; Presto version upgrades changing the @SqlInvokedScalarFunction contract; shaded jars hiding required classes.

Related errors


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