@@ -59,19 +59,19 @@ PG_FUNCTION_INFO_V1(pg_relpages);
59
59
typedef struct BTIndexStat
60
60
{
61
61
uint32 version ;
62
- BlockNumber root_blkno ;
63
62
uint32 level ;
63
+ BlockNumber root_blkno ;
64
64
65
- uint32 root_pages ;
66
- uint32 internal_pages ;
67
- uint32 leaf_pages ;
68
- uint32 empty_pages ;
69
- uint32 deleted_pages ;
65
+ uint64 root_pages ;
66
+ uint64 internal_pages ;
67
+ uint64 leaf_pages ;
68
+ uint64 empty_pages ;
69
+ uint64 deleted_pages ;
70
70
71
- uint32 max_avail ;
72
- uint32 free_space ;
71
+ uint64 max_avail ;
72
+ uint64 free_space ;
73
73
74
- uint32 fragments ;
74
+ uint64 fragments ;
75
75
} BTIndexStat ;
76
76
77
77
/* ------------------------------------------------------
@@ -87,8 +87,8 @@ pgstatindex(PG_FUNCTION_ARGS)
87
87
Relation rel ;
88
88
RangeVar * relrv ;
89
89
Datum result ;
90
- uint32 nblocks ;
91
- uint32 blkno ;
90
+ BlockNumber nblocks ;
91
+ BlockNumber blkno ;
92
92
BTIndexStat indexStat ;
93
93
94
94
if (!superuser ())
@@ -112,30 +112,29 @@ pgstatindex(PG_FUNCTION_ARGS)
112
112
BTMetaPageData * metad = BTPageGetMeta (page );
113
113
114
114
indexStat .version = metad -> btm_version ;
115
- indexStat .root_blkno = metad -> btm_root ;
116
115
indexStat .level = metad -> btm_level ;
116
+ indexStat .root_blkno = metad -> btm_root ;
117
117
118
118
ReleaseBuffer (buffer );
119
119
}
120
120
121
- nblocks = RelationGetNumberOfBlocks (rel );
122
-
123
- /* -- init stat -- */
124
- indexStat .fragments = 0 ;
125
-
121
+ /* -- init counters -- */
126
122
indexStat .root_pages = 0 ;
127
- indexStat .leaf_pages = 0 ;
128
123
indexStat .internal_pages = 0 ;
124
+ indexStat .leaf_pages = 0 ;
129
125
indexStat .empty_pages = 0 ;
130
126
indexStat .deleted_pages = 0 ;
131
127
132
128
indexStat .max_avail = 0 ;
133
129
indexStat .free_space = 0 ;
134
130
135
- /*-----------------------
136
- * Scan all blocks
137
- *-----------------------
131
+ indexStat .fragments = 0 ;
132
+
133
+ /*
134
+ * Scan all blocks except the metapage
138
135
*/
136
+ nblocks = RelationGetNumberOfBlocks (rel );
137
+
139
138
for (blkno = 1 ; blkno < nblocks ; blkno ++ )
140
139
{
141
140
Buffer buffer ;
@@ -151,13 +150,7 @@ pgstatindex(PG_FUNCTION_ARGS)
151
150
152
151
/* Determine page type, and update totals */
153
152
154
- if (P_ISDELETED (opaque ))
155
- indexStat .deleted_pages ++ ;
156
-
157
- else if (P_IGNORE (opaque ))
158
- indexStat .empty_pages ++ ;
159
-
160
- else if (P_ISLEAF (opaque ))
153
+ if (P_ISLEAF (opaque ))
161
154
{
162
155
int max_avail ;
163
156
@@ -174,9 +167,12 @@ pgstatindex(PG_FUNCTION_ARGS)
174
167
if (opaque -> btpo_next != P_NONE && opaque -> btpo_next < blkno )
175
168
indexStat .fragments ++ ;
176
169
}
170
+ else if (P_ISDELETED (opaque ))
171
+ indexStat .deleted_pages ++ ;
172
+ else if (P_IGNORE (opaque ))
173
+ indexStat .empty_pages ++ ;
177
174
else if (P_ISROOT (opaque ))
178
175
indexStat .root_pages ++ ;
179
-
180
176
else
181
177
indexStat .internal_pages ++ ;
182
178
@@ -207,25 +203,26 @@ pgstatindex(PG_FUNCTION_ARGS)
207
203
values [j ] = palloc (32 );
208
204
snprintf (values [j ++ ], 32 , "%d" , indexStat .level );
209
205
values [j ] = palloc (32 );
210
- snprintf (values [j ++ ], 32 , "%d" , (indexStat .root_pages +
211
- indexStat .leaf_pages +
212
- indexStat .internal_pages +
213
- indexStat .deleted_pages +
214
- indexStat .empty_pages ) * BLCKSZ );
206
+ snprintf (values [j ++ ], 32 , INT64_FORMAT ,
207
+ (indexStat .root_pages +
208
+ indexStat .leaf_pages +
209
+ indexStat .internal_pages +
210
+ indexStat .deleted_pages +
211
+ indexStat .empty_pages ) * BLCKSZ );
215
212
values [j ] = palloc (32 );
216
- snprintf (values [j ++ ], 32 , "%d " , indexStat .root_blkno );
213
+ snprintf (values [j ++ ], 32 , "%u " , indexStat .root_blkno );
217
214
values [j ] = palloc (32 );
218
- snprintf (values [j ++ ], 32 , "%d" , indexStat .internal_pages );
215
+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .internal_pages );
219
216
values [j ] = palloc (32 );
220
- snprintf (values [j ++ ], 32 , "%d" , indexStat .leaf_pages );
217
+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .leaf_pages );
221
218
values [j ] = palloc (32 );
222
- snprintf (values [j ++ ], 32 , "%d" , indexStat .empty_pages );
219
+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .empty_pages );
223
220
values [j ] = palloc (32 );
224
- snprintf (values [j ++ ], 32 , "%d" , indexStat .deleted_pages );
221
+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .deleted_pages );
225
222
values [j ] = palloc (32 );
226
- snprintf (values [j ++ ], 32 , "%.2f" , 100.0 - (float ) indexStat .free_space / (float ) indexStat .max_avail * 100.0 );
223
+ snprintf (values [j ++ ], 32 , "%.2f" , 100.0 - (double ) indexStat .free_space / (double ) indexStat .max_avail * 100.0 );
227
224
values [j ] = palloc (32 );
228
- snprintf (values [j ++ ], 32 , "%.2f" , (float ) indexStat .fragments / (float ) indexStat .leaf_pages * 100.0 );
225
+ snprintf (values [j ++ ], 32 , "%.2f" , (double ) indexStat .fragments / (double ) indexStat .leaf_pages * 100.0 );
229
226
230
227
tuple = BuildTupleFromCStrings (TupleDescGetAttInMetadata (tupleDesc ),
231
228
values );
@@ -249,9 +246,9 @@ Datum
249
246
pg_relpages (PG_FUNCTION_ARGS )
250
247
{
251
248
text * relname = PG_GETARG_TEXT_P (0 );
249
+ int64 relpages ;
252
250
Relation rel ;
253
251
RangeVar * relrv ;
254
- int4 relpages ;
255
252
256
253
if (!superuser ())
257
254
ereport (ERROR ,
@@ -265,5 +262,5 @@ pg_relpages(PG_FUNCTION_ARGS)
265
262
266
263
relation_close (rel , AccessShareLock );
267
264
268
- PG_RETURN_INT32 (relpages );
265
+ PG_RETURN_INT64 (relpages );
269
266
}
0 commit comments