@@ -59,19 +59,19 @@ PG_FUNCTION_INFO_V1(pg_relpages);
5959typedef struct BTIndexStat
6060{
6161 uint32 version ;
62- BlockNumber root_blkno ;
6362 uint32 level ;
63+ BlockNumber root_blkno ;
6464
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 ;
7070
71- uint32 max_avail ;
72- uint32 free_space ;
71+ uint64 max_avail ;
72+ uint64 free_space ;
7373
74- uint32 fragments ;
74+ uint64 fragments ;
7575} BTIndexStat ;
7676
7777/* ------------------------------------------------------
@@ -87,8 +87,8 @@ pgstatindex(PG_FUNCTION_ARGS)
8787 Relation rel ;
8888 RangeVar * relrv ;
8989 Datum result ;
90- uint32 nblocks ;
91- uint32 blkno ;
90+ BlockNumber nblocks ;
91+ BlockNumber blkno ;
9292 BTIndexStat indexStat ;
9393
9494 if (!superuser ())
@@ -112,30 +112,29 @@ pgstatindex(PG_FUNCTION_ARGS)
112112 BTMetaPageData * metad = BTPageGetMeta (page );
113113
114114 indexStat .version = metad -> btm_version ;
115- indexStat .root_blkno = metad -> btm_root ;
116115 indexStat .level = metad -> btm_level ;
116+ indexStat .root_blkno = metad -> btm_root ;
117117
118118 ReleaseBuffer (buffer );
119119 }
120120
121- nblocks = RelationGetNumberOfBlocks (rel );
122-
123- /* -- init stat -- */
124- indexStat .fragments = 0 ;
125-
121+ /* -- init counters -- */
126122 indexStat .root_pages = 0 ;
127- indexStat .leaf_pages = 0 ;
128123 indexStat .internal_pages = 0 ;
124+ indexStat .leaf_pages = 0 ;
129125 indexStat .empty_pages = 0 ;
130126 indexStat .deleted_pages = 0 ;
131127
132128 indexStat .max_avail = 0 ;
133129 indexStat .free_space = 0 ;
134130
135- /*-----------------------
136- * Scan all blocks
137- *-----------------------
131+ indexStat .fragments = 0 ;
132+
133+ /*
134+ * Scan all blocks except the metapage
138135 */
136+ nblocks = RelationGetNumberOfBlocks (rel );
137+
139138 for (blkno = 1 ; blkno < nblocks ; blkno ++ )
140139 {
141140 Buffer buffer ;
@@ -151,13 +150,7 @@ pgstatindex(PG_FUNCTION_ARGS)
151150
152151 /* Determine page type, and update totals */
153152
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 ))
161154 {
162155 int max_avail ;
163156
@@ -174,9 +167,12 @@ pgstatindex(PG_FUNCTION_ARGS)
174167 if (opaque -> btpo_next != P_NONE && opaque -> btpo_next < blkno )
175168 indexStat .fragments ++ ;
176169 }
170+ else if (P_ISDELETED (opaque ))
171+ indexStat .deleted_pages ++ ;
172+ else if (P_IGNORE (opaque ))
173+ indexStat .empty_pages ++ ;
177174 else if (P_ISROOT (opaque ))
178175 indexStat .root_pages ++ ;
179-
180176 else
181177 indexStat .internal_pages ++ ;
182178
@@ -207,25 +203,26 @@ pgstatindex(PG_FUNCTION_ARGS)
207203 values [j ] = palloc (32 );
208204 snprintf (values [j ++ ], 32 , "%d" , indexStat .level );
209205 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 );
215212 values [j ] = palloc (32 );
216- snprintf (values [j ++ ], 32 , "%d " , indexStat .root_blkno );
213+ snprintf (values [j ++ ], 32 , "%u " , indexStat .root_blkno );
217214 values [j ] = palloc (32 );
218- snprintf (values [j ++ ], 32 , "%d" , indexStat .internal_pages );
215+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .internal_pages );
219216 values [j ] = palloc (32 );
220- snprintf (values [j ++ ], 32 , "%d" , indexStat .leaf_pages );
217+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .leaf_pages );
221218 values [j ] = palloc (32 );
222- snprintf (values [j ++ ], 32 , "%d" , indexStat .empty_pages );
219+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .empty_pages );
223220 values [j ] = palloc (32 );
224- snprintf (values [j ++ ], 32 , "%d" , indexStat .deleted_pages );
221+ snprintf (values [j ++ ], 32 , INT64_FORMAT , indexStat .deleted_pages );
225222 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 );
227224 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 );
229226
230227 tuple = BuildTupleFromCStrings (TupleDescGetAttInMetadata (tupleDesc ),
231228 values );
@@ -249,9 +246,9 @@ Datum
249246pg_relpages (PG_FUNCTION_ARGS )
250247{
251248 text * relname = PG_GETARG_TEXT_P (0 );
249+ int64 relpages ;
252250 Relation rel ;
253251 RangeVar * relrv ;
254- int4 relpages ;
255252
256253 if (!superuser ())
257254 ereport (ERROR ,
@@ -265,5 +262,5 @@ pg_relpages(PG_FUNCTION_ARGS)
265262
266263 relation_close (rel , AccessShareLock );
267264
268- PG_RETURN_INT32 (relpages );
265+ PG_RETURN_INT64 (relpages );
269266}
0 commit comments