should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,143 @@
# name: test/sql/overflow/bigint_overflow.test
# description: Test handling of overflow bigint; this is tested extra because the multiply overflow detection code is tricky
# group: [overflow]
statement ok
PRAGMA enable_verification
query I
SELECT 251658240::BIGINT * 251658240::BIGINT
----
63331869759897600
statement error
SELECT 251658240::BIGINT * 1080863910568919040::BIGINT
----
Out of Range Error: Overflow
statement error
SELECT 1080863910568919040::BIGINT * 251658240::BIGINT
----
Out of Range Error: Overflow
statement error
SELECT 1080863910568919040::BIGINT * 1080863910568919040::BIGINT
----
Out of Range Error: Overflow
query I
SELECT -1::BIGINT * 9223372036854775807::BIGINT
----
-9223372036854775807
statement error
SELECT -2::BIGINT * 4611686018427387905::BIGINT
----
Out of Range Error: Overflow
query I
SELECT 8589934592::BIGINT * 1073741823::BIGINT
----
9223372028264841216
statement error
SELECT 10737418240::BIGINT * 1073741823::BIGINT
----
Out of Range Error: Overflow
query I
SELECT 1073741823::BIGINT * 8589934592::BIGINT
----
9223372028264841216
statement error
SELECT 1073741823::BIGINT * 10737418240::BIGINT
----
Out of Range Error: Overflow
query I
SELECT 1073741823::BIGINT * 8589934592::BIGINT
----
9223372028264841216
# int64_min
statement error
SELECT (-9223372036854775808)::BIGINT * 2::BIGINT
----
Out of Range Error: Overflow
statement error
SELECT (-9223372036854775808)::BIGINT * -1::BIGINT
----
Out of Range Error: Overflow
statement error
SELECT -1::BIGINT * (-9223372036854775808)::BIGINT
----
Out of Range Error: Overflow
statement error
SELECT -2::BIGINT * (-9223372036854775808)::BIGINT
----
Out of Range Error: Overflow
query I
SELECT (-9223372036854775808)::BIGINT * 0::BIGINT
----
0
query I
SELECT (-9223372036854775808)::BIGINT * 1::BIGINT
----
-9223372036854775808
query I
SELECT 0::BIGINT * (-9223372036854775808)::BIGINT
----
0
query I
SELECT 1::BIGINT * (-9223372036854775808)::BIGINT
----
-9223372036854775808
# int64_min + 1
statement error
SELECT (-9223372036854775807)::BIGINT * 2::BIGINT
----
Out of Range Error: Overflow
query I
SELECT (-9223372036854775807)::BIGINT * -1::BIGINT
----
9223372036854775807
query I
SELECT -1::BIGINT * (-9223372036854775807)::BIGINT
----
9223372036854775807
statement error
SELECT -2::BIGINT * (-9223372036854775807)::BIGINT
----
Out of Range Error: Overflow
query I
SELECT (-9223372036854775807)::BIGINT * 0::BIGINT
----
0
query I
SELECT (-9223372036854775807)::BIGINT * 1::BIGINT
----
-9223372036854775807
query I
SELECT 0::BIGINT * (-9223372036854775807)::BIGINT
----
0
query I
SELECT 1::BIGINT * (-9223372036854775807)::BIGINT
----
-9223372036854775807

View File

@@ -0,0 +1,50 @@
# name: test/sql/overflow/double_float_overflow.test
# description: Test handling of overflow doubles and floats;
# group: [overflow]
# this is tested extra because floats and doubles can represent inf and nan as well. And we
# want to make sure we still catch overflows for these functions
statement ok
PRAGMA enable_verification
query I
SELECT 1e308::DOUBLE + 1e308::DOUBLE;
----
inf
query I
SELECT 0::DOUBLE - 1e308::DOUBLE - 1e308::DOUBLE;
----
-inf
query I
SELECT 1e308::DOUBLE * 1e308::DOUBLE;
----
inf
query I
SELECT 1e308::DOUBLE * 1e308::DOUBLE;
----
inf
query I
SELECT 1e308::DOUBLE / 0.1;
----
inf
query I
SELECT 2e38::FLOAT + 2e38::FLOAT;
----
inf
query I
SELECT 2e38::FLOAT * 2e38::FLOAT;
----
inf
query I
SELECT 2e38::FLOAT / 0.1;
----
inf

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,222 @@
# name: test/sql/overflow/integer_overflow.test
# description: Test handling of integer overflow in arithmetic
# group: [overflow]
statement ok
PRAGMA enable_verification
# addition
# tinyint
statement ok
SELECT 100::TINYINT + 1::TINYINT
statement error
SELECT 100::TINYINT + 50::TINYINT
----
Out of Range Error: Overflow
statement ok
SELECT 0::TINYINT + -127::TINYINT
statement error
SELECT -2::TINYINT + -127::TINYINT
----
Out of Range Error: Overflow
# smallint
statement ok
SELECT 30000::SMALLINT + 1::SMALLINT
statement error
SELECT 30000::SMALLINT + 5000::SMALLINT
----
Out of Range Error: Overflow
statement ok
SELECT 0::SMALLINT + -32767::SMALLINT
statement error
SELECT -2::SMALLINT + -32767::SMALLINT
----
Out of Range Error: Overflow
# integer
statement ok
SELECT 2147483640::INTEGER + 1::INTEGER
statement error
SELECT 2147483640::INTEGER + 5000::INTEGER
----
Out of Range Error: Overflow
statement ok
SELECT 0::INTEGER + -2147483647::INTEGER
statement error
SELECT -2::INTEGER + -2147483647::INTEGER
----
Out of Range Error: Overflow
# bigint
statement ok
SELECT 9223372036854775800::BIGINT + 1::BIGINT
statement error
SELECT 9223372036854775800::BIGINT + 5000::BIGINT
----
Out of Range Error: Overflow
statement ok
SELECT 0::BIGINT + -9223372036854775807::BIGINT
statement error
SELECT -2::BIGINT + -9223372036854775808::BIGINT
----
Conversion Error
# subtraction
# tinyint
statement ok
SELECT -100::TINYINT - 1::TINYINT
statement error
SELECT -100::TINYINT - 50::TINYINT
----
Out of Range Error: Overflow
statement ok
SELECT 0::TINYINT - 127::TINYINT
statement error
SELECT -2::TINYINT - 127::TINYINT
----
Out of Range Error: Overflow
# smallint
statement ok
SELECT -30000::SMALLINT - 1::SMALLINT
statement error
SELECT -30000::SMALLINT - 5000::SMALLINT
----
Out of Range Error: Overflow
statement ok
SELECT 0::SMALLINT - 32767::SMALLINT
statement error
SELECT -2::SMALLINT - 32767::SMALLINT
----
Out of Range Error: Overflow
# integer
statement ok
SELECT -2147483640::INTEGER - 1::INTEGER
statement error
SELECT -2147483640::INTEGER - 5000::INTEGER
----
Out of Range Error: Overflow
statement ok
SELECT 0::INTEGER - 2147483647::INTEGER
statement error
SELECT -2::INTEGER - 2147483647::INTEGER
----
Out of Range Error: Overflow
# bigint
statement ok
SELECT -9223372036854775800::BIGINT - 1::BIGINT
statement error
SELECT -9223372036854775800::BIGINT - 5000::BIGINT
----
Out of Range Error: Overflow
statement ok
SELECT 0::BIGINT - 9223372036854775807::BIGINT
statement error
SELECT -2::BIGINT - 9223372036854775807::BIGINT
----
Out of Range Error: Overflow
# multiplication
# tinyint
statement ok
SELECT 50::TINYINT * 2::TINYINT
statement error
SELECT 50::TINYINT * 3::TINYINT
----
Out of Range Error: Overflow
statement ok
SELECT -1::TINYINT * 127::TINYINT
statement ok
SELECT -2::TINYINT * 64::TINYINT
statement error
SELECT -2::TINYINT * 65::TINYINT
----
Out of Range Error: Overflow
# smallint
statement ok
SELECT 15000::SMALLINT * 2::SMALLINT
statement error
SELECT 15000::SMALLINT * 3::SMALLINT
----
Out of Range Error: Overflow
statement ok
SELECT -1::SMALLINT * 32767::SMALLINT
statement ok
SELECT -2::SMALLINT * 16384::SMALLINT
statement error
SELECT -2::SMALLINT * 16385::SMALLINT
----
Out of Range Error: Overflow
# integer
statement ok
SELECT 1073741820::INTEGER * 2::INTEGER
statement error
SELECT 1073741820::INTEGER * 3::INTEGER
----
Out of Range Error: Overflow
statement ok
SELECT -1::INTEGER * 2147483647::INTEGER
statement ok
SELECT -2::INTEGER * 1073741824::INTEGER
statement error
SELECT -2::INTEGER * 1073741825::INTEGER
----
Out of Range Error: Overflow
# bigint
statement ok
SELECT 4611686018427387900::BIGINT * 2::BIGINT
statement error
SELECT 4611686018427387900::BIGINT * 3::BIGINT
----
Out of Range Error: Overflow
statement ok
SELECT -1::BIGINT * 9223372036854775807::BIGINT
statement error
SELECT -2::BIGINT * 4611686018427387905::BIGINT
----
Out of Range Error: Overflow

View 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

View File

@@ -0,0 +1,87 @@
# name: test/sql/overflow/test_numeric_overflow.test
# description: Test handling of overflows in float/double
# group: [overflow]
statement ok
PRAGMA enable_verification
query I
SELECT 1e1000
----
inf
# overflow on cast from double to real results in an error
statement error
SELECT 1e308::REAL
----
Conversion Error
# except we can cast inf -> inf
query I
SELECT 1e1000::REAL
----
inf
# test string casts
query I
SELECT '1e1000'::DOUBLE
----
inf
query I
SELECT '1e100'::REAL
----
inf
# overflow in SUM/AVG overflow
query I
SELECT SUM(i) FROM (VALUES (1e308), (1e308)) tbl(i)
----
inf
query I
SELECT AVG(i) FROM (VALUES (1e308), (1e308)) tbl(i)
----
inf
# overflow in arithmetic as well
query I
SELECT 1e308+1e308
----
inf
query I
SELECT 1e308*2
----
inf
query I
SELECT -1e308-1e308
----
-inf
query I
SELECT 1e308/0.1
----
inf
query I
SELECT 2e38::REAL+2e38::REAL
----
inf
query I
SELECT 2e38::REAL*2
----
inf
query I
SELECT -2e38::REAL-2e38::REAL
----
-inf
query I
SELECT 2e38::REAL/0.1::REAL
----
inf

View File

@@ -0,0 +1,98 @@
# name: test/sql/overflow/test_overflow.test
# description: Test handling of overflows in basic types
# group: [overflow]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test (a INTEGER, b INTEGER);
# insert too large value for domain should cause error
statement error
INSERT INTO test VALUES (-1099511627776, 3)
----
Conversion Error
statement ok
INSERT INTO test VALUES (11, 22), (12, 21), (14, 22)
# Casting NULL should still work though
query I
SELECT ALL CAST ( - SUM ( DISTINCT - CAST ( NULL AS INTEGER ) ) AS INTEGER ) FROM test
----
NULL
# proper upcasting of integer columns in AVG
query IR
SELECT b, AVG(a) FROM test GROUP BY b ORDER BY b;
----
21 12.000000
22 12.500000
# cast overflows
statement error
SELECT cast(200 AS TINYINT)
----
Conversion Error
statement error
SELECT cast(-129 AS TINYINT)
----
Conversion Error
# addition overflow
statement error
SELECT cast(100 AS TINYINT) + cast(100 AS TINYINT)
----
Out of Range Error: Overflow
# also with tables
statement ok
CREATE TABLE test2 (a INTEGER, b TINYINT);
statement ok
INSERT INTO test2 VALUES (200, 60), (12, 60), (14, 60)
statement error
SELECT cast(a AS TINYINT) FROM test2
----
Conversion Error
query I
SELECT SUM(b) FROM test2
----
180
# subtraction
statement error
SELECT 100::TINYINT - -50::TINYINT
----
Out of Range Error: Overflow
statement error
SELECT 100::TINYINT * 2::TINYINT
----
Out of Range Error: Overflow
# tables
statement error
SELECT 100::TINYINT + b::TINYINT FROM test2
----
Out of Range Error: Overflow
statement error
SELECT 100::TINYINT - -b::TINYINT FROM test2
----
Out of Range Error: Overflow
statement error
SELECT 100::TINYINT * b::TINYINT FROM test2
----
Out of Range Error: Overflow
# more complex expressions
statement error
SELECT a + b FROM (SELECT cast(100 AS TINYINT) AS a, cast(100 AS TINYINT) AS b) tbl1
----
Out of Range Error: Overflow