Files
email-tracker/external/duckdb/test/common/test_cast_hugeint.test
2025-10-24 19:21:19 -05:00

412 lines
12 KiB
SQL

# name: test/common/test_cast_hugeint.test
# description: Test hugeint casting from various types
# group: [common]
# test float -> hugeint casts
statement ok
CREATE TABLE working_floats(f FLOAT);
CREATE TABLE broken_floats(f FLOAT);
statement ok
INSERT INTO working_floats VALUES (10.0), (-10.0), (32767.0), (-32767.0), (1.3), (-2.7), (2000000000.0), (-2000000000.0), (4000000000000000000.0), (-4000000000000000000.0), (1329227995784915872903807060280344576.0), (-1329227995784915872903807060280344576.0);
statement ok
INSERT INTO broken_floats VALUES (170141183460469231731687303715884105729.0), (-170141183460469231731687303715884105729.0);
query I
SELECT f::HUGEINT::FLOAT FROM working_floats
----
10.0
-10.0
32767.0
-32767.0
1.0
-3.0
2000000000.0
-2000000000.0
4000000000000000000.0
-4000000000000000000.0
1329227995784915872903807060280344576
-1329227995784915872903807060280344576
# test broken casts
# we test one by one to ensure that every single value is broken
loop i 0 2
statement error
SELECT f::HUGEINT FROM (SELECT f FROM broken_floats ORDER BY f LIMIT 1 OFFSET ${i}) t1
----
<REGEX>:Conversion Error.*FLOAT.*is out of range for.*INT128.*
endloop
# test double -> hugeint casts
statement ok
CREATE TABLE working_doubles(f DOUBLE);
CREATE TABLE broken_doubles(f DOUBLE);
statement ok
INSERT INTO working_doubles VALUES (10.0), (-10.0), (32767.0), (-32767.0), (1.3), (-2.7), (2000000000.0), (-2000000000.0), (4000000000000000000.0), (-4000000000000000000.0), (1329227995784915872903807060280344576.0), (-1329227995784915872903807060280344576.0);
statement ok
INSERT INTO broken_doubles VALUES (1361129467683753853853498429727072845824.0), (-1361129467683753853853498429727072845824.0), (1.0e100), (-1.0e100);
query I
SELECT f::HUGEINT::DOUBLE FROM working_doubles
----
10.0
-10.0
32767.0
-32767.0
1.0
-3.0
2000000000.0
-2000000000.0
4000000000000000000.0
-4000000000000000000.0
1329227995784915872903807060280344576
-1329227995784915872903807060280344576
# we handle the values one by one here
loop i 0 4
statement error
SELECT f::HUGEINT FROM (SELECT f FROM broken_doubles ORDER BY f LIMIT 1 OFFSET ${i}) t1
----
<REGEX>:Conversion Error.*DOUBLE.*is out of range for.*INT128.*
endloop
# test varchar -> hugeint casts
statement ok
CREATE TABLE working_strings(f VARCHAR);
CREATE TABLE broken_strings(f VARCHAR);
statement ok
INSERT INTO working_strings VALUES ('10'), ('-10'), ('-1329227995784915872903807060280344576'), ('170141183460469231731687303715884105727'), ('-170141183460469231731687303715884105728'), ('1.3'), ('-9223372036854775807.1293813'), ('1e18'), ('1e+18'), ('1.'), ('.1'), ('0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'), ('1000e-40'), ('10000e-3');
statement ok
INSERT INTO broken_strings VALUES ('170141183460469231731687303715884105728'), ('-170141183460469231731687303715884105729'), ('10000000000000000000000000000000000000000000000000000000000000'), ('aaaa'), ('19A'), (''), ('1.A'), ('1.2382398723A'), ('1e++1'), ('1e+1+1'), ('1e+1-1'), ('+'), ('.'), ('. '), ('10000000000e37');
query I
SELECT f::HUGEINT FROM working_strings
----
10
-10
-1329227995784915872903807060280344576
170141183460469231731687303715884105727
-170141183460469231731687303715884105728
1.3
-9223372036854775807.1293813
1e18
1e+18
1.
.1
0
0
10
loop i 0 14
statement error
SELECT f::HUGEINT FROM (SELECT f FROM broken_strings ORDER BY f LIMIT 1 OFFSET ${i}) t1
----
<REGEX>:Conversion Error.*string.*INT128.*
endloop
# cast all powers of ten
statement ok
CREATE TABLE powers_of_ten(p VARCHAR);
statement ok
INSERT INTO powers_of_ten VALUES ('1'), ('10'), ('100'), ('1000'), ('10000'), ('100000'), ('1000000'), ('10000000'), ('100000000'), ('1000000000'), ('10000000000'), ('100000000000'), ('1000000000000'), ('10000000000000'), ('100000000000000'), ('1000000000000000'), ('10000000000000000'), ('100000000000000000'), ('1000000000000000000'), ('10000000000000000000'), ('100000000000000000000'), ('1000000000000000000000'), ('10000000000000000000000'), ('100000000000000000000000'), ('1000000000000000000000000'), ('10000000000000000000000000'), ('100000000000000000000000000'), ('1000000000000000000000000000'), ('10000000000000000000000000000'), ('100000000000000000000000000000'), ('1000000000000000000000000000000'), ('10000000000000000000000000000000'), ('100000000000000000000000000000000'), ('1000000000000000000000000000000000'), ('10000000000000000000000000000000000'), ('100000000000000000000000000000000000'), ('1000000000000000000000000000000000000'), ('10000000000000000000000000000000000000'), ('100000000000000000000000000000000000000'), ('-1'), ('-10'), ('-100'), ('-1000'), ('-10000'), ('-100000'), ('-1000000'), ('-10000000'), ('-100000000'), ('-1000000000'), ('-10000000000'), ('-100000000000'), ('-1000000000000'), ('-10000000000000'), ('-100000000000000'), ('-1000000000000000'), ('-10000000000000000'), ('-100000000000000000'), ('-1000000000000000000'), ('-10000000000000000000'), ('-100000000000000000000'), ('-1000000000000000000000'), ('-10000000000000000000000'), ('-100000000000000000000000'), ('-1000000000000000000000000'), ('-10000000000000000000000000'), ('-100000000000000000000000000'), ('-1000000000000000000000000000'), ('-10000000000000000000000000000'), ('-100000000000000000000000000000'), ('-1000000000000000000000000000000'), ('-10000000000000000000000000000000'), ('-100000000000000000000000000000000'), ('-1000000000000000000000000000000000'), ('-10000000000000000000000000000000000'), ('-100000000000000000000000000000000000'), ('-1000000000000000000000000000000000000'), ('-10000000000000000000000000000000000000'), ('-100000000000000000000000000000000000000');
query I
SELECT p::HUGEINT FROM powers_of_ten
----
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
10000000000000000000
100000000000000000000
1000000000000000000000
10000000000000000000000
100000000000000000000000
1000000000000000000000000
10000000000000000000000000
100000000000000000000000000
1000000000000000000000000000
10000000000000000000000000000
100000000000000000000000000000
1000000000000000000000000000000
10000000000000000000000000000000
100000000000000000000000000000000
1000000000000000000000000000000000
10000000000000000000000000000000000
100000000000000000000000000000000000
1000000000000000000000000000000000000
10000000000000000000000000000000000000
100000000000000000000000000000000000000
-1
-10
-100
-1000
-10000
-100000
-1000000
-10000000
-100000000
-1000000000
-10000000000
-100000000000
-1000000000000
-10000000000000
-100000000000000
-1000000000000000
-10000000000000000
-100000000000000000
-1000000000000000000
-10000000000000000000
-100000000000000000000
-1000000000000000000000
-10000000000000000000000
-100000000000000000000000
-1000000000000000000000000
-10000000000000000000000000
-100000000000000000000000000
-1000000000000000000000000000
-10000000000000000000000000000
-100000000000000000000000000000
-1000000000000000000000000000000
-10000000000000000000000000000000
-100000000000000000000000000000000
-1000000000000000000000000000000000
-10000000000000000000000000000000000
-100000000000000000000000000000000000
-1000000000000000000000000000000000000
-10000000000000000000000000000000000000
-100000000000000000000000000000000000000
query I
SELECT p::HUGEINT::VARCHAR FROM powers_of_ten
----
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
10000000000000000000
100000000000000000000
1000000000000000000000
10000000000000000000000
100000000000000000000000
1000000000000000000000000
10000000000000000000000000
100000000000000000000000000
1000000000000000000000000000
10000000000000000000000000000
100000000000000000000000000000
1000000000000000000000000000000
10000000000000000000000000000000
100000000000000000000000000000000
1000000000000000000000000000000000
10000000000000000000000000000000000
100000000000000000000000000000000000
1000000000000000000000000000000000000
10000000000000000000000000000000000000
100000000000000000000000000000000000000
-1
-10
-100
-1000
-10000
-100000
-1000000
-10000000
-100000000
-1000000000
-10000000000
-100000000000
-1000000000000
-10000000000000
-100000000000000
-1000000000000000
-10000000000000000
-100000000000000000
-1000000000000000000
-10000000000000000000
-100000000000000000000
-1000000000000000000000
-10000000000000000000000
-100000000000000000000000
-1000000000000000000000000
-10000000000000000000000000
-100000000000000000000000000
-1000000000000000000000000000
-10000000000000000000000000000
-100000000000000000000000000000
-1000000000000000000000000000000
-10000000000000000000000000000000
-100000000000000000000000000000000
-1000000000000000000000000000000000
-10000000000000000000000000000000000
-100000000000000000000000000000000000
-1000000000000000000000000000000000000
-10000000000000000000000000000000000000
-100000000000000000000000000000000000000
# test large constants and correct parsing into either HUGEINT or DOUBLE
query II
SELECT typeof(4832904823908104981209840981240981277), 4832904823908104981209840981240981277
----
HUGEINT 4832904823908104981209840981240981277
query II
SELECT typeof(48329048239081049812098409812409812772), 48329048239081049812098409812409812772
----
HUGEINT 48329048239081049812098409812409812772
query II
SELECT typeof(483290482390810498120984098124098127725), 483290482390810498120984098124098127725
----
DOUBLE 483290482390810498120984098124098127725.0
query II
SELECT typeof(4832904823908104981209840981240981277256), 4832904823908104981209840981240981277256
----
DOUBLE 4832904823908104981209840981240981277256.0
query II
SELECT typeof(48329048239081049812098409812409812772568), 48329048239081049812098409812409812772568
----
DOUBLE 48329048239081049812098409812409812772568.0
query II
SELECT typeof(483290482390810498120984098124098127725683), 483290482390810498120984098124098127725683
----
DOUBLE 483290482390810498120984098124098127725683.0
query I
SELECT 0::HUGEINT::VARCHAR
----
0
# hugeint -> uints
# uint8
query I
select '255'::HUGEINT::UINT8
----
255
statement error
select '-1'::hugeint::uint8
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT8.*
statement error
select '256'::hugeint::uint8
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT8.*
# uint16
query I
select '65535'::HUGEINT::UINT16
----
65535
statement error
select '-1'::hugeint::uint16
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT16.*
statement error
select '65536'::hugeint::uint16
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT16.*
# uint32
query I
select '4294967295'::HUGEINT::UINT32
----
4294967295
statement error
select '-1'::hugeint::uint32
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT32.*
statement error
select '4294967296'::hugeint::uint32
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT32.*
# UINT64
query I
select '18446744073709551615'::HUGEINT::UINT64
----
18446744073709551615
statement error
select '-1'::hugeint::UINT64
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT64.*
statement error
select '18446744073709551616'::hugeint::UINT64
----
<REGEX>:Conversion Error.*INT128.*is out of range for.*UINT64.*
# uint -> hugeint
query I
select '255'::UINT8::HUGEINT
----
255
query I
select '65535'::UINT16::HUGEINT
----
65535
query I
select '4294967295'::UINT32::HUGEINT
----
4294967295
query I
select '18446744073709551615'::UINT64::HUGEINT
----
18446744073709551615