Come già affermato da @a_horse_with_no_name:la funzione unnest() appiattisce non solo la prima dimensione ma tutti gli elementi nidificati. Quindi crea una riga per intero. Ciò ovviamente si traduce in una colonna con (nel tuo caso) sei valori. Questo è il significato del messaggio di eccezione:hai generato una colonna ma ne erano previste tre.
Quindi, hai bisogno di una soluzione per disnidificare solo la prima dimensione. Sto utilizzando le soluzioni presentate qui :
- https://stackoverflow.com/a/8142998/3984221 da @LukasEklund e @ErwinBrandstetter
Creazione della funzione di Lukas:
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM generate_subscripts($1,1) d1
, generate_subscripts($1,2) d2
GROUP BY d1
ORDER BY d1
$func$ LANGUAGE sql IMMUTABLE;
Questo sta snidando solo la prima dimensione. Quindi puoi usarlo al posto del tuo unnest() try all'interno della tua funzione:
CREATE OR REPLACE function create_combinations_if_needed(p_combinations integer[][]) RETURNS boolean
LANGUAGE sql AS
$$
INSERT INTO combinations (some_id1, some_id2, some_id3)
SELECT unnest[1], unnest[2], unnest[3]
FROM unnest_2d_1d(p_combinations) as unnest
ON CONFLICT (some_id1, some_id2, some_id3)
DO NOTHING
RETURNING TRUE;
$$;