2002-03-19 03:18:25 +01:00
|
|
|
-- Test Comment / Drop
|
|
|
|
create domain domaindroptest int4;
|
|
|
|
comment on domain domaindroptest is 'About to drop this..';
|
2002-07-12 20:43:19 +02:00
|
|
|
-- currently this will be disallowed
|
2002-03-19 03:18:25 +01:00
|
|
|
create domain basetypetest domaindroptest;
|
2003-07-20 23:56:35 +02:00
|
|
|
ERROR: "domaindroptest" is not a valid base type for a domain
|
2002-03-19 03:18:25 +01:00
|
|
|
drop domain domaindroptest;
|
2002-07-12 20:43:19 +02:00
|
|
|
-- this should fail because already gone
|
|
|
|
drop domain domaindroptest cascade;
|
2003-07-20 23:56:35 +02:00
|
|
|
ERROR: type "domaindroptest" does not exist
|
2002-03-19 03:18:25 +01:00
|
|
|
-- TEST Domains.
|
|
|
|
create domain domainvarchar varchar(5);
|
|
|
|
create domain domainnumeric numeric(8,2);
|
|
|
|
create domain domainint4 int4;
|
|
|
|
create domain domaintext text;
|
Extend pg_cast castimplicit column to a three-way value; this allows us
to be flexible about assignment casts without introducing ambiguity in
operator/function resolution. Introduce a well-defined promotion hierarchy
for numeric datatypes (int2->int4->int8->numeric->float4->float8).
Change make_const to initially label numeric literals as int4, int8, or
numeric (never float8 anymore).
Explicitly mark Func and RelabelType nodes to indicate whether they came
from a function call, explicit cast, or implicit cast; use this to do
reverse-listing more accurately and without so many heuristics.
Explicit casts to char, varchar, bit, varbit will truncate or pad without
raising an error (the pre-7.2 behavior), while assigning to a column without
any explicit cast will still raise an error for wrong-length data like 7.3.
This more nearly follows the SQL spec than 7.2 behavior (we should be
reporting a 'completion condition' in the explicit-cast cases, but we have
no mechanism for that, so just do silent truncation).
Fix some problems with enforcement of typmod for array elements;
it didn't work at all in 'UPDATE ... SET array[n] = foo', for example.
Provide a generalized array_length_coerce() function to replace the
specialized per-array-type functions that used to be needed (and were
missing for NUMERIC as well as all the datetime types).
Add missing conversions int8<->float4, text<->numeric, oid<->int8.
initdb forced.
2002-09-18 23:35:25 +02:00
|
|
|
-- Test explicit coercions --- these should succeed (and truncate)
|
|
|
|
SELECT cast('123456' as domainvarchar);
|
|
|
|
domainvarchar
|
|
|
|
---------------
|
|
|
|
12345
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT cast('12345' as domainvarchar);
|
2002-07-06 22:16:36 +02:00
|
|
|
domainvarchar
|
|
|
|
---------------
|
|
|
|
12345
|
|
|
|
(1 row)
|
|
|
|
|
2002-03-19 03:18:25 +01:00
|
|
|
-- Test tables using domains
|
|
|
|
create table basictest
|
|
|
|
( testint4 domainint4
|
|
|
|
, testtext domaintext
|
|
|
|
, testvarchar domainvarchar
|
|
|
|
, testnumeric domainnumeric
|
|
|
|
);
|
|
|
|
INSERT INTO basictest values ('88', 'haha', 'short', '123.12'); -- Good
|
|
|
|
INSERT INTO basictest values ('88', 'haha', 'short text', '123.12'); -- Bad varchar
|
|
|
|
ERROR: value too long for type character varying(5)
|
|
|
|
INSERT INTO basictest values ('88', 'haha', 'short', '123.1212'); -- Truncate numeric
|
2002-09-20 05:52:50 +02:00
|
|
|
-- Test copy
|
|
|
|
COPY basictest (testvarchar) FROM stdin; -- fail
|
2003-04-24 23:16:45 +02:00
|
|
|
ERROR: value too long for type character varying(5)
|
2003-09-30 00:06:40 +02:00
|
|
|
CONTEXT: COPY basictest, line 1: "notsoshorttext"
|
2002-09-20 05:52:50 +02:00
|
|
|
COPY basictest (testvarchar) FROM stdin;
|
2002-03-19 03:18:25 +01:00
|
|
|
select * from basictest;
|
|
|
|
testint4 | testtext | testvarchar | testnumeric
|
|
|
|
----------+----------+-------------+-------------
|
2003-05-14 05:26:03 +02:00
|
|
|
88 | haha | short | 123.12
|
|
|
|
88 | haha | short | 123.12
|
|
|
|
| | short |
|
2002-09-20 05:52:50 +02:00
|
|
|
(3 rows)
|
2002-03-19 03:18:25 +01:00
|
|
|
|
2002-03-20 20:45:13 +01:00
|
|
|
-- check that domains inherit operations from base types
|
2002-09-01 00:10:48 +02:00
|
|
|
select testtext || testvarchar as concat, testnumeric + 42 as sum
|
2002-03-20 20:45:13 +01:00
|
|
|
from basictest;
|
|
|
|
concat | sum
|
|
|
|
-----------+--------
|
|
|
|
hahashort | 165.12
|
|
|
|
hahashort | 165.12
|
2002-09-20 05:52:50 +02:00
|
|
|
|
|
|
|
|
(3 rows)
|
2002-03-20 20:45:13 +01:00
|
|
|
|
2002-03-19 03:18:25 +01:00
|
|
|
drop table basictest;
|
|
|
|
drop domain domainvarchar restrict;
|
|
|
|
drop domain domainnumeric restrict;
|
|
|
|
drop domain domainint4 restrict;
|
2002-03-20 20:45:13 +01:00
|
|
|
drop domain domaintext;
|
2002-03-19 03:18:25 +01:00
|
|
|
-- Array Test
|
|
|
|
create domain domainint4arr int4[1];
|
|
|
|
create domain domaintextarr text[2][3];
|
|
|
|
create table domarrtest
|
|
|
|
( testint4arr domainint4arr
|
|
|
|
, testtextarr domaintextarr
|
|
|
|
);
|
2004-08-05 05:30:44 +02:00
|
|
|
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"}}');
|
2002-03-20 20:45:13 +01:00
|
|
|
select * from domarrtest;
|
|
|
|
testint4arr | testtextarr
|
|
|
|
---------------+---------------------
|
2004-08-05 05:30:44 +02:00
|
|
|
{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}}
|
2002-03-20 20:45:13 +01:00
|
|
|
(5 rows)
|
|
|
|
|
|
|
|
select testint4arr[1], testtextarr[2:2] from domarrtest;
|
|
|
|
testint4arr | testtextarr
|
|
|
|
-------------+-------------
|
2004-08-05 05:30:44 +02:00
|
|
|
2 | {{c,d}}
|
2005-11-17 23:14:56 +01:00
|
|
|
| {}
|
2004-08-05 05:30:44 +02:00
|
|
|
2 | {{c,d}}
|
2002-03-20 20:45:13 +01:00
|
|
|
2 | {{c}}
|
2004-08-05 05:30:44 +02:00
|
|
|
| {{d,e,f}}
|
2002-03-20 20:45:13 +01:00
|
|
|
(5 rows)
|
|
|
|
|
2002-03-19 03:18:25 +01:00
|
|
|
drop table domarrtest;
|
|
|
|
drop domain domainint4arr restrict;
|
|
|
|
drop domain domaintextarr restrict;
|
|
|
|
create domain dnotnull varchar(15) NOT NULL;
|
2002-07-06 22:16:36 +02:00
|
|
|
create domain dnull varchar(15);
|
2002-11-15 03:50:21 +01:00
|
|
|
create domain dcheck varchar(15) NOT NULL CHECK (VALUE = 'a' OR VALUE = 'c' OR VALUE = 'd');
|
2002-03-19 03:18:25 +01:00
|
|
|
create table nulltest
|
|
|
|
( col1 dnotnull
|
|
|
|
, col2 dnotnull NULL -- NOT NULL in the domain cannot be overridden
|
|
|
|
, col3 dnull NOT NULL
|
|
|
|
, col4 dnull
|
2002-11-15 03:50:21 +01:00
|
|
|
, col5 dcheck CHECK (col5 IN ('c', 'd'))
|
2002-03-19 03:18:25 +01:00
|
|
|
);
|
|
|
|
INSERT INTO nulltest DEFAULT VALUES;
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dnotnull does not allow null values
|
2002-11-15 03:50:21 +01:00
|
|
|
INSERT INTO nulltest values ('a', 'b', 'c', 'd', 'c'); -- Good
|
|
|
|
insert into nulltest values ('a', 'b', 'c', 'd', NULL);
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dcheck does not allow null values
|
2002-11-15 03:50:21 +01:00
|
|
|
insert into nulltest values ('a', 'b', 'c', 'd', 'a');
|
2004-06-10 19:56:03 +02:00
|
|
|
ERROR: new row for relation "nulltest" violates check constraint "nulltest_col5_check"
|
2002-11-15 03:50:21 +01:00
|
|
|
INSERT INTO nulltest values (NULL, 'b', 'c', 'd', 'd');
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dnotnull does not allow null values
|
2002-11-15 03:50:21 +01:00
|
|
|
INSERT INTO nulltest values ('a', NULL, 'c', 'd', 'c');
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dnotnull does not allow null values
|
2002-11-15 03:50:21 +01:00
|
|
|
INSERT INTO nulltest values ('a', 'b', NULL, 'd', 'c');
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: null value in column "col3" violates not-null constraint
|
2002-11-15 03:50:21 +01:00
|
|
|
INSERT INTO nulltest values ('a', 'b', 'c', NULL, 'd'); -- Good
|
2002-09-20 05:52:50 +02:00
|
|
|
-- Test copy
|
|
|
|
COPY nulltest FROM stdin; --fail
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dcheck does not allow null values
|
2003-09-30 00:06:40 +02:00
|
|
|
CONTEXT: COPY nulltest, line 1: "a b \N d \N"
|
2002-11-15 03:50:21 +01:00
|
|
|
-- Last row is bad
|
2002-09-20 05:52:50 +02:00
|
|
|
COPY nulltest FROM stdin;
|
2004-06-10 19:56:03 +02:00
|
|
|
ERROR: new row for relation "nulltest" violates check constraint "nulltest_col5_check"
|
2003-09-30 00:06:40 +02:00
|
|
|
CONTEXT: COPY nulltest, line 3: "a b c \N a"
|
2002-03-19 03:18:25 +01:00
|
|
|
select * from nulltest;
|
2002-11-15 03:50:21 +01:00
|
|
|
col1 | col2 | col3 | col4 | col5
|
|
|
|
------+------+------+------+------
|
|
|
|
a | b | c | d | c
|
|
|
|
a | b | c | | d
|
|
|
|
(2 rows)
|
2002-03-19 03:18:25 +01:00
|
|
|
|
2002-07-06 22:16:36 +02:00
|
|
|
-- Test out coerced (casted) constraints
|
|
|
|
SELECT cast('1' as dnotnull);
|
|
|
|
dnotnull
|
|
|
|
----------
|
|
|
|
1
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT cast(NULL as dnotnull); -- fail
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dnotnull does not allow null values
|
2002-07-06 22:16:36 +02:00
|
|
|
SELECT cast(cast(NULL as dnull) as dnotnull); -- fail
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dnotnull does not allow null values
|
2002-07-06 22:16:36 +02:00
|
|
|
SELECT cast(col4 as dnotnull) from nulltest; -- fail
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dnotnull does not allow null values
|
2002-07-06 22:16:36 +02:00
|
|
|
-- cleanup
|
2002-03-19 03:18:25 +01:00
|
|
|
drop table nulltest;
|
|
|
|
drop domain dnotnull restrict;
|
|
|
|
drop domain dnull restrict;
|
2002-12-06 06:00:34 +01:00
|
|
|
drop domain dcheck restrict;
|
2002-03-19 03:18:25 +01:00
|
|
|
create domain ddef1 int4 DEFAULT 3;
|
|
|
|
create domain ddef2 oid DEFAULT '12';
|
|
|
|
-- Type mixing, function returns int8
|
|
|
|
create domain ddef3 text DEFAULT 5;
|
|
|
|
create sequence ddef4_seq;
|
2005-10-03 01:50:16 +02:00
|
|
|
create domain ddef4 int4 DEFAULT nextval('ddef4_seq');
|
2002-03-19 03:18:25 +01:00
|
|
|
create domain ddef5 numeric(8,2) NOT NULL DEFAULT '12.12';
|
|
|
|
create table defaulttest
|
|
|
|
( col1 ddef1
|
|
|
|
, col2 ddef2
|
|
|
|
, col3 ddef3
|
2002-08-20 18:37:03 +02:00
|
|
|
, col4 ddef4 PRIMARY KEY
|
2002-03-19 03:18:25 +01:00
|
|
|
, col5 ddef1 NOT NULL DEFAULT NULL
|
|
|
|
, col6 ddef2 DEFAULT '88'
|
|
|
|
, col7 ddef4 DEFAULT 8000
|
2002-09-01 00:10:48 +02:00
|
|
|
, col8 ddef5
|
2002-03-19 03:18:25 +01:00
|
|
|
);
|
2003-07-19 22:20:53 +02:00
|
|
|
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "defaulttest_pkey" for table "defaulttest"
|
2002-03-19 03:18:25 +01:00
|
|
|
insert into defaulttest default values;
|
|
|
|
insert into defaulttest default values;
|
|
|
|
insert into defaulttest default values;
|
2002-09-20 05:52:50 +02:00
|
|
|
-- Test defaults with copy
|
|
|
|
COPY defaulttest(col5) FROM stdin;
|
2002-03-19 03:18:25 +01:00
|
|
|
select * from defaulttest;
|
|
|
|
col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8
|
|
|
|
------+------+------+------+------+------+------+-------
|
2003-05-14 05:26:03 +02:00
|
|
|
3 | 12 | 5 | 1 | 3 | 88 | 8000 | 12.12
|
|
|
|
3 | 12 | 5 | 2 | 3 | 88 | 8000 | 12.12
|
|
|
|
3 | 12 | 5 | 3 | 3 | 88 | 8000 | 12.12
|
|
|
|
3 | 12 | 5 | 4 | 42 | 88 | 8000 | 12.12
|
2002-09-20 05:52:50 +02:00
|
|
|
(4 rows)
|
2002-03-19 03:18:25 +01:00
|
|
|
|
2002-12-06 06:00:34 +01:00
|
|
|
drop table defaulttest cascade;
|
|
|
|
-- Test ALTER DOMAIN .. NOT NULL
|
|
|
|
create domain dnotnulltest integer;
|
|
|
|
create table domnotnull
|
|
|
|
( col1 dnotnulltest
|
|
|
|
, col2 dnotnulltest
|
|
|
|
);
|
|
|
|
insert into domnotnull default values;
|
|
|
|
alter domain dnotnulltest set not null; -- fails
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: column "col1" of table "domnotnull" contains null values
|
2002-12-06 06:00:34 +01:00
|
|
|
update domnotnull set col1 = 5;
|
|
|
|
alter domain dnotnulltest set not null; -- fails
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: column "col2" of table "domnotnull" contains null values
|
2002-12-06 06:00:34 +01:00
|
|
|
update domnotnull set col2 = 6;
|
|
|
|
alter domain dnotnulltest set not null;
|
|
|
|
update domnotnull set col1 = null; -- fails
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dnotnulltest does not allow null values
|
2002-12-06 06:00:34 +01:00
|
|
|
alter domain dnotnulltest drop not null;
|
|
|
|
update domnotnull set col1 = null;
|
|
|
|
drop domain dnotnulltest cascade;
|
2003-07-21 03:59:11 +02:00
|
|
|
NOTICE: drop cascades to table domnotnull column col2
|
|
|
|
NOTICE: drop cascades to table domnotnull column col1
|
2002-12-06 06:00:34 +01:00
|
|
|
-- Test ALTER DOMAIN .. DEFAULT ..
|
|
|
|
create table domdeftest (col1 ddef1);
|
|
|
|
insert into domdeftest default values;
|
|
|
|
select * from domdeftest;
|
|
|
|
col1
|
|
|
|
------
|
2003-05-14 05:26:03 +02:00
|
|
|
3
|
2002-12-06 06:00:34 +01:00
|
|
|
(1 row)
|
|
|
|
|
|
|
|
alter domain ddef1 set default '42';
|
|
|
|
insert into domdeftest default values;
|
|
|
|
select * from domdeftest;
|
|
|
|
col1
|
|
|
|
------
|
2003-05-14 05:26:03 +02:00
|
|
|
3
|
|
|
|
42
|
2002-12-06 06:00:34 +01:00
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
alter domain ddef1 drop default;
|
|
|
|
insert into domdeftest default values;
|
|
|
|
select * from domdeftest;
|
|
|
|
col1
|
|
|
|
------
|
2003-05-14 05:26:03 +02:00
|
|
|
3
|
|
|
|
42
|
|
|
|
|
2002-12-06 06:00:34 +01:00
|
|
|
(3 rows)
|
|
|
|
|
|
|
|
drop table domdeftest;
|
|
|
|
-- Test ALTER DOMAIN .. CONSTRAINT ..
|
|
|
|
create domain con as integer;
|
|
|
|
create table domcontest (col1 con);
|
|
|
|
insert into domcontest values (1);
|
|
|
|
insert into domcontest values (2);
|
|
|
|
alter domain con add constraint t check (VALUE < 1); -- fails
|
2003-09-29 02:05:25 +02:00
|
|
|
ERROR: column "col1" of table "domcontest" contains values that violate the new constraint
|
2002-12-06 06:00:34 +01:00
|
|
|
alter domain con add constraint t check (VALUE < 34);
|
|
|
|
alter domain con add check (VALUE > 0);
|
|
|
|
insert into domcontest values (-5); -- fails
|
2004-06-10 19:56:03 +02:00
|
|
|
ERROR: value for domain con violates check constraint "con_check"
|
2002-12-06 06:00:34 +01:00
|
|
|
insert into domcontest values (42); -- fails
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: value for domain con violates check constraint "t"
|
2002-12-06 06:00:34 +01:00
|
|
|
insert into domcontest values (5);
|
|
|
|
alter domain con drop constraint t;
|
|
|
|
insert into domcontest values (-5); --fails
|
2004-06-10 19:56:03 +02:00
|
|
|
ERROR: value for domain con violates check constraint "con_check"
|
2002-12-06 06:00:34 +01:00
|
|
|
insert into domcontest values (42);
|
2003-02-03 22:15:45 +01:00
|
|
|
-- Confirm ALTER DOMAIN with RULES.
|
|
|
|
create table domtab (col1 integer);
|
|
|
|
create domain dom as integer;
|
|
|
|
create view domview as select cast(col1 as dom) from domtab;
|
|
|
|
insert into domtab (col1) values (null);
|
|
|
|
insert into domtab (col1) values (5);
|
|
|
|
select * from domview;
|
|
|
|
col1
|
|
|
|
------
|
2003-05-14 05:26:03 +02:00
|
|
|
|
|
|
|
5
|
2003-02-03 22:15:45 +01:00
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
alter domain dom set not null;
|
|
|
|
select * from domview; -- fail
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: domain dom does not allow null values
|
2003-02-03 22:15:45 +01:00
|
|
|
alter domain dom drop not null;
|
|
|
|
select * from domview;
|
|
|
|
col1
|
|
|
|
------
|
2003-05-14 05:26:03 +02:00
|
|
|
|
|
|
|
5
|
2003-02-03 22:15:45 +01:00
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
alter domain dom add constraint domchkgt6 check(value > 6);
|
|
|
|
select * from domview; --fail
|
2003-09-25 08:58:07 +02:00
|
|
|
ERROR: value for domain dom violates check constraint "domchkgt6"
|
2003-02-03 22:15:45 +01:00
|
|
|
alter domain dom drop constraint domchkgt6 restrict;
|
|
|
|
select * from domview;
|
|
|
|
col1
|
|
|
|
------
|
2003-05-14 05:26:03 +02:00
|
|
|
|
|
|
|
5
|
2003-02-03 22:15:45 +01:00
|
|
|
(2 rows)
|
|
|
|
|
2002-12-06 06:00:34 +01:00
|
|
|
-- cleanup
|
2002-03-19 03:18:25 +01:00
|
|
|
drop domain ddef1 restrict;
|
|
|
|
drop domain ddef2 restrict;
|
|
|
|
drop domain ddef3 restrict;
|
|
|
|
drop domain ddef4 restrict;
|
|
|
|
drop domain ddef5 restrict;
|
2005-10-03 01:50:16 +02:00
|
|
|
drop sequence ddef4_seq;
|
2005-01-25 04:22:19 +01:00
|
|
|
-- Make sure that constraints of newly-added domain columns are
|
|
|
|
-- enforced correctly, even if there's no default value for the new
|
|
|
|
-- column. Per bug #1433
|
|
|
|
create domain str_domain as text not null;
|
|
|
|
create table domain_test (a int, b int);
|
|
|
|
insert into domain_test values (1, 2);
|
|
|
|
insert into domain_test values (1, 2);
|
|
|
|
-- should fail
|
|
|
|
alter table domain_test add column c str_domain;
|
|
|
|
ERROR: domain str_domain does not allow null values
|
|
|
|
create domain str_domain2 as text check (value <> 'foo') default 'foo';
|
|
|
|
-- should fail
|
|
|
|
alter table domain_test add column d str_domain2;
|
|
|
|
ERROR: value for domain str_domain2 violates check constraint "str_domain2_check"
|