should be it
This commit is contained in:
143
external/duckdb/test/sql/overflow/bigint_overflow.test
vendored
Normal file
143
external/duckdb/test/sql/overflow/bigint_overflow.test
vendored
Normal 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
|
||||
50
external/duckdb/test/sql/overflow/double_float_overflow.test
vendored
Normal file
50
external/duckdb/test/sql/overflow/double_float_overflow.test
vendored
Normal 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
|
||||
|
||||
18
external/duckdb/test/sql/overflow/expression_tree_depth.test
vendored
Normal file
18
external/duckdb/test/sql/overflow/expression_tree_depth.test
vendored
Normal file
File diff suppressed because one or more lines are too long
222
external/duckdb/test/sql/overflow/integer_overflow.test
vendored
Normal file
222
external/duckdb/test/sql/overflow/integer_overflow.test
vendored
Normal 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
|
||||
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
|
||||
87
external/duckdb/test/sql/overflow/test_numeric_overflow.test
vendored
Normal file
87
external/duckdb/test/sql/overflow/test_numeric_overflow.test
vendored
Normal 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
|
||||
|
||||
98
external/duckdb/test/sql/overflow/test_overflow.test
vendored
Normal file
98
external/duckdb/test/sql/overflow/test_overflow.test
vendored
Normal 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
|
||||
Reference in New Issue
Block a user