PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Créer un clone immuable de concat_ws

Premier , la fonction nécessite deux paramètres dans la définition, comme Richard l'a déjà suggéré, et vous avez mis à jour votre question en conséquence.

Deuxième , vous pouvez créer cette fonction avec "any" saisie en utilisant LANGUAGE internal . Cela ne signifie pas pour autant que vous devriez le faire.

concat_ws() est seulement STABLE pour une raison. Entre autres, la représentation textuelle de date ou timestamp dépend des paramètres régionaux / datestyle, donc le résultat n'est pas immuable . Les index qui s'appuient sur cela pourraient se casser en silence. Limité au text input, il est sûr de le déclarer IMMUTABLE .Puisque vous n'avez besoin que de text input (ou varchar , qui a un transtypage implicite en text ), limitez-le à votre cas d'utilisation et soyez prudent :

CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text AS 'text_concat_ws' LANGUAGE internal IMMUTABLE PARALLEL SAFE;

Marquez-le comme PARALLEL SAFE pour ne pas gâcher le parallélisme lors de l'implication de cette fonction. Le manuel :

Résistez à la tentation de faire des choses comme ça immutable_concat_ws('|', now()::text, 'foo') . Cela réintroduirait lesdites dépendances dans l'appel.

Connexe :