⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashutil.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
字号:
/*------------------------------------------------------------------------- * * btutils.c *	  Utility code for Postgres btree implementation. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /usr/local/cvsroot/pgsql/src/backend/access/hash/hashutil.c,v 1.15.2.1 1999/08/02 05:24:36 scrappy Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/hash.h"#include "access/iqual.h"ScanKey_hash_mkscankey(Relation rel, IndexTuple itup, HashMetaPage metap){	ScanKey		skey;	TupleDesc	itupdesc;	int			natts;	AttrNumber	i;	Datum		arg;	RegProcedure proc;	bool		null;	natts = rel->rd_rel->relnatts;	itupdesc = RelationGetDescr(rel);	skey = (ScanKey) palloc(natts * sizeof(ScanKeyData));	for (i = 0; i < natts; i++)	{		arg = index_getattr(itup, i + 1, itupdesc, &null);		proc = metap->hashm_procid;		ScanKeyEntryInitialize(&skey[i],							   0x0, (AttrNumber) (i + 1), proc, arg);	}	return skey;}void_hash_freeskey(ScanKey skey){	pfree(skey);}bool_hash_checkqual(IndexScanDesc scan, IndexTuple itup){	if (scan->numberOfKeys > 0)		return (index_keytest(itup,							  RelationGetDescr(scan->relation),							  scan->numberOfKeys, scan->keyData));	else		return true;}HashItem_hash_formitem(IndexTuple itup){	int			nbytes_hitem;	HashItem	hitem;	Size		tuplen;	/* disallow nulls in hash keys */	if (itup->t_info & INDEX_NULL_MASK)		elog(ERROR, "hash indices cannot include null keys");	/* make a copy of the index tuple with room for the sequence number */	tuplen = IndexTupleSize(itup);	nbytes_hitem = tuplen +		(sizeof(HashItemData) - sizeof(IndexTupleData));	hitem = (HashItem) palloc(nbytes_hitem);	memmove((char *) &(hitem->hash_itup), (char *) itup, tuplen);	return hitem;}Bucket_hash_call(Relation rel, HashMetaPage metap, Datum key){	uint32		n;	Bucket		bucket;	RegProcedure proc;	proc = metap->hashm_procid;	n = (uint32) fmgr(proc, key);	bucket = n & metap->hashm_highmask;	if (bucket > metap->hashm_maxbucket)		bucket = bucket & metap->hashm_lowmask;	return bucket;}/* * _hash_log2 -- returns ceil(lg2(num)) */uint32_hash_log2(uint32 num){	uint32		i,				limit;	limit = 1;	for (i = 0; limit < num; limit = limit << 1, i++)		;	return i;}/* * _hash_checkpage -- sanity checks on the format of all hash pages */void_hash_checkpage(Page page, int flags){	HashPageOpaque opaque;	Assert(page);	Assert(((PageHeader) (page))->pd_lower >= (sizeof(PageHeaderData) - sizeof(ItemIdData)));#if 1	Assert(((PageHeader) (page))->pd_upper <=		   (BLCKSZ - MAXALIGN(sizeof(HashPageOpaqueData))));	Assert(((PageHeader) (page))->pd_special ==		   (BLCKSZ - MAXALIGN(sizeof(HashPageOpaqueData))));	Assert(((PageHeader) (page))->pd_opaque.od_pagesize == BLCKSZ);#endif	if (flags)	{		opaque = (HashPageOpaque) PageGetSpecialPointer(page);		Assert(opaque->hasho_flag & flags);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -