Je verwart niveaus van abstractie. Zoals andere antwoorden al aangeven, CREATE TYPE registreert alleen een (samengesteld / rij) type in het systeem. Terwijl een ROW constructor retourneert eigenlijk een rij.
Een rijtype gemaakt met de ROW constructor bewaart geen kolomnamen, wat duidelijk wordt wanneer u de rij naar JSON probeert te converteren.
Terwijl je toch bezig bent, ROW is slechts een ruiswoord meestal. De documentatie:
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 en j1 originele kolomnamen behouden.r2 en j2 niet doen.r3 en j3 zijn hetzelfde; om te demonstreren hoe ROW is gewoon ruis.r4 en j4 dragen de kolomnamen van het geregistreerde type.
U kunt de rij (record) casten naar een geregistreerd rijtype als nummer en gegevenstypen van de elementen komt overeen met het rijtype - namen invoervelden worden genegeerd.