PostgreSQL - INSERTAR una matriz de tipo compuesto que contiene matrices

Tengo un tipo compuesto que contiene matrices de TEXTO, etc. Lo estoy usando dentro de mi tabla principal para crear una matriz de tipo compuesto.
¿Cómo genero un comando INSERT (sin usar los nombres de campo predeterminados del tipo compuesto)? ¿Puedo crear una TABLA TEMPORAL con la matriz de compuestos y luego insertarla en la tabla principal?

Por ejemplo:

DROP TABLE collection;
DROP TABLE book_set;
DROP TYPE book;

CREATE TYPE book AS ( title TEXT, authors TEXT[], extra_spare TEXT );
CREATE TEMPORARY TABLE book_set ( books book[] );
CREATE TABLE shelf_collection ( shelf INT, position INT, books book[] );

-- Prefer to specify the fields I want, and NOT extra_spare as shown here!
-- AND it doesn't yet work... needs more casting?
INSERT INTO book_set( books ) VALUES (
      ( 'book1', array[ ( 'author1', 'author2' ) ], '' ),
      ( 'book2', array[ ( 'author3' )            ], '' ) ); 

-- And this obviously does not work yet!
INSERT INTO shelf_collection( shelf, position, books ) VALUES ( 1, 2, book_set ); 

El primer INSERT falla con el mensaje:

ERROR: INSERT tiene más expresiones que columnas objetivo.

Falla lo mismo con o sin array [] construcción.

Mi uso en el mundo real es significativamente más complejo, ya que el compuesto contiene otros compuestos y muchos campos.

No estoy usando varias tablas aquí por razones de rendimiento (no se requiere una unión para recuperar), y los compuestos y matrices internos nunca se referencian de forma independiente.

estoy usandoperl(5.14.2) yDBI(1.616) ypsql(9.1.7).

MÁS INFORMACIÓN:

Lo siguiente funciona, pero ¿cómo lo cambio para que no tenga que especificar TODOS los campos del libro?

DROP TABLE shelf_collection;
DROP TYPE book;

CREATE TYPE  book AS          ( title TEXT, authors TEXT[], extra_spare TEXT );
CREATE TABLE shelf_collection ( shelf INT, position INT, books book[] );

INSERT INTO shelf_collection VALUES ( 12, 23, array[ROW( 'book title 1', array[ 'author1', 'author2' ], '' )::book] );

SELECT * FROM shelf_collection;

Respuestas a la pregunta(1)

Su respuesta a la pregunta