PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Crie um clone imutável de concat_ws


Primeiro , a função requer dois parâmetros na definição, como Richard já sugeriu, e você atualizou sua pergunta de acordo.

Segundo , você pode criar essa função com "any" entrada usando LANGUAGE internal . Não significa que você deve, no entanto.

concat_ws() é apenas STABLE por uma razão. Entre outros, a representação de texto de date ou timestamp depende das configurações de localidade/estilo de data, então o resultado não é imutável . Índices baseados nisso podem quebrar silenciosamente. Restrito a text input, é seguro declará-lo IMMUTABLE .Como você só precisa de text entrada (ou varchar , que tem uma conversão implícita para text ), limite-o ao seu caso de uso e fique seguro:
CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text AS 'text_concat_ws' LANGUAGE internal IMMUTABLE PARALLEL SAFE;

Marque-o como PARALLEL SAFE para não estragar o paralelismo ao envolver esta função. O manual:

Resista à tentação de fazer coisas como esta immutable_concat_ws('|', now()::text, 'foo') . Isso reintroduziria essas dependências na chamada.

Relacionado: