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
- 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.
- Validate the signature shape 'ENUM<type>{key: value, key: value}' with balanced braces and quotes.
- 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
- Escape embedded double quotes in varchar enum keys/values by doubling them.
- Keep one quote per key token and one per value token.
- Lint generated signatures for balanced quotes/braces.
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
- Unexpected varchar value in numeric enum signature
- Unexpected numeric value in varchar enum signature
- Bad type signature: '%s'
- Cannot parse distinct type definition(%s), expected '{' afte
- Cannot parse distinct type definition(%s), expected ',' afte
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/5f333a97800783fa.
Report an issue: GitHub.