Enable failure to rename a partitioned index
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 26 Jun 2018 15:28:41 +0000 (11:28 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 26 Jun 2018 15:54:45 +0000 (11:54 -0400)
Concurrently with partitioned index development (commit 8b08f7d4820f),
the code to handle failure to rename indexes was refactored (commit
8b9e9644dc6a).  Turns out that that particular case was untested, which
naturally led it to be broken.  Add tests and the missing code line.

Co-authored-by: David Rowley <dgrowley@gmail.com>
Co-authored-by: Álvaro Herrera <alvherre@alvh.no-ip.org>
Reported-by: Rajkumar Raghuwanshi <rajkumar.raghuwanshi@enterprisedb.com>
Discussion: https://postgr.es/m/CAKcux6mfYMS3OX0ywjOiWiGSEKhJf-1zdeTceHFbd0mScUzU5A@mail.gmail.com

src/backend/catalog/objectaddress.c
src/test/regress/expected/alter_table.out
src/test/regress/expected/object_address.out
src/test/regress/sql/alter_table.sql
src/test/regress/sql/object_address.sql

index ad682673e6aac94d674b80ba3ccba772d2780e50..7db942dcbacbed5e3189d814117dd746819b6224 100644 (file)
@@ -5248,6 +5248,7 @@ get_relkind_objtype(char relkind)
        case RELKIND_PARTITIONED_TABLE:
            return OBJECT_TABLE;
        case RELKIND_INDEX:
+       case RELKIND_PARTITIONED_INDEX:
            return OBJECT_INDEX;
        case RELKIND_SEQUENCE:
            return OBJECT_SEQUENCE;
index b9fd6d1d1c50cfdbfc276341239fc86a55172f4a..df604a326ca4763a9fe4236cec725c5f4ab8c28d 100644 (file)
@@ -159,6 +159,24 @@ SELECT * FROM attmp_new2;
 
 DROP TABLE attmp_new;
 DROP TABLE attmp_new2;
+-- check rename of partitioned tables and indexes also
+CREATE TABLE part_attmp (a int primary key) partition by range (a);
+CREATE TABLE part_attmp1 PARTITION OF part_attmp FOR VALUES FROM (0) TO (100);
+ALTER INDEX part_attmp_pkey RENAME TO part_attmp_index;
+ALTER INDEX part_attmp1_pkey RENAME TO part_attmp1_index;
+ALTER TABLE part_attmp RENAME TO part_at2tmp;
+ALTER TABLE part_attmp1 RENAME TO part_at2tmp1;
+SET ROLE regress_alter_table_user1;
+ALTER INDEX part_attmp_index RENAME TO fail;
+ERROR:  must be owner of index part_attmp_index
+ALTER INDEX part_attmp1_index RENAME TO fail;
+ERROR:  must be owner of index part_attmp1_index
+ALTER TABLE part_at2tmp RENAME TO fail;
+ERROR:  must be owner of table part_at2tmp
+ALTER TABLE part_at2tmp1 RENAME TO fail;
+ERROR:  must be owner of table part_at2tmp1
+RESET ROLE;
+DROP TABLE part_at2tmp;
 --
 -- check renaming to a table's array type's autogenerated name
 -- (the array type's name should get out of the way)
index d195a0d7009e1bac8df782d1da924d8f553c6b59..4085e451e49e4111ebc2637afebee09da35d0901 100644 (file)
@@ -19,6 +19,9 @@ CREATE TEXT SEARCH PARSER addr_ts_prs
 CREATE TABLE addr_nsp.gentable (
    a serial primary key CONSTRAINT a_chk CHECK (a > 0),
    b text DEFAULT 'hello');
+CREATE TABLE addr_nsp.parttable (
+   a int PRIMARY KEY
+) PARTITION BY RANGE (a);
 CREATE VIEW addr_nsp.genview AS SELECT * from addr_nsp.gentable;
 CREATE MATERIALIZED VIEW addr_nsp.genmatview AS SELECT * FROM addr_nsp.gentable;
 CREATE TYPE addr_nsp.gencomptype AS (a int);
@@ -368,7 +371,9 @@ ERROR:  name list length must be exactly 1
 -- test successful cases
 WITH objects (type, name, args) AS (VALUES
                ('table', '{addr_nsp, gentable}'::text[], '{}'::text[]),
+               ('table', '{addr_nsp, parttable}'::text[], '{}'::text[]),
                ('index', '{addr_nsp, gentable_pkey}', '{}'),
+               ('index', '{addr_nsp, parttable_pkey}', '{}'),
                ('sequence', '{addr_nsp, gentable_a_seq}', '{}'),
                -- toast table
                ('view', '{addr_nsp, genview}', '{}'),
@@ -444,6 +449,8 @@ SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*,
  table                     | addr_nsp   | gentable          | addr_nsp.gentable                                                    | t
  table column              | addr_nsp   | gentable          | addr_nsp.gentable.b                                                  | t
  index                     | addr_nsp   | gentable_pkey     | addr_nsp.gentable_pkey                                               | t
+ table                     | addr_nsp   | parttable         | addr_nsp.parttable                                                   | t
+ index                     | addr_nsp   | parttable_pkey    | addr_nsp.parttable_pkey                                              | t
  view                      | addr_nsp   | genview           | addr_nsp.genview                                                     | t
  materialized view         | addr_nsp   | genmatview        | addr_nsp.genmatview                                                  | t
  foreign table             | addr_nsp   | genftable         | addr_nsp.genftable                                                   | t
@@ -478,7 +485,7 @@ SELECT (pg_identify_object(addr1.classid, addr1.objid, addr1.objsubid)).*,
  subscription              |            | addr_sub          | addr_sub                                                             | t
  publication               |            | addr_pub          | addr_pub                                                             | t
  publication relation      |            |                   | addr_nsp.gentable in publication addr_pub                            | t
-(47 rows)
+(49 rows)
 
 ---
 --- Cleanup resources
@@ -489,6 +496,6 @@ NOTICE:  drop cascades to 4 other objects
 DROP PUBLICATION addr_pub;
 DROP SUBSCRIPTION addr_sub;
 DROP SCHEMA addr_nsp CASCADE;
-NOTICE:  drop cascades to 13 other objects
+NOTICE:  drop cascades to 14 other objects
 DROP OWNED BY regress_addr_user;
 DROP USER regress_addr_user;
index 3a5b80ea815e81e828f0066fb3f7633b154cc2df..22cf4ef0a764481d4ef36c47f34fcf2e0d2c25f6 100644 (file)
@@ -191,6 +191,21 @@ SELECT * FROM attmp_new2;
 DROP TABLE attmp_new;
 DROP TABLE attmp_new2;
 
+-- check rename of partitioned tables and indexes also
+CREATE TABLE part_attmp (a int primary key) partition by range (a);
+CREATE TABLE part_attmp1 PARTITION OF part_attmp FOR VALUES FROM (0) TO (100);
+ALTER INDEX part_attmp_pkey RENAME TO part_attmp_index;
+ALTER INDEX part_attmp1_pkey RENAME TO part_attmp1_index;
+ALTER TABLE part_attmp RENAME TO part_at2tmp;
+ALTER TABLE part_attmp1 RENAME TO part_at2tmp1;
+SET ROLE regress_alter_table_user1;
+ALTER INDEX part_attmp_index RENAME TO fail;
+ALTER INDEX part_attmp1_index RENAME TO fail;
+ALTER TABLE part_at2tmp RENAME TO fail;
+ALTER TABLE part_at2tmp1 RENAME TO fail;
+RESET ROLE;
+DROP TABLE part_at2tmp;
+
 --
 -- check renaming to a table's array type's autogenerated name
 -- (the array type's name should get out of the way)
index 55faa71edfb87ffd10e03895d0bced9223c4744c..d7df322873dae941017880220f8cb64e7bd40838 100644 (file)
@@ -22,6 +22,9 @@ CREATE TEXT SEARCH PARSER addr_ts_prs
 CREATE TABLE addr_nsp.gentable (
    a serial primary key CONSTRAINT a_chk CHECK (a > 0),
    b text DEFAULT 'hello');
+CREATE TABLE addr_nsp.parttable (
+   a int PRIMARY KEY
+) PARTITION BY RANGE (a);
 CREATE VIEW addr_nsp.genview AS SELECT * from addr_nsp.gentable;
 CREATE MATERIALIZED VIEW addr_nsp.genmatview AS SELECT * FROM addr_nsp.gentable;
 CREATE TYPE addr_nsp.gencomptype AS (a int);
@@ -138,7 +141,9 @@ SELECT pg_get_object_address('subscription', '{one,two}', '{}');
 -- test successful cases
 WITH objects (type, name, args) AS (VALUES
                ('table', '{addr_nsp, gentable}'::text[], '{}'::text[]),
+               ('table', '{addr_nsp, parttable}'::text[], '{}'::text[]),
                ('index', '{addr_nsp, gentable_pkey}', '{}'),
+               ('index', '{addr_nsp, parttable_pkey}', '{}'),
                ('sequence', '{addr_nsp, gentable_a_seq}', '{}'),
                -- toast table
                ('view', '{addr_nsp, genview}', '{}'),