{"record":{"id":"d8e7591561bec51d","repo":"prestodb/presto","slug":"unexpected-numeric-value-in-varchar-enum-signature","errorCode":null,"errorMessage":"Unexpected numeric value in varchar enum signature","messagePattern":"Unexpected numeric value in varchar enum signature","errorType":"validation","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"presto-common/src/main/java/com/facebook/presto/common/type/TypeSignature.java","lineNumber":477,"sourceCode":"                }\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) {\n                keyOrValue.append(c);\n            }\n            else if ((c == ',' || c == '}') && (state == EnumMapParsingState.EXPECT_COMMA_OR_CLOSING_BRACKET || state == EnumMapParsingState.IN_NUM_VALUE)) {\n                if (key == null) {\n                    throw new IllegalStateException(\"Cannot parse enum signature\");\n                }\n                map.put(key, keyOrValue.toString());\n                if (c == '}') {\n                    return new EnumMapParsingData(i, typeName, map, isBigintEnum);\n                }\n                key = null;\n                keyOrValue = new StringBuilder();\n                state = EnumMapParsingState.EXPECT_KEY;","sourceCodeStart":459,"sourceCodeEnd":495,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-common/src/main/java/com/facebook/presto/common/type/TypeSignature.java#L459-L495","documentation":"parseEnumMap rejects a digit or '-' in the value position when the enum is a varchar (non-bigint) enum. Numeric enum values are only legal when the signature declares a numeric base type; a bare number as a varchar enum's value is a parse error.","triggerScenarios":"Parsing 'ENUM<varchar>{a: 1}' — a quoted-key enum whose value is an unquoted number — via TypeSignature.parseTypeSignature.","commonSituations":"Mixing enum styles when hand-writing signatures, code generators emitting numeric values without quoting them for varchar enums, copy/paste between bigint and varchar enum definitions.","solutions":["Quote the numeric value: 'ENUM<varchar>{a: \"1\"}'.","Or change the base type to a numeric one if values really are numbers: 'ENUM<bigint>{a: 1}'.","Regenerate the signature programmatically so value style always matches the base type."],"exampleFix":"// before\n\"ENUM<varchar>{a: 1}\"\n// after\n\"ENUM<varchar>{a: \\\"1\\\"}\"","handlingStrategy":"validation","validationCode":"// varchar enums must quote numeric-looking values\nif (!signature.contains(\"ENUM<bigint>\")) {\n    // every ': ' value should start with '\"' for varchar enums\n    if (signature.matches(\".*:\\\\s*[-0-9].*\")) {\n        throw new IllegalArgumentException(\"unquoted numeric value in varchar enum: \" + signature);\n    }\n}","typeGuard":"static boolean varcharEnumValuesQuoted(String sig) {\n    if (sig == null || sig.contains(\"ENUM<bigint>\")) return true;\n    return !sig.matches(\".*:\\\\s*[-0-9].*\");\n}","tryCatchPattern":"try {\n    TypeSignature.parseTypeSignature(signature);\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"numeric value in varchar enum\")) {\n        // quote the values or switch base type to bigint\n    } else throw e;\n}","preventionTips":["Quote any value that could parse as a number when the enum base is varchar.","Centralize enum-signature building so base type and value style stay consistent.","Add unit tests covering both bigint and varchar enum round-trips."],"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"}