Commit bef5fcc3 authored by Alvaro Herrera's avatar Alvaro Herrera

pgstatindex, pageinspect: handle partitioned indexes

Commit 8b08f7d4 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
parent c8478f4f
...@@ -83,10 +83,14 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0)); ...@@ -83,10 +83,14 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
(1 row) (1 row)
DROP TABLE test1; 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 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', 0); -- error about partitioned table
ERROR: cannot get raw page from partitioned table "test_partitioned" 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 -- 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); 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 select get_raw_page('test_part1', 0); -- get farther and error about empty table
......
...@@ -128,6 +128,11 @@ get_raw_page_internal(text *relname, ForkNumber forknum, BlockNumber blkno) ...@@ -128,6 +128,11 @@ get_raw_page_internal(text *relname, ForkNumber forknum, BlockNumber blkno)
(errcode(ERRCODE_WRONG_OBJECT_TYPE), (errcode(ERRCODE_WRONG_OBJECT_TYPE),
errmsg("cannot get raw page from partitioned table \"%s\"", errmsg("cannot get raw page from partitioned table \"%s\"",
RelationGetRelationName(rel)))); 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 * Reject attempts to read non-local temporary relations; we would be
......
...@@ -33,9 +33,12 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0)); ...@@ -33,9 +33,12 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
DROP TABLE test1; 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 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', 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 -- 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); create table test_part1 partition of test_partitioned for values from ( 1 ) to (100);
......
...@@ -152,9 +152,12 @@ select pgstatginindex('test_hashidx'); ...@@ -152,9 +152,12 @@ select pgstatginindex('test_hashidx');
ERROR: relation "test_hashidx" is not a GIN index ERROR: relation "test_hashidx" is not a GIN index
-- check that using any of these functions with unsupported relations will fail -- check that using any of these functions with unsupported relations will fail
create table test_partitioned (a int) partition by range (a); create table test_partitioned (a int) partition by range (a);
create index test_partitioned_index on test_partitioned(a);
-- these should all fail -- these should all fail
select pgstattuple('test_partitioned'); select pgstattuple('test_partitioned');
ERROR: "test_partitioned" (partitioned table) is not supported 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'); select pgstattuple_approx('test_partitioned');
ERROR: "test_partitioned" is not a table or materialized view ERROR: "test_partitioned" is not a table or materialized view
select pg_relpages('test_partitioned'); select pg_relpages('test_partitioned');
......
...@@ -604,7 +604,6 @@ pgstathashindex(PG_FUNCTION_ARGS) ...@@ -604,7 +604,6 @@ pgstathashindex(PG_FUNCTION_ARGS)
errmsg("relation \"%s\" is not a hash index", errmsg("relation \"%s\" is not a hash index",
RelationGetRelationName(rel)))); RelationGetRelationName(rel))));
/* /*
* Reject attempts to read non-local temporary relations; we would be * Reject attempts to read non-local temporary relations; we would be
* likely to get wrong data since we have no visibility into the owning * likely to get wrong data since we have no visibility into the owning
......
...@@ -296,6 +296,9 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo) ...@@ -296,6 +296,9 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo)
case RELKIND_PARTITIONED_TABLE: case RELKIND_PARTITIONED_TABLE:
err = "partitioned table"; err = "partitioned table";
break; break;
case RELKIND_PARTITIONED_INDEX:
err = "partitioned index";
break;
default: default:
err = "unknown"; err = "unknown";
break; break;
......
...@@ -64,8 +64,10 @@ select pgstatginindex('test_hashidx'); ...@@ -64,8 +64,10 @@ select pgstatginindex('test_hashidx');
-- check that using any of these functions with unsupported relations will fail -- check that using any of these functions with unsupported relations will fail
create table test_partitioned (a int) partition by range (a); create table test_partitioned (a int) partition by range (a);
create index test_partitioned_index on test_partitioned(a);
-- these should all fail -- these should all fail
select pgstattuple('test_partitioned'); select pgstattuple('test_partitioned');
select pgstattuple('test_partitioned_index');
select pgstattuple_approx('test_partitioned'); select pgstattuple_approx('test_partitioned');
select pg_relpages('test_partitioned'); select pg_relpages('test_partitioned');
select pgstatindex('test_partitioned'); select pgstatindex('test_partitioned');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment