From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | pgsql-hackers(at)postgreSQL(dot)org |
Subject: | getTypeIOParam is wrong for domains over array types? |
Date: | 2007-03-19 15:13:55 |
Message-ID: | 5963.1174317235@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
In lsyscache.c we have
/*
* Array types get their typelem as parameter; everybody else gets their
* own type OID as parameter. (This is a change from 8.0, in which only
* composite types got their own OID as parameter.)
*/
if (OidIsValid(typeStruct->typelem))
return typeStruct->typelem;
else
return HeapTupleGetOid(typeTuple);
but it turns out that a domain over an array type has typelem set, and
so domain_in gets passed the element type instead of the domain's own
OID, leading to this misbehavior reported by Anton Pikhteryev:
regression=# create domain ddd as name;
CREATE DOMAIN
regression=# create table foot(f1 ddd);
CREATE TABLE
regression=# copy foot from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> dd
>> \.
ERROR: type "char" is not a domain
CONTEXT: COPY foot, line 1, column f1: "dd"
This failure is new in 8.2 --- in prior releases domain_in didn't exist
and it was correct, indeed necessary, for domains to get exactly the
same typioparam as their underlying type.
I think probably the right solution is to adjust getTypeIOParam so that
it only examines typelem for base types (typtype = 'b'). Can anyone
see a downside to that?
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Merlin Moncure | 2007-03-19 15:29:56 | Re: CREATE INDEX and HOT (was Question: pg_classattributes and race conditions ?) |
Previous Message | Heikki Linnakangas | 2007-03-19 14:49:49 | Re: CREATE INDEX and HOT (was Question:pg_classattributes and race conditions ?) |