# 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 ---- :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 ---- :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 ---- :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 ---- :Conversion Error.*INT128.*is out of range for.*UINT8.* statement error select '256'::hugeint::uint8 ---- :Conversion Error.*INT128.*is out of range for.*UINT8.* # uint16 query I select '65535'::HUGEINT::UINT16 ---- 65535 statement error select '-1'::hugeint::uint16 ---- :Conversion Error.*INT128.*is out of range for.*UINT16.* statement error select '65536'::hugeint::uint16 ---- :Conversion Error.*INT128.*is out of range for.*UINT16.* # uint32 query I select '4294967295'::HUGEINT::UINT32 ---- 4294967295 statement error select '-1'::hugeint::uint32 ---- :Conversion Error.*INT128.*is out of range for.*UINT32.* statement error select '4294967296'::hugeint::uint32 ---- :Conversion Error.*INT128.*is out of range for.*UINT32.* # UINT64 query I select '18446744073709551615'::HUGEINT::UINT64 ---- 18446744073709551615 statement error select '-1'::hugeint::UINT64 ---- :Conversion Error.*INT128.*is out of range for.*UINT64.* statement error select '18446744073709551616'::hugeint::UINT64 ---- :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