Бъркате нивата на абстракция. Както вече посочват други отговори, CREATE TYPE регистрира само тип (съставен / ред) в системата. Докато ROW конструкторът всъщност връща ред.
Тип ред, създаден с ROW конструкторът не запазва имена на колони, което става очевидно, когато се опитате да конвертирате реда в JSON.
Докато сте там, ROW е просто шумна дума през повечето време. Документацията:
Демо:
SELECT t AS r1, row_to_json(t) AS j1
, ROW(1, 'x', NUMERIC '42.1') AS r2, row_to_json(ROW(1, 'x', NUMERIC '42.1')) AS j2
, (1, 'x', NUMERIC '42.1') AS r3, row_to_json( (1, 'x', NUMERIC '42.1')) AS j3
, (1, 'x', '42.1')::myrowtype AS r4, row_to_json((1, 'x', '42.1')::myrowtype) AS j4
FROM (SELECT 1, 'x', NUMERIC '42.1') t;
r1 и j1 запазва оригиналните имена на колони.r2 и j2 недей.r3 и j3 са същите; за да демонстрирате как ROW е просто шум.r4 и j4 носят имената на колоните от регистрирания тип.
Можете да прехвърлите реда (записа) към регистриран тип ред, ако номер и типове данни от елементите съответстват на типа ред - имена от полетата за въвеждане се игнорират.