412 lines
12 KiB
SQL
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
|