getTypeIOParam is wrong for domains over array types? - Mailing list pgsql-hackers

From Tom Lane
Subject getTypeIOParam is wrong for domains over array types?
Date
Msg-id 5963.1174317235@sss.pgh.pa.us
Whole thread Raw
Responses Re: getTypeIOParam is wrong for domains over array types?  ("Merlin Moncure" <mmoncure@gmail.com>)
List pgsql-hackers
In lsyscache.c we have
   /*    * Array types get their typelem as parameter; everybody else gets their    * own type OID as parameter.  (This
isa 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


pgsql-hackers by date:

Previous
From: Heikki Linnakangas
Date:
Subject: Re: CREATE INDEX and HOT (was Question:pg_classattributes and race conditions ?)
Next
From: "Merlin Moncure"
Date:
Subject: Re: CREATE INDEX and HOT (was Question: pg_classattributes and race conditions ?)