Pletete si úrovně abstrakce. Jak již zdůrazňují jiné odpovědi, CREATE TYPE
registruje v systému pouze typ (složený / řádek). Zatímco ROW
konstruktor ve skutečnosti vrací řádek.
Typ řádku vytvořený pomocí ROW
konstruktor nezachovává názvy sloupců, což se projeví, když se pokusíte převést řádek na JSON.
Během toho ROW
je jen hlučné slovo většinu času. Dokumentace:
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
a j1
zachovat původní názvy sloupců.r2
a j2
ne.r3
a j3
jsou stejní; ukázat, jak ROW
je jen šum.r4
a j4
nesou názvy sloupců registrovaného typu.
Řádek (záznam) můžete přetypovat na registrovaný typ řádku, pokud číslo a datové typy prvků odpovídá typu řádku - názvy vstupních polí jsou ignorována.