mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Fix pgstattuple functions to use regclass-type as the argument.
This allows us to specify the target relation with several expressions, 'relname', 'schemaname.relname' and OID in all pgstattuple functions. pgstatindex() and pg_relpages() could not accept OID as the argument so far. Per discussion on -hackers, we decided to keep two types of interfaces, with regclass-type and TEXT-type argument, for each pgstattuple function because of the backward-compatibility issue. The functions which have TEXT-type argument will be deprecated in the future release. Patch by Satoshi Nagayasu, reviewed by Rushabh Lathia and Fujii Masao.
This commit is contained in:
@ -39,12 +39,24 @@
|
||||
#include "utils/rel.h"
|
||||
|
||||
|
||||
/*
|
||||
* Because of backward-compatibility issue, we have decided to have
|
||||
* two types of interfaces, with regclass-type input arg and text-type
|
||||
* input arg, for each function.
|
||||
*
|
||||
* Those functions which have text-type input arg will be deprecated
|
||||
* in the future release.
|
||||
*/
|
||||
extern Datum pgstatindex(PG_FUNCTION_ARGS);
|
||||
extern Datum pgstatindexbyid(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_relpages(PG_FUNCTION_ARGS);
|
||||
extern Datum pg_relpagesbyid(PG_FUNCTION_ARGS);
|
||||
extern Datum pgstatginindex(PG_FUNCTION_ARGS);
|
||||
|
||||
PG_FUNCTION_INFO_V1(pgstatindex);
|
||||
PG_FUNCTION_INFO_V1(pgstatindexbyid);
|
||||
PG_FUNCTION_INFO_V1(pg_relpages);
|
||||
PG_FUNCTION_INFO_V1(pg_relpagesbyid);
|
||||
PG_FUNCTION_INFO_V1(pgstatginindex);
|
||||
|
||||
#define IS_INDEX(r) ((r)->rd_rel->relkind == RELKIND_INDEX)
|
||||
@ -97,6 +109,8 @@ typedef struct GinIndexStat
|
||||
int64 pending_tuples;
|
||||
} GinIndexStat;
|
||||
|
||||
static Datum pgstatindex_impl(Relation rel, FunctionCallInfo fcinfo);
|
||||
|
||||
/* ------------------------------------------------------
|
||||
* pgstatindex()
|
||||
*
|
||||
@ -109,11 +123,6 @@ pgstatindex(PG_FUNCTION_ARGS)
|
||||
text *relname = PG_GETARG_TEXT_P(0);
|
||||
Relation rel;
|
||||
RangeVar *relrv;
|
||||
Datum result;
|
||||
BlockNumber nblocks;
|
||||
BlockNumber blkno;
|
||||
BTIndexStat indexStat;
|
||||
BufferAccessStrategy bstrategy = GetAccessStrategy(BAS_BULKREAD);
|
||||
|
||||
if (!superuser())
|
||||
ereport(ERROR,
|
||||
@ -123,6 +132,34 @@ pgstatindex(PG_FUNCTION_ARGS)
|
||||
relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
|
||||
rel = relation_openrv(relrv, AccessShareLock);
|
||||
|
||||
PG_RETURN_DATUM(pgstatindex_impl(rel, fcinfo));
|
||||
}
|
||||
|
||||
Datum
|
||||
pgstatindexbyid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
Relation rel;
|
||||
|
||||
if (!superuser())
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
(errmsg("must be superuser to use pgstattuple functions"))));
|
||||
|
||||
rel = relation_open(relid, AccessShareLock);
|
||||
|
||||
PG_RETURN_DATUM(pgstatindex_impl(rel, fcinfo));
|
||||
}
|
||||
|
||||
static Datum
|
||||
pgstatindex_impl(Relation rel, FunctionCallInfo fcinfo)
|
||||
{
|
||||
Datum result;
|
||||
BlockNumber nblocks;
|
||||
BlockNumber blkno;
|
||||
BTIndexStat indexStat;
|
||||
BufferAccessStrategy bstrategy = GetAccessStrategy(BAS_BULKREAD);
|
||||
|
||||
if (!IS_INDEX(rel) || !IS_BTREE(rel))
|
||||
elog(ERROR, "relation \"%s\" is not a btree index",
|
||||
RelationGetRelationName(rel));
|
||||
@ -274,7 +311,7 @@ pgstatindex(PG_FUNCTION_ARGS)
|
||||
result = HeapTupleGetDatum(tuple);
|
||||
}
|
||||
|
||||
PG_RETURN_DATUM(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------
|
||||
@ -311,6 +348,29 @@ pg_relpages(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT64(relpages);
|
||||
}
|
||||
|
||||
Datum
|
||||
pg_relpagesbyid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid relid = PG_GETARG_OID(0);
|
||||
int64 relpages;
|
||||
Relation rel;
|
||||
|
||||
if (!superuser())
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
(errmsg("must be superuser to use pgstattuple functions"))));
|
||||
|
||||
rel = relation_open(relid, AccessShareLock);
|
||||
|
||||
/* note: this will work OK on non-local temp tables */
|
||||
|
||||
relpages = RelationGetNumberOfBlocks(rel);
|
||||
|
||||
relation_close(rel, AccessShareLock);
|
||||
|
||||
PG_RETURN_INT64(relpages);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------
|
||||
* pgstatginindex()
|
||||
*
|
||||
|
Reference in New Issue
Block a user