From: Tom Lane Date: Mon, 19 Mar 2007 16:30:32 +0000 (+0000) Subject: Fix 8.2 breakage of domains over array types, and add a regression test case X-Git-Tag: REL8_3_BETA1~1020 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9bc933b2125a5358722490acbc50889887bf7680;p=postgresql Fix 8.2 breakage of domains over array types, and add a regression test case to cover it. Per report from Anton Pikhteryev. --- diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 6df288da45..69f1e0c242 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.149 2007/03/17 00:11:05 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.150 2007/03/19 16:30:31 tgl Exp $ * * NOTES * Eventually, the index information should go through here, too. @@ -1767,10 +1767,10 @@ getTypeIOParam(HeapTuple typeTuple) /* * 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.) + * own type OID as parameter. (As of 8.2, domains must get their own OID + * even if their base type is an array.) */ - if (OidIsValid(typeStruct->typelem)) + if (typeStruct->typtype == 'b' && OidIsValid(typeStruct->typelem)) return typeStruct->typelem; else return HeapTupleGetOid(typeTuple); diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 4acaaa4121..e01fc7cadc 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -15,7 +15,9 @@ NOTICE: drop cascades to type dependenttypetest -- this should fail because already gone drop domain domaindroptest cascade; ERROR: type "domaindroptest" does not exist --- TEST Domains. +-- Test domain input. +-- Note: the point of checking both INSERT and COPY FROM is that INSERT +-- exercises CoerceToDomain while COPY exercises domain_in. create domain domainvarchar varchar(5); create domain domainnumeric numeric(8,2); create domain domainint4 int4; @@ -72,20 +74,22 @@ drop domain domainvarchar restrict; drop domain domainnumeric restrict; drop domain domainint4 restrict; drop domain domaintext; --- Array Test +-- Test domains over array types create domain domainint4arr int4[1]; -create domain domaintextarr text[2][3]; +create domain domainchar4arr varchar(4)[2][3]; create table domarrtest ( testint4arr domainint4arr - , testtextarr domaintextarr + , testchar4arr domainchar4arr ); INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"}}'); INSERT INTO domarrtest values ('{{2,2},{2,2}}', '{{"a","b"}}'); INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}'); INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}'); INSERT INTO domarrtest values (NULL, '{{"a","b","c"},{"d","e","f"}}'); +INSERT INTO domarrtest values (NULL, '{{"toolong","b","c"},{"d","e","f"}}'); +ERROR: value too long for type character varying(4) select * from domarrtest; - testint4arr | testtextarr + testint4arr | testchar4arr ---------------+--------------------- {2,2} | {{a,b},{c,d}} {{2,2},{2,2}} | {{a,b}} @@ -94,9 +98,9 @@ select * from domarrtest; | {{a,b,c},{d,e,f}} (5 rows) -select testint4arr[1], testtextarr[2:2] from domarrtest; - testint4arr | testtextarr --------------+------------- +select testint4arr[1], testchar4arr[2:2] from domarrtest; + testint4arr | testchar4arr +-------------+-------------- 2 | {{c,d}} | {} 2 | {{c,d}} @@ -104,9 +108,25 @@ select testint4arr[1], testtextarr[2:2] from domarrtest; | {{d,e,f}} (5 rows) +COPY domarrtest FROM stdin; +COPY domarrtest FROM stdin; -- fail +ERROR: value too long for type character varying(4) +CONTEXT: COPY domarrtest, line 1, column testchar4arr: "{qwerty,w,e}" +select * from domarrtest; + testint4arr | testchar4arr +---------------+--------------------- + {2,2} | {{a,b},{c,d}} + {{2,2},{2,2}} | {{a,b}} + {2,2} | {{a,b},{c,d},{e,f}} + {2,2} | {{a},{c}} + | {{a,b,c},{d,e,f}} + {3,4} | {q,w,e} + | +(7 rows) + drop table domarrtest; drop domain domainint4arr restrict; -drop domain domaintextarr restrict; +drop domain domainchar4arr restrict; create domain dnotnull varchar(15) NOT NULL; create domain dnull varchar(15); create domain dcheck varchar(15) NOT NULL CHECK (VALUE = 'a' OR VALUE = 'c' OR VALUE = 'd'); diff --git a/src/test/regress/sql/domain.sql b/src/test/regress/sql/domain.sql index 411d64648a..4e103172ed 100644 --- a/src/test/regress/sql/domain.sql +++ b/src/test/regress/sql/domain.sql @@ -17,7 +17,10 @@ drop domain domaindroptest cascade; drop domain domaindroptest cascade; --- TEST Domains. +-- Test domain input. + +-- Note: the point of checking both INSERT and COPY FROM is that INSERT +-- exercises CoerceToDomain while COPY exercises domain_in. create domain domainvarchar varchar(5); create domain domainnumeric numeric(8,2); @@ -62,25 +65,38 @@ drop domain domainint4 restrict; drop domain domaintext; --- Array Test +-- Test domains over array types + create domain domainint4arr int4[1]; -create domain domaintextarr text[2][3]; +create domain domainchar4arr varchar(4)[2][3]; create table domarrtest ( testint4arr domainint4arr - , testtextarr domaintextarr + , testchar4arr domainchar4arr ); INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"}}'); INSERT INTO domarrtest values ('{{2,2},{2,2}}', '{{"a","b"}}'); INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}'); INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}'); INSERT INTO domarrtest values (NULL, '{{"a","b","c"},{"d","e","f"}}'); +INSERT INTO domarrtest values (NULL, '{{"toolong","b","c"},{"d","e","f"}}'); +select * from domarrtest; +select testint4arr[1], testchar4arr[2:2] from domarrtest; + +COPY domarrtest FROM stdin; +{3,4} {q,w,e} +\N \N +\. + +COPY domarrtest FROM stdin; -- fail +{3,4} {qwerty,w,e} +\. + select * from domarrtest; -select testint4arr[1], testtextarr[2:2] from domarrtest; drop table domarrtest; drop domain domainint4arr restrict; -drop domain domaintextarr restrict; +drop domain domainchar4arr restrict; create domain dnotnull varchar(15) NOT NULL;