Som @a_horse_with_no_name redan har sagt:Funktionen unnest() plattar inte bara ut den första dimensionen utan alla kapslade element. Så det skapar en rad per heltal. Det resulterar naturligtvis i en kolumn med (i ditt fall) sex värden. Detta är vad undantagsmeddelandet betyder:Du genererar en kolumn men tre förväntades.
Så, du behöver en lösning för att avvärja endast den första dimensionen. Jag använder lösningarna som presenteras här :
- https://stackoverflow.com/a/8142998/3984221 från @LukasEklund och @ErwinBrandstetter
Skapar Lukas funktion:
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;
Den här löser bara den första dimensionen. Så du kan använda det istället för ditt unnest()-försök inom din funktion:
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;
$$;