Como @a_horse_with_no_name já afirmou:A função unnest() nivela não apenas a primeira dimensão, mas todos os elementos aninhados. Então, ele cria uma linha por inteiro. Isso, é claro, resulta em uma coluna com (no seu caso) seis valores. Isto é o que a mensagem de exceção significa:Você gera uma coluna, mas três eram esperadas.
Portanto, você precisa de uma solução para desaninhar apenas a primeira dimensão. Estou usando as soluções apresentadas aqui :
- https://stackoverflow.com/a/8142998/3984221 de @LukasEklund e @ErwinBrandstetter
demo:db<>fiddle
Criando a função do 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;
Este está desaninhando apenas a primeira dimensão. Então você pode usá-lo em vez de seu unnest() try dentro de sua função:
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;
$$;