Il existe trois types de casting. Le casting enregistré pour votre source et votre type de cible doit être "assignation" (a
) ou "implicite" (i
) pour travailler dans les VALUES
expression d'un INSERT
déclaration. En regardant le catalogue système pg_cast
, le cast de boolean
en integer
est uniquement défini "explicit" (e
) :
SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM pg_cast
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Résultat :
castsource casttarget castfunc castcontext
boolean integer pg_catalog.int4 e
Connexe :
Vous auriez à changer castcontext
pour le faire fonctionner - ce que vous pouvez faire en tant que superutilisateur. Il n'y a pas d'instruction "ALTER CAST" pour cette manœuvre exotique, vous devriez UPDATE
directement. Comme :
UPDATE pg_cast
SET castcontext = 'a'
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Cependant , il y a de bonnes raisons pour le contexte de cast prédéfini de chaque cast. La falsification des catalogues système n'est pas quelque chose que vous devez faire à la légère. Dans ce cas particulier, cela peut déséquilibrer la prise de décision lorsque Postgres doit choisir un casting correspondant. Comme pour piocher dans un ensemble de fonctions surchargées...
Procédure similaire pour integer -> boolean
, int2 -> boolean
, boolean -> int2
, etc.