mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Clean up manipulations of hash indexes' hasho_flag field.
Standardize on testing a hash index page's type by doing (opaque->hasho_flag & LH_PAGE_TYPE) == LH_xxx_PAGE Various places were taking shortcuts like opaque->hasho_flag & LH_BUCKET_PAGE which while not actually wrong, is still bad practice because it encourages use of opaque->hasho_flag & LH_UNUSED_PAGE which *is* wrong (LH_UNUSED_PAGE == 0, so the above is constant false). hash_xlog.c's hash_mask() contained such an incorrect test. This also ensures that we mask out the additional flag bits that hasho_flag has accreted since 9.6. pgstattuple's pgstat_hash_page(), for one, was failing to do that and was thus actively broken. Also fix assorted comments that hadn't been updated to reflect the extended usage of hasho_flag, and fix some macros that were testing just "(hasho_flag & bit)" to use the less dangerous, project-approved form "((hasho_flag & bit) != 0)". Coverity found the bug in hash_mask(); I noted the one in pgstat_hash_page() through code reading.
This commit is contained in:
@ -184,7 +184,8 @@ hash_page_type(PG_FUNCTION_ARGS)
|
||||
bytea *raw_page = PG_GETARG_BYTEA_P(0);
|
||||
Page page;
|
||||
HashPageOpaque opaque;
|
||||
char *type;
|
||||
int pagetype;
|
||||
const char *type;
|
||||
|
||||
if (!superuser())
|
||||
ereport(ERROR,
|
||||
@ -200,13 +201,14 @@ hash_page_type(PG_FUNCTION_ARGS)
|
||||
opaque = (HashPageOpaque) PageGetSpecialPointer(page);
|
||||
|
||||
/* page type (flags) */
|
||||
if (opaque->hasho_flag & LH_META_PAGE)
|
||||
pagetype = opaque->hasho_flag & LH_PAGE_TYPE;
|
||||
if (pagetype == LH_META_PAGE)
|
||||
type = "metapage";
|
||||
else if (opaque->hasho_flag & LH_OVERFLOW_PAGE)
|
||||
else if (pagetype == LH_OVERFLOW_PAGE)
|
||||
type = "overflow";
|
||||
else if (opaque->hasho_flag & LH_BUCKET_PAGE)
|
||||
else if (pagetype == LH_BUCKET_PAGE)
|
||||
type = "bucket";
|
||||
else if (opaque->hasho_flag & LH_BITMAP_PAGE)
|
||||
else if (pagetype == LH_BITMAP_PAGE)
|
||||
type = "bitmap";
|
||||
else
|
||||
type = "unused";
|
||||
|
Reference in New Issue
Block a user