0005-Use-qsort_itemptr-and-friends-in-various-places.patch
text/x-patch
Filename: 0005-Use-qsort_itemptr-and-friends-in-various-places.patch
Type: text/x-patch
Part: 4
Message:
Re: A qsort template
Patch
Format: format-patch
Series: patch 0005
Subject: Use qsort_itemptr() and friends in various places.
| File | + | − |
|---|---|---|
| src/backend/access/heap/vacuumlazy.c | 4 | 36 |
| src/backend/executor/nodeTidscan.c | 3 | 29 |
From eed4a91d7742166124c26dbdadd41aa4695cc5b8 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Sat, 13 Mar 2021 18:48:10 +1300
Subject: [PATCH 5/9] Use qsort_itemptr() and friends in various places.
---
src/backend/access/heap/vacuumlazy.c | 40 +++-------------------------
src/backend/executor/nodeTidscan.c | 32 +++-------------------
2 files changed, 7 insertions(+), 65 deletions(-)
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index a65dcbebfa..ef57e88b43 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -79,6 +79,7 @@
#include "utils/lsyscache.h"
#include "utils/memutils.h"
#include "utils/pg_rusage.h"
+#include "utils/sortitemptr.h"
#include "utils/timestamp.h"
@@ -367,7 +368,6 @@ static void lazy_space_alloc(LVRelStats *vacrelstats, BlockNumber relblocks);
static void lazy_record_dead_tuple(LVDeadTuples *dead_tuples,
ItemPointer itemptr);
static bool lazy_tid_reaped(ItemPointer itemptr, void *state);
-static int vac_cmp_itemptr(const void *left, const void *right);
static bool heap_page_is_all_visible(Relation rel, Buffer buf,
LVRelStats *vacrelstats,
TransactionId *visibility_cutoff_xid, bool *all_frozen);
@@ -2943,45 +2943,13 @@ lazy_tid_reaped(ItemPointer itemptr, void *state)
if (item < litem || item > ritem)
return false;
- res = (ItemPointer) bsearch((void *) itemptr,
- (void *) dead_tuples->itemptrs,
- dead_tuples->num_tuples,
- sizeof(ItemPointerData),
- vac_cmp_itemptr);
+ res = bsearch_itemptr(itemptr,
+ dead_tuples->itemptrs,
+ dead_tuples->num_tuples);
return (res != NULL);
}
-/*
- * Comparator routines for use with qsort() and bsearch().
- */
-static int
-vac_cmp_itemptr(const void *left, const void *right)
-{
- BlockNumber lblk,
- rblk;
- OffsetNumber loff,
- roff;
-
- lblk = ItemPointerGetBlockNumber((ItemPointer) left);
- rblk = ItemPointerGetBlockNumber((ItemPointer) right);
-
- if (lblk < rblk)
- return -1;
- if (lblk > rblk)
- return 1;
-
- loff = ItemPointerGetOffsetNumber((ItemPointer) left);
- roff = ItemPointerGetOffsetNumber((ItemPointer) right);
-
- if (loff < roff)
- return -1;
- if (loff > roff)
- return 1;
-
- return 0;
-}
-
/*
* Check if every tuple in the given page is visible to all current and future
* transactions. Also return the visibility_cutoff_xid which is the highest
diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c
index 48c3737da2..ee6bc4ee05 100644
--- a/src/backend/executor/nodeTidscan.c
+++ b/src/backend/executor/nodeTidscan.c
@@ -33,6 +33,7 @@
#include "storage/bufmgr.h"
#include "utils/array.h"
#include "utils/rel.h"
+#include "utils/sortitemptr.h"
#define IsCTIDVar(node) \
@@ -51,7 +52,6 @@ typedef struct TidExpr
static void TidExprListCreate(TidScanState *tidstate);
static void TidListEval(TidScanState *tidstate);
-static int itemptr_comparator(const void *a, const void *b);
static TupleTableSlot *TidNext(TidScanState *node);
@@ -263,10 +263,8 @@ TidListEval(TidScanState *tidstate)
/* CurrentOfExpr could never appear OR'd with something else */
Assert(!tidstate->tss_isCurrentOf);
- qsort((void *) tidList, numTids, sizeof(ItemPointerData),
- itemptr_comparator);
- numTids = qunique(tidList, numTids, sizeof(ItemPointerData),
- itemptr_comparator);
+ qsort_itemptr(tidList, numTids);
+ numTids = unique_itemptr(tidList, numTids);
}
tidstate->tss_TidList = tidList;
@@ -274,30 +272,6 @@ TidListEval(TidScanState *tidstate)
tidstate->tss_TidPtr = -1;
}
-/*
- * qsort comparator for ItemPointerData items
- */
-static int
-itemptr_comparator(const void *a, const void *b)
-{
- const ItemPointerData *ipa = (const ItemPointerData *) a;
- const ItemPointerData *ipb = (const ItemPointerData *) b;
- BlockNumber ba = ItemPointerGetBlockNumber(ipa);
- BlockNumber bb = ItemPointerGetBlockNumber(ipb);
- OffsetNumber oa = ItemPointerGetOffsetNumber(ipa);
- OffsetNumber ob = ItemPointerGetOffsetNumber(ipb);
-
- if (ba < bb)
- return -1;
- if (ba > bb)
- return 1;
- if (oa < ob)
- return -1;
- if (oa > ob)
- return 1;
- return 0;
-}
-
/* ----------------------------------------------------------------
* TidNext
*
--
2.30.1