{"record":{"id":"830efe93a37acefc","repo":"prestodb/presto","slug":"numeric-value-out-of-range-830efe","errorCode":"NUMERIC_VALUE_OUT_OF_RANGE","errorMessage":"interval_day_to_second addition overflow: %s ms + %s ms","messagePattern":"interval_day_to_second addition overflow: (.+?) ms \\+ (.+?) ms","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/type/IntervalDayTimeOperators.java","lineNumber":66,"sourceCode":"import static com.facebook.presto.type.IntervalDayTimeType.INTERVAL_DAY_TIME;\nimport static io.airlift.slice.Slices.utf8Slice;\nimport static java.lang.String.format;\n\npublic final class IntervalDayTimeOperators\n{\n    private IntervalDayTimeOperators()\n    {\n    }\n\n    @ScalarOperator(ADD)\n    @SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND)\n    public static long add(@SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND) long left, @SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND) long right)\n    {\n        try {\n            return Math.addExact(left, right);\n        }\n        catch (ArithmeticException e) {\n            throw new PrestoException(NUMERIC_VALUE_OUT_OF_RANGE, format(\"interval_day_to_second addition overflow: %s ms + %s ms\", left, right), e);\n        }\n    }\n\n    @ScalarOperator(SUBTRACT)\n    @SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND)\n    public static long subtract(@SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND) long left, @SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND) long right)\n    {\n        try {\n            return Math.subtractExact(left, right);\n        }\n        catch (ArithmeticException e) {\n            throw new PrestoException(NUMERIC_VALUE_OUT_OF_RANGE, format(\"interval_day_to_second subtraction overflow: %s ms - %s ms\", left, right), e);\n        }\n    }\n\n    @ScalarOperator(MULTIPLY)\n    @SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND)\n    public static long multiplyByBigint(@SqlType(StandardTypes.INTERVAL_DAY_TO_SECOND) long left, @SqlType(StandardTypes.BIGINT) long right)","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/type/IntervalDayTimeOperators.java#L48-L84","documentation":"Thrown by the INTERVAL DAY TO SECOND addition operator when Math.addExact detects that adding two intervals (millisecond encodings in a long) overflows the 64-bit range. Presto raises NUMERIC_VALUE_OUT_OF_RANGE with both operand millisecond values instead of silently wrapping.","triggerScenarios":"Executing SQL '+' on two INTERVAL DAY TO SECOND values whose combined millisecond total exceeds Long.MAX_VALUE, e.g. repeatedly adding huge intervals like INTERVAL '106751991' DAY to itself.","commonSituations":"Accumulating intervals in a loop/aggregation where durations are mistakenly expressed in extreme units (e.g. building INTERVAL from an unchecked millisecond counter), and pathological data from ETL conversions.","solutions":["Check interval magnitudes before adding; normalize durations to smaller realistic units.","Verify the code building the INTERVAL is not multiplying days by the wrong factor (ms vs seconds).","Accumulate as BIGINT milliseconds in application logic with its own bounds check before constructing intervals."],"exampleFix":"// before\nSELECT huge_interval + INTERVAL '1000000000' DAY; -- overflow\n// after\n-- validate: SELECT huge_interval; then add only if within representable range\nSELECT huge_interval + INTERVAL '1' DAY;","handlingStrategy":"validation","validationCode":"-- Cap and validate interval magnitudes before adding\nSELECT interval_add FROM t\nWHERE day(interval_add) < 106751991;  -- ~Long.MAX_VALUE ms in days\n-- Or validate in code that source millis are within realistic bounds\nif (millis < 0 || millis > MAX_REASONABLE_DURATION_MS) throw new IllegalArgumentException(...);","typeGuard":null,"tryCatchPattern":"try { run(\"SELECT iv1 + iv2 FROM t\"); }\ncatch (PrestoException e) {\n  if (StandardErrorCode.NUMERIC_VALUE_OUT_OF_RANGE.toErrorCode().equals(e.getErrorCode())) {\n    // handle overflow: clamp or route row to error path\n  } else throw e;\n}","preventionTips":["Audit unit conversions (s/ms/us/ns) in the code that builds INTERVAL values.","Bound-check duration inputs at ingestion time.","Avoid accumulating intervals in unbounded loops without normalization."],"tags":["presto","sql","interval","overflow"],"backgroundTag":"integer-overflow","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"}