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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * nbtcompare.c
  4.  *   Comparison functions for btree access method.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/access/nbtree/nbtcompare.c,v 1.24.2.1 1999/08/02 05:24:40 scrappy Exp $
  11.  *
  12.  * NOTES
  13.  * These functions are stored in pg_amproc.  For each operator class
  14.  * defined on btrees, they compute
  15.  *
  16.  * compare(a, b):
  17.  * < 0 if a < b,
  18.  * = 0 if a == b,
  19.  * > 0 if a > b.
  20.  *-------------------------------------------------------------------------
  21.  */
  22. #include "postgres.h"
  23. #include "utils/builtins.h"
  24. int32
  25. btint2cmp(int16 a, int16 b)
  26. {
  27. return (int32) (a - b);
  28. }
  29. int32
  30. btint4cmp(int32 a, int32 b)
  31. {
  32. return a - b;
  33. }
  34. int32
  35. btint8cmp(int64 *a, int64 *b)
  36. {
  37. if (*a > *b)
  38. return 1;
  39. else if (*a == *b)
  40. return 0;
  41. else
  42. return -1;
  43. }
  44. int32
  45. btint24cmp(int16 a, int32 b)
  46. {
  47. return ((int32) a) - b;
  48. }
  49. int32
  50. btint42cmp(int32 a, int16 b)
  51. {
  52. return a - ((int32) b);
  53. }
  54. int32
  55. btfloat4cmp(float32 a, float32 b)
  56. {
  57. if (*a > *b)
  58. return 1;
  59. else if (*a == *b)
  60. return 0;
  61. else
  62. return -1;
  63. }
  64. int32
  65. btfloat8cmp(float64 a, float64 b)
  66. {
  67. if (*a > *b)
  68. return 1;
  69. else if (*a == *b)
  70. return 0;
  71. else
  72. return -1;
  73. }
  74. int32
  75. btoidcmp(Oid a, Oid b)
  76. {
  77. if (a > b)
  78. return 1;
  79. else if (a == b)
  80. return 0;
  81. else
  82. return -1;
  83. }
  84. int32
  85. btoid8cmp(Oid *a, Oid *b)
  86. {
  87. int i;
  88. for (i = 0; i < 8; i++)
  89. /* we use this because we need the int4gt, etc */
  90. if (!int4eq(a[i], b[i]))
  91. {
  92. if (int4gt(a[i], b[i]))
  93. return 1;
  94. else
  95. return -1;
  96. }
  97. return 0;
  98. }
  99. int32
  100. btabstimecmp(AbsoluteTime a, AbsoluteTime b)
  101. {
  102. if (AbsoluteTimeIsBefore(a, b))
  103. return -1;
  104. else if (AbsoluteTimeIsBefore(b, a))
  105. return 1;
  106. else
  107. return 0;
  108. }
  109. int32
  110. btcharcmp(char a, char b)
  111. {
  112. return (int32) ((uint8) a - (uint8) b);
  113. }
  114. int32
  115. btnamecmp(NameData *a, NameData *b)
  116. {
  117. return strncmp(a->data, b->data, NAMEDATALEN);
  118. }
  119. int32
  120. bttextcmp(struct varlena * a, struct varlena * b)
  121. {
  122. int res;
  123. unsigned char *ap,
  124.    *bp;
  125. #ifdef USE_LOCALE
  126. int la = VARSIZE(a) - VARHDRSZ;
  127. int lb = VARSIZE(b) - VARHDRSZ;
  128. ap = (unsigned char *) palloc(la + 1);
  129. bp = (unsigned char *) palloc(lb + 1);
  130. memcpy(ap, VARDATA(a), la);
  131. *(ap + la) = '';
  132. memcpy(bp, VARDATA(b), lb);
  133. *(bp + lb) = '';
  134. res = strcoll(ap, bp);
  135. pfree(ap);
  136. pfree(bp);
  137. #else
  138. int len = VARSIZE(a);
  139. /* len is the length of the shorter of the two strings */
  140. if (len > VARSIZE(b))
  141. len = VARSIZE(b);
  142. len -= VARHDRSZ;
  143. ap = (unsigned char *) VARDATA(a);
  144. bp = (unsigned char *) VARDATA(b);
  145. /*
  146.  * If the two strings differ in the first len bytes, or if they're the
  147.  * same in the first len bytes and they're both len bytes long, we're
  148.  * done.
  149.  */
  150. res = 0;
  151. if (len > 0)
  152. {
  153. do
  154. {
  155. res = (int) (*ap++ - *bp++);
  156. len--;
  157. } while (res == 0 && len != 0);
  158. }
  159. #endif
  160. if (res != 0 || VARSIZE(a) == VARSIZE(b))
  161. return res;
  162. /*
  163.  * The two strings are the same in the first len bytes, and they are
  164.  * of different lengths.
  165.  */
  166. if (VARSIZE(a) < VARSIZE(b))
  167. return -1;
  168. else
  169. return 1;
  170. }