From 0001e98d54f3d81c2ff413e4aec4933bd1378963 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 2 Aug 2005 16:11:57 +0000 Subject: [PATCH] Code and docs review for pg_column_size() patch. --- doc/src/sgml/func.sgml | 109 ++++++++++++++++----------- src/backend/access/heap/tuptoaster.c | 76 ++++++++----------- src/backend/utils/adt/varlena.c | 49 +++++++----- src/include/catalog/pg_proc.h | 4 +- 4 files changed, 130 insertions(+), 108 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index ba372618ac..7dc9a3b597 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,5 +1,5 @@ @@ -2206,14 +2206,6 @@ PostgreSQL documentation 5 - - pg_column_size(string) - integer - Number of bytes required to store the value, which might be compressed - pg_column_size('jo\\000se'::bytea) - 5 - - position(substring in string) integer @@ -9181,11 +9173,29 @@ SELECT set_config('log_statement_stats', 'off', false); - The functions shown in calculate the actual disk space - usage of database objects. + The functions shown in calculate + the actual disk space usage of database objects. + + pg_column_size + + + pg_tablespace_size + + + pg_database_size + + + pg_relation_size + + + pg_complete_relation_size + + + pg_size_pretty + + Database Object Size Functions @@ -9195,97 +9205,108 @@ SELECT set_config('log_statement_stats', 'off', false); + + pg_column_size(any) + integer + Number of bytes used to store a particular value (possibly compressed) + pg_tablespace_size(oid) - int8 - Calculates the total disk space used by the tablespace with the specified OID + bigint + Total disk space used by the tablespace with the specified OID pg_tablespace_size(name) - int8 - Calculates the total disk space used by the tablespace with the specified name + bigint + Total disk space used by the tablespace with the specified name pg_database_size(oid) - int8 - Calculates the total disk space used by the database with the specified OID + bigint + Total disk space used by the database with the specified OID pg_database_size(name) - int8 - Calculates the total disk space used by the database with the specified name + bigint + Total disk space used by the database with the specified name pg_relation_size(oid) - int8 - Calculates the disk space used by the table or index with the specified OID + bigint + Disk space used by the table or index with the specified OID pg_relation_size(text) - int8 - Calculates the disk space used by the index or table with the specified name. - The name may be prefixed with a schema name if required + bigint + Disk space used by the table or index with the specified name. + The name may be qualified with a schema name pg_complete_relation_size(oid) - int8 - Calculates the total disk space used by the table with the specified OID, + bigint + Total disk space used by the table with the specified OID, including indexes and toasted data pg_complete_relation_size(text) - int8 - Calculates the total disk space used by the table with the specified name, - including indexes and toasted data. The name may be prefixed with a schema name if - required + bigint + Total disk space used by the table with the specified name, + including indexes and toasted data. + The table name may be qualified with a schema name - pg_size_pretty(int8) + pg_size_pretty(bigint) text - Formats the size value (in bytes) into a human readable format with size units + Converts a size in bytes into a human-readable format with size units
- pg_tablespace_size and pg_database_size accept an - oid or name of a tablespace or database, and return the disk space usage of the specified object. + pg_column_size shows the space used to store any individual + data value. - - pg_relation_size - - pg_relation_size accepts the oid or name of a table, index or + pg_tablespace_size and pg_database_size accept + the OID or name of a tablespace or database, and return the total disk + space used therein. + + + + pg_relation_size accepts the OID or name of a table, index or toast table, and returns the size in bytes. + - pg_complete_relation_size accepts the oid or name of a table or - toast table, and returns the size in bytes of the data and all associated - indexes and toast tables. + pg_complete_relation_size accepts the OID or name of a table + or toast table, and returns the size in bytes of the data and all + associated indexes and toast tables. + - pg_size_pretty can be used to format the size of the - database objects in a human readable way, using kB, MB, GB or TB as appropriate. + pg_size_pretty can be used to format the result of one of + the other functions in a human-readable way, using kB, MB, GB or TB as + appropriate. diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c index 77caf79dd1..5359f24fce 100644 --- a/src/backend/access/heap/tuptoaster.c +++ b/src/backend/access/heap/tuptoaster.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.50 2005/07/06 19:02:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.51 2005/08/02 16:11:57 tgl Exp $ * * * INTERFACE ROUTINES @@ -268,6 +268,38 @@ toast_raw_datum_size(Datum value) return result; } +/* ---------- + * toast_datum_size + * + * Return the physical storage size (possibly compressed) of a varlena datum + * ---------- + */ +Size +toast_datum_size(Datum value) +{ + varattrib *attr = (varattrib *) DatumGetPointer(value); + Size result; + + if (VARATT_IS_EXTERNAL(attr)) + { + /* + * Attribute is stored externally - return the extsize whether + * compressed or not. We do not count the size of the toast + * pointer ... should we? + */ + result = attr->va_content.va_external.va_extsize; + } + else + { + /* + * Attribute is stored inline either compressed or not, just + * calculate the size of the datum in either case. + */ + result = VARSIZE(attr); + } + return result; +} + /* ---------- * toast_delete - @@ -1436,45 +1468,3 @@ toast_fetch_datum_slice(varattrib *attr, int32 sliceoffset, int32 length) return result; } - -/* ---------- - * toast_datum_size - * - * Show the (possibly compressed) size of a datum - * ---------- - */ -Size -toast_datum_size(Datum value) -{ - - varattrib *attr = (varattrib *) DatumGetPointer(value); - Size result; - - if (VARATT_IS_EXTERNAL(attr)) - { - /* - * Attribute is stored externally - If it is compressed too, - * then we need to get the external datum and calculate its size, - * otherwise we just use the external rawsize. - */ - if (VARATT_IS_COMPRESSED(attr)) - { - varattrib *attrext = toast_fetch_datum(attr); - result = VARSIZE(attrext); - pfree(attrext); - } - else - result = attr->va_content.va_external.va_rawsize; - } - else - { - /* - * Attribute is stored inline either compressed or not, just - * calculate the size of the datum in either case. - */ - result = VARSIZE(attr); - } - - return result; - -} diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 9ea8a17b02..399da66613 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.130 2005/07/29 03:17:55 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.131 2005/08/02 16:11:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2574,38 +2574,49 @@ md5_bytea(PG_FUNCTION_ARGS) } /* - * Return the length of a datum, possibly compressed + * Return the size of a datum, possibly compressed + * + * Works on any data type */ Datum pg_column_size(PG_FUNCTION_ARGS) { - Datum value = PG_GETARG_DATUM(0); - int result; + Datum value = PG_GETARG_DATUM(0); + int32 result; + int typlen; - /* fn_extra stores the fixed column length, or -1 for varlena. */ - if (fcinfo->flinfo->fn_extra == NULL) /* first call? */ + /* On first call, get the input type's typlen, and save at *fn_extra */ + if (fcinfo->flinfo->fn_extra == NULL) { - /* On the first call lookup the datatype of the supplied argument */ - Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0); - int typlen = get_typlen(argtypeid); + /* Lookup the datatype of the supplied argument */ + Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0); - - if (typlen == 0) - { - /* Oid not in pg_type, should never happen. */ + typlen = get_typlen(argtypeid); + if (typlen == 0) /* should not happen */ elog(ERROR, "cache lookup failed for type %u", argtypeid); - } fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt, sizeof(int)); - *(int *)fcinfo->flinfo->fn_extra = typlen; + *((int *) fcinfo->flinfo->fn_extra) = typlen; } + else + typlen = *((int *) fcinfo->flinfo->fn_extra); - if (*(int *)fcinfo->flinfo->fn_extra != -1) - PG_RETURN_INT32(*(int *)fcinfo->flinfo->fn_extra); + if (typlen == -1) + { + /* varlena type, possibly toasted */ + result = toast_datum_size(value); + } + else if (typlen == -2) + { + /* cstring */ + result = strlen(DatumGetCString(value)) + 1; + } else { - result = toast_datum_size(value) - VARHDRSZ; - PG_RETURN_INT32(result); + /* ordinary fixed-width type */ + result = typlen; } + + PG_RETURN_INT32(result); } diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 72e23c3f0b..71f51172dc 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.379 2005/07/29 14:47:01 momjian Exp $ + * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.380 2005/08/02 16:11:57 tgl Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki @@ -3701,7 +3701,7 @@ DATA(insert OID = 2560 ( pg_postmaster_start_time PGNSP PGUID 12 f f t f s 0 11 DESCR("postmaster start time"); /* Column storage size */ -DATA(insert OID = 1269 ( pg_column_size PGNSP PGUID 12 f f t f i 1 23 "2276" _null_ _null_ _null_ pg_column_size - _null_ )); +DATA(insert OID = 1269 ( pg_column_size PGNSP PGUID 12 f f t f s 1 23 "2276" _null_ _null_ _null_ pg_column_size - _null_ )); DESCR("bytes required to store the value, perhaps with compression"); /* new functions for Y-direction rtree opclasses */ -- GitLab