prestodb/presto · error · IllegalStateException

Cannot parse enum signature

Error message

Cannot parse enum signature

What it means

parseEnumMap throws this generic enum-parse error when a closing quote '"' is encountered in a state that doesn't fit the enum grammar (not EXPECT_KEY, EXPECT_VALUE, IN_KEY, or IN_STR_VALUE). The character stream does not form a valid 'ENUM{key: value, ...}' structure.

Source

Thrown at presto-common/src/main/java/com/facebook/presto/common/type/TypeSignature.java:464

                }
                else if (state == EnumMapParsingState.EXPECT_VALUE) {
                    if (isBigintEnum) {
                        throw new IllegalStateException("Unexpected varchar value in numeric enum signature");
                    }
                    state = EnumMapParsingState.IN_STR_VALUE;
                }
                else if ((state == EnumMapParsingState.IN_KEY || state == EnumMapParsingState.IN_STR_VALUE)
                        && i + 1 < signature.length() && signature.charAt(i + 1) == '"') {
                    state = state == EnumMapParsingState.IN_KEY ? EnumMapParsingState.IN_KEY_ESCAPE : EnumMapParsingState.IN_STR_VALUE_ESCAPE;
                }
                else if (state == EnumMapParsingState.IN_KEY) {
                    state = EnumMapParsingState.EXPECT_COLON;
                }
                else if (state == EnumMapParsingState.IN_STR_VALUE) {
                    state = EnumMapParsingState.EXPECT_COMMA_OR_CLOSING_BRACKET;
                }
                else {
                    throw new IllegalStateException("Cannot parse enum signature");
                }
            }
            else if (state == EnumMapParsingState.IN_KEY || state == EnumMapParsingState.IN_STR_VALUE) {
                keyOrValue.append(c);
            }
            else if (c == ':' && state == EnumMapParsingState.EXPECT_COLON) {
                key = keyOrValue.toString();
                keyOrValue = new StringBuilder();
                state = EnumMapParsingState.EXPECT_VALUE;
            }
            else if ((Character.isDigit(c) || c == '-') && state == EnumMapParsingState.EXPECT_VALUE) {
                if (!isBigintEnum) {
                    throw new IllegalStateException("Unexpected numeric value in varchar enum signature");
                }
                state = EnumMapParsingState.IN_NUM_VALUE;
                keyOrValue.append(c);
            }
            else if (Character.isDigit(c) && state == EnumMapParsingState.IN_NUM_VALUE) {

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Fix quote placement/escaping: escape embedded quotes by doubling (''""' inside IN_KEY/IN_STR_VALUE is the escape path), and ensure each key/value is exactly one quoted token.
  2. Validate the signature shape 'ENUM<type>{key: value, key: value}' with balanced braces and quotes.
  3. Regenerate the signature via TypeSignature.toString() instead of manual construction.

Example fix

// before
"ENUM<varchar>{a: \"b\"\"}"   // extra quote
// after
"ENUM<varchar>{a: \"b\"}"
Defensive patterns

Strategy: validation

Validate before calling

// balanced braces and quotes before parsing
long quotes = signature.chars().filter(c -> c == '"').count();
if (signature.chars().filter(c -> c == '{').count() != signature.chars().filter(c -> c == '}').count()
        || quotes % 2 != 0) {
    throw new IllegalArgumentException("unbalanced quotes/braces in enum signature: " + signature);
}

Type guard

static boolean enumStructureLooksValid(String sig) {
    if (sig == null) return false;
    long q = sig.chars().filter(c -> c == '"').count();
    return sig.startsWith("ENUM") && sig.contains("{") && sig.contains("}") && q % 2 == 0;
}

Try / catch

try {
    TypeSignature.parseTypeSignature(signature);
} catch (IllegalStateException e) {
    if (e.getMessage().equals("Cannot parse enum signature")) {
        // scan for stray quotes; escape embedded quotes by doubling
    } else throw e;
}

Prevention

When it happens

Trigger: Malformed enum signatures such as stray quotes, a quote closing a value twice ('ENUM<varchar>{a: "b"""}'), or quotes in unexpected positions like 'ENUM<varchar>{"a": b"}'.

Common situations: Escaping mistakes when hand-writing varchar enums (double-quote escaping inside keys/values), truncated signatures ending mid-value, generators producing invalid escaping.

Related errors


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