PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 14/05/2012 01:58:30

Jiff
Membre

yakekchoz que je ne saisis pas (inserion d'un row)

Debian sid
Pg 9.1+129
=========

Salut forumers,

je ne saisis pas ce qui se passe, d'autant que ça fonctionnait correctement en début d'année (9.0?).

J'ai une table:

CREATE TABLE	common.civility (			
	id	SERIAL		PRIMARY KEY,
	label	DA_LABEL,
	shortcut	DA_LABEL_S,
	front	BOOLEAN	NOT NULL	DEFAULT TRUE
) WITHOUT OIDS;

Le domaine DA_LABEL_S se présente comme suit:
(DA_LABEL d° mais longueur supérieure)

CREATE DOMAIN	DA_LABEL_S AS VARCHAR(6)
	NOT NULL		
	CHECK(char_length(VALUE) > 0);		

Mais lorsque je veux insérer un row n'ayant qu'une seule lettre pour la colonne 'shorcut', je reçois cette erreur:

INSERT INTO common.civility  VALUES (default, 'Monsieur', 'M', TRUE);
ERROR:  value for domain da_label_s violates check constraint "da_label_s_check"

apatoukompri, parce que normalement 'M' a une longueur de 1 qui est donc > 0 (à moins qu'un casting automatique ne transforme 'M' en "char" au lieu de varchar?)

Je suppose que l'interface chaise/clavier est en cause, mais elle a du mal là.

Hors ligne

#2 14/05/2012 09:41:12

rjuju
Administrateur

Re : yakekchoz que je ne saisis pas (inserion d'un row)

Bonjour.
Je viens de tester vos requêtes sur un postgres 9.1.3 et cela fonctionne. La contrainte sur DA_LABEL_S a peut-être été changée entre temps.

Hors ligne

#3 14/05/2012 13:59:49

Jiff
Membre

Re : yakekchoz que je ne saisis pas (inserion d'un row)

Effectivement, en contrôlant le domain, il-y-a un gros PB:

SELECT D.typname as domname, format_type(b.oid,NULL) as dombasetype,
    D.typlen, D.typtypmod, D.typnotnull, D.typdefault, D.typndims, D.typdelim, C.consrc
    FROM pg_type D
    JOIN pg_type B ON B.oid = CASE WHEN B.typndims > 0 then D.typelem ELSE D.typbasetype END
    JOIN pg_namespace N ON N.oid = B.typnamespace
    JOIN pg_constraint C ON (D.typname || '_check') = C.conname
    WHERE D.typtype = 'd' AND D.typnamespace = 2200::oid
    ORDER BY D.typname;

da_label_s   | character varying |   -1 |     20 | t       |                 |        0 | ,      | (char_length((VALUE)::text) > 1)

Alors que ça devrait être >0.

Etant donné que justement le source est dans un tableur pour éviter toute redondance, après grattage j'ai droit au tirage: un typo a fait que 3 lignes plus bas le domain DA_LABEL_M se nomme aussi DA_LABEL_S (et lui, il compare >1).

Désolé pour le bruit et merci.

Hors ligne

Pied de page des forums