Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * itemptr.c
4 : * POSTGRES disk item pointer code.
5 : *
6 : * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
7 : * Portions Copyright (c) 1994, Regents of the University of California
8 : *
9 : *
10 : * IDENTIFICATION
11 : * src/backend/storage/page/itemptr.c
12 : *
13 : *-------------------------------------------------------------------------
14 : */
15 : #include "postgres.h"
16 :
17 : #include "storage/itemptr.h"
18 :
19 :
20 : /*
21 : * ItemPointerEquals
22 : * Returns true if both item pointers point to the same item,
23 : * otherwise returns false.
24 : *
25 : * Note:
26 : * Asserts that the disk item pointers are both valid!
27 : */
28 : bool
29 131336 : ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2)
30 : {
31 : /*
32 : * We really want ItemPointerData to be exactly 6 bytes. This is rather a
33 : * random place to check, but there is no better place.
34 : */
35 : StaticAssertStmt(sizeof(ItemPointerData) == 3 * sizeof(uint16),
36 : "ItemPointerData struct is improperly padded");
37 :
38 394008 : if (ItemPointerGetBlockNumber(pointer1) ==
39 386116 : ItemPointerGetBlockNumber(pointer2) &&
40 246888 : ItemPointerGetOffsetNumber(pointer1) ==
41 246888 : ItemPointerGetOffsetNumber(pointer2))
42 90270 : return true;
43 : else
44 41066 : return false;
45 : }
46 :
47 : /*
48 : * ItemPointerCompare
49 : * Generic btree-style comparison for item pointers.
50 : */
51 : int32
52 1817686 : ItemPointerCompare(ItemPointer arg1, ItemPointer arg2)
53 : {
54 : /*
55 : * Use ItemPointerGet{Offset,Block}NumberNoCheck to avoid asserting
56 : * ip_posid != 0, which may not be true for a user-supplied TID.
57 : */
58 1817686 : BlockNumber b1 = ItemPointerGetBlockNumberNoCheck(arg1);
59 1817686 : BlockNumber b2 = ItemPointerGetBlockNumberNoCheck(arg2);
60 :
61 1817686 : if (b1 < b2)
62 1241 : return -1;
63 1816445 : else if (b1 > b2)
64 1776795 : return 1;
65 79300 : else if (ItemPointerGetOffsetNumberNoCheck(arg1) <
66 39650 : ItemPointerGetOffsetNumberNoCheck(arg2))
67 30 : return -1;
68 79240 : else if (ItemPointerGetOffsetNumberNoCheck(arg1) >
69 39620 : ItemPointerGetOffsetNumberNoCheck(arg2))
70 2568 : return 1;
71 : else
72 37052 : return 0;
73 : }
|