{"record":{"id":"0db92920213bcd73","repo":"apache/iceberg","slug":"invalid-precision-precision","errorCode":null,"errorMessage":"Invalid precision: ${precision}","messagePattern":"Invalid precision: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink/v1.20/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/v1.20/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReaders.java#L51-L87","documentation":"FlinkOrcReaders.decimals selects a decimal reader by precision: <=18 uses a long-backed reader, <=38 a byte-array-backed reader. Any precision above 38 is impossible under Iceberg's decimal spec and throws IllegalArgumentException 'Invalid precision'.","triggerScenarios":"FlinkOrcReaders.decimals(precision, scale) called with precision > 38, e.g. from FlinkOrcReader when a schema declares a decimal beyond ORC/Iceberg limits.","commonSituations":"Hand-built schemas with decimal(40,x); corrupted or externally produced schema metadata with out-of-spec decimals.","solutions":["Fix the schema so decimal precision is between 1 and 38","Validate decimal precision at schema creation with TypeUtil/Preconditions before reading/writing","Re-check the file's embedded schema validity if it comes from a foreign writer"],"exampleFix":"// before\nTypes.DecimalType.of(45, 5) -> decimals() throws\n// after\nTypes.DecimalType.of(38, 5)","handlingStrategy":"validation","validationCode":"Preconditions.checkArgument(precision >= 1 && precision <= 38, \"decimal precision must be 1..38, got %s\", precision);","typeGuard":"boolean validDecimal(int p) { return p >= 1 && p <= 38; }","tryCatchPattern":"try { reader = FlinkOrcReaders.decimals(p, s); } catch (IllegalArgumentException e) { /* fix schema */ throw e; }","preventionTips":["Validate decimals with TypeUtil at schema creation","Reject precision > 38 early in ingestion pipelines"],"tags":["flink","orc","decimal","validation"],"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"}