| CREATE TABLE test_replica_identity ( |
| id serial, |
| keya text not null primary key, |
| keyb text not null, |
| nonkey text, |
| CONSTRAINT test_replica_identity_unique_defer UNIQUE (keya, keyb) DEFERRABLE, |
| CONSTRAINT test_replica_identity_unique_nondefer UNIQUE (keya, keyb) |
| ) distributed by (keya); |
| |
| -- GPDB has a habit of naming the indexes that back constraints differently, |
| -- at CREATE TABLE. Rename the constraints, and then rename them back. That |
| -- renames the indexes to the same names they have in the upstream. |
| ALTER TABLE test_replica_identity RENAME CONSTRAINT test_replica_identity_unique_defer TO x; |
| ALTER TABLE test_replica_identity RENAME CONSTRAINT x TO test_replica_identity_unique_defer; |
| ALTER TABLE test_replica_identity RENAME CONSTRAINT test_replica_identity_unique_nondefer TO x; |
| ALTER TABLE test_replica_identity RENAME CONSTRAINT x TO test_replica_identity_unique_nondefer; |
| |
| CREATE TABLE test_replica_identity_othertable (id serial primary key); |
| |
| CREATE INDEX test_replica_identity_keyab ON test_replica_identity (keya, keyb); |
| CREATE UNIQUE INDEX test_replica_identity_keyab_key ON test_replica_identity (keya, keyb); |
| CREATE UNIQUE INDEX test_replica_identity_nonkey ON test_replica_identity (keya, nonkey); |
| CREATE INDEX test_replica_identity_hash ON test_replica_identity USING hash (nonkey); |
| CREATE UNIQUE INDEX test_replica_identity_expr ON test_replica_identity (keya, keyb, (3)); |
| CREATE UNIQUE INDEX test_replica_identity_partial ON test_replica_identity (keya, keyb) WHERE keyb != '3'; |
| |
| -- default is 'd'/DEFAULT for user created tables |
| SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; |
| -- but 'none' for system tables |
| SELECT relreplident FROM pg_class WHERE oid = 'pg_class'::regclass; |
| SELECT relreplident FROM pg_class WHERE oid = 'pg_constraint'::regclass; |
| |
| ---- |
| -- Make sure we detect ineligible indexes |
| ---- |
| |
| -- fail, not unique |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab; |
| -- fail, not a candidate key, nullable column |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_nonkey; |
| -- fail, hash indexes cannot do uniqueness |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_hash; |
| -- fail, expression index |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_expr; |
| -- fail, partial index |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_partial; |
| -- fail, not our index |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_othertable_pkey; |
| -- fail, deferrable |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_defer; |
| |
| SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; |
| |
| ---- |
| -- Make sure index cases succeed |
| ---- |
| |
| -- succeed, primary key |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_pkey; |
| SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; |
| \d test_replica_identity |
| |
| -- succeed, nondeferrable unique constraint over nonnullable cols |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_nondefer; |
| |
| -- succeed unique index over nonnullable cols |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab_key; |
| ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_keyab_key; |
| SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; |
| \d test_replica_identity |
| SELECT count(*) FROM pg_index WHERE indrelid = 'test_replica_identity'::regclass AND indisreplident; |
| |
| ---- |
| -- Make sure non index cases work |
| ---- |
| ALTER TABLE test_replica_identity REPLICA IDENTITY DEFAULT; |
| SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; |
| SELECT count(*) FROM pg_index WHERE indrelid = 'test_replica_identity'::regclass AND indisreplident; |
| |
| ALTER TABLE test_replica_identity REPLICA IDENTITY FULL; |
| SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; |
| \d+ test_replica_identity |
| ALTER TABLE test_replica_identity REPLICA IDENTITY NOTHING; |
| SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; |
| |
| --- |
| -- Test that ALTER TABLE rewrite preserves nondefault replica identity |
| --- |
| |
| -- constraint variant |
| CREATE TABLE test_replica_identity2 (id int UNIQUE NOT NULL); |
| ALTER TABLE test_replica_identity2 REPLICA IDENTITY USING INDEX test_replica_identity2_id_key; |
| \d test_replica_identity2 |
| ALTER TABLE test_replica_identity2 ALTER COLUMN id TYPE bigint; |
| \d test_replica_identity2 |
| |
| -- straight index variant |
| CREATE TABLE test_replica_identity3 (id int NOT NULL); |
| CREATE UNIQUE INDEX test_replica_identity3_id_key ON test_replica_identity3 (id); |
| ALTER TABLE test_replica_identity3 REPLICA IDENTITY USING INDEX test_replica_identity3_id_key; |
| \d test_replica_identity3 |
| ALTER TABLE test_replica_identity3 ALTER COLUMN id TYPE bigint; |
| \d test_replica_identity3 |
| |
| -- ALTER TABLE DROP NOT NULL is not allowed for columns part of an index |
| -- used as replica identity. |
| ALTER TABLE test_replica_identity3 ALTER COLUMN id DROP NOT NULL; |
| |
| -- |
| -- Test that replica identity can be set on an index that's not yet valid. |
| -- (This matches the way pg_dump will try to dump a partitioned table.) |
| -- |
| CREATE TABLE test_replica_identity4(id integer NOT NULL) PARTITION BY LIST (id); |
| CREATE TABLE test_replica_identity4_1(id integer NOT NULL); |
| ALTER TABLE ONLY test_replica_identity4 |
| ATTACH PARTITION test_replica_identity4_1 FOR VALUES IN (1); |
| ALTER TABLE ONLY test_replica_identity4 |
| ADD CONSTRAINT test_replica_identity4_pkey PRIMARY KEY (id); |
| ALTER TABLE ONLY test_replica_identity4 |
| REPLICA IDENTITY USING INDEX test_replica_identity4_pkey; |
| ALTER TABLE ONLY test_replica_identity4_1 |
| ADD CONSTRAINT test_replica_identity4_1_pkey PRIMARY KEY (id); |
| \d+ test_replica_identity4 |
| ALTER INDEX test_replica_identity4_pkey |
| ATTACH PARTITION test_replica_identity4_1_pkey; |
| \d+ test_replica_identity4 |
| |
| DROP TABLE test_replica_identity; |
| DROP TABLE test_replica_identity2; |
| DROP TABLE test_replica_identity3; |
| DROP TABLE test_replica_identity4; |
| DROP TABLE test_replica_identity_othertable; |