{"record":{"id":"2d10e412c847cc5e","repo":"prestodb/presto","slug":"unknown-primitive-type","errorCode":null,"errorMessage":"Unknown primitive type: ","messagePattern":"Unknown primitive type: ","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"presto-hive/src/main/java/com/facebook/presto/hive/util/SerDeUtils.java","lineNumber":166,"sourceCode":"                return;\n            case TIMESTAMP:\n                TimestampType.TIMESTAMP.writeLong(builder, formatTimestampAsLong(object, (TimestampObjectInspector) inspector, hiveStorageTimeZone, legacyTimestampEnabled));\n                return;\n            case BINARY:\n                VARBINARY.writeSlice(builder, Slices.wrappedBuffer(((BinaryObjectInspector) inspector).getPrimitiveJavaObject(object)));\n                return;\n            case DECIMAL:\n                DecimalType decimalType = (DecimalType) type;\n                HiveDecimalWritable hiveDecimal = ((HiveDecimalObjectInspector) inspector).getPrimitiveWritableObject(object);\n                if (decimalType.isShort()) {\n                    decimalType.writeLong(builder, DecimalUtils.getShortDecimalValue(hiveDecimal, decimalType.getScale()));\n                }\n                else {\n                    decimalType.writeSlice(builder, DecimalUtils.getLongDecimalValue(hiveDecimal, decimalType.getScale()));\n                }\n                return;\n        }\n        throw new RuntimeException(\"Unknown primitive type: \" + inspector.getPrimitiveCategory());\n    }\n\n    private static Block serializeList(Type type, BlockBuilder builder, Object object, ListObjectInspector inspector, DateTimeZone hiveStorageTimeZone, boolean legacyTimestampEnabled)\n    {\n        List<?> list = inspector.getList(object);\n        if (list == null) {\n            requireNonNull(builder, \"parent builder is null\").appendNull();\n            return null;\n        }\n\n        List<Type> typeParameters = type.getTypeParameters();\n        checkArgument(typeParameters.size() == 1, \"list must have exactly 1 type parameter\");\n        Type elementType = typeParameters.get(0);\n        ObjectInspector elementInspector = inspector.getListElementObjectInspector();\n        BlockBuilder currentBuilder;\n        if (builder != null) {\n            currentBuilder = builder.beginBlockEntry();\n        }","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-hive/src/main/java/com/facebook/presto/hive/util/SerDeUtils.java#L148-L184","documentation":"SerDeUtils.serializePrimitive switches over Hive primitive object inspector categories (boolean, byte, short, int, long, float, double, string, varchar, char, date, timestamp, decimal, binary...). A primitive category with no case in the switch falls through to a RuntimeException('Unknown primitive type: ...'). A new or exotic Hive primitive is not handled by this serializer.","triggerScenarios":"serializeObject dispatches a PRIMITIVE inspector whose PrimitiveObjectInspector.PrimitiveCategory lacks a case branch in serializePrimitive — e.g. hive void/unknown or a newer Hive primitive added by the SerDe.","commonSituations":"Reading tables with unusual primitive columns (e.g. void from corrupt schema); SerDe/third-party storage handler returning a novel primitive category; Hive version mismatch introducing new primitive types.","solutions":["Identify the primitive category printed in the message and check which table/column produces it","Fix the table schema to use standard Hive primitives (e.g. replace void columns)","Upgrade Presto to a version handling that primitive category","Patch/extend serializePrimitive if you maintain a fork and the type is legitimate"],"exampleFix":"// before\n-- column shows up as void/unknown primitive in metastore\n// after\nALTER TABLE t REPLACE COLUMNS (col string); -- use a supported primitive type","handlingStrategy":"type-guard","validationCode":"// verify the primitive category is handled before serializing\nPrimitiveObjectInspector.PrimitiveCategory pc = inspector.getPrimitiveCategory();\nSet<PrimitiveCategory> supported = EnumSet.of(BOOLEAN, BYTE, SHORT, INT, LONG, FLOAT, DOUBLE,\n    STRING, VARCHAR, CHAR, DATE, TIMESTAMP, DECIMAL, BINARY);\nif (!supported.contains(pc)) {\n    throw new PrestoException(NOT_SUPPORTED, \"Unsupported primitive: \" + pc);\n}","typeGuard":"boolean isSupportedPrimitive(PrimitiveObjectInspector inspector) {\n    return inspector.getPrimitiveCategory() != PrimitiveCategory.UNKNOWN\n        && inspector.getPrimitiveCategory() != PrimitiveCategory.VOID;\n}","tryCatchPattern":"try {\n    block = SerDeUtils.serializeObject(...);\n} catch (RuntimeException e) {\n    if (e.getMessage() != null && e.getMessage().startsWith(\"Unknown primitive type\")) {\n        LOG.error(\"Unhandled Hive primitive: \" + e.getMessage());\n    }\n    throw e;\n}","preventionTips":["Check DESCRIBE output for void/odd primitives before querying","Fix corrupt schema metadata (e.g. void columns) at the metastore","Keep Hive and Presto versions aligned on primitive type support","Extend serializePrimitive and add a test when introducing a new primitive category"],"tags":["hive","serde","primitive-type","unsupported-type"],"backgroundTag":"unknown-primitive-type","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"}