{"record":{"id":"dfacf157c4940523","repo":"apache/iceberg","slug":"invalid-precision-s","errorCode":null,"errorMessage":"Invalid precision: %s","messagePattern":"Invalid precision: (.+?)","errorType":"exception","errorClass":"java.lang.IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReaders.java","lineNumber":69,"sourceCode":"\nclass FlinkOrcReaders {\n  private FlinkOrcReaders() {}\n\n  static OrcValueReader<StringData> strings() {\n    return StringReader.INSTANCE;\n  }\n\n  static OrcValueReader<Integer> dates() {\n    return DateReader.INSTANCE;\n  }\n\n  static OrcValueReader<DecimalData> decimals(int precision, int scale) {\n    if (precision <= 18) {\n      return new Decimal18Reader(precision, scale);\n    } else if (precision <= 38) {\n      return new Decimal38Reader(precision, scale);\n    } else {\n      throw new IllegalArgumentException(\"Invalid precision: \" + precision);\n    }\n  }\n\n  static OrcValueReader<Integer> times() {\n    return TimeReader.INSTANCE;\n  }\n\n  static OrcValueReader<TimestampData> timestamps() {\n    return TimestampReader.INSTANCE;\n  }\n\n  static OrcValueReader<TimestampData> timestampTzs() {\n    return TimestampTzReader.INSTANCE;\n  }\n\n  static <T> OrcValueReader<ArrayData> array(OrcValueReader<T> elementReader) {\n    return new ArrayReader<>(elementReader);\n  }","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReaders.java#L51-L87","documentation":"FlinkOrcReaders.decimals() throws IllegalArgumentException 'Invalid precision: <p>' when a DECIMAL column's precision is greater than 38, because the reader only supports precision <= 18 (long-backed) and <= 38 (BigDecimal-backed). Iceberg itself caps decimal precision at 38, so this usually indicates corrupt/foreign metadata.","triggerScenarios":"Reading ORC decimal columns whose declared precision exceeds 38, e.g. decimal(50, 5).","commonSituations":"ORC files produced by external systems allowing larger precisions; hand-built schemas with invalid precision; metadata corruption.","solutions":["Fix the schema so decimal precision is <= 38 (Iceberg max).","Rewrite the ORC files with a supported precision (e.g. decimal(38, s)).","Validate the table schema with TypeUtil/validation before scanning."],"exampleFix":"// before\nTypes.DecimalType.of(50, 5)\n// after\nTypes.DecimalType.of(38, 5)","handlingStrategy":"validation","validationCode":"Types.DecimalType dt = (Types.DecimalType) fieldType;\nPreconditions.checkArgument(dt.precision() <= 38,\n    \"ORC reader supports decimal precision <= 38, got %s\", dt.precision());","typeGuard":"boolean readableDecimal(Types.DecimalType t) {\n  return t.precision() <= 38;\n}","tryCatchPattern":"try {\n  reader.read(row, ordinal);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Invalid precision\")) {\n    // schema is outside Iceberg limits; fail fast with clear context\n    throw new IllegalStateException(\"Decimal precision beyond Iceberg limit: \" + e.getMessage());\n  }\n  throw e;\n}","preventionTips":["Cap decimal precision at 38 when defining schemas.","Validate user-supplied DDL precision/scale before creating tables."],"tags":["flink","orc","decimal","precision"],"backgroundTag":"value-out-of-range","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}