{"record":{"id":"677f50b04f683bbd","repo":"prestodb/presto","slug":"numeric-value-out-of-range-677f50","errorCode":"NUMERIC_VALUE_OUT_OF_RANGE","errorMessage":"tinyint addition overflow: %s + %s","messagePattern":"tinyint addition overflow: (.+?) \\+ (.+?)","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/type/TinyintOperators.java","lineNumber":70,"sourceCode":"import static io.airlift.slice.Slices.utf8Slice;\nimport static java.lang.Float.floatToRawIntBits;\nimport static java.lang.String.format;\n\npublic final class TinyintOperators\n{\n    private TinyintOperators()\n    {\n    }\n\n    @ScalarOperator(ADD)\n    @SqlType(StandardTypes.TINYINT)\n    public static long add(@SqlType(StandardTypes.TINYINT) long left, @SqlType(StandardTypes.TINYINT) long right)\n    {\n        try {\n            return SignedBytes.checkedCast(left + right);\n        }\n        catch (IllegalArgumentException e) {\n            throw new PrestoException(NUMERIC_VALUE_OUT_OF_RANGE, format(\"tinyint addition overflow: %s + %s\", left, right), e);\n        }\n    }\n\n    @ScalarOperator(SUBTRACT)\n    @SqlType(StandardTypes.TINYINT)\n    public static long subtract(@SqlType(StandardTypes.TINYINT) long left, @SqlType(StandardTypes.TINYINT) long right)\n    {\n        try {\n            return SignedBytes.checkedCast(left - right);\n        }\n        catch (IllegalArgumentException e) {\n            throw new PrestoException(NUMERIC_VALUE_OUT_OF_RANGE, format(\"tinyint subtraction overflow: %s - %s\", left, right), e);\n        }\n    }\n\n    @ScalarOperator(MULTIPLY)\n    @SqlType(StandardTypes.TINYINT)\n    public static long multiply(@SqlType(StandardTypes.TINYINT) long left, @SqlType(StandardTypes.TINYINT) long right)","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/type/TinyintOperators.java#L52-L88","documentation":"Thrown when adding two TINYINT values produces a result outside the signed 8-bit range (-128 to 127). SignedBytes.checkedCast rejects the out-of-range long, and Presto rethrows it as NUMERIC_VALUE_OUT_OF_RANGE. The SQL left + right operator on tinyint operands invokes this function.","triggerScenarios":"SELECT tinyint_col + tinyint_col2 where the mathematical sum exceeds 127 or drops below -128, e.g. 100 + 50.","commonSituations":"Aggregating or combining small-int columns whose intermediate sums grow beyond tinyint range; misclassified columns that should be integer/smallint; porting queries from engines with implicit integer promotion.","solutions":["CAST the operands (or result expression) to SMALLINT/INTEGER/BIGINT before adding","Change the table column type to a wider integer if the data legitimately needs it","Clamp or recompute the data if overflow indicates a data-quality bug","Catch at query level by validating expected ranges before running the arithmetic"],"exampleFix":"// before\nSELECT a + b FROM t; -- a,b tinyint, overflow risk\n// after\nSELECT CAST(a AS INTEGER) + CAST(b AS INTEGER) FROM t;","handlingStrategy":"validation","validationCode":"// Presto SQL: guard before adding\nSELECT * FROM t WHERE CAST(a AS INTEGER) + CAST(b AS INTEGER) BETWEEN -128 AND 127;","typeGuard":null,"tryCatchPattern":"-- No try/catch in SQL; use try_cast to a wider type or clamp:\nSELECT CAST(a AS INTEGER) + CAST(b AS INTEGER) FROM t;","preventionTips":["Cast tinyint operands to INTEGER/BIGINT before any arithmetic","Store columns whose math matters as a wider integer type","Remember tinyint range is only -128..127 when writing expressions","Add range assertions in data-quality checks on ingestion"],"tags":["presto","tinyint","overflow","arithmetic"],"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"}