prestodb/presto · error · PrestoException
INVALID_PROCEDURE_ARGUMENT
INVALID_PROCEDURE_ARGUMENT
Error message
Procedure argument cannot be null:
What it means
A generic argument guard in CallTask.execute that rejects NULL values passed for any procedure argument. Procedure signatures declare non-nullable parameters, so a null literal, unbound parameter marker, or null-producing expression for one of the arguments triggers this error.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/CallTask.java:104
throw new PrestoException(NOT_SUPPORTED, "Procedures cannot be called within a transaction (use autocommit mode)");
}
QualifiedObjectName procedureName = createQualifiedObjectName(session, call, call.getName(), metadata);
ConnectorId connectorId = getConnectorIdOrThrow(session, metadata, procedureName.getCatalogName(), call, catalogError);
BaseProcedure procedure = metadata.getProcedureRegistry().resolve(connectorId, toSchemaTableName(procedureName));
accessControl.checkCanCallProcedure(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), procedureName);
Map<NodeRef<Parameter>, Expression> parameterLookup = parameterExtractor(call, parameters);
checkArgument(procedure instanceof Procedure, "Must call an inner procedure in CallTask");
Procedure innerProcedure = (Procedure) procedure;
Object[] values = extractParameterValuesInOrder(call, innerProcedure, metadata, session, parameterLookup);
// validate arguments
MethodType methodType = innerProcedure.getMethodHandle().type();
for (int i = 0; i < innerProcedure.getArguments().size(); i++) {
if ((values[i] == null) && methodType.parameterType(i).isPrimitive()) {
String name = innerProcedure.getArguments().get(i).getName();
throw new PrestoException(INVALID_PROCEDURE_ARGUMENT, "Procedure argument cannot be null: " + name);
}
}
// insert session argument
List<Object> arguments = new ArrayList<>();
Iterator<Object> valuesIterator = asList(values).iterator();
for (Class<?> type : methodType.parameterList()) {
if (ConnectorSession.class.isAssignableFrom(type)) {
arguments.add(session.toConnectorSession(connectorId));
}
else {
arguments.add(valuesIterator.next());
}
}
try {
innerProcedure.getMethodHandle().invokeWithArguments(arguments);
}View on GitHub (pinned to 55bb57d202)
Solutions
- Replace the null argument with a concrete non-null value
- Use COALESCE(expr, default) so the argument can never evaluate to null
- If nulls are legitimate for this procedure, ask the procedure author to accept and handle nullable arguments
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/CallTask.java:104 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/6b5d3c24e5f4e232.
Report an issue: GitHub.