428 lines
7.9 KiB
SQL
428 lines
7.9 KiB
SQL
# name: test/sql/cast/test_bit_cast.test
|
|
# description: Test casting from and to BitString
|
|
# group: [cast]
|
|
|
|
statement ok
|
|
PRAGMA enable_verification
|
|
|
|
statement ok
|
|
CREATE TABLE bits (b bit);
|
|
|
|
statement ok
|
|
INSERT INTO bits VALUES('00001111');
|
|
|
|
# cast to bool
|
|
# ---------------------------------------------------
|
|
statement error
|
|
SELECT bitstring('1', 9)::BOOL;
|
|
----
|
|
Conversion Error: Bitstring doesn't fit inside of UINT8
|
|
|
|
query I
|
|
SELECT b::BOOLEAN FROM bits;
|
|
----
|
|
true
|
|
|
|
query I
|
|
SELECT '1'::BIT::BOOL;
|
|
----
|
|
true
|
|
|
|
query I
|
|
SELECT '0'::BIT::BOOL;
|
|
----
|
|
false
|
|
|
|
# casting to numerical types
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT b::TINYINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::SMALLINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::INTEGER FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::BIGINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::UTINYINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::USMALLINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::UINTEGER FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::UBIGINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::HUGEINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::UHUGEINT FROM bits;
|
|
----
|
|
15
|
|
|
|
query I
|
|
SELECT b::FLOAT FROM bits;
|
|
----
|
|
2.1e-44
|
|
|
|
query I
|
|
SELECT b::DOUBLE FROM bits;
|
|
----
|
|
7.4e-323
|
|
|
|
query I
|
|
SELECT '100001111000011110000111100001111'::BIT::BIGINT;
|
|
----
|
|
4547612431
|
|
|
|
# numeric to bitstring
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT 15::BOOLEAN::BIT;
|
|
----
|
|
00000001
|
|
|
|
query I
|
|
SELECT 15::TINYINT::BIT;
|
|
----
|
|
00001111
|
|
|
|
query I
|
|
SELECT 15::SMALLINT::BIT;
|
|
----
|
|
0000000000001111
|
|
|
|
query I
|
|
SELECT 15::BIT;
|
|
----
|
|
00000000000000000000000000001111
|
|
|
|
query I
|
|
SELECT 15::BIGINT::BIT;
|
|
----
|
|
0000000000000000000000000000000000000000000000000000000000001111
|
|
|
|
query I
|
|
SELECT 15::HUGEINT::BIT;
|
|
----
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111
|
|
|
|
query I
|
|
SELECT 15::UHUGEINT::BIT;
|
|
----
|
|
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111
|
|
|
|
query I
|
|
SELECT 2.1e-44::FLOAT::BIT;
|
|
----
|
|
00000000000000000000000000001111
|
|
|
|
query I
|
|
SELECT 7.4e-323::BIT;
|
|
----
|
|
0000000000000000000000000000000000000000000000000000000000001111
|
|
|
|
# bitstrings that are too large for casted-to type
|
|
# ---------------------------------------------------
|
|
statement error
|
|
SELECT bitstring('1', 9)::TINYINT;
|
|
----
|
|
Conversion Error: Bitstring doesn't fit inside of INT8
|
|
|
|
statement error
|
|
SELECT bitstring('1', 17)::SMALLINT;
|
|
----
|
|
Conversion Error: Bitstring doesn't fit inside of INT16
|
|
|
|
statement error
|
|
SELECT bitstring('1', 33)::INT;
|
|
----
|
|
Conversion Error: Bitstring doesn't fit inside of INT32
|
|
|
|
statement error
|
|
SELECT bitstring('1', 65)::BIGINT;
|
|
----
|
|
Conversion Error: Bitstring doesn't fit inside of INT64
|
|
|
|
statement error
|
|
SELECT bitstring('1', 33)::FLOAT;
|
|
----
|
|
Conversion Error: Bitstring doesn't fit inside of FLOAT
|
|
|
|
statement error
|
|
SELECT bitstring('1', 65)::DOUBLE;
|
|
----
|
|
Conversion Error: Bitstring doesn't fit inside of DOUBLE
|
|
|
|
# casting to BLOB type
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT b::BLOB FROM bits;
|
|
----
|
|
\x0F
|
|
|
|
query I
|
|
SELECT bitstring('1111', 32)::BLOB;
|
|
----
|
|
\x00\x00\x00\x0F
|
|
|
|
query I
|
|
SELECT '1111'::BIT::BLOB;
|
|
----
|
|
\x0F
|
|
|
|
query I
|
|
select 'ab'::BLOB::BIT::BLOB;
|
|
----
|
|
ab
|
|
|
|
query I
|
|
select 'a'::BLOB::BIT::BLOB;
|
|
----
|
|
a
|
|
|
|
query I
|
|
SELECT bitstring('1111', 33)::BLOB;
|
|
----
|
|
\x00\x00\x00\x00\x0F
|
|
|
|
# casting from BLOB type
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT 'AAAA'::BLOB::BIT;
|
|
----
|
|
01000001010000010100000101000001
|
|
|
|
statement error
|
|
SELECT ''::BLOB::BIT;
|
|
----
|
|
Conversion Error: Cannot cast empty BLOB to BIT
|
|
|
|
# negative numbers
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT (-15)::TINYINT::BIT;
|
|
----
|
|
11110001
|
|
|
|
query I
|
|
SELECT (-15)::HUGEINT::BIT;
|
|
----
|
|
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110001
|
|
|
|
# signed integer limits -> Bit
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT (127)::TINYINT::BIT;
|
|
----
|
|
01111111
|
|
|
|
query I
|
|
SELECT (-128)::TINYINT::BIT;
|
|
----
|
|
10000000
|
|
|
|
query I
|
|
SELECT (32767)::SMALLINT::BIT;
|
|
----
|
|
0111111111111111
|
|
|
|
query I
|
|
SELECT (-32768)::SMALLINT::BIT;
|
|
----
|
|
1000000000000000
|
|
|
|
query I
|
|
SELECT (2147483647)::INT::BIT;
|
|
----
|
|
01111111111111111111111111111111
|
|
|
|
query I
|
|
SELECT (-2147483648)::INT::BIT;
|
|
----
|
|
10000000000000000000000000000000
|
|
|
|
query I
|
|
SELECT (9223372036854775807)::BIGINT::BIT;
|
|
----
|
|
0111111111111111111111111111111111111111111111111111111111111111
|
|
|
|
query I
|
|
SELECT (-9223372036854775808)::BIGINT::BIT;
|
|
----
|
|
1000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
query I
|
|
SELECT (170141183460469231731687303715884105727)::HUGEINT::BIT;
|
|
----
|
|
01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
|
|
|
query I
|
|
SELECT (-170141183460469231731687303715884105728)::HUGEINT::BIT;
|
|
----
|
|
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
|
|
|
# Bit -> signed integer limits
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT '01111111'::BIT::TINYINT;
|
|
----
|
|
127
|
|
|
|
query I
|
|
SELECT '10000000'::BIT::TINYINT;
|
|
----
|
|
-128
|
|
|
|
query I
|
|
SELECT '0111111111111111'::BIT::SMALLINT;
|
|
----
|
|
32767
|
|
|
|
query I
|
|
SELECT '1000000000000000'::BIT::SMALLINT;
|
|
----
|
|
-32768
|
|
|
|
query I
|
|
SELECT '01111111111111111111111111111111'::BIT::INT;
|
|
----
|
|
2147483647
|
|
|
|
query I
|
|
SELECT '10000000000000000000000000000000'::BIT::INT;
|
|
----
|
|
-2147483648
|
|
|
|
query I
|
|
SELECT '0111111111111111111111111111111111111111111111111111111111111111'::BIT::BIGINT;
|
|
----
|
|
9223372036854775807
|
|
|
|
query I
|
|
SELECT '1000000000000000000000000000000000000000000000000000000000000000'::BIT::BIGINT;
|
|
----
|
|
-9223372036854775808
|
|
|
|
query I
|
|
SELECT '01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'::BIT::HUGEINT;
|
|
----
|
|
170141183460469231731687303715884105727
|
|
|
|
query I
|
|
SELECT '10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'::BIT::HUGEINT;
|
|
----
|
|
-170141183460469231731687303715884105728
|
|
|
|
|
|
# unsigned integer limits -> Bit
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT (255)::UTINYINT::BIT;
|
|
----
|
|
11111111
|
|
|
|
query I
|
|
SELECT (65535)::USMALLINT::BIT;
|
|
----
|
|
1111111111111111
|
|
|
|
query I
|
|
SELECT (4294967295)::UINTEGER::BIT;
|
|
----
|
|
11111111111111111111111111111111
|
|
|
|
query I
|
|
SELECT (18446744073709551615)::UBIGINT::BIT;
|
|
----
|
|
1111111111111111111111111111111111111111111111111111111111111111
|
|
|
|
query I
|
|
SELECT '340282366920938463463374607431768211455'::UHUGEINT::BIT;
|
|
----
|
|
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
|
|
|
|
# Bit -> unsigned integer limits
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT '11111111'::BIT::UTINYINT;
|
|
----
|
|
255
|
|
|
|
query I
|
|
SELECT '1111111111111111'::BIT::USMALLINT;
|
|
----
|
|
65535
|
|
|
|
query I
|
|
SELECT '11111111111111111111111111111111'::BIT::UINTEGER;
|
|
----
|
|
4294967295
|
|
|
|
query I
|
|
SELECT '1111111111111111111111111111111111111111111111111111111111111111'::BIT::UBIGINT;
|
|
----
|
|
18446744073709551615
|
|
|
|
# float limits -> Bit
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT (3.4028235e+38)::FLOAT::BIT;
|
|
----
|
|
01111111011111111111111111111111
|
|
|
|
query I
|
|
SELECT (1.7976931348623157e+308)::DOUBLE::BIT;
|
|
----
|
|
0111111111101111111111111111111111111111111111111111111111111111
|
|
|
|
|
|
# Bit -> float limits
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT '01111111011111111111111111111111'::BIT::FLOAT;
|
|
----
|
|
3.4028235e+38
|
|
|
|
query I
|
|
SELECT '0111111111101111111111111111111111111111111111111111111111111111'::BIT::DOUBLE;
|
|
----
|
|
1.7976931348623157e+308
|
|
|
|
# NULL <-> Bit
|
|
# ---------------------------------------------------
|
|
query I
|
|
SELECT NULL::BIT;
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT NULL::BIT::INT;
|
|
----
|
|
NULL
|