hashutil.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * btutils.c
  4.  *   Utility code for Postgres btree implementation.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/access/hash/hashutil.c,v 1.15.2.1 1999/08/02 05:24:36 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "access/hash.h"
  16. #include "access/iqual.h"
  17. ScanKey
  18. _hash_mkscankey(Relation rel, IndexTuple itup, HashMetaPage metap)
  19. {
  20. ScanKey skey;
  21. TupleDesc itupdesc;
  22. int natts;
  23. AttrNumber i;
  24. Datum arg;
  25. RegProcedure proc;
  26. bool null;
  27. natts = rel->rd_rel->relnatts;
  28. itupdesc = RelationGetDescr(rel);
  29. skey = (ScanKey) palloc(natts * sizeof(ScanKeyData));
  30. for (i = 0; i < natts; i++)
  31. {
  32. arg = index_getattr(itup, i + 1, itupdesc, &null);
  33. proc = metap->hashm_procid;
  34. ScanKeyEntryInitialize(&skey[i],
  35.    0x0, (AttrNumber) (i + 1), proc, arg);
  36. }
  37. return skey;
  38. }
  39. void
  40. _hash_freeskey(ScanKey skey)
  41. {
  42. pfree(skey);
  43. }
  44. bool
  45. _hash_checkqual(IndexScanDesc scan, IndexTuple itup)
  46. {
  47. if (scan->numberOfKeys > 0)
  48. return (index_keytest(itup,
  49.   RelationGetDescr(scan->relation),
  50.   scan->numberOfKeys, scan->keyData));
  51. else
  52. return true;
  53. }
  54. HashItem
  55. _hash_formitem(IndexTuple itup)
  56. {
  57. int nbytes_hitem;
  58. HashItem hitem;
  59. Size tuplen;
  60. /* disallow nulls in hash keys */
  61. if (itup->t_info & INDEX_NULL_MASK)
  62. elog(ERROR, "hash indices cannot include null keys");
  63. /* make a copy of the index tuple with room for the sequence number */
  64. tuplen = IndexTupleSize(itup);
  65. nbytes_hitem = tuplen +
  66. (sizeof(HashItemData) - sizeof(IndexTupleData));
  67. hitem = (HashItem) palloc(nbytes_hitem);
  68. memmove((char *) &(hitem->hash_itup), (char *) itup, tuplen);
  69. return hitem;
  70. }
  71. Bucket
  72. _hash_call(Relation rel, HashMetaPage metap, Datum key)
  73. {
  74. uint32 n;
  75. Bucket bucket;
  76. RegProcedure proc;
  77. proc = metap->hashm_procid;
  78. n = (uint32) fmgr(proc, key);
  79. bucket = n & metap->hashm_highmask;
  80. if (bucket > metap->hashm_maxbucket)
  81. bucket = bucket & metap->hashm_lowmask;
  82. return bucket;
  83. }
  84. /*
  85.  * _hash_log2 -- returns ceil(lg2(num))
  86.  */
  87. uint32
  88. _hash_log2(uint32 num)
  89. {
  90. uint32 i,
  91. limit;
  92. limit = 1;
  93. for (i = 0; limit < num; limit = limit << 1, i++)
  94. ;
  95. return i;
  96. }
  97. /*
  98.  * _hash_checkpage -- sanity checks on the format of all hash pages
  99.  */
  100. void
  101. _hash_checkpage(Page page, int flags)
  102. {
  103. HashPageOpaque opaque;
  104. Assert(page);
  105. Assert(((PageHeader) (page))->pd_lower >= (sizeof(PageHeaderData) - sizeof(ItemIdData)));
  106. #if 1
  107. Assert(((PageHeader) (page))->pd_upper <=
  108.    (BLCKSZ - MAXALIGN(sizeof(HashPageOpaqueData))));
  109. Assert(((PageHeader) (page))->pd_special ==
  110.    (BLCKSZ - MAXALIGN(sizeof(HashPageOpaqueData))));
  111. Assert(((PageHeader) (page))->pd_opaque.od_pagesize == BLCKSZ);
  112. #endif
  113. if (flags)
  114. {
  115. opaque = (HashPageOpaque) PageGetSpecialPointer(page);
  116. Assert(opaque->hasho_flag & flags);
  117. }
  118. }