Du forvirrer abstraktionsniveauer. Som andre svar allerede påpeger, CREATE TYPE registrerer kun en (sammensat / række) type i systemet. Mens en ROW konstruktør returnerer faktisk en række.
En rækketype oprettet med ROW constructor bevarer ikke kolonnenavne, hvilket bliver tydeligt, når du forsøger at konvertere rækken til JSON.
Mens du er i gang, ROW er bare et støjord det meste af tiden. Dokumentationen:
Demo:
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 og j1 bevar originale kolonnenavne.r2 og j2 ikke.r3 og j3 er det samme; for at demonstrere hvordan ROW er bare støj.r4 og j4 bære kolonnenavnene af den registrerede type.
Du kan caste rækken (record) til en registreret rækketype hvis nummer og datatyper af elementerne matcher rækketypen - navne af inputfelter ignoreres.