# name: test/common/test_cast_struct.test # description: Test casting structs # group: [common] statement ok PRAGMA enable_verification statement error SELECT struct_pack(b => 42)::STRUCT(a INT); ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* statement error SELECT struct_extract(struct_pack(b => 42)::STRUCT(a INT), 'a'); ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* query I SELECT struct_extract(struct_pack(a => 42)::STRUCT(a STRING), 'a'); ---- 42 statement error SELECT struct_extract(struct_pack(b => 42)::ROW(a INT), 'a'); ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* query I SELECT struct_extract(struct_pack(a => 42)::ROW(a INT), 'a'); ---- 42 statement error SELECT struct_extract(struct_pack(b => 42::DOUBLE)::STRUCT(a INT), 'a'); ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* query I SELECT struct_extract(struct_pack(a => 42::DOUBLE)::STRUCT(a INT), 'a'); ---- 42 statement error SELECT struct_extract(struct_pack(b => '42'::DOUBLE)::STRUCT(a INT), 'a'); ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* query I SELECT struct_extract(struct_pack(a => '42'::DOUBLE)::STRUCT(a INT), 'a'); ---- 42 statement error SELECT struct_pack(b => '42'::DOUBLE)::STRUCT(a INT, c STRING) ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* statement error SELECT struct_pack(b => 'hello'::STRING)::STRUCT(b INT) ---- Could not convert string 'hello' to INT32 statement error SELECT struct_pack(a => 'hello'::STRING, b => 'world'::STRING)::STRUCT(a STRING, b INT) ---- Could not convert string 'world' to INT32 statement error SELECT struct_pack(a => [1, 2, 3])::STRUCT(a INT) ---- Unimplemented type for cast (INTEGER[] -> INTEGER) statement error SELECT struct_pack(a => struct_pack(b => 42)::STRUCT(b INT))::STRUCT(a INT) ---- Unimplemented type for cast (STRUCT(b INTEGER) -> INTEGER) statement error SELECT struct_pack(b => 'hello'::STRING)::STRUCT(a INT) ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* statement error SELECT struct_pack(b => '42'::DOUBLE, c => 'asdf'::STRING)::STRUCT(a1 INT, a2 STRING); ---- :Binder Error.*STRUCT to STRUCT cast must have at least one matching member.* query I SELECT struct_pack(a1 => '42'::DOUBLE, a2 => 'asdf'::STRING)::STRUCT(a1 INT, a2 STRING); ---- {'a1': 42, 'a2': asdf} query I SELECT ROW(42, 'asdf'); ---- (42, asdf) statement error SELECT ROW(); ---- pack nothing into a struct query I SELECT ROW(NULL); ---- (NULL) query I SELECT ROW(NULL, NULL); ---- (NULL, NULL) # MB example query I SELECT CAST(ROW(1, 2) AS ROW(a INTEGER, b INTEGER)) ---- {'a': 1, 'b': 2} query I SELECT a::ROW(a INT, b STRING) r FROM (VALUES (ROW(1, 'asdf')), (ROW(4, 'fdsa'))) s(a); ---- {'a': 1, 'b': asdf} {'a': 4, 'b': fdsa} statement error SELECT struct_extract({'a': a}, a) FROM (SELECT a::VARCHAR AS a FROM range(10) tbl(a)); ---- :.*Binder Error.*Key name for struct_extract needs to be a constant string.* statement error SELECT struct_extract({'a': 42}, 42) ---- :.*Binder Error.*can only be used on unnamed structs.* query I SELECT struct_extract_at({'a': 42}, 1) ---- 42 statement error SELECT struct_extract_at({'a': 42}, 0) ---- :.*Binder Error.*out of range.* statement error SELECT struct_extract_at({'a': 42}, 42) ---- :.*Binder Error.*out of range.* # Test string to struct cast within struct casting. query I SELECT {a: {b: '{a: 3, b: "Hello World"}'}}::STRUCT(a STRUCT(b STRUCT(a INT, b VARCHAR))); ---- {'a': {'b': {'a': 3, 'b': Hello World}}} # Test if try_cast continues after encountering error. query I SELECT TRY_CAST(struct_pack(a => 4, b => 'Ducky', c => '1964-06-15') AS STRUCT(a INT, b DOUBLE, c DATE)); ---- {'a': 4, 'b': NULL, 'c': 1964-06-15} query I SELECT TRY_CAST(struct_pack(a => 4, b => 'Ducky', c => 'Tommorow', d => {a:3.0}) AS STRUCT(a VARCHAR[], b VARCHAR, c DATE, d STRUCT(a INT))); ---- {'a': NULL, 'b': Ducky, 'c': NULL, 'd': {'a': 3}}