should be it
This commit is contained in:
202
external/duckdb/test/sql/overflow/table_overflow.test
vendored
Normal file
202
external/duckdb/test/sql/overflow/table_overflow.test
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user