# 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