prestodb/presto · error · IllegalArgumentException

Could not parse selected role:

Error message

Could not parse selected role: 

What it means

SelectedRole.valueOf parses the string form '<TYPE> <role>' (e.g. 'ROLE admin', 'NONE') using a regex PATTERN and throws IllegalArgumentException 'Could not parse selected role: <value>' when the string does not match. It is used to round-trip the toString representation back into a SelectedRole.

Solutions

  1. Check the exact expected format in SelectedRole.toString and correct the input (e.g. 'ROLE admin')
  2. Use SelectedRole(Type, Optional) construction directly instead of parsing ad-hoc strings
  3. Handle legacy formats by normalizing separators/type names before calling valueOf
  4. Wrap in try/catch and fall back to SelectedRole(Type.NONE, Optional.empty()) for unparseable legacy values

Example fix

// before
SelectedRole.valueOf("role=admin"); // throws
// after
SelectedRole.valueOf("ROLE admin");
// or safer:
try { sr = SelectedRole.valueOf(raw); } catch (IllegalArgumentException e) { sr = new SelectedRole(SelectedRole.Type.NONE, Optional.empty()); }
Defensive patterns

Strategy: type-guard

Validate before calling

// validate format before parsing
if (!value.matches("(NONE|ALL|ROLE)( \\S+)?$")) {
    throw new IllegalArgumentException("Bad SelectedRole string: " + value);
}

Type guard

Optional<SelectedRole> tryParseSelectedRole(String value) {
    try {
        return Optional.of(SelectedRole.valueOf(value));
    } catch (IllegalArgumentException e) {
        return Optional.empty();
    }
}

Try / catch

try {
    return SelectedRole.valueOf(value);
} catch (IllegalArgumentException e) {
    LOG.warn("Could not parse selected role '%s'; defaulting to NONE", value);
    return new SelectedRole(SelectedRole.Type.NONE, Optional.empty());
}

Prevention

When it happens

Trigger: Calling SelectedRole.valueOf on a string not matching the PATTERN regex — e.g. missing type, unknown type name, wrong separator, empty string, or a value produced by a different/older serialization format.

Common situations: Internal tools storing SelectedRole strings in config/DB across Presto version upgrades where the format changed; manually typed values in properties files; interop with clients that serialize roles differently (e.g. 'ROLE:admin' instead of 'ROLE admin').

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/53e5a391e82486a4. Report an issue: GitHub.

Appendix: source

Thrown at presto-spi/src/main/java/com/facebook/presto/spi/security/SelectedRole.java:120

    @Override
    public String toString()
    {
        StringBuilder result = new StringBuilder();
        result.append(type);
        role.ifPresent(s -> result.append("{").append(s).append("}"));
        return result.toString();
    }

    public static SelectedRole valueOf(String value)
    {
        Matcher m = PATTERN.matcher(value);
        if (m.matches()) {
            Type type = Type.valueOf(m.group(1));
            Optional<String> role = Optional.ofNullable(m.group(3));
            return new SelectedRole(type, role);
        }
        throw new IllegalArgumentException("Could not parse selected role: " + value);
    }
}

View on GitHub (pinned to 55bb57d202)