203 lines
3.9 KiB
SQL
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
|