From: Tomas Vondra Date: Fri, 5 Mar 2021 00:16:40 +0100 Subject: [PATCH 1/8] introduce bsearch_arg --- src/backend/statistics/extended_stats.c | 31 -------------- src/include/port.h | 5 +++ .../statistics/extended_stats_internal.h | 5 --- src/port/Makefile | 1 + src/port/bsearch_arg.c | 40 +++++++++++++++++++ src/tools/msvc/Mkvcbuild.pm | 2 +- 6 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 src/port/bsearch_arg.c diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index a030ea3653..fa42851fd5 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -659,37 +659,6 @@ compare_datums_simple(Datum a, Datum b, SortSupport ssup) return ApplySortComparator(a, false, b, false, ssup); } -/* simple counterpart to qsort_arg */ -void * -bsearch_arg(const void *key, const void *base, size_t nmemb, size_t size, - int (*compar) (const void *, const void *, void *), - void *arg) -{ - size_t l, - u, - idx; - const void *p; - int comparison; - - l = 0; - u = nmemb; - while (l < u) - { - idx = (l + u) / 2; - p = (void *) (((const char *) base) + (idx * size)); - comparison = (*compar) (key, p, arg); - - if (comparison < 0) - u = idx; - else if (comparison > 0) - l = idx + 1; - else - return (void *) p; - } - - return NULL; -} - /* * build_attnums_array * Transforms a bitmap into an array of AttrNumber values. diff --git a/src/include/port.h b/src/include/port.h index 227ef4b148..82f63de325 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -508,6 +508,11 @@ typedef int (*qsort_arg_comparator) (const void *a, const void *b, void *arg); extern void qsort_arg(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg); +extern void *bsearch_arg(const void *key, const void *base, + size_t nmemb, size_t size, + int (*compar) (const void *, const void *, void *), + void *arg); + /* port/chklocale.c */ extern int pg_get_encoding_from_locale(const char *ctype, bool write_message); diff --git a/src/include/statistics/extended_stats_internal.h b/src/include/statistics/extended_stats_internal.h index c849bd57c0..a0a3cf5b0f 100644 --- a/src/include/statistics/extended_stats_internal.h +++ b/src/include/statistics/extended_stats_internal.h @@ -85,11 +85,6 @@ extern int multi_sort_compare_dims(int start, int end, const SortItem *a, extern int compare_scalars_simple(const void *a, const void *b, void *arg); extern int compare_datums_simple(Datum a, Datum b, SortSupport ssup); -extern void *bsearch_arg(const void *key, const void *base, - size_t nmemb, size_t size, - int (*compar) (const void *, const void *, void *), - void *arg); - extern AttrNumber *build_attnums_array(Bitmapset *attrs, int *numattrs); extern SortItem *build_sorted_items(int numrows, int *nitems, HeapTuple *rows, diff --git a/src/port/Makefile b/src/port/Makefile index e41b005c4f..52dbf5783f 100644 --- a/src/port/Makefile +++ b/src/port/Makefile @@ -40,6 +40,7 @@ LIBS += $(PTHREAD_LIBS) OBJS = \ $(LIBOBJS) \ $(PG_CRC32C_OBJS) \ + bsearch_arg.o \ chklocale.o \ erand48.o \ inet_net_ntop.o \ diff --git a/src/port/bsearch_arg.c b/src/port/bsearch_arg.c new file mode 100644 index 0000000000..d24dc4b7c4 --- /dev/null +++ b/src/port/bsearch_arg.c @@ -0,0 +1,40 @@ +/* + * bsearch_arg.c: bsearch variant with a user-supplied pointer + * + * src/port/bsearch_arg.c + */ + + +#include "c.h" + + +/* simple counterpart to qsort_arg */ +void * +bsearch_arg(const void *key, const void *base, size_t nmemb, size_t size, + int (*compar) (const void *, const void *, void *), + void *arg) +{ + size_t l, + u, + idx; + const void *p; + int comparison; + + l = 0; + u = nmemb; + while (l < u) + { + idx = (l + u) / 2; + p = (void *) (((const char *) base) + (idx * size)); + comparison = (*compar) (key, p, arg); + + if (comparison < 0) + u = idx; + else if (comparison > 0) + l = idx + 1; + else + return (void *) p; + } + + return NULL; +} diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index 49614106dc..20221c1ae3 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -101,7 +101,7 @@ sub mkvcbuild dirent.c dlopen.c getopt.c getopt_long.c link.c pread.c preadv.c pwrite.c pwritev.c pg_bitutils.c pg_strong_random.c pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c - pqsignal.c mkdtemp.c qsort.c qsort_arg.c quotes.c system.c + pqsignal.c mkdtemp.c qsort.c qsort_arg.c bsearch_arg.c quotes.c system.c strerror.c tar.c thread.c win32env.c win32error.c win32security.c win32setlocale.c win32stat.c); -- 2.26.2 --------------556A1DC61262AF15641DB204 Content-Type: text/x-patch; charset=UTF-8; name="0002-Pass-all-scan-keys-to-BRIN-consistent-func-20210308b.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0002-Pass-all-scan-keys-to-BRIN-consistent-func-20210308b.pa"; filename*1="tch"