{"record":{"id":"5f333a97800783fa","repo":"prestodb/presto","slug":"cannot-parse-enum-signature","errorCode":null,"errorMessage":"Cannot parse enum signature","messagePattern":"Cannot parse enum signature","errorType":"validation","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"presto-common/src/main/java/com/facebook/presto/common/type/TypeSignature.java","lineNumber":464,"sourceCode":"                }\n                else if (state == EnumMapParsingState.EXPECT_VALUE) {\n                    if (isBigintEnum) {\n                        throw new IllegalStateException(\"Unexpected varchar value in numeric enum signature\");\n                    }\n                    state = EnumMapParsingState.IN_STR_VALUE;\n                }\n                else if ((state == EnumMapParsingState.IN_KEY || state == EnumMapParsingState.IN_STR_VALUE)\n                        && i + 1 < signature.length() && signature.charAt(i + 1) == '\"') {\n                    state = state == EnumMapParsingState.IN_KEY ? EnumMapParsingState.IN_KEY_ESCAPE : EnumMapParsingState.IN_STR_VALUE_ESCAPE;\n                }\n                else if (state == EnumMapParsingState.IN_KEY) {\n                    state = EnumMapParsingState.EXPECT_COLON;\n                }\n                else if (state == EnumMapParsingState.IN_STR_VALUE) {\n                    state = EnumMapParsingState.EXPECT_COMMA_OR_CLOSING_BRACKET;\n                }\n                else {\n                    throw new IllegalStateException(\"Cannot parse enum signature\");\n                }\n            }\n            else if (state == EnumMapParsingState.IN_KEY || state == EnumMapParsingState.IN_STR_VALUE) {\n                keyOrValue.append(c);\n            }\n            else if (c == ':' && state == EnumMapParsingState.EXPECT_COLON) {\n                key = keyOrValue.toString();\n                keyOrValue = new StringBuilder();\n                state = EnumMapParsingState.EXPECT_VALUE;\n            }\n            else if ((Character.isDigit(c) || c == '-') && state == EnumMapParsingState.EXPECT_VALUE) {\n                if (!isBigintEnum) {\n                    throw new IllegalStateException(\"Unexpected numeric value in varchar enum signature\");\n                }\n                state = EnumMapParsingState.IN_NUM_VALUE;\n                keyOrValue.append(c);\n            }\n            else if (Character.isDigit(c) && state == EnumMapParsingState.IN_NUM_VALUE) {","sourceCodeStart":446,"sourceCodeEnd":482,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-common/src/main/java/com/facebook/presto/common/type/TypeSignature.java#L446-L482","documentation":"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.","triggerScenarios":"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\"}'.","commonSituations":"Escaping mistakes when hand-writing varchar enums (double-quote escaping inside keys/values), truncated signatures ending mid-value, generators producing invalid escaping.","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."],"exampleFix":"// before\n\"ENUM<varchar>{a: \\\"b\\\"\\\"}\"   // extra quote\n// after\n\"ENUM<varchar>{a: \\\"b\\\"}\"","handlingStrategy":"validation","validationCode":"// balanced braces and quotes before parsing\nlong quotes = signature.chars().filter(c -> c == '\"').count();\nif (signature.chars().filter(c -> c == '{').count() != signature.chars().filter(c -> c == '}').count()\n        || quotes % 2 != 0) {\n    throw new IllegalArgumentException(\"unbalanced quotes/braces in enum signature: \" + signature);\n}","typeGuard":"static boolean enumStructureLooksValid(String sig) {\n    if (sig == null) return false;\n    long q = sig.chars().filter(c -> c == '\"').count();\n    return sig.startsWith(\"ENUM\") && sig.contains(\"{\") && sig.contains(\"}\") && q % 2 == 0;\n}","tryCatchPattern":"try {\n    TypeSignature.parseTypeSignature(signature);\n} catch (IllegalStateException e) {\n    if (e.getMessage().equals(\"Cannot parse enum signature\")) {\n        // scan for stray quotes; escape embedded quotes by doubling\n    } else throw e;\n}","preventionTips":["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."],"tags":["presto","type-signature","enum","parsing"],"backgroundTag":"enum-signature-parse-failure","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}