should be it
This commit is contained in:
260
external/duckdb/test/sql/cast/test_string_cast.test
vendored
Normal file
260
external/duckdb/test/sql/cast/test_string_cast.test
vendored
Normal file
@@ -0,0 +1,260 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user