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