getTypeIOParam is wrong for domains over array types?
От | Tom Lane |
---|---|
Тема | getTypeIOParam is wrong for domains over array types? |
Дата | |
Msg-id | 5963.1174317235@sss.pgh.pa.us обсуждение исходный текст |
Ответы |
Re: getTypeIOParam is wrong for domains over array types?
|
Список | 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 по дате отправления: