{"record":{"id":"451ec37feffe84a7","repo":"apache/iceberg","slug":"unsupported-shredded-value-type-logical","errorCode":null,"errorMessage":"Unsupported shredded value type: ${logical}","messagePattern":"Unsupported shredded value type: (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"parquet/src/main/java/org/apache/iceberg/parquet/VariantReaderBuilder.java","lineNumber":222,"sourceCode":"      VariantValueReader reader =\n          ParquetVariantReaders.asVariant(PhysicalType.DATE, ParquetValueReaders.unboxed(desc));\n\n      return Optional.of(reader);\n    }\n\n    @Override\n    public Optional<VariantValueReader> visit(TimestampLogicalTypeAnnotation logical) {\n      VariantValueReader reader =\n          ParquetVariantReaders.asVariant(\n              ParquetVariantUtil.convert(logical), ParquetValueReaders.timestamps(desc));\n\n      return Optional.of(reader);\n    }\n\n    @Override\n    public Optional<VariantValueReader> visit(TimeLogicalTypeAnnotation logical) {\n      if (logical.getUnit() != LogicalTypeAnnotation.TimeUnit.MICROS || logical.isAdjustedToUTC()) {\n        throw new UnsupportedOperationException(\"Unsupported shredded value type: \" + logical);\n      }\n\n      VariantValueReader reader =\n          ParquetVariantReaders.asVariant(PhysicalType.TIME, ParquetValueReaders.times(desc));\n\n      return Optional.of(reader);\n    }\n\n    @Override\n    public Optional<VariantValueReader> visit(IntLogicalTypeAnnotation logical) {\n      if (!logical.isSigned()) {\n        // unsigned ints are not allowed for shredded fields\n        throw new UnsupportedOperationException(\"Unsupported shredded value type: \" + logical);\n      }\n\n      VariantValueReader reader;\n      switch (logical.getBitWidth()) {\n        case 64:","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/parquet/src/main/java/org/apache/iceberg/parquet/VariantReaderBuilder.java#L204-L240","documentation":"Thrown by VariantReaderBuilder's TimeLogicalTypeAnnotation visitor when a shredded Variant typed_value uses a TIME logical type that is not TIME_MICROS adjusted-to-UTC=false. The Parquet Variant spec only permits TIME (microsecond, non-UTC) for shredded time values; any other time encoding is rejected at reader construction.","triggerScenarios":"visit(TimeLogicalTypeAnnotation) where logical.getUnit() != MICROS or logical.isAdjustedToUTC() is true while building a reader for a shredded Variant column.","commonSituations":"Writers shredding Variant time values as TIME_MILLIS or as isAdjustedToUTC=true timestamps; hand-authored schemas deviating from the Variant shredding spec; cross-ecosystem files where the writer used a different time convention.","solutions":["Rewrite the column as TIME(NANOS? no) TIME_MICROS with isAdjustedToUTC=false in typed_value, then read again.","Disable shredding (write the Variant unshredded) so the time value stays inside the variant binary instead of a typed Parquet column.","Fix the producing writer to emit TIME_MICROS non-UTC per the Parquet Variant shredding spec.","Filter out/ignore the shredded time field in reads that do not need it."],"exampleFix":"// before\nTypes.required(PrimitiveTypeName.INT64).as(LogicalTypeAnnotation.timeType(true, TimeUnit.MICROS)).named(\"typed_value\")\n\n// after\nTypes.required(PrimitiveTypeName.INT64).as(LogicalTypeAnnotation.timeType(false, TimeUnit.MICROS)).named(\"typed_value\")","handlingStrategy":"validation","validationCode":"LogicalTypeAnnotation l = typedValue.getType().asPrimitiveType().getLogicalTypeAnnotation();\nif (l instanceof TimeLogicalTypeAnnotation t) {\n  Preconditions.checkArgument(t.getUnit() == TimeUnit.MICROS && !t.isAdjustedToUTC(),\n      \"Shredded time must be TIME_MICROS non-UTC: %s\", t);\n}","typeGuard":"boolean isVariantShreddableTime(LogicalTypeAnnotation l) {\n  return l instanceof TimeLogicalTypeAnnotation t\n      && t.getUnit() == TimeUnit.MICROS && !t.isAdjustedToUTC();\n}","tryCatchPattern":"try {\n  openVariantReader(schema);\n} catch (UnsupportedOperationException e) {\n  fallbackToUnshreddedRead();\n}","preventionTips":["Emit TIME_MICROS with isAdjustedToUTC=false when shredding Variant time values","Run schema validation on write paths before committing files","Add unit tests asserting logical types on shredded typed_value columns"],"tags":["parquet","variant","shredding","logical-type"],"backgroundTag":"type-mismatch","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}