Files
email-tracker/external/duckdb/test/sql/overflow/table_overflow.test
2025-10-24 19:21:19 -05:00

203 lines
3.9 KiB
SQL

# name: test/sql/overflow/table_overflow.test
# description: Test handling of integer overflows in table
# group: [overflow]
# statement ok
# PRAGMA enable_verification
# tinyint
statement ok
CREATE TABLE tinyints(i TINYINT);
statement ok
INSERT INTO tinyints VALUES (1), (10);
# addition
query I
SELECT i+100::TINYINT FROM tinyints ORDER BY 1;
----
101
110
# overflow in addition
statement error
SELECT i+120::TINYINT FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow
# no overflow if we filter the offending element
query I
SELECT i+120::TINYINT FROM tinyints WHERE i=1 ORDER BY 1;
----
121
# subtraction
query I
SELECT -100::TINYINT-i FROM tinyints ORDER BY 1;
----
-110
-101
statement error
SELECT -120::TINYINT-i FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow
# no overflow if we filter the offending element
query I
SELECT -120::TINYINT-i FROM tinyints WHERE i=1 ORDER BY 1;
----
-121
# addition with negation
statement error
SELECT -120::TINYINT + (-i) FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow
# multiple negations
statement error
SELECT -120::TINYINT + (-(-(-i))) FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow
# multiplication
query I
SELECT i*10::TINYINT FROM tinyints ORDER BY 1;
----
10
100
statement error
SELECT i*15::TINYINT FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow
statement error
SELECT (i*10::TINYINT)*10::TINYINT FROM tinyints ORDER BY 1;
----
Out of Range Error: Overflow
# no overflow if we filter the offending element
query I
SELECT (i*10::TINYINT)*10::TINYINT FROM tinyints WHERE i=1 ORDER BY 1;
----
100
# what if we have a subquery?
statement error
SELECT (i*10::TINYINT)*10::TINYINT FROM (SELECT * FROM tinyints) tbl(i) ORDER BY 1;
----
Out of Range Error: Overflow
query I
SELECT (i*10::TINYINT)*10::TINYINT FROM (SELECT * FROM tinyints) tbl(i) WHERE i=1 ORDER BY 1;
----
100
# what if we have a UNION in the subquery
statement error
SELECT (i*10::TINYINT)*10::TINYINT FROM (SELECT * FROM tinyints WHERE i=1 UNION ALL SELECT * FROM tinyints WHERE i=10) tbl(i) ORDER BY 1;
----
Out of Range Error: Overflow
# smallints
statement ok
CREATE TABLE smallints(i SMALLINT);
statement ok
INSERT INTO smallints VALUES (1), (10);
# overflow in various smallint ops
statement error
SELECT i+32765::SMALLINT FROM smallints
----
Out of Range Error: Overflow
query I
SELECT i+32765::SMALLINT FROM smallints WHERE i=1
----
32766
statement error
SELECT -32765::SMALLINT-i FROM smallints
----
Out of Range Error: Overflow
query I
SELECT -32765::SMALLINT-i FROM smallints WHERE i=1
----
-32766
statement error
SELECT i*10000::SMALLINT FROM smallints
----
Out of Range Error: Overflow
query I
SELECT i*10000::SMALLINT FROM smallints WHERE i=1
----
10000
# including a cast to tinyint
statement error
SELECT i::TINYINT+120::TINYINT FROM smallints
----
Out of Range Error: Overflow
query I
SELECT i::TINYINT+120::TINYINT FROM smallints WHERE i=1
----
121
# what if the smallint doesn't fit?
statement ok
INSERT INTO smallints VALUES (1000)
statement error
SELECT i::TINYINT FROM smallints
----
Conversion Error
query I
SELECT i::TINYINT+120::TINYINT FROM smallints WHERE i=1
----
121
# include multiple projections...
# include joins (specifically left joins! they add nulls)
# What about adding column types that end up overflowing?
statement ok
INSERT INTO smallints VALUES (30000);
statement error
SELECT integers1.i::SMALLINT + integers2.i::SMALLINT from smallints integers1, smallints integers2 where integers1.i = integers2.i;
----
Out of Range Error: Overflow
statement ok
CREATE TABLE smallints2 (j SMALLINT);
statement ok
INSERT INTO smallints2 VALUES (1), (10);
# no overflow, just some null values
query I rowsort
SELECT i + j from smallints si_left LEFT JOIN smallints2 si_right ON (i = j);
----
2
20
NULL
NULL
# insert 30000 into smallints 2
statement ok
INSERT INTO smallints2 VALUES (30000);
statement error
SELECT i + j from smallints LEFT JOIN smallints2 ON (i = j);
----
Out of Range Error: Overflow