]> granicus.if.org Git - postgresql/commitdiff
pgstatindex, pageinspect: handle partitioned indexes
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 9 May 2018 17:03:43 +0000 (14:03 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 9 May 2018 17:22:59 +0000 (14:22 -0300)
Commit 8b08f7d4820f failed to update these modules to at least give
non-broken error messages for partitioned indexes.  Add appropriate
error support to them.

Peter G. was complaining about a problem of unfriendly error messages;
while we haven't fixed that yet, subsequent discussion let to discovery
of these unhandled cases.

Author: MichaĆ«l Paquier
Reported-by: Peter Geoghegan
Discussion: https://postgr.es/m/CAH2-WzkOKptQiE51Bh4_xeEHhaBwHkZkGtKizrFMgEkfUuRRQg@mail.gmail.com

contrib/pageinspect/expected/page.out
contrib/pageinspect/rawpage.c
contrib/pageinspect/sql/page.sql
contrib/pgstattuple/expected/pgstattuple.out
contrib/pgstattuple/pgstatindex.c
contrib/pgstattuple/pgstattuple.c
contrib/pgstattuple/sql/pgstattuple.sql

index 5edb650085906b0007905f4cebcee98d9fac21bd..3fcd9fbe6d9edba28c3a70c2d54feeaaaae90513 100644 (file)
@@ -83,10 +83,14 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
 (1 row)
 
 DROP TABLE test1;
--- check that using any of these functions with a partitioned table would fail
+-- check that using any of these functions with a partitioned table or index
+-- would fail
 create table test_partitioned (a int) partition by range (a);
+create index test_partitioned_index on test_partitioned (a);
 select get_raw_page('test_partitioned', 0); -- error about partitioned table
 ERROR:  cannot get raw page from partitioned table "test_partitioned"
+select get_raw_page('test_partitioned_index', 0); -- error about partitioned index
+ERROR:  cannot get raw page from partitioned index "test_partitioned_index"
 -- a regular table which is a member of a partition set should work though
 create table test_part1 partition of test_partitioned for values from ( 1 ) to (100);
 select get_raw_page('test_part1', 0); -- get farther and error about empty table
index 72f1d21e1b76b2595e3c22804b9cdd21fdabe132..d7bf782ccd5703fe082f42cef5d371ce597811da 100644 (file)
@@ -128,6 +128,11 @@ get_raw_page_internal(text *relname, ForkNumber forknum, BlockNumber blkno)
                                (errcode(ERRCODE_WRONG_OBJECT_TYPE),
                                 errmsg("cannot get raw page from partitioned table \"%s\"",
                                                RelationGetRelationName(rel))));
+       if (rel->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("cannot get raw page from partitioned index \"%s\"",
+                                               RelationGetRelationName(rel))));
 
        /*
         * Reject attempts to read non-local temporary relations; we would be
index 8f35830e067a6afc038ebbf22b63289157c7234a..8ac999183752e160fce3202e5524b9ed840c5934 100644 (file)
@@ -33,9 +33,12 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
 
 DROP TABLE test1;
 
--- check that using any of these functions with a partitioned table would fail
+-- check that using any of these functions with a partitioned table or index
+-- would fail
 create table test_partitioned (a int) partition by range (a);
+create index test_partitioned_index on test_partitioned (a);
 select get_raw_page('test_partitioned', 0); -- error about partitioned table
+select get_raw_page('test_partitioned_index', 0); -- error about partitioned index
 
 -- a regular table which is a member of a partition set should work though
 create table test_part1 partition of test_partitioned for values from ( 1 ) to (100);
index 7fe81e9e342418ffd62a3ea4bc6c55fb644cc1e9..9858ea69d49c61c06d9c072f920e547ec50b42b7 100644 (file)
@@ -152,9 +152,12 @@ select pgstatginindex('test_hashidx');
 ERROR:  relation "test_hashidx" is not a GIN index
 -- check that using any of these functions with unsupported relations will fail
 create table test_partitioned (a int) partition by range (a);
+create index test_partitioned_index on test_partitioned(a);
 -- these should all fail
 select pgstattuple('test_partitioned');
 ERROR:  "test_partitioned" (partitioned table) is not supported
+select pgstattuple('test_partitioned_index');
+ERROR:  "test_partitioned_index" (partitioned index) is not supported
 select pgstattuple_approx('test_partitioned');
 ERROR:  "test_partitioned" is not a table or materialized view
 select pg_relpages('test_partitioned');
index 94198f913e545b7b4b3eabaf47638e97c545f65d..db396c8c4b705eb831855b29b3242bddc05ad147 100644 (file)
@@ -604,7 +604,6 @@ pgstathashindex(PG_FUNCTION_ARGS)
                                 errmsg("relation \"%s\" is not a hash index",
                                                RelationGetRelationName(rel))));
 
-
        /*
         * Reject attempts to read non-local temporary relations; we would be
         * likely to get wrong data since we have no visibility into the owning
index b599b6ca21a42541142a9255c982939ccbe96518..6d67bd8271c63c732360910c865956809593f18e 100644 (file)
@@ -296,6 +296,9 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo)
                case RELKIND_PARTITIONED_TABLE:
                        err = "partitioned table";
                        break;
+               case RELKIND_PARTITIONED_INDEX:
+                       err = "partitioned index";
+                       break;
                default:
                        err = "unknown";
                        break;
index a8e341e35181e293f697a250805a5fcd2a3af863..cfa540302da09db78cad9ad422f0f5b9cd9b0ba7 100644 (file)
@@ -64,8 +64,10 @@ select pgstatginindex('test_hashidx');
 
 -- check that using any of these functions with unsupported relations will fail
 create table test_partitioned (a int) partition by range (a);
+create index test_partitioned_index on test_partitioned(a);
 -- these should all fail
 select pgstattuple('test_partitioned');
+select pgstattuple('test_partitioned_index');
 select pgstattuple_approx('test_partitioned');
 select pg_relpages('test_partitioned');
 select pgstatindex('test_partitioned');