52#include "utils/fmgrprotos.h"
59#define INETSTRAT_OVERLAPS RTOverlapStrategyNumber
60#define INETSTRAT_EQ RTEqualStrategyNumber
61#define INETSTRAT_NE RTNotEqualStrategyNumber
62#define INETSTRAT_LT RTLessStrategyNumber
63#define INETSTRAT_LE RTLessEqualStrategyNumber
64#define INETSTRAT_GT RTGreaterStrategyNumber
65#define INETSTRAT_GE RTGreaterEqualStrategyNumber
66#define INETSTRAT_SUB RTSubStrategyNumber
67#define INETSTRAT_SUBEQ RTSubEqualStrategyNumber
68#define INETSTRAT_SUP RTSuperStrategyNumber
69#define INETSTRAT_SUPEQ RTSuperEqualStrategyNumber
88#define DatumGetInetKeyP(X) ((GistInetKey *) DatumGetPointer(X))
89#define InetKeyPGetDatum(X) PointerGetDatum(X)
96#define gk_ip_family(gkptr) ((gkptr)->family)
97#define gk_ip_minbits(gkptr) ((gkptr)->minbits)
98#define gk_ip_commonbits(gkptr) ((gkptr)->commonbits)
99#define gk_ip_addr(gkptr) ((gkptr)->ipaddr)
100#define ip_family_maxbits(fam) ((fam) == PGSQL_AF_INET6 ? 128 : 32)
103#define gk_ip_addrsize(gkptr) \
104 (gk_ip_family(gkptr) == PGSQL_AF_INET6 ? 16 : 4)
105#define gk_ip_maxbits(gkptr) \
106 ip_family_maxbits(gk_ip_family(gkptr))
107#define SET_GK_VARSIZE(dst) \
108 SET_VARSIZE_SHORT(dst, offsetof(GistInetKey, ipaddr) + gk_ip_addrsize(dst))
327 elog(
ERROR,
"unknown strategy for inet GiST");
371 for (
i = m + 1;
i <= n;
i++)
393 if (minfamily != maxfamily)
394 minbits = commonbits = 0;
396 *minfamily_p = minfamily;
397 *maxfamily_p = maxfamily;
398 *minbits_p = minbits;
399 *commonbits_p = commonbits;
433 for (
i = 1;
i < noffsets;
i++)
455 if (minfamily != maxfamily)
456 minbits = commonbits = 0;
458 *minfamily_p = minfamily;
459 *maxfamily_p = maxfamily;
460 *minbits_p = minbits;
461 *commonbits_p = commonbits;
486 memcpy(
gk_ip_addr(result), addr, (commonbits + 7) / 8);
489 if (commonbits % 8 != 0)
490 gk_ip_addr(result)[commonbits / 8] &= ~(0xFF >> (commonbits % 8));
519 &minfamily, &maxfamily,
520 &minbits, &commonbits);
523 if (minfamily != maxfamily)
637 *penalty = 1.0f / commonbits;
682 maxoff = entryvec->
n - 1;
696 &minfamily, &maxfamily,
697 &minbits, &commonbits);
699 if (minfamily != maxfamily)
725 while (commonbits < maxbits)
728 int bitbyte = commonbits / 8;
729 int bitmask = 0x80 >> (commonbits % 8);
737 if ((addr[bitbyte] & bitmask) == 0)
748 if (commonbits >= maxbits)
771 &minfamily, &maxfamily,
772 &minbits, &commonbits);
773 if (minfamily != maxfamily)
781 &minfamily, &maxfamily,
782 &minbits, &commonbits);
783 if (minfamily != maxfamily)
#define PG_GETARG_POINTER(n)
#define PG_GETARG_DATUM(n)
#define PG_GETARG_UINT16(n)
#define PG_RETURN_POINTER(x)
#define PG_RETURN_BOOL(x)
#define gistentryinit(e, k, r, pg, o, l)
Assert(PointerIsAligned(start, uint64))
void * palloc0(Size size)
int bitncommon(const unsigned char *l, const unsigned char *r, int n)
int bitncmp(const unsigned char *l, const unsigned char *r, int n)
#define gk_ip_commonbits(gkptr)
static void calc_inet_union_params(GISTENTRY *ent, int m, int n, int *minfamily_p, int *maxfamily_p, int *minbits_p, int *commonbits_p)
Datum inet_gist_fetch(PG_FUNCTION_ARGS)
#define DatumGetInetKeyP(X)
static void calc_inet_union_params_indexed(GISTENTRY *ent, OffsetNumber *offsets, int noffsets, int *minfamily_p, int *maxfamily_p, int *minbits_p, int *commonbits_p)
#define gk_ip_maxbits(gkptr)
Datum inet_gist_compress(PG_FUNCTION_ARGS)
#define gk_ip_family(gkptr)
#define gk_ip_addr(gkptr)
#define gk_ip_addrsize(gkptr)
struct GistInetKey GistInetKey
static GistInetKey * build_inet_union_key(int family, int minbits, int commonbits, unsigned char *addr)
#define SET_GK_VARSIZE(dst)
Datum inet_gist_consistent(PG_FUNCTION_ARGS)
#define ip_family_maxbits(fam)
Datum inet_gist_union(PG_FUNCTION_ARGS)
Datum inet_gist_picksplit(PG_FUNCTION_ARGS)
Datum inet_gist_penalty(PG_FUNCTION_ARGS)
Datum inet_gist_same(PG_FUNCTION_ARGS)
#define INETSTRAT_OVERLAPS
#define gk_ip_minbits(gkptr)
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
GISTENTRY vector[FLEXIBLE_ARRAY_MEMBER]
static Datum InetPGetDatum(const inet *X)
static inet * DatumGetInetPP(Datum X)
#define SET_INET_VARSIZE(dst)
#define PG_GETARG_INET_PP(n)
#define ip_family(inetptr)
#define ip_addrsize(inetptr)