Arquivos

Arquivo para fevereiro 14, 2008

Conversões implícitas no PostgreSQL (8.3)

fevereiro 14, 2008 1 comentário

Vejam bem, o assunto é polêmico, inconclusivo, recorrente… mas ainda assim vou dar continuidade.

Na versão 8.3 algumas conversões implícitas para o tipo texto foram retiradas à favor de avaliação de expressões envolvendo este tipo um pouco mais confiáveis. Então as expressões:

postgres=# \d foobar
Table “public.foobar”
Column | Type | Modifiers
——–+———+———–
a | integer |
b | text |

SELECT a=b FROM foo;

SELECT substring(9999,2);

[...]

… não devem mais funcionar.

Nosso problema é que a aplicação possuía muitos trechos de código utilizando este tipo de expressão. Ok, falha na aplicação, mas vai explicar isso pro cliente …

Os próximos parágrafos não pretendem de forma alguma discordar das decisões do PGDG em relação à retirada das conversões do núcleo do PostgreSQL e também não são aconselhados em hipótese alguma, salvo a minha situação que era emergencial :-) e decidi compartilhar. Estas medidas devem ser tomadas em caráter paliativo, enquanto a aplicação cliente não é corrigida.

Criando funções internas para as converções:

/* Baseado em $SRC/backend/utils/adt/int.c, int_text */

#include “postgres.h”
#include “fmgr.h”

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(int4_text);
Datum
int4_text(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
text *result = (text *) palloc(12 + VARHDRSZ);
pg_ltoa(arg, VARDATA(result));

SET_VARSIZE(result,strlen(VARDATA(result)) + VARHDRSZ);
PG_RETURN_TEXT_P(result);
}

O código acima deverá gerar um objeto compartilhado e colocado em libdir (pg_config –libdir) do servidor.

Em seguida podemos criar o objeto para gerenciar as conversões:

CREATE OR REPLACE FUNCTION text(int4) RETURNS TEXT AS ‘int4_text’,'int4_text’ LANGUAGE ‘C’;

E depois a conversão propriamente dita:

CREATE CAST(int4 as text) WITH FUNCTION text(int4) AS IMPLICIT;

Testando:

SELECT 1=’1′::text;

?column?
———-
t
(1 row)

#regression: gmake installation check

Pronto, deve ser suficiente para este tipo de conversão funcionar.

Não esqueça que deve ser uma medida paleativa apenas. Existe muito mais por trás de uma conversão do que se pode imaginar. Talvez assunto para um próximo post.

CategoriasNúcleo
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.