Existují tři typy obsazení. Registrované obsazení pro váš zdroj a cílový typ musí být "přiřazení" (a
) nebo "implicitní" (i
) pracovat v VALUES
výraz INSERT
tvrzení. Při pohledu na systémový katalog pg_cast
, obsazení z boolean
na integer
je definován pouze "explicitní" (e
) :
SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM pg_cast
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Výsledek:
castsource casttarget castfunc castcontext
boolean integer pg_catalog.int4 e
Související:
Museli byste změnit castcontext
aby to fungovalo – což můžete dělat jako superuživatel. Pro tento exotický manévr neexistuje žádné prohlášení „ALTER CAST“, budete muset UPDATE
přímo. Jako:
UPDATE pg_cast
SET castcontext = 'a'
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Nicméně , existují dobré důvody pro předdefinovaný kontext obsazení každého obsazení. Manipulace se systémovými katalogy není něco, co byste měli dělat na lehkou váhu. V tomto konkrétním případě to může způsobit nerovnováhu při rozhodování, když Postgres musí vybrat odpovídající obsazení. Jako pro vybírání ze sady přetížených funkcí ...
Podobný postup pro integer -> boolean
, int2 -> boolean
, boolean -> int2
, atd.