prestodb/presto · error · PrestoException
NOT_SUPPORTED
NOT_SUPPORTED
Error message
Procedures cannot be called within a transaction (use autocommit mode)
What it means
Thrown at the start of CALL execution when the current session already has an open transaction. Stored procedures manage their own commit/rollback boundaries internally, so Presto only permits calling them from a session in autocommit mode.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/CallTask.java:86
import static com.google.common.base.Verify.verify;
import static com.google.common.util.concurrent.Futures.immediateFuture;
import static java.lang.String.format;
import static java.util.Arrays.asList;
public class CallTask
implements DDLDefinitionTask<Call>
{
@Override
public String getName()
{
return "CALL";
}
@Override
public ListenableFuture<?> execute(Call call, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector, String query)
{
if (!transactionManager.getTransactionInfo(session.getRequiredTransactionId()).isAutoCommitContext()) {
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);View on GitHub (pinned to 55bb57d202)
Solutions
- Commit or roll back the current transaction (COMMIT / ROLLBACK) before issuing the CALL statement
- Run the session in autocommit mode (do not open an explicit transaction around the CALL)
- Move the procedure invocation outside transactional scripts or drivers that wrap every statement in a transaction
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/CallTask.java:86 when the library encounters an invalid state.
Common situations: See trigger scenarios.
Understand the failure class
Background: Presto NOT_SUPPORTED error: what "not supported" means and how to fix it — this error's family across 3 libraries.
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/599c45be46a0da37.
Report an issue: GitHub.