mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Fix 8.2 breakage of domains over array types, and add a regression test case
to cover it. Per report from Anton Pikhteryev.
This commit is contained in:
8
src/backend/utils/cache/lsyscache.c
vendored
8
src/backend/utils/cache/lsyscache.c
vendored
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.138 2006/10/04 00:30:00 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.138.2.1 2007/03/19 16:30:40 tgl Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* Eventually, the index information should go through here, too.
|
* Eventually, the index information should go through here, too.
|
||||||
@ -1366,10 +1366,10 @@ getTypeIOParam(HeapTuple typeTuple)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Array types get their typelem as parameter; everybody else gets their
|
* 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
|
* own type OID as parameter. (As of 8.2, domains must get their own OID
|
||||||
* composite types got their own OID as parameter.)
|
* even if their base type is an array.)
|
||||||
*/
|
*/
|
||||||
if (OidIsValid(typeStruct->typelem))
|
if (typeStruct->typtype == 'b' && OidIsValid(typeStruct->typelem))
|
||||||
return typeStruct->typelem;
|
return typeStruct->typelem;
|
||||||
else
|
else
|
||||||
return HeapTupleGetOid(typeTuple);
|
return HeapTupleGetOid(typeTuple);
|
||||||
|
@ -15,7 +15,9 @@ NOTICE: drop cascades to type dependenttypetest
|
|||||||
-- this should fail because already gone
|
-- this should fail because already gone
|
||||||
drop domain domaindroptest cascade;
|
drop domain domaindroptest cascade;
|
||||||
ERROR: type "domaindroptest" does not exist
|
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 domainvarchar varchar(5);
|
||||||
create domain domainnumeric numeric(8,2);
|
create domain domainnumeric numeric(8,2);
|
||||||
create domain domainint4 int4;
|
create domain domainint4 int4;
|
||||||
@ -72,20 +74,22 @@ drop domain domainvarchar restrict;
|
|||||||
drop domain domainnumeric restrict;
|
drop domain domainnumeric restrict;
|
||||||
drop domain domainint4 restrict;
|
drop domain domainint4 restrict;
|
||||||
drop domain domaintext;
|
drop domain domaintext;
|
||||||
-- Array Test
|
-- Test domains over array types
|
||||||
create domain domainint4arr int4[1];
|
create domain domainint4arr int4[1];
|
||||||
create domain domaintextarr text[2][3];
|
create domain domainchar4arr varchar(4)[2][3];
|
||||||
create table domarrtest
|
create table domarrtest
|
||||||
( testint4arr domainint4arr
|
( testint4arr domainint4arr
|
||||||
, testtextarr domaintextarr
|
, testchar4arr domainchar4arr
|
||||||
);
|
);
|
||||||
INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"}}');
|
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},{2,2}}', '{{"a","b"}}');
|
||||||
INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}');
|
INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}');
|
||||||
INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}');
|
INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}');
|
||||||
INSERT INTO domarrtest values (NULL, '{{"a","b","c"},{"d","e","f"}}');
|
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;
|
select * from domarrtest;
|
||||||
testint4arr | testtextarr
|
testint4arr | testchar4arr
|
||||||
---------------+---------------------
|
---------------+---------------------
|
||||||
{2,2} | {{a,b},{c,d}}
|
{2,2} | {{a,b},{c,d}}
|
||||||
{{2,2},{2,2}} | {{a,b}}
|
{{2,2},{2,2}} | {{a,b}}
|
||||||
@ -94,9 +98,9 @@ select * from domarrtest;
|
|||||||
| {{a,b,c},{d,e,f}}
|
| {{a,b,c},{d,e,f}}
|
||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
select testint4arr[1], testtextarr[2:2] from domarrtest;
|
select testint4arr[1], testchar4arr[2:2] from domarrtest;
|
||||||
testint4arr | testtextarr
|
testint4arr | testchar4arr
|
||||||
-------------+-------------
|
-------------+--------------
|
||||||
2 | {{c,d}}
|
2 | {{c,d}}
|
||||||
| {}
|
| {}
|
||||||
2 | {{c,d}}
|
2 | {{c,d}}
|
||||||
@ -104,9 +108,25 @@ select testint4arr[1], testtextarr[2:2] from domarrtest;
|
|||||||
| {{d,e,f}}
|
| {{d,e,f}}
|
||||||
(5 rows)
|
(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 table domarrtest;
|
||||||
drop domain domainint4arr restrict;
|
drop domain domainint4arr restrict;
|
||||||
drop domain domaintextarr restrict;
|
drop domain domainchar4arr restrict;
|
||||||
create domain dnotnull varchar(15) NOT NULL;
|
create domain dnotnull varchar(15) NOT NULL;
|
||||||
create domain dnull varchar(15);
|
create domain dnull varchar(15);
|
||||||
create domain dcheck varchar(15) NOT NULL CHECK (VALUE = 'a' OR VALUE = 'c' OR VALUE = 'd');
|
create domain dcheck varchar(15) NOT NULL CHECK (VALUE = 'a' OR VALUE = 'c' OR VALUE = 'd');
|
||||||
|
@ -17,7 +17,10 @@ drop domain domaindroptest cascade;
|
|||||||
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 domainvarchar varchar(5);
|
||||||
create domain domainnumeric numeric(8,2);
|
create domain domainnumeric numeric(8,2);
|
||||||
@ -62,25 +65,38 @@ drop domain domainint4 restrict;
|
|||||||
drop domain domaintext;
|
drop domain domaintext;
|
||||||
|
|
||||||
|
|
||||||
-- Array Test
|
-- Test domains over array types
|
||||||
|
|
||||||
create domain domainint4arr int4[1];
|
create domain domainint4arr int4[1];
|
||||||
create domain domaintextarr text[2][3];
|
create domain domainchar4arr varchar(4)[2][3];
|
||||||
|
|
||||||
create table domarrtest
|
create table domarrtest
|
||||||
( testint4arr domainint4arr
|
( testint4arr domainint4arr
|
||||||
, testtextarr domaintextarr
|
, testchar4arr domainchar4arr
|
||||||
);
|
);
|
||||||
INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"}}');
|
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},{2,2}}', '{{"a","b"}}');
|
||||||
INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}');
|
INSERT INTO domarrtest values ('{2,2}', '{{"a","b"},{"c","d"},{"e","f"}}');
|
||||||
INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}');
|
INSERT INTO domarrtest values ('{2,2}', '{{"a"},{"c"}}');
|
||||||
INSERT INTO domarrtest values (NULL, '{{"a","b","c"},{"d","e","f"}}');
|
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 * from domarrtest;
|
||||||
select testint4arr[1], testtextarr[2:2] from domarrtest;
|
|
||||||
|
|
||||||
drop table domarrtest;
|
drop table domarrtest;
|
||||||
drop domain domainint4arr restrict;
|
drop domain domainint4arr restrict;
|
||||||
drop domain domaintextarr restrict;
|
drop domain domainchar4arr restrict;
|
||||||
|
|
||||||
|
|
||||||
create domain dnotnull varchar(15) NOT NULL;
|
create domain dnotnull varchar(15) NOT NULL;
|
||||||
|
Reference in New Issue
Block a user