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

  1. Replace the null argument with a concrete non-null value
  2. Use COALESCE(expr, default) so the argument can never evaluate to null
  3. 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.