Início > Núcleo > Conversões implícitas no PostgreSQL (8.3)

Conversões implícitas no PostgreSQL (8.3)

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.

Anúncios
Categorias:Núcleo
  1. Nenhum comentário ainda.
  1. dezembro 14, 2009 às 7:27 pm

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: