Mylisz poziomy abstrakcji. Jak już wskazują inne odpowiedzi, CREATE TYPE
rejestruje tylko typ (złożony/wierszowy) w systemie. Podczas gdy ROW
Konstruktor faktycznie zwraca wiersz.
Typ wiersza utworzony za pomocą ROW
Konstruktor nie zachowuje nazw kolumn, co staje się oczywiste, gdy próbujesz przekonwertować wiersz na JSON.
Będąc przy tym, ROW
to tylko hałasowe słowo większość czasu. Dokumentacja:
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
i j1
zachowaj oryginalne nazwy kolumn.r2
i j2
nie.r3
i j3
są takie same; aby zademonstrować, jak ROW
to tylko hałas.r4
i j4
nosić nazwy kolumn zarejestrowanego typu.
Możesz rzutować wiersz (rekord) na zarejestrowany typ wiersza, jeśli liczba i typy danych elementów pasuje do typu wiersza - nazwy pól wejściowych jest ignorowanych.