Existem três tipos de elenco. O cast registrado para seu tipo de destino de origem deve ser "atribuição" (
a
) ou "implícito" (i
) para trabalhar em VALUES
expressão de um INSERT
declaração. Examinando o catálogo do sistema pg_cast
, a conversão de boolean
para integer
é definido apenas "explícito" (e
) :SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM pg_cast
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
Resultado:
castsource casttarget castfunc castcontext
boolean integer pg_catalog.int4 e
Relacionado:
Você teria que alterar
castcontext
para fazê-lo funcionar - o que você pode faça como superusuário. Não há instrução "ALTER CAST" para esta manobra exótica, você teria que UPDATE
diretamente. Curti:UPDATE pg_cast
SET castcontext = 'a'
WHERE castsource = 'bool'::regtype
AND casttarget = 'int'::regtype;
No entanto , há boas razões para o contexto de conversão predefinido de cada conversão. Adulterar os catálogos do sistema não é algo que você deve fazer de ânimo leve. Neste caso em particular, pode desequilibrar a tomada de decisão quando o Postgres tem que escolher um elenco correspondente. Como para escolher de um conjunto de funções sobrecarregadas ...
Procedimento semelhante para
integer -> boolean
, int2 -> boolean
, boolean -> int2
, etc