Estás confundiendo los niveles de abstracción. Como ya señalan otras respuestas, CREATE TYPE
solo registra un tipo (compuesto/fila) en el sistema. Mientras que una ROW
constructor en realidad devuelve una fila.
Un tipo de fila creado con ROW
El constructor no conserva los nombres de las columnas, lo que se vuelve evidente cuando intenta convertir la fila a JSON.
Mientras estás en eso, ROW
es solo una palabra de ruido la mayor parte del tiempo La documentación:
Demostración:
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
y j1
conservar los nombres de las columnas originales.r2
y j2
no.r3
y j3
son lo mismo; para demostrar cómo ROW
es solo ruido.r4
y j4
llevan los nombres de columna del tipo registrado.
Puede convertir la fila (registro) en un tipo de fila registrado si número y tipos de datos de los elementos coinciden con el tipo de fila - nombres de los campos de entrada se ignoran.