mirror of
https://github.com/postgres/postgres.git
synced 2025-08-09 17:03:00 +03:00
The places that did, eg, (statbuf.st_mode & S_IFMT) == S_IFDIR were correct, but there is no good reason not to use S_ISDIR() instead, especially when that's what the other 90% of our code does. The places that did, eg, (statbuf.st_mode & S_IFDIR) were flat out *wrong* and would fail in various platform-specific ways, eg a symlink could be mistaken for a regular file on most Unixen. The actual impact of this is probably small, since the problem cases seem to always involve symlinks or sockets, which are unlikely to be found in the directories that PG code might be scanning. But it's clearly trouble waiting to happen, so patch all the way back anyway. (There seem to be no occurrences of the mistake in 7.4.)
This module contains several functions that report the size of a given database object: int8 database_size(name) int8 relation_size(text) int8 pg_database_size(oid) int8 pg_relation_size(oid) int8 pg_tablespace_size(oid) text pg_size_pretty(int8) The first two functions: SELECT database_size('template1'); SELECT relation_size('pg_class'); take the name of the object (possibly schema-qualified, for relation_size), while these functions take object OIDs: SELECT pg_database_size(1); -- template1 database SELECT pg_relation_size(1259); -- pg_class table size SELECT pg_tablespace_size(1663); -- pg_default tablespace Please note that relation_size and pg_relation_size report only the size of the selected relation itself; any subsidiary indexes or toast tables are not counted. To obtain the total size of a table including all helper files you'd have to do something like: SELECT *, pg_size_pretty(tablesize+indexsize+toastsize+toastindexsize) AS totalsize FROM (SELECT pg_relation_size(cl.oid) AS tablesize, COALESCE((SELECT SUM(pg_relation_size(indexrelid))::bigint FROM pg_index WHERE cl.oid=indrelid), 0) AS indexsize, CASE WHEN reltoastrelid=0 THEN 0 ELSE pg_relation_size(reltoastrelid) END AS toastsize, CASE WHEN reltoastrelid=0 THEN 0 ELSE pg_relation_size((SELECT reltoastidxid FROM pg_class ct WHERE ct.oid = cl.reltoastrelid)) END AS toastindexsize FROM pg_class cl WHERE relname = 'foo') ss; This sample query utilizes the helper function pg_size_pretty(int8), which formats the number of bytes into a convenient string using KB, MB, GB. It is also contained in this module. To install, just run make; make install. Then load the functions into any database using dbsize.sql.