mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Diagnose !indisvalid in more SQL functions.
pgstatindex failed with ERRCODE_DATA_CORRUPTED, of the "can't-happen" class XX. The other functions succeeded on an empty index; they might have malfunctioned if the failed index build left torn I/O or other complex state. Report an ERROR in statistics functions pgstatindex, pgstatginindex, pgstathashindex, and pgstattuple. Report DEBUG1 and skip all index I/O in maintenance functions brin_desummarize_range, brin_summarize_new_values, brin_summarize_range, and gin_clean_pending_list. Back-patch to v11 (all supported versions). Discussion: https://postgr.es/m/20231001195309.a3@google.com
This commit is contained in:
@ -237,6 +237,18 @@ pgstatindex_impl(Relation rel, FunctionCallInfo fcinfo)
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("cannot access temporary tables of other sessions")));
|
||||
|
||||
/*
|
||||
* A !indisready index could lead to ERRCODE_DATA_CORRUPTED later, so exit
|
||||
* early. We're capable of assessing an indisready&&!indisvalid index,
|
||||
* but the results could be confusing. For example, the index's size
|
||||
* could be too low for a valid index of the table.
|
||||
*/
|
||||
if (!rel->rd_index->indisvalid)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("index \"%s\" is not valid",
|
||||
RelationGetRelationName(rel))));
|
||||
|
||||
/*
|
||||
* Read metapage
|
||||
*/
|
||||
@ -523,6 +535,13 @@ pgstatginindex_internal(Oid relid, FunctionCallInfo fcinfo)
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("cannot access temporary indexes of other sessions")));
|
||||
|
||||
/* see pgstatindex_impl */
|
||||
if (!rel->rd_index->indisvalid)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("index \"%s\" is not valid",
|
||||
RelationGetRelationName(rel))));
|
||||
|
||||
/*
|
||||
* Read metapage
|
||||
*/
|
||||
@ -600,6 +619,13 @@ pgstathashindex(PG_FUNCTION_ARGS)
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("cannot access temporary indexes of other sessions")));
|
||||
|
||||
/* see pgstatindex_impl */
|
||||
if (!rel->rd_index->indisvalid)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("index \"%s\" is not valid",
|
||||
RelationGetRelationName(rel))));
|
||||
|
||||
/* Get the information we need from the metapage. */
|
||||
memset(&stats, 0, sizeof(stats));
|
||||
metabuf = _hash_getbuf(rel, HASH_METAPAGE, HASH_READ, LH_META_PAGE);
|
||||
|
@ -259,6 +259,13 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo)
|
||||
}
|
||||
else if (rel->rd_rel->relkind == RELKIND_INDEX)
|
||||
{
|
||||
/* see pgstatindex_impl */
|
||||
if (!rel->rd_index->indisvalid)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||
errmsg("index \"%s\" is not valid",
|
||||
RelationGetRelationName(rel))));
|
||||
|
||||
switch (rel->rd_rel->relam)
|
||||
{
|
||||
case BTREE_AM_OID:
|
||||
|
Reference in New Issue
Block a user