PostgreSQL Source Code git master
Loading...
Searching...
No Matches
relation_stats.c File Reference
#include "postgres.h"
#include "access/heapam.h"
#include "catalog/indexing.h"
#include "catalog/namespace.h"
#include "nodes/makefuncs.h"
#include "statistics/stat_utils.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
#include "utils/fmgrprotos.h"
#include "utils/lsyscache.h"
#include "utils/syscache.h"
Include dependency graph for relation_stats.c:

Go to the source code of this file.

Enumerations

enum  relation_stats_argnum {
  RELSCHEMA_ARG = 0 , RELNAME_ARG , RELPAGES_ARG , RELTUPLES_ARG ,
  RELALLVISIBLE_ARG , RELALLFROZEN_ARG , NUM_RELATION_STATS_ARGS
}
 

Functions

static bool relation_statistics_update (FunctionCallInfo fcinfo)
 
Datum pg_clear_relation_stats (PG_FUNCTION_ARGS)
 
Datum pg_restore_relation_stats (PG_FUNCTION_ARGS)
 

Variables

static struct StatsArgInfo relarginfo []
 

Enumeration Type Documentation

◆ relation_stats_argnum

Enumerator
RELSCHEMA_ARG 
RELNAME_ARG 
RELPAGES_ARG 
RELTUPLES_ARG 
RELALLVISIBLE_ARG 
RELALLFROZEN_ARG 
NUM_RELATION_STATS_ARGS 

Definition at line 37 of file relation_stats.c.

38{
39 RELSCHEMA_ARG = 0,
46};
@ RELALLVISIBLE_ARG
@ RELSCHEMA_ARG
@ RELNAME_ARG
@ RELPAGES_ARG
@ RELALLFROZEN_ARG
@ RELTUPLES_ARG
@ NUM_RELATION_STATS_ARGS

Function Documentation

◆ pg_clear_relation_stats()

Datum pg_clear_relation_stats ( PG_FUNCTION_ARGS  )

Definition at line 202 of file relation_stats.c.

203{
205
207
208 newfcinfo->args[0].value = PG_GETARG_DATUM(0);
209 newfcinfo->args[0].isnull = PG_ARGISNULL(0);
210 newfcinfo->args[1].value = PG_GETARG_DATUM(1);
211 newfcinfo->args[1].isnull = PG_ARGISNULL(1);
212 newfcinfo->args[2].value = UInt32GetDatum(0);
213 newfcinfo->args[2].isnull = false;
214 newfcinfo->args[3].value = Float4GetDatum(-1.0);
215 newfcinfo->args[3].isnull = false;
216 newfcinfo->args[4].value = UInt32GetDatum(0);
217 newfcinfo->args[4].isnull = false;
218 newfcinfo->args[5].value = UInt32GetDatum(0);
219 newfcinfo->args[5].isnull = false;
220
223}
#define PG_RETURN_VOID()
Definition fmgr.h:350
#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo)
Definition fmgr.h:150
#define PG_ARGISNULL(n)
Definition fmgr.h:209
#define PG_GETARG_DATUM(n)
Definition fmgr.h:268
#define LOCAL_FCINFO(name, nargs)
Definition fmgr.h:110
static Datum Float4GetDatum(float4 X)
Definition postgres.h:478
static Datum UInt32GetDatum(uint32 X)
Definition postgres.h:242
#define InvalidOid
static int fb(int x)
static bool relation_statistics_update(FunctionCallInfo fcinfo)

References fb(), Float4GetDatum(), InitFunctionCallInfoData, InvalidOid, LOCAL_FCINFO, PG_ARGISNULL, PG_GETARG_DATUM, PG_RETURN_VOID, relation_statistics_update(), and UInt32GetDatum().

◆ pg_restore_relation_stats()

Datum pg_restore_relation_stats ( PG_FUNCTION_ARGS  )

Definition at line 226 of file relation_stats.c.

227{
229 bool result = true;
230
234
236 relarginfo))
237 result = false;
238
240 result = false;
241
242 PG_RETURN_BOOL(result);
243}
#define PG_RETURN_BOOL(x)
Definition fmgr.h:360
static struct StatsArgInfo relarginfo[]
bool stats_fill_fcinfo_from_arg_pairs(FunctionCallInfo pairs_fcinfo, FunctionCallInfo positional_fcinfo, struct StatsArgInfo *arginfo)
Definition stat_utils.c:348

References fb(), InitFunctionCallInfoData, InvalidOid, LOCAL_FCINFO, NUM_RELATION_STATS_ARGS, PG_RETURN_BOOL, relarginfo, relation_statistics_update(), and stats_fill_fcinfo_from_arg_pairs().

◆ relation_statistics_update()

static bool relation_statistics_update ( FunctionCallInfo  fcinfo)
static

Definition at line 65 of file relation_stats.c.

66{
67 bool result = true;
68 char *nspname;
69 char *relname;
70 Oid reloid;
72 BlockNumber relpages = 0;
73 bool update_relpages = false;
74 float reltuples = 0;
75 bool update_reltuples = false;
76 BlockNumber relallvisible = 0;
77 bool update_relallvisible = false;
78 BlockNumber relallfrozen = 0;
79 bool update_relallfrozen = false;
82 int replaces[4] = {0};
83 Datum values[4] = {0};
84 bool nulls[4] = {0};
85 int nreplaces = 0;
87
90
93
97 errmsg("recovery is in progress"),
98 errhint("Statistics cannot be modified during recovery.")));
99
100 reloid = RangeVarGetRelidExtended(makeRangeVar(nspname, relname, -1),
103
105 {
106 relpages = PG_GETARG_UINT32(RELPAGES_ARG);
107 update_relpages = true;
108 }
109
111 {
112 reltuples = PG_GETARG_FLOAT4(RELTUPLES_ARG);
113 if (reltuples < -1.0)
114 {
117 errmsg("argument \"%s\" must not be less than -1.0", "reltuples")));
118 result = false;
119 }
120 else
121 update_reltuples = true;
122 }
123
125 {
126 relallvisible = PG_GETARG_UINT32(RELALLVISIBLE_ARG);
128 }
129
131 {
132 relallfrozen = PG_GETARG_UINT32(RELALLFROZEN_ARG);
133 update_relallfrozen = true;
134 }
135
136 /*
137 * Take RowExclusiveLock on pg_class, consistent with
138 * vac_update_relstats().
139 */
141
144 elog(ERROR, "pg_class entry for relid %u not found", reloid);
145
147
148 if (update_relpages && relpages != pgcform->relpages)
149 {
151 values[nreplaces] = UInt32GetDatum(relpages);
152 nreplaces++;
153 }
154
155 if (update_reltuples && reltuples != pgcform->reltuples)
156 {
158 values[nreplaces] = Float4GetDatum(reltuples);
159 nreplaces++;
160 }
161
162 if (update_relallvisible && relallvisible != pgcform->relallvisible)
163 {
165 values[nreplaces] = UInt32GetDatum(relallvisible);
166 nreplaces++;
167 }
168
169 if (update_relallfrozen && relallfrozen != pgcform->relallfrozen)
170 {
172 values[nreplaces] = UInt32GetDatum(relallfrozen);
173 nreplaces++;
174 }
175
176 if (nreplaces > 0)
177 {
180
182 replaces, values, nulls);
185 }
186
188
189 /* release the lock, consistent with vac_update_relstats() */
191
193
194 return result;
195}
uint32 BlockNumber
Definition block.h:31
static Datum values[MAXATTR]
Definition bootstrap.c:155
#define TextDatumGetCString(d)
Definition builtins.h:98
int errhint(const char *fmt,...)
Definition elog.c:1330
int errcode(int sqlerrcode)
Definition elog.c:863
int errmsg(const char *fmt,...)
Definition elog.c:1080
#define WARNING
Definition elog.h:36
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
#define ereport(elevel,...)
Definition elog.h:150
#define PG_GETARG_UINT32(n)
Definition fmgr.h:270
#define PG_GETARG_FLOAT4(n)
Definition fmgr.h:282
HeapTuple heap_modify_tuple_by_cols(HeapTuple tuple, TupleDesc tupleDesc, int nCols, const int *replCols, const Datum *replValues, const bool *replIsnull)
Definition heaptuple.c:1278
void heap_freetuple(HeapTuple htup)
Definition heaptuple.c:1435
#define HeapTupleIsValid(tuple)
Definition htup.h:78
static void * GETSTRUCT(const HeapTupleData *tuple)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
Definition indexing.c:313
#define ShareUpdateExclusiveLock
Definition lockdefs.h:39
#define RowExclusiveLock
Definition lockdefs.h:38
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
Definition makefuncs.c:473
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
Definition namespace.c:440
NameData relname
Definition pg_class.h:38
FormData_pg_class * Form_pg_class
Definition pg_class.h:156
static Datum ObjectIdGetDatum(Oid X)
Definition postgres.h:262
uint64_t Datum
Definition postgres.h:70
unsigned int Oid
#define RelationGetDescr(relation)
Definition rel.h:540
void RangeVarCallbackForStats(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
Definition stat_utils.c:142
void stats_check_required_arg(FunctionCallInfo fcinfo, struct StatsArgInfo *arginfo, int argnum)
Definition stat_utils.c:51
void ReleaseSysCache(HeapTuple tuple)
Definition syscache.c:264
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition syscache.c:220
void table_close(Relation relation, LOCKMODE lockmode)
Definition table.c:126
Relation table_open(Oid relationId, LOCKMODE lockmode)
Definition table.c:40
void CommandCounterIncrement(void)
Definition xact.c:1101
bool RecoveryInProgress(void)
Definition xlog.c:6460

References CatalogTupleUpdate(), CommandCounterIncrement(), elog, ereport, errcode(), errhint(), errmsg(), ERROR, fb(), Float4GetDatum(), GETSTRUCT(), heap_freetuple(), heap_modify_tuple_by_cols(), HeapTupleIsValid, InvalidOid, makeRangeVar(), ObjectIdGetDatum(), PG_ARGISNULL, PG_GETARG_DATUM, PG_GETARG_FLOAT4, PG_GETARG_UINT32, RangeVarCallbackForStats(), RangeVarGetRelidExtended(), RecoveryInProgress(), RELALLFROZEN_ARG, RELALLVISIBLE_ARG, relarginfo, RelationGetDescr, ReleaseSysCache(), relname, RELNAME_ARG, RELPAGES_ARG, RELSCHEMA_ARG, RELTUPLES_ARG, RowExclusiveLock, SearchSysCache1(), ShareUpdateExclusiveLock, stats_check_required_arg(), table_close(), table_open(), TextDatumGetCString, UInt32GetDatum(), values, and WARNING.

Referenced by pg_clear_relation_stats(), and pg_restore_relation_stats().

Variable Documentation

◆ relarginfo

struct StatsArgInfo relarginfo[]
static
Initial value:
=
{
[RELSCHEMA_ARG] = {"schemaname", TEXTOID},
[RELNAME_ARG] = {"relname", TEXTOID},
[RELPAGES_ARG] = {"relpages", INT4OID},
[RELTUPLES_ARG] = {"reltuples", FLOAT4OID},
[RELALLVISIBLE_ARG] = {"relallvisible", INT4OID},
[RELALLFROZEN_ARG] = {"relallfrozen", INT4OID},
}

Definition at line 48 of file relation_stats.c.

49{
50 [RELSCHEMA_ARG] = {"schemaname", TEXTOID},
51 [RELNAME_ARG] = {"relname", TEXTOID},
52 [RELPAGES_ARG] = {"relpages", INT4OID},
53 [RELTUPLES_ARG] = {"reltuples", FLOAT4OID},
54 [RELALLVISIBLE_ARG] = {"relallvisible", INT4OID},
55 [RELALLFROZEN_ARG] = {"relallfrozen", INT4OID},
57};

Referenced by pg_restore_relation_stats(), and relation_statistics_update().