Comme @a_horse_with_no_name l'a déjà indiqué :la fonction unnest() aplatit non seulement la première dimension, mais tous les éléments imbriqués. Il crée donc une ligne par entier. Cela se traduit bien sûr par une colonne avec (dans votre cas) six valeurs. Voici ce que signifie le message d'exception :vous générez une colonne, mais trois étaient attendues.
Vous avez donc besoin d'une solution pour désimbriquer uniquement la première dimension. J'utilise les solutions présentées ici :
- https://stackoverflow.com/a/8142998/3984221 de @LukasEklund et @ErwinBrandstetter
Création de la fonction de 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;
Celui-ci désimbrique uniquement la première dimension. Vous pouvez donc l'utiliser à la place de votre essai unnest() dans votre fonction :
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;
$$;