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.