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

  1. Commit or roll back the current transaction (COMMIT / ROLLBACK) before issuing the CALL statement
  2. Run the session in autocommit mode (do not open an explicit transaction around the CALL)
  3. 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.