{"record":{"id":"a8bc096c3815736d","repo":"prestodb/presto","slug":"unsupported-parquet-primitive-type","errorCode":null,"errorMessage":"Unsupported Parquet primitive type: ","messagePattern":"Unsupported Parquet primitive type: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-parquet/src/main/java/com/facebook/presto/parquet/predicate/TupleDomainParquetPredicate.java","lineNumber":523,"sourceCode":"        }\n\n        private Function<Integer, Object> getConverter(PrimitiveType primitiveType)\n        {\n            switch (primitiveType.getPrimitiveTypeName()) {\n                case INT32:\n                    return (i) -> dictionary.decodeToInt(i);\n                case INT64:\n                    return (i) -> dictionary.decodeToLong(i);\n                case FLOAT:\n                    return (i) -> dictionary.decodeToFloat(i);\n                case DOUBLE:\n                    return (i) -> dictionary.decodeToDouble(i);\n                case FIXED_LEN_BYTE_ARRAY:\n                case BINARY:\n                case INT96:\n                    return (i) -> dictionary.decodeToBinary(i);\n                default:\n                    throw new IllegalArgumentException(\"Unsupported Parquet primitive type: \" + primitiveType.getPrimitiveTypeName());\n            }\n        }\n    }\n\n    /**\n     * This class implements methods defined in UserDefinedPredicate based on the page statistic and tuple domain(for a column).\n     */\n    static class ParquetUserDefinedPredicateTupleDomain<T extends Comparable<T>>\n            extends UserDefinedPredicate<T>\n            implements Serializable\n    {\n        private Domain columnDomain;\n\n        ParquetUserDefinedPredicateTupleDomain(Domain domain)\n        {\n            this.columnDomain = domain;\n        }\n","sourceCodeStart":505,"sourceCodeEnd":541,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-parquet/src/main/java/com/facebook/presto/parquet/predicate/TupleDomainParquetPredicate.java#L505-L541","documentation":"Thrown by DictionaryValueConverter.getConverter in TupleDomainParquetPredicate when building a per-dictionary-page value converter for predicate pushdown. The switch maps each Parquet primitive type (INT32, INT64, FLOAT, DOUBLE, BINARY, FIXED_LEN_BYTE_ARRAY, INT96) to a Dictionary decode function; any type name not covered hits the default branch. With the current parquet-mr enum all primitives are covered, so this only fires when a new PrimitiveTypeName value appears that this code does not know about.","triggerScenarios":"getConverter(primitiveType) is invoked while constructing dictionary-page statistics for a column whose PrimitiveType.getPrimitiveTypeName() is not one of the eight handled values — in practice only possible with a newer parquet-mr/parquet-column PrimitiveTypeName enum value or a custom type mapping, since BOOLEAN is the only other enum member and is filtered out earlier.","commonSituations":"Upgrading parquet-mr to a version that introduces a new primitive type while presto-parquet still ships the old switch; running a Presto build against a file written by a newer writer emitting types this build predates.","solutions":["Upgrade Presto (or the presto-parquet module) to a version whose TupleDomainParquetPredicate handles the new primitive type.","Add the missing case to the switch in DictionaryValueConverter.getConverter, mapping the new PrimitiveTypeName to an appropriate dictionary decode function.","As a workaround, disable predicate/dictionary statistics pushdown for the affected column (e.g. avoid effectivePredicate pushdown) so getConverter is never called.","Verify which primitive type the file uses with parquet-tools / parquet meta to confirm it is genuinely an unsupported type."],"exampleFix":"// before\ndefault:\n    throw new IllegalArgumentException(\"Unsupported Parquet primitive type: \" + primitiveType.getPrimitiveTypeName());\n\n// after\ncase NEW_PRIMITIVE_TYPE:\n    return (i) -> dictionary.decodeToBinary(i); // or the appropriate decoder\ndefault:\n    throw new IllegalArgumentException(\"Unsupported Parquet primitive type: \" + primitiveType.getPrimitiveTypeName());","handlingStrategy":"validation","validationCode":"// Check the column's primitive type before relying on predicate pushdown\nPrimitiveTypeName name = primitiveType.getPrimitiveTypeName();\nif (name != PrimitiveTypeName.INT32 && name != PrimitiveTypeName.INT64 &&\n    name != PrimitiveTypeName.FLOAT && name != PrimitiveTypeName.DOUBLE &&\n    name != PrimitiveTypeName.BINARY && name != PrimitiveTypeName.FIXED_LEN_BYTE_ARRAY &&\n    name != PrimitiveTypeName.INT96) {\n    // skip dictionary-statistics pushdown for this column\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep Presto and parquet-mr versions aligned; upgrade both together.","Inspect file schemas with parquet-tools before querying files from new writers.","Prefer standard primitive types when exporting data."],"tags":["parquet","predicate-pushdown","unsupported-type","dictionary"],"backgroundTag":"unsupported-parquet-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"}