mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-03 05:47:04 +02:00
cda3e5836e
the row types of parent/child tables.
654 lines
16 KiB
Plaintext
654 lines
16 KiB
Plaintext
--
|
|
-- Test inheritance features
|
|
--
|
|
CREATE TABLE a (aa TEXT);
|
|
CREATE TABLE b (bb TEXT) INHERITS (a);
|
|
CREATE TABLE c (cc TEXT) INHERITS (a);
|
|
CREATE TABLE d (dd TEXT) INHERITS (b,c,a);
|
|
NOTICE: merging multiple inherited definitions of column "aa"
|
|
NOTICE: merging multiple inherited definitions of column "aa"
|
|
INSERT INTO a(aa) VALUES('aaa');
|
|
INSERT INTO a(aa) VALUES('aaaa');
|
|
INSERT INTO a(aa) VALUES('aaaaa');
|
|
INSERT INTO a(aa) VALUES('aaaaaa');
|
|
INSERT INTO a(aa) VALUES('aaaaaaa');
|
|
INSERT INTO a(aa) VALUES('aaaaaaaa');
|
|
INSERT INTO b(aa) VALUES('bbb');
|
|
INSERT INTO b(aa) VALUES('bbbb');
|
|
INSERT INTO b(aa) VALUES('bbbbb');
|
|
INSERT INTO b(aa) VALUES('bbbbbb');
|
|
INSERT INTO b(aa) VALUES('bbbbbbb');
|
|
INSERT INTO b(aa) VALUES('bbbbbbbb');
|
|
INSERT INTO c(aa) VALUES('ccc');
|
|
INSERT INTO c(aa) VALUES('cccc');
|
|
INSERT INTO c(aa) VALUES('ccccc');
|
|
INSERT INTO c(aa) VALUES('cccccc');
|
|
INSERT INTO c(aa) VALUES('ccccccc');
|
|
INSERT INTO c(aa) VALUES('cccccccc');
|
|
INSERT INTO d(aa) VALUES('ddd');
|
|
INSERT INTO d(aa) VALUES('dddd');
|
|
INSERT INTO d(aa) VALUES('ddddd');
|
|
INSERT INTO d(aa) VALUES('dddddd');
|
|
INSERT INTO d(aa) VALUES('ddddddd');
|
|
INSERT INTO d(aa) VALUES('dddddddd');
|
|
SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+----------
|
|
a | aaa
|
|
a | aaaa
|
|
a | aaaaa
|
|
a | aaaaaa
|
|
a | aaaaaaa
|
|
a | aaaaaaaa
|
|
b | bbb
|
|
b | bbbb
|
|
b | bbbbb
|
|
b | bbbbbb
|
|
b | bbbbbbb
|
|
b | bbbbbbbb
|
|
c | ccc
|
|
c | cccc
|
|
c | ccccc
|
|
c | cccccc
|
|
c | ccccccc
|
|
c | cccccccc
|
|
d | ddd
|
|
d | dddd
|
|
d | ddddd
|
|
d | dddddd
|
|
d | ddddddd
|
|
d | dddddddd
|
|
(24 rows)
|
|
|
|
SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+----------+----
|
|
b | bbb |
|
|
b | bbbb |
|
|
b | bbbbb |
|
|
b | bbbbbb |
|
|
b | bbbbbbb |
|
|
b | bbbbbbbb |
|
|
d | ddd |
|
|
d | dddd |
|
|
d | ddddd |
|
|
d | dddddd |
|
|
d | ddddddd |
|
|
d | dddddddd |
|
|
(12 rows)
|
|
|
|
SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----------+----
|
|
c | ccc |
|
|
c | cccc |
|
|
c | ccccc |
|
|
c | cccccc |
|
|
c | ccccccc |
|
|
c | cccccccc |
|
|
d | ddd |
|
|
d | dddd |
|
|
d | ddddd |
|
|
d | dddddd |
|
|
d | ddddddd |
|
|
d | dddddddd |
|
|
(12 rows)
|
|
|
|
SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+----------+----+----+----
|
|
d | ddd | | |
|
|
d | dddd | | |
|
|
d | ddddd | | |
|
|
d | dddddd | | |
|
|
d | ddddddd | | |
|
|
d | dddddddd | | |
|
|
(6 rows)
|
|
|
|
SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+----------
|
|
a | aaa
|
|
a | aaaa
|
|
a | aaaaa
|
|
a | aaaaaa
|
|
a | aaaaaaa
|
|
a | aaaaaaaa
|
|
(6 rows)
|
|
|
|
SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+----------+----
|
|
b | bbb |
|
|
b | bbbb |
|
|
b | bbbbb |
|
|
b | bbbbbb |
|
|
b | bbbbbbb |
|
|
b | bbbbbbbb |
|
|
(6 rows)
|
|
|
|
SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----------+----
|
|
c | ccc |
|
|
c | cccc |
|
|
c | ccccc |
|
|
c | cccccc |
|
|
c | ccccccc |
|
|
c | cccccccc |
|
|
(6 rows)
|
|
|
|
SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+----------+----+----+----
|
|
d | ddd | | |
|
|
d | dddd | | |
|
|
d | ddddd | | |
|
|
d | dddddd | | |
|
|
d | ddddddd | | |
|
|
d | dddddddd | | |
|
|
(6 rows)
|
|
|
|
UPDATE a SET aa='zzzz' WHERE aa='aaaa';
|
|
UPDATE ONLY a SET aa='zzzzz' WHERE aa='aaaaa';
|
|
UPDATE b SET aa='zzz' WHERE aa='aaa';
|
|
UPDATE ONLY b SET aa='zzz' WHERE aa='aaa';
|
|
UPDATE a SET aa='zzzzzz' WHERE aa LIKE 'aaa%';
|
|
SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+----------
|
|
a | zzzz
|
|
a | zzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
b | bbb
|
|
b | bbbb
|
|
b | bbbbb
|
|
b | bbbbbb
|
|
b | bbbbbbb
|
|
b | bbbbbbbb
|
|
c | ccc
|
|
c | cccc
|
|
c | ccccc
|
|
c | cccccc
|
|
c | ccccccc
|
|
c | cccccccc
|
|
d | ddd
|
|
d | dddd
|
|
d | ddddd
|
|
d | dddddd
|
|
d | ddddddd
|
|
d | dddddddd
|
|
(24 rows)
|
|
|
|
SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+----------+----
|
|
b | bbb |
|
|
b | bbbb |
|
|
b | bbbbb |
|
|
b | bbbbbb |
|
|
b | bbbbbbb |
|
|
b | bbbbbbbb |
|
|
d | ddd |
|
|
d | dddd |
|
|
d | ddddd |
|
|
d | dddddd |
|
|
d | ddddddd |
|
|
d | dddddddd |
|
|
(12 rows)
|
|
|
|
SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----------+----
|
|
c | ccc |
|
|
c | cccc |
|
|
c | ccccc |
|
|
c | cccccc |
|
|
c | ccccccc |
|
|
c | cccccccc |
|
|
d | ddd |
|
|
d | dddd |
|
|
d | ddddd |
|
|
d | dddddd |
|
|
d | ddddddd |
|
|
d | dddddddd |
|
|
(12 rows)
|
|
|
|
SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+----------+----+----+----
|
|
d | ddd | | |
|
|
d | dddd | | |
|
|
d | ddddd | | |
|
|
d | dddddd | | |
|
|
d | ddddddd | | |
|
|
d | dddddddd | | |
|
|
(6 rows)
|
|
|
|
SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+--------
|
|
a | zzzz
|
|
a | zzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
(6 rows)
|
|
|
|
SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+----------+----
|
|
b | bbb |
|
|
b | bbbb |
|
|
b | bbbbb |
|
|
b | bbbbbb |
|
|
b | bbbbbbb |
|
|
b | bbbbbbbb |
|
|
(6 rows)
|
|
|
|
SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----------+----
|
|
c | ccc |
|
|
c | cccc |
|
|
c | ccccc |
|
|
c | cccccc |
|
|
c | ccccccc |
|
|
c | cccccccc |
|
|
(6 rows)
|
|
|
|
SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+----------+----+----+----
|
|
d | ddd | | |
|
|
d | dddd | | |
|
|
d | ddddd | | |
|
|
d | dddddd | | |
|
|
d | ddddddd | | |
|
|
d | dddddddd | | |
|
|
(6 rows)
|
|
|
|
UPDATE b SET aa='new';
|
|
SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+----------
|
|
a | zzzz
|
|
a | zzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
b | new
|
|
b | new
|
|
b | new
|
|
b | new
|
|
b | new
|
|
b | new
|
|
c | ccc
|
|
c | cccc
|
|
c | ccccc
|
|
c | cccccc
|
|
c | ccccccc
|
|
c | cccccccc
|
|
d | new
|
|
d | new
|
|
d | new
|
|
d | new
|
|
d | new
|
|
d | new
|
|
(24 rows)
|
|
|
|
SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+-----+----
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
(12 rows)
|
|
|
|
SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----------+----
|
|
c | ccc |
|
|
c | cccc |
|
|
c | ccccc |
|
|
c | cccccc |
|
|
c | ccccccc |
|
|
c | cccccccc |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
(12 rows)
|
|
|
|
SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+-----+----+----+----
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
(6 rows)
|
|
|
|
SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+--------
|
|
a | zzzz
|
|
a | zzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
a | zzzzzz
|
|
(6 rows)
|
|
|
|
SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+-----+----
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
(6 rows)
|
|
|
|
SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----------+----
|
|
c | ccc |
|
|
c | cccc |
|
|
c | ccccc |
|
|
c | cccccc |
|
|
c | ccccccc |
|
|
c | cccccccc |
|
|
(6 rows)
|
|
|
|
SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+-----+----+----+----
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
(6 rows)
|
|
|
|
UPDATE a SET aa='new';
|
|
DELETE FROM ONLY c WHERE aa='new';
|
|
SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+-----
|
|
a | new
|
|
a | new
|
|
a | new
|
|
a | new
|
|
a | new
|
|
a | new
|
|
b | new
|
|
b | new
|
|
b | new
|
|
b | new
|
|
b | new
|
|
b | new
|
|
d | new
|
|
d | new
|
|
d | new
|
|
d | new
|
|
d | new
|
|
d | new
|
|
(18 rows)
|
|
|
|
SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+-----+----
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
(12 rows)
|
|
|
|
SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+-----+----
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
d | new |
|
|
(6 rows)
|
|
|
|
SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+-----+----+----+----
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
(6 rows)
|
|
|
|
SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+-----
|
|
a | new
|
|
a | new
|
|
a | new
|
|
a | new
|
|
a | new
|
|
a | new
|
|
(6 rows)
|
|
|
|
SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+-----+----
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
b | new |
|
|
(6 rows)
|
|
|
|
SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----+----
|
|
(0 rows)
|
|
|
|
SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+-----+----+----+----
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
d | new | | |
|
|
(6 rows)
|
|
|
|
DELETE FROM a;
|
|
SELECT relname, a.* FROM a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+----
|
|
(0 rows)
|
|
|
|
SELECT relname, b.* FROM b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+----+----
|
|
(0 rows)
|
|
|
|
SELECT relname, c.* FROM c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----+----
|
|
(0 rows)
|
|
|
|
SELECT relname, d.* FROM d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+----+----+----+----
|
|
(0 rows)
|
|
|
|
SELECT relname, a.* FROM ONLY a, pg_class where a.tableoid = pg_class.oid;
|
|
relname | aa
|
|
---------+----
|
|
(0 rows)
|
|
|
|
SELECT relname, b.* FROM ONLY b, pg_class where b.tableoid = pg_class.oid;
|
|
relname | aa | bb
|
|
---------+----+----
|
|
(0 rows)
|
|
|
|
SELECT relname, c.* FROM ONLY c, pg_class where c.tableoid = pg_class.oid;
|
|
relname | aa | cc
|
|
---------+----+----
|
|
(0 rows)
|
|
|
|
SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid;
|
|
relname | aa | bb | cc | dd
|
|
---------+----+----+----+----
|
|
(0 rows)
|
|
|
|
-- Confirm PRIMARY KEY adds NOT NULL constraint to child table
|
|
CREATE TEMP TABLE z (b TEXT, PRIMARY KEY(aa, b)) inherits (a);
|
|
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "z_pkey" for table "z"
|
|
INSERT INTO z VALUES (NULL, 'text'); -- should fail
|
|
ERROR: null value in column "aa" violates not-null constraint
|
|
-- Check UPDATE with inherited target and an inherited source table
|
|
create temp table foo(f1 int, f2 int);
|
|
create temp table foo2(f3 int) inherits (foo);
|
|
create temp table bar(f1 int, f2 int);
|
|
create temp table bar2(f3 int) inherits (bar);
|
|
insert into foo values(1,1);
|
|
insert into foo values(3,3);
|
|
insert into foo2 values(2,2,2);
|
|
insert into foo2 values(3,3,3);
|
|
insert into bar values(1,1);
|
|
insert into bar values(2,2);
|
|
insert into bar values(3,3);
|
|
insert into bar values(4,4);
|
|
insert into bar2 values(1,1,1);
|
|
insert into bar2 values(2,2,2);
|
|
insert into bar2 values(3,3,3);
|
|
insert into bar2 values(4,4,4);
|
|
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
|
|
SELECT relname, bar.* FROM bar, pg_class where bar.tableoid = pg_class.oid
|
|
order by 1,2;
|
|
relname | f1 | f2
|
|
---------+----+-----
|
|
bar | 1 | 101
|
|
bar | 2 | 102
|
|
bar | 3 | 103
|
|
bar | 4 | 4
|
|
bar2 | 1 | 101
|
|
bar2 | 2 | 102
|
|
bar2 | 3 | 103
|
|
bar2 | 4 | 4
|
|
(8 rows)
|
|
|
|
/* Test inheritance of structure (LIKE) */
|
|
CREATE TABLE inhx (xx text DEFAULT 'text');
|
|
/*
|
|
* Test double inheritance
|
|
*
|
|
* Ensure that defaults are NOT included unless
|
|
* INCLUDING DEFAULTS is specified
|
|
*/
|
|
CREATE TABLE inhe (ee text, LIKE inhx) inherits (b);
|
|
INSERT INTO inhe VALUES ('ee-col1', 'ee-col2', DEFAULT, 'ee-col4');
|
|
SELECT * FROM inhe; /* Columns aa, bb, xx value NULL, ee */
|
|
aa | bb | ee | xx
|
|
---------+---------+----+---------
|
|
ee-col1 | ee-col2 | | ee-col4
|
|
(1 row)
|
|
|
|
SELECT * FROM inhx; /* Empty set since LIKE inherits structure only */
|
|
xx
|
|
----
|
|
(0 rows)
|
|
|
|
SELECT * FROM b; /* Has ee entry */
|
|
aa | bb
|
|
---------+---------
|
|
ee-col1 | ee-col2
|
|
(1 row)
|
|
|
|
SELECT * FROM a; /* Has ee entry */
|
|
aa
|
|
---------
|
|
ee-col1
|
|
(1 row)
|
|
|
|
CREATE TABLE inhf (LIKE inhx, LIKE inhx); /* Throw error */
|
|
ERROR: column "xx" duplicated
|
|
CREATE TABLE inhf (LIKE inhx INCLUDING DEFAULTS);
|
|
INSERT INTO inhf DEFAULT VALUES;
|
|
SELECT * FROM inhf; /* Single entry with value 'text' */
|
|
xx
|
|
------
|
|
text
|
|
(1 row)
|
|
|
|
-- Test changing the type of inherited columns
|
|
insert into d values('test','one','two','three');
|
|
alter table a alter column aa type integer using bit_length(aa);
|
|
select * from d;
|
|
aa | bb | cc | dd
|
|
----+-----+-----+-------
|
|
32 | one | two | three
|
|
(1 row)
|
|
|
|
-- Tests for casting between the rowtypes of parent and child
|
|
-- tables. See the pgsql-hackers thread beginning Dec. 4/04
|
|
create table base (i integer);
|
|
create table derived () inherits (base);
|
|
insert into derived (i) values (0);
|
|
select derived::base from derived;
|
|
derived
|
|
---------
|
|
(0)
|
|
(1 row)
|
|
|
|
drop table derived;
|
|
drop table base;
|
|
create table p1(ff1 int);
|
|
create table p2(f1 text);
|
|
create function p2text(p2) returns text as 'select $1.f1' language sql;
|
|
create table c1(f3 int) inherits(p1,p2);
|
|
insert into c1 values(123456789, 'hi', 42);
|
|
select p2text(c1.*) from c1;
|
|
p2text
|
|
--------
|
|
hi
|
|
(1 row)
|
|
|
|
drop function p2text(p2);
|
|
drop table c1;
|
|
drop table p2;
|
|
drop table p1;
|