261 lines
3.9 KiB
SQL
261 lines
3.9 KiB
SQL
# name: test/sql/cast/test_string_cast.test
|
|
# description: Test string casts
|
|
# group: [cast]
|
|
|
|
statement ok
|
|
PRAGMA enable_verification
|
|
|
|
query TTT
|
|
SELECT (1=1)::VARCHAR, (1=0)::VARCHAR, NULL::BOOLEAN::VARCHAR
|
|
----
|
|
true
|
|
false
|
|
NULL
|
|
|
|
query TTT
|
|
SELECT 1::TINYINT::VARCHAR, 12::TINYINT::VARCHAR, (-125)::TINYINT::VARCHAR
|
|
----
|
|
1
|
|
12
|
|
-125
|
|
|
|
query TTT
|
|
SELECT 1::SMALLINT::VARCHAR, 12442::SMALLINT::VARCHAR, (-32153)::SMALLINT::VARCHAR
|
|
----
|
|
1
|
|
12442
|
|
-32153
|
|
|
|
query TTT
|
|
SELECT 1::INTEGER::VARCHAR, 12442952::INTEGER::VARCHAR, (-2000000111)::INTEGER::VARCHAR
|
|
----
|
|
1
|
|
12442952
|
|
-2000000111
|
|
|
|
query TTT
|
|
SELECT 1::BIGINT::VARCHAR, 1244295295289253::BIGINT::VARCHAR, (-2000000111551166)::BIGINT::VARCHAR
|
|
----
|
|
1
|
|
1244295295289253
|
|
-2000000111551166
|
|
|
|
query TTT
|
|
SELECT 2::FLOAT::VARCHAR, 0.5::FLOAT::VARCHAR, (-128.5)::FLOAT::VARCHAR
|
|
----
|
|
2.0
|
|
0.5
|
|
-128.5
|
|
|
|
query TTT
|
|
SELECT 2::DOUBLE::VARCHAR, 0.5::DOUBLE::VARCHAR, (-128.5)::DOUBLE::VARCHAR
|
|
----
|
|
2.0
|
|
0.5
|
|
-128.5
|
|
|
|
query IIIII
|
|
SELECT '0xF'::INTEGER, '0x0'::INTEGER, '0xFEE'::INTEGER, '0xfee'::INTEGER, '0x00FEE'::INTEGER
|
|
----
|
|
15
|
|
0
|
|
4078
|
|
4078
|
|
4078
|
|
|
|
# Empty hex fails
|
|
|
|
statement error
|
|
SELECT '0x'::INT
|
|
----
|
|
|
|
statement error
|
|
SELECT '0X'::INT
|
|
----
|
|
|
|
# Hex with invalid characters fails
|
|
|
|
statement error
|
|
SELECT '0xHELLO'::INT
|
|
----
|
|
|
|
# Overflow with very large numbers
|
|
|
|
statement error
|
|
SELECT '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'::INT
|
|
----
|
|
|
|
# Allowed upper bounds for casting from hex strings to signed integers
|
|
query IIII
|
|
SELECT '0x7F'::TINYINT, '0x7FFF'::SMALLINT, '0x7FFFFFFF'::INT, '0x7FFFFFFFFFFFFFFF'::BIGINT
|
|
----
|
|
127
|
|
32767
|
|
2147483647
|
|
9223372036854775807
|
|
|
|
# Allowed upper bounds for casting from hex strings to unsigned integers
|
|
|
|
query IIII
|
|
SELECT '0xFF'::UINT8, '0xFFFF'::UINT16, '0xFFFFFFFF'::UINT32, '0xFFFFFFFFFFFFFFFF'::UINT64
|
|
----
|
|
255
|
|
65535
|
|
4294967295
|
|
18446744073709551615
|
|
|
|
# Lots of zeros is safe
|
|
|
|
query I
|
|
SELECT '0x000000000000000000000000000000000000000000000000000000000000000000'::INT
|
|
----
|
|
0
|
|
|
|
# Bounds exceeded for casting from hex strings to integers
|
|
|
|
statement error
|
|
SELECT '0x80'::TINYINT
|
|
----
|
|
|
|
statement error
|
|
SELECT '0x8000'::SMALLINT
|
|
----
|
|
|
|
statement error
|
|
SELECT '0x80000000'::INT
|
|
----
|
|
|
|
statement error
|
|
SELECT '0x8000000000000000'::BIGINT
|
|
----
|
|
|
|
statement error
|
|
SELECT '0x100'::UINT8
|
|
----
|
|
|
|
statement error
|
|
SELECT '0x10000'::UINT16
|
|
----
|
|
|
|
statement error
|
|
SELECT '0x100000000'::UINT32
|
|
----
|
|
|
|
statement error
|
|
SELECT '0x10000000000000000'::UINT64
|
|
----
|
|
|
|
# Bounds exceeded for casting from hex strings to integers, TRY_CAST should be safe
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x80' AS TINYINT)
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x8000' AS SMALLINT)
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x80000000' AS INT)
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x8000000000000000' AS BIGINT)
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x100' AS UINT8)
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x10000' AS UINT16)
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x100000000' AS UINT32)
|
|
----
|
|
NULL
|
|
|
|
query I
|
|
SELECT TRY_CAST('0x10000000000000000' AS UINT64)
|
|
----
|
|
NULL
|
|
|
|
# Casting decimal strings to integral types should round to be consistent.
|
|
foreach inttype TINYINT SMALLINT INTEGER BIGINT HUGEINT
|
|
|
|
query I
|
|
SELECT '0.5'::${inttype};
|
|
----
|
|
1
|
|
|
|
query I
|
|
SELECT '-0.5'::${inttype};
|
|
----
|
|
-1
|
|
|
|
endloop
|
|
|
|
# Casting hex strings to integral types should round to be consistent.
|
|
foreach inttype TINYINT SMALLINT INTEGER BIGINT
|
|
|
|
query I
|
|
SELECT '0x1e'::${inttype};
|
|
----
|
|
30
|
|
|
|
endloop
|
|
|
|
# Varied case casting should be consistent
|
|
foreach hex 0xfade 0Xfade 0xFADE 0XFADE 0xFaDe 0xFaDE 0XFaDe 0xfAdE
|
|
|
|
query I
|
|
SELECT '${hex}'::INT;
|
|
----
|
|
64222
|
|
|
|
endloop
|
|
|
|
# Casting zeros
|
|
foreach inttype TINYINT SMALLINT INTEGER BIGINT HUGEINT DECIMAL
|
|
|
|
query I
|
|
SELECT '0'::${inttype};
|
|
----
|
|
0
|
|
|
|
endloop
|
|
|
|
# Casting infinities of various timestamp units
|
|
|
|
foreach ts timestamp timestamp_ms timestamp_ns timestamp_s timestamptz
|
|
|
|
query I
|
|
SELECT ('infinity'::${ts})::VARCHAR
|
|
----
|
|
infinity
|
|
|
|
query I
|
|
SELECT ('-infinity'::${ts})::VARCHAR
|
|
----
|
|
-infinity
|
|
|
|
query I
|
|
SELECT TRY_CAST('infinity' AS ${ts})
|
|
----
|
|
infinity
|
|
|
|
query I
|
|
SELECT TRY_CAST('-infinity' AS ${ts})
|
|
----
|
|
-infinity
|
|
|
|
#ts
|
|
endloop
|