Vous n'êtes pas identifié(e).

#1 Re : Migration » Garder INTEGER comme type boolean » 22/12/2011 12:37:59

Hi tom lane,

j'ai vu ta remarque (http://archives.postgresql.org/pgsql-ge … g00866.php) comme quoi c'est pas bien de modifier les tables internes de postgres, mais avec une conversion implicite à l'assignement faite par update de la table pg_cast, ca me permet d'utiliser false et true sur des integers :

-- http://docs.postgresql.fr/8.4/catalog-pg-cast.html
update pg_cast set castcontext = 'a' where oid in (
select c.oid   
from pg_cast c
inner join pg_type src on src.oid = c.castsource
inner join pg_type tgt on tgt.oid = c.casttarget
where src.typname = 'bool' and tgt.typname = 'int4');

drop table Tutu;
create table Tutu (isNull_ INTEGER);
insert into Tutu  Values(false);

Vais je au devant d'emmerde sans nom ? hmm

#2 Re : Migration » Garder INTEGER comme type boolean » 22/12/2011 11:50:46

@flo
Ceci pose de cout de portage de code.
Tu me diras si le code est bien foutu, ceci devrait être concentré dans certaines classes.

N'y a t il pas un setting de guru dans postgres qui permettrait de impliciter false à 0 et true à 1 ?
Comment fait postgres pour reconnaitre 'y', 'yes', 'true', 't', 1 comme boolean ?
Si il est capable de faire ces cast de façon implicite ... ne pourrait on pas lui dire .. heu non non Mr Postgres,  false, c'est désormais l'entier 1 ?

#3 Re : Migration » Garder INTEGER comme type boolean » 21/12/2011 18:51:54

:'( bouh bouh, va falloir modifier du code pour se connecter à postgresql malgré une compatibilité avec h2/sybase/oracle/sqlserver
NOTE : pour mysql, c'est une autre galère ... sad le sql c'est vraiment pas un standard ...

#4 Migration » Garder INTEGER comme type boolean » 21/12/2011 16:12:25

ofthestreet
Réponses : 15

Pour des raisons de portabilité, j'aimerai conserver integer comme type primitif pour mes booléen.

Je me heurte à des problèmes de cast lors de false ou true. Le code suivant ne marche pas :

drop table Tutu;
create table Tutu (isNull_ INTEGER);
insert into Tutu  Values(false);

ERREUR:  la colonne "isnull_ " est de type integer mais l'expression est de type boolean
LIGNE 1 : insert into Tutu  Values(false);
                                  ^
 ASTUCE : Vous devez réécrire l'expression ou lui appliquer une transformation de type.

il me faut écrire :

drop table Tutu;
create table Tutu (isNull_ INTEGER);
insert into Tutu  Values(cast(false as integer));

Cela m'oblige à modifier le code, ce que j'aimerai éviter.
J'ai essayé les cast lors de l'assignement, sans y arriver :

create cast (boolean as INTEGER) WITH FUNCTION int4(boolean) AS ASSIGNMENT

> ERREUR:  la conversion du type boolean vers le type integer existe déjà

Comment faire pour que false et true soit systématiquement transformé en entier ?
Est il possible de changet le type boolean en entier ?

merci

Pied de page des forums

Propulsé par FluxBB