@ -180,7 +180,121 @@ Rules:
drop table inserttest2;
drop table inserttest;
drop type insert_test_type;
-- Make the same tests with domains over the array and composite fields
create domain insert_pos_ints as int[] check (value[1] > 0);
create domain insert_test_domain as insert_test_type
check ((value).if2[1] is not null);
create table inserttesta (f1 int, f2 insert_pos_ints);
create table inserttestb (f3 insert_test_domain, f4 insert_test_domain[]);
insert into inserttesta (f2[1], f2[2]) values (1,2);
insert into inserttesta (f2[1], f2[2]) values (3,4), (5,6);
insert into inserttesta (f2[1], f2[2]) select 7,8;
insert into inserttesta (f2[1], f2[2]) values (1,default); -- not supported
ERROR: cannot set an array element to DEFAULT
LINE 1: insert into inserttesta (f2[1], f2[2]) values (1,default);
^
insert into inserttesta (f2[1], f2[2]) values (0,2);
ERROR: value for domain insert_pos_ints violates check constraint "insert_pos_ints_check"
insert into inserttesta (f2[1], f2[2]) values (3,4), (0,6);
ERROR: value for domain insert_pos_ints violates check constraint "insert_pos_ints_check"
insert into inserttesta (f2[1], f2[2]) select 0,8;
ERROR: value for domain insert_pos_ints violates check constraint "insert_pos_ints_check"
insert into inserttestb (f3.if1, f3.if2) values (1,array['foo']);
insert into inserttestb (f3.if1, f3.if2) values (1,'{foo}'), (2,'{bar}');
insert into inserttestb (f3.if1, f3.if2) select 3, '{baz,quux}';
insert into inserttestb (f3.if1, f3.if2) values (1,default); -- not supported
ERROR: cannot set a subfield to DEFAULT
LINE 1: insert into inserttestb (f3.if1, f3.if2) values (1,default);
^
insert into inserttestb (f3.if1, f3.if2) values (1,array[null]);
ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check"
insert into inserttestb (f3.if1, f3.if2) values (1,'{null}'), (2,'{bar}');
ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check"
insert into inserttestb (f3.if1, f3.if2) select 3, '{null,quux}';
ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check"
insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar');
insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar'), ('baz', 'quux');
insert into inserttestb (f3.if2[1], f3.if2[2]) select 'bear', 'beer';
insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar');
insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar'), (row(2,'{y}'), 'baz', 'quux');
insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) select row(1,'{x}')::insert_test_domain, 'bear', 'beer';
select * from inserttesta;
f1 | f2
----+-------
| {1,2}
| {3,4}
| {5,6}
| {7,8}
(4 rows)
select * from inserttestb;
f3 | f4
------------------+------------------------
(1,{foo}) |
(1,{foo}) |
(2,{bar}) |
(3,"{baz,quux}") |
(,"{foo,bar}") |
(,"{foo,bar}") |
(,"{baz,quux}") |
(,"{bear,beer}") |
(1,{x}) | {"(,\"{foo,bar}\")"}
(1,{x}) | {"(,\"{foo,bar}\")"}
(2,{y}) | {"(,\"{baz,quux}\")"}
(1,{x}) | {"(,\"{bear,beer}\")"}
(12 rows)
-- also check reverse-listing
create table inserttest2 (f1 bigint, f2 text);
create rule irule1 as on insert to inserttest2 do also
insert into inserttestb (f3.if2[1], f3.if2[2])
values (new.f1,new.f2);
create rule irule2 as on insert to inserttest2 do also
insert into inserttestb (f4[1].if1, f4[1].if2[2])
values (1,'fool'),(new.f1,new.f2);
create rule irule3 as on insert to inserttest2 do also
insert into inserttestb (f4[1].if1, f4[1].if2[2])
select new.f1, new.f2;
\d+ inserttest2
Table "public.inserttest2"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+--------+-----------+----------+---------+----------+--------------+-------------
f1 | bigint | | | | plain | |
f2 | text | | | | extended | |
Rules:
irule1 AS
ON INSERT TO inserttest2 DO INSERT INTO inserttestb (f3.if2[1], f3.if2[2])
VALUES (new.f1, new.f2)
irule2 AS
ON INSERT TO inserttest2 DO INSERT INTO inserttestb (f4[1].if1, f4[1].if2[2]) VALUES (1,'fool'::text), (new.f1,new.f2)
irule3 AS
ON INSERT TO inserttest2 DO INSERT INTO inserttestb (f4[1].if1, f4[1].if2[2]) SELECT new.f1,
new.f2
drop table inserttest2;
drop table inserttesta;
drop table inserttestb;
drop domain insert_pos_ints;
drop domain insert_test_domain;
-- Verify that multiple inserts to subfields of a domain-over-container
-- check the domain constraints only on the finished value
create domain insert_nnarray as int[]
check (value[1] is not null and value[2] is not null);
create domain insert_test_domain as insert_test_type
check ((value).if1 is not null and (value).if2 is not null);
create table inserttesta (f1 insert_nnarray);
insert into inserttesta (f1[1]) values (1); -- fail
ERROR: value for domain insert_nnarray violates check constraint "insert_nnarray_check"
insert into inserttesta (f1[1], f1[2]) values (1, 2);
create table inserttestb (f1 insert_test_domain);
insert into inserttestb (f1.if1) values (1); -- fail
ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check"
insert into inserttestb (f1.if1, f1.if2) values (1, '{foo}');
drop table inserttesta;
drop table inserttestb;
drop domain insert_nnarray;
drop type insert_test_type cascade;
NOTICE: drop cascades to type insert_test_domain
-- direct partition inserts should check partition bound constraint
create table range_parted (
a text,