@ -56,13 +56,12 @@ static Page
verify_hash_page ( bytea * raw_page , int flags )
verify_hash_page ( bytea * raw_page , int flags )
{
{
Page page = get_page_from_raw ( raw_page ) ;
Page page = get_page_from_raw ( raw_page ) ;
int pagetype ;
int pagetype = LH_UNUSED_PAGE ;
HashPageOpaque pageopaque ;
if ( PageIsNew ( page ) )
/* Treat new pages as unused. */
ereport ( ERROR ,
if ( ! PageIsNew ( page ) )
( errcode ( ERRCODE_INDEX_CORRUPTED ) ,
{
errmsg ( " index table contains zero page " ) ) ) ;
HashPageOpaque pageopaque ;
if ( PageGetSpecialSize ( page ) ! = MAXALIGN ( sizeof ( HashPageOpaqueData ) ) )
if ( PageGetSpecialSize ( page ) ! = MAXALIGN ( sizeof ( HashPageOpaqueData ) ) )
ereport ( ERROR ,
ereport ( ERROR ,
@ -77,10 +76,13 @@ verify_hash_page(bytea *raw_page, int flags)
errdetail ( " Expected %08x, got %08x. " ,
errdetail ( " Expected %08x, got %08x. " ,
HASHO_PAGE_ID , pageopaque - > hasho_page_id ) ) ) ;
HASHO_PAGE_ID , pageopaque - > hasho_page_id ) ) ) ;
/* Check that page type is sane. */
pagetype = pageopaque - > hasho_flag & LH_PAGE_TYPE ;
pagetype = pageopaque - > hasho_flag & LH_PAGE_TYPE ;
}
/* Check that page type is sane. */
if ( pagetype ! = LH_OVERFLOW_PAGE & & pagetype ! = LH_BUCKET_PAGE & &
if ( pagetype ! = LH_OVERFLOW_PAGE & & pagetype ! = LH_BUCKET_PAGE & &
pagetype ! = LH_BITMAP_PAGE & & pagetype ! = LH_META_PAGE )
pagetype ! = LH_BITMAP_PAGE & & pagetype ! = LH_META_PAGE & &
pagetype ! = LH_UNUSED_PAGE )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " invalid hash page type %08x " , pagetype ) ) ) ;
errmsg ( " invalid hash page type %08x " , pagetype ) ) ) ;
@ -190,6 +192,11 @@ hash_page_type(PG_FUNCTION_ARGS)
( errmsg ( " must be superuser to use raw page functions " ) ) ) ) ;
( errmsg ( " must be superuser to use raw page functions " ) ) ) ) ;
page = verify_hash_page ( raw_page , 0 ) ;
page = verify_hash_page ( raw_page , 0 ) ;
if ( PageIsNew ( page ) )
type = " unused " ;
else
{
opaque = ( HashPageOpaque ) PageGetSpecialPointer ( page ) ;
opaque = ( HashPageOpaque ) PageGetSpecialPointer ( page ) ;
/* page type (flags) */
/* page type (flags) */
@ -203,6 +210,7 @@ hash_page_type(PG_FUNCTION_ARGS)
type = " bitmap " ;
type = " bitmap " ;
else
else
type = " unused " ;
type = " unused " ;
}
PG_RETURN_TEXT_P ( cstring_to_text ( type ) ) ;
PG_RETURN_TEXT_P ( cstring_to_text ( type ) ) ;
}
}