{"record":{"id":"b7aaff2df6454ffe","repo":"apache/flink","slug":"illegal-type-for-protobuf-enum-only-char-vachar-i","errorCode":null,"errorMessage":"Illegal type for protobuf enum, only char/vachar/int/bigint is supported","messagePattern":"Illegal type for protobuf enum, only char/vachar/int/bigint is supported","errorType":"exception","errorClass":"PbCodegenException","httpStatus":null,"severity":"error","filePath":"flink-formats/flink-protobuf/src/main/java/org/apache/flink/formats/protobuf/deserialize/PbCodegenSimpleDeserializer.java","lineNumber":76,"sourceCode":"                                + \" = BinaryStringData.fromString(\"\n                                + pbObjectCode\n                                + \".toString())\");\n                break;\n            case ENUM:\n                if (logicalType.getTypeRoot() == LogicalTypeRoot.CHAR\n                        || logicalType.getTypeRoot() == LogicalTypeRoot.VARCHAR) {\n                    appender.appendLine(\n                            resultVar\n                                    + \" = BinaryStringData.fromString(\"\n                                    + pbObjectCode\n                                    + \".toString())\");\n                } else if (logicalType.getTypeRoot() == LogicalTypeRoot.TINYINT\n                        || logicalType.getTypeRoot() == LogicalTypeRoot.SMALLINT\n                        || logicalType.getTypeRoot() == LogicalTypeRoot.INTEGER\n                        || logicalType.getTypeRoot() == LogicalTypeRoot.BIGINT) {\n                    appender.appendLine(resultVar + \" = \" + pbObjectCode + \".getNumber()\");\n                } else {\n                    throw new PbCodegenException(\n                            \"Illegal type for protobuf enum, only char/vachar/int/bigint is supported\");\n                }\n                break;\n            default:\n                throw new PbCodegenException(\n                        \"Unsupported protobuf simple type: \" + fd.getJavaType());\n        }\n        return appender.code();\n    }\n}\n","sourceCodeStart":58,"sourceCodeEnd":87,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-formats/flink-protobuf/src/main/java/org/apache/flink/formats/protobuf/deserialize/PbCodegenSimpleDeserializer.java#L58-L87","documentation":"When a proto field is an ENUM, the deserializer only accepts Flink CHAR/VARCHAR (stringified) or TINYINT/SMALLINT/INTEGER/BIGINT (numeric getNumber()). Any other type root for that column (e.g. BOOLEAN, DOUBLE, DECIMAL) throws this PbCodegenException at codegen time. The message text 'vachar' is a known typo for varchar.","triggerScenarios":"DDL maps an enum proto field to a non-string/non-integer column, e.g. status DECIMAL(10,0) while the proto defines status as enum Status.","commonSituations":"Inferring the table schema from a data lake/AVRO-like source where enums became strings or decimals, then pointing the same schema at a protobuf message class; evolving the proto field from int to enum without updating the DDL.","solutions":["Change the offending column to VARCHAR (stores enum name) or INT/BIGINT (stores enum number) so it matches the proto enum field.","If you need DECIMAL, map to a proto int64/int32 field instead of enum in the .proto, or preprocess the value upstream.","Validate schema against the descriptor with PbSchemaValidationUtils.validatePbStruct before job submission."],"exampleFix":"-- before (proto field 'status' is enum)\nstatus DECIMAL(10,0),\n-- after\nstatus INT,  -- or VARCHAR","handlingStrategy":"validation","validationCode":"FieldDescriptor fd = descriptor.findFieldByName(col);\nif (fd != null && fd.getJavaType() == JavaType.ENUM) {\n    LogicalTypeRoot r = colType.getTypeRoot();\n    boolean ok = r == LogicalTypeRoot.CHAR || r == LogicalTypeRoot.VARCHAR\n            || r == LogicalTypeRoot.TINYINT || r == LogicalTypeRoot.SMALLINT\n            || r == LogicalTypeRoot.INTEGER || r == LogicalTypeRoot.BIGINT;\n    if (!ok) throw new IllegalArgumentException(\"Enum field \" + col + \" must be string or integer\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Adopt a convention: proto enum <-> Flink INT (number) or VARCHAR (name); document it in the schema repo.","Run PbSchemaValidationUtils.validatePbStruct on new/changed DDLs in CI."],"tags":["protobuf","enum","codegen","schema"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}