Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit706a308

Browse files
committed
Add relation fork support to pg_relation_size() function. You can now pass
name of a fork ('main' or 'fsm', at the moment) to pg_relation_size() toget the size of a specific fork. Defaults to 'main', if none given.While we're at it, modify pg_relation_size to take a regclass as argument,instead of separate variants taking oid and name. This change istransparent to typical use where the table name is passed as a stringliteral, like pg_relation_size('table'), but will break queries likepg_relation_size(namecol), where namecol is of type name. text-type inputstill works, and using a non-schema-qualified table name is not veryreliable anyway, so this is unlikely to break anyone's queries in practice.
1 parent2cc1633 commit706a308

File tree

6 files changed

+72
-72
lines changed

6 files changed

+72
-72
lines changed

‎doc/src/sgml/func.sgml

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.447 2008/09/11 17:32:33 tgl Exp $ -->
1+
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.448 2008/10/03 07:33:08 heikki Exp $ -->
22

33
<chapter id="functions">
44
<title>Functions and Operators</title>
@@ -12417,7 +12417,7 @@ postgres=# select * from pg_xlogfile_name_offset(pg_stop_backup());
1241712417

1241812418
<tbody>
1241912419
<row>
12420-
<entry><function>pg_column_size</function>(<type>any</type>)</entry>
12420+
<entry><literal><function>pg_column_size</function>(<type>any</type>)</literal></entry>
1242112421
<entry><type>int</type></entry>
1242212422
<entry>Number of bytes used to store a particular value (possibly compressed)</entry>
1242312423
</row>
@@ -12437,19 +12437,22 @@ postgres=# select * from pg_xlogfile_name_offset(pg_stop_backup());
1243712437
</row>
1243812438
<row>
1243912439
<entry>
12440-
<literal><function>pg_relation_size</function>(<type>oid</type>)</literal>
12440+
<literal><function>pg_relation_size</function>(<parameter>relation</parameter> <type>regclass</type>, <parameter>fork</parameter> <type>text</type>)</literal>
1244112441
</entry>
1244212442
<entry><type>bigint</type></entry>
12443-
<entry>Disk space used by the table or index with the specified OID</entry>
12443+
<entry>
12444+
Disk space used by the specified fork, <literal>'main'</literal> or
12445+
<literal>'fsm'</literal>, of a table or index with the specified OID
12446+
or name. The table name can be qualified with a schema name
12447+
</entry>
1244412448
</row>
1244512449
<row>
1244612450
<entry>
12447-
<literal><function>pg_relation_size</function>(<type>text</type>)</literal>
12451+
<literal><function>pg_relation_size</function>(<parameter>relation</parameter> <type>regclass</type>)</literal>
1244812452
</entry>
1244912453
<entry><type>bigint</type></entry>
1245012454
<entry>
12451-
Disk space used by the table or index with the specified name.
12452-
The table name can be qualified with a schema name
12455+
Shorthand for <literal>pg_relation_size(..., 'main')</literal>
1245312456
</entry>
1245412457
</row>
1245512458
<row>
@@ -12475,21 +12478,11 @@ postgres=# select * from pg_xlogfile_name_offset(pg_stop_backup());
1247512478
</row>
1247612479
<row>
1247712480
<entry>
12478-
<literal><function>pg_total_relation_size</function>(<type>oid</type>)</literal>
12479-
</entry>
12480-
<entry><type>bigint</type></entry>
12481-
<entry>
12482-
Total disk space used by the table with the specified OID,
12483-
including indexes and toasted data
12484-
</entry>
12485-
</row>
12486-
<row>
12487-
<entry>
12488-
<literal><function>pg_total_relation_size</function>(<type>text</type>)</literal>
12481+
<literal><function>pg_total_relation_size</function>(<type>regclass</type>)</literal>
1248912482
</entry>
1249012483
<entry><type>bigint</type></entry>
1249112484
<entry>
12492-
Total disk space used by the table with the specified name,
12485+
Total disk space used by the table with the specifiedOID orname,
1249312486
including indexes and toasted data. The table name can be
1249412487
qualified with a schema name
1249512488
</entry>
@@ -12511,7 +12504,12 @@ postgres=# select * from pg_xlogfile_name_offset(pg_stop_backup());
1251112504

1251212505
<para>
1251312506
<function>pg_relation_size</> accepts the OID or name of a table, index or
12514-
toast table, and returns the size in bytes.
12507+
toast table, and returns the size in bytes. Specifying
12508+
<literal>'main'</literal> or leaving out the second argument returns the
12509+
size of the main data fork of the relation. Specifying
12510+
<literal>'fsm'</literal> returns the size of the
12511+
Free Space Map (see <xref linkend="storage-fsm">) associated with the
12512+
relation.
1251512513
</para>
1251612514

1251712515
<para>

‎src/backend/utils/adt/dbsize.c

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Copyright (c) 2002-2008, PostgreSQL Global Development Group
66
*
77
* IDENTIFICATION
8-
* $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.20 2008/08/11 11:05:11 heikki Exp $
8+
* $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.21 2008/10/03 07:33:09 heikki Exp $
99
*
1010
*/
1111

@@ -248,15 +248,14 @@ pg_tablespace_size_name(PG_FUNCTION_ARGS)
248248
* calculate size of a relation
249249
*/
250250
staticint64
251-
calculate_relation_size(RelFileNode*rfn)
251+
calculate_relation_size(RelFileNode*rfn,ForkNumberforknum)
252252
{
253253
int64totalsize=0;
254254
char*relationpath;
255255
charpathname[MAXPGPATH];
256256
unsignedintsegcount=0;
257257

258-
/* XXX: This ignores the other forks. */
259-
relationpath=relpath(*rfn,MAIN_FORKNUM);
258+
relationpath=relpath(*rfn,forknum);
260259

261260
for (segcount=0;;segcount++)
262261
{
@@ -284,34 +283,47 @@ calculate_relation_size(RelFileNode *rfn)
284283
returntotalsize;
285284
}
286285

287-
Datum
288-
pg_relation_size_oid(PG_FUNCTION_ARGS)
289-
{
290-
OidrelOid=PG_GETARG_OID(0);
291-
Relationrel;
292-
int64size;
293286

294-
rel=relation_open(relOid,AccessShareLock);
287+
/*
288+
* XXX: Consider making this global and moving elsewhere. But currently
289+
* there's no other users for this.
290+
*
291+
* Remember to also update the errhint below if you add entries, and the
292+
* documentation for pg_relation_size().
293+
*/
294+
staticchar*forkNames[]= {
295+
"main",/* MAIN_FORKNUM */
296+
"fsm"/* FSM_FORKNUM */
297+
};
295298

296-
size=calculate_relation_size(&(rel->rd_node));
299+
staticForkNumber
300+
forkname_to_number(char*forkName)
301+
{
302+
ForkNumberforkNum;
297303

298-
relation_close(rel,AccessShareLock);
304+
for (forkNum=0;forkNum <=MAX_FORKNUM;forkNum++)
305+
if (strcmp(forkNames[forkNum],forkName)==0)
306+
returnforkNum;
299307

300-
PG_RETURN_INT64(size);
308+
ereport(ERROR,
309+
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
310+
errmsg("invalid fork name"),
311+
errhint("Valid fork names are 'main' and 'fsm'")));
312+
returnInvalidForkNumber;/* keep compiler quiet */
301313
}
302314

303315
Datum
304-
pg_relation_size_name(PG_FUNCTION_ARGS)
316+
pg_relation_size(PG_FUNCTION_ARGS)
305317
{
306-
text*relname=PG_GETARG_TEXT_P(0);
307-
RangeVar*relrv;
318+
OidrelOid=PG_GETARG_OID(0);
319+
text*forkName=PG_GETARG_TEXT_P(1);
308320
Relationrel;
309321
int64size;
310322

311-
relrv=makeRangeVarFromNameList(textToQualifiedNameList(relname));
312-
rel=relation_openrv(relrv,AccessShareLock);
323+
rel=relation_open(relOid,AccessShareLock);
313324

314-
size=calculate_relation_size(&(rel->rd_node));
325+
size=calculate_relation_size(&(rel->rd_node),
326+
forkname_to_number(text_to_cstring(forkName)));
315327

316328
relation_close(rel,AccessShareLock);
317329

@@ -330,12 +342,15 @@ calculate_total_relation_size(Oid Relid)
330342
OidtoastOid;
331343
int64size;
332344
ListCell*cell;
345+
ForkNumberforkNum;
333346

334347
heapRel=relation_open(Relid,AccessShareLock);
335348
toastOid=heapRel->rd_rel->reltoastrelid;
336349

337350
/* Get the heap size */
338-
size=calculate_relation_size(&(heapRel->rd_node));
351+
size=0;
352+
for (forkNum=0;forkNum <=MAX_FORKNUM;forkNum++)
353+
size+=calculate_relation_size(&(heapRel->rd_node),forkNum);
339354

340355
/* Include any dependent indexes */
341356
if (heapRel->rd_rel->relhasindex)
@@ -349,7 +364,8 @@ calculate_total_relation_size(Oid Relid)
349364

350365
iRel=relation_open(idxOid,AccessShareLock);
351366

352-
size+=calculate_relation_size(&(iRel->rd_node));
367+
for (forkNum=0;forkNum <=MAX_FORKNUM;forkNum++)
368+
size+=calculate_relation_size(&(iRel->rd_node),forkNum);
353369

354370
relation_close(iRel,AccessShareLock);
355371
}
@@ -367,26 +383,13 @@ calculate_total_relation_size(Oid Relid)
367383
}
368384

369385
Datum
370-
pg_total_relation_size_oid(PG_FUNCTION_ARGS)
386+
pg_total_relation_size(PG_FUNCTION_ARGS)
371387
{
372388
Oidrelid=PG_GETARG_OID(0);
373389

374390
PG_RETURN_INT64(calculate_total_relation_size(relid));
375391
}
376392

377-
Datum
378-
pg_total_relation_size_name(PG_FUNCTION_ARGS)
379-
{
380-
text*relname=PG_GETARG_TEXT_P(0);
381-
RangeVar*relrv;
382-
Oidrelid;
383-
384-
relrv=makeRangeVarFromNameList(textToQualifiedNameList(relname));
385-
relid=RangeVarGetRelid(relrv, false);
386-
387-
PG_RETURN_INT64(calculate_total_relation_size(relid));
388-
}
389-
390393
/*
391394
* formatting with size units
392395
*/

‎src/include/catalog/catversion.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
3838
* Portions Copyright (c) 1994, Regents of the University of California
3939
*
40-
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.490 2008/09/30 11:11:28 heikki Exp $
40+
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.491 2008/10/03 07:33:09 heikki Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/*yyyymmddN */
56-
#defineCATALOG_VERSION_NO200809301
56+
#defineCATALOG_VERSION_NO200810031
5757

5858
#endif

‎src/include/catalog/pg_proc.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.515 2008/09/19 19:03:40 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.516 2008/10/03 07:33:09 heikki Exp $
1111
*
1212
* NOTES
1313
* The script catalog/genbki.sh reads this file and generates .bki
@@ -3591,13 +3591,11 @@ DATA(insert OID = 2324 ( pg_database_sizePGNSP PGUID 12 1 0 0 f f t f v 1 20 "
35913591
DESCR("total disk space usage for the specified database");
35923592
DATA(insertOID=2168 (pg_database_sizePGNSPPGUID12100fftfv120"19"_null__null__null_pg_database_size_name_null__null__null_ ));
35933593
DESCR("total disk space usage for the specified database");
3594-
DATA(insertOID=2325 (pg_relation_sizePGNSPPGUID12100fftfv120"26"_null__null__null_pg_relation_size_oid_null__null__null_ ));
3594+
DATA(insertOID=2325 (pg_relation_sizePGNSPPGUID14100fftfv120"2205"_null__null__null_"select pg_catalog.pg_relation_size($1, ''main'')"_null__null__null_ ));
35953595
DESCR("disk space usage for the specified table or index");
3596-
DATA(insertOID=2289 (pg_relation_sizePGNSPPGUID12100fftfv120"25"_null__null__null_pg_relation_size_name_null__null__null_ ));
3597-
DESCR("disk space usage for the specified table or index");
3598-
DATA(insertOID=2286 (pg_total_relation_sizePGNSPPGUID12100fftfv120"26"_null__null__null_pg_total_relation_size_oid_null__null__null_ ));
3599-
DESCR("total disk space usage for the specified table and associated indexes and toast tables");
3600-
DATA(insertOID=2287 (pg_total_relation_sizePGNSPPGUID12100fftfv120"25"_null__null__null_pg_total_relation_size_name_null__null__null_ ));
3596+
DATA(insertOID=2332 (pg_relation_sizePGNSPPGUID12100fftfv220"2205 25"_null__null__null_pg_relation_size_null__null__null_ ));
3597+
DESCR("disk space usage for the specified fork of a table or index");
3598+
DATA(insertOID=2286 (pg_total_relation_sizePGNSPPGUID12100fftfv120"2205"_null__null__null_pg_total_relation_size_null__null__null_ ));
36013599
DESCR("total disk space usage for the specified table and associated indexes and toast tables");
36023600
DATA(insertOID=2288 (pg_size_prettyPGNSPPGUID12100fftfv125"20"_null__null__null_pg_size_pretty_null__null__null_ ));
36033601
DESCR("convert a long int to a human readable text using size units");

‎src/include/storage/relfilenode.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/storage/relfilenode.h,v 1.17 2008/09/30 10:52:14 heikki Exp $
10+
* $PostgreSQL: pgsql/src/include/storage/relfilenode.h,v 1.18 2008/10/03 07:33:10 heikki Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -25,7 +25,10 @@ typedef enum ForkNumber
2525
InvalidForkNumber=-1,
2626
MAIN_FORKNUM=0,
2727
FSM_FORKNUM
28-
/* NOTE: change MAX_FORKNUM below when you add new forks */
28+
/*
29+
* NOTE: if you add a new fork, change MAX_FORKNUM below and update the
30+
* name to number mapping in utils/adt/dbsize.c
31+
*/
2932
}ForkNumber;
3033

3134
#defineMAX_FORKNUMFSM_FORKNUM

‎src/include/utils/builtins.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.320 2008/09/06 00:01:25 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.321 2008/10/03 07:33:10 heikki Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -389,10 +389,8 @@ extern Datum pg_tablespace_size_oid(PG_FUNCTION_ARGS);
389389
externDatumpg_tablespace_size_name(PG_FUNCTION_ARGS);
390390
externDatumpg_database_size_oid(PG_FUNCTION_ARGS);
391391
externDatumpg_database_size_name(PG_FUNCTION_ARGS);
392-
externDatumpg_relation_size_oid(PG_FUNCTION_ARGS);
393-
externDatumpg_relation_size_name(PG_FUNCTION_ARGS);
394-
externDatumpg_total_relation_size_oid(PG_FUNCTION_ARGS);
395-
externDatumpg_total_relation_size_name(PG_FUNCTION_ARGS);
392+
externDatumpg_relation_size(PG_FUNCTION_ARGS);
393+
externDatumpg_total_relation_size(PG_FUNCTION_ARGS);
396394
externDatumpg_size_pretty(PG_FUNCTION_ARGS);
397395

398396
/* genfile.c */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp