Det finns tre typer av gjutning. Den registrerade skådespelaren för din källa och måltyp måste vara "tilldelning" (a ) eller "implicit" (i ) för att arbeta i VALUES uttryck för en INSERT påstående. Tittar på systemkatalogen pg_cast
, skådespelaren från boolean till integer är bara definierad som "explicit" (e ) :
SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM pg_cast
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Resultat:
castsource casttarget castfunc castcontext
boolean integer pg_catalog.int4 e
Relaterat:
Du måste ändra castcontext för att få det att fungera - vilket du kan gör som superanvändare. Det finns ingen "ALTER CAST"-sats för denna exotiska manöver, du måste UPDATE direkt. Gilla:
UPDATE pg_cast
SET castcontext = 'a'
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Men , det finns goda skäl för det fördefinierade castkontexten för varje cast. Att manipulera med systemkataloger är inte något du bör göra lättvindigt. I det här speciella fallet kan det obalans i beslutsfattandet när Postgres måste välja en matchande roll. Som för att välja från en uppsättning överbelastade funktioner ...
Liknande procedur för integer -> boolean , int2 -> boolean , boolean -> int2 osv.