prestodb/presto · error · SemanticException

INVALID_PROCEDURE_ARGUMENTS

INVALID_PROCEDURE_ARGUMENTS

Error message

Named and positional arguments cannot be mixed

What it means

Validation in extractParameterValuesInOrder enforcing the SQL procedure-call specification: a CALL statement's arguments must be either all positional (call proc(a, b)) or all named (call proc(x => a)). Mixing the two styles in one invocation is rejected before arguments are bound.

Source

Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/CallTask.java:147

        }

        return immediateFuture(null);
    }

    public static Object[] extractParameterValuesInOrder(Call call, BaseProcedure<?> procedure, Metadata metadata, Session session, Map<NodeRef<Parameter>, Expression> parameterLookup)
    {
        // map declared argument names to positions
        Map<String, Integer> positions = new HashMap<>();
        for (int i = 0; i < procedure.getArguments().size(); i++) {
            positions.put(procedure.getArguments().get(i).getName(), i);
        }

        // per specification, do not allow mixing argument types
        Predicate<CallArgument> hasName = argument -> argument.getName().isPresent();
        boolean anyNamed = call.getArguments().stream().anyMatch(hasName);
        boolean allNamed = call.getArguments().stream().allMatch(hasName);
        if (anyNamed && !allNamed) {
            throw new SemanticException(INVALID_PROCEDURE_ARGUMENTS, call, "Named and positional arguments cannot be mixed");
        }

        // get the argument names in call order
        Map<String, CallArgument> names = new LinkedHashMap<>();
        for (int i = 0; i < call.getArguments().size(); i++) {
            CallArgument argument = call.getArguments().get(i);
            if (argument.getName().isPresent()) {
                String name = argument.getName().get();
                if (names.put(name, argument) != null) {
                    throw new SemanticException(INVALID_PROCEDURE_ARGUMENTS, argument, "Duplicate procedure argument: %s", name);
                }
                if (!positions.containsKey(name)) {
                    throw new SemanticException(INVALID_PROCEDURE_ARGUMENTS, argument, "Unknown argument name: %s", name);
                }
            }
            else if (i < procedure.getArguments().size()) {
                names.put(procedure.getArguments().get(i).getName(), argument);
            }

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Rewrite the CALL using only positional arguments
  2. Rewrite the CALL using only named arguments
  3. Check for a trailing named argument after positional ones, the most common cause of this error
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at presto-main-base/src/main/java/com/facebook/presto/execution/CallTask.java:147 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/a4d50235a8c64905. Report an issue: GitHub.