1
#include "btree_gist.h"
2
#include "btree_utils_num.h"
3
#include "utils/builtins.h"
4
#include "utils/inet.h"
5
#include "catalog/pg_type.h"
16
PG_FUNCTION_INFO_V1(gbt_inet_compress);
17
PG_FUNCTION_INFO_V1(gbt_cidr_compress);
18
PG_FUNCTION_INFO_V1(gbt_inet_union);
19
PG_FUNCTION_INFO_V1(gbt_inet_picksplit);
20
PG_FUNCTION_INFO_V1(gbt_inet_consistent);
21
PG_FUNCTION_INFO_V1(gbt_cidr_consistent);
22
PG_FUNCTION_INFO_V1(gbt_inet_penalty);
23
PG_FUNCTION_INFO_V1(gbt_inet_same);
25
Datum gbt_inet_compress(PG_FUNCTION_ARGS);
26
Datum gbt_cidr_compress(PG_FUNCTION_ARGS);
27
Datum gbt_inet_union(PG_FUNCTION_ARGS);
28
Datum gbt_inet_picksplit(PG_FUNCTION_ARGS);
29
Datum gbt_inet_consistent(PG_FUNCTION_ARGS);
30
Datum gbt_cidr_consistent(PG_FUNCTION_ARGS);
31
Datum gbt_inet_penalty(PG_FUNCTION_ARGS);
32
Datum gbt_inet_same(PG_FUNCTION_ARGS);
36
gbt_inetgt(const void *a, const void *b)
38
return (*((double *) a) > *((double *) b));
41
gbt_inetge(const void *a, const void *b)
43
return (*((double *) a) >= *((double *) b));
46
gbt_ineteq(const void *a, const void *b)
48
return (*((double *) a) == *((double *) b));
51
gbt_inetle(const void *a, const void *b)
53
return (*((double *) a) <= *((double *) b));
56
gbt_inetlt(const void *a, const void *b)
58
return (*((double *) a) < *((double *) b));
62
gbt_inetkey_cmp(const void *a, const void *b)
65
if (*(double *) (&((Nsrt *) a)->t[0]) > *(double *) (&((Nsrt *) b)->t[0]))
67
else if (*(double *) (&((Nsrt *) a)->t[0]) < *(double *) (&((Nsrt *) b)->t[0]))
74
static const gbtree_ninfo tinfo =
87
/**************************************************
89
**************************************************/
94
gbt_inet_compress_inetrnal(GISTENTRY *retval, GISTENTRY *entry, Oid typid)
99
inetKEY *r = (inetKEY *) palloc(sizeof(inetKEY));
101
retval = palloc(sizeof(GISTENTRY));
102
r->lower = convert_network_to_scalar(entry->key, typid);
104
gistentryinit(*retval, PointerGetDatum(r),
105
entry->rel, entry->page,
106
entry->offset, sizeof(inetKEY), FALSE);
117
gbt_inet_compress(PG_FUNCTION_ARGS)
119
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
120
GISTENTRY *retval = NULL;
122
PG_RETURN_POINTER(gbt_inet_compress_inetrnal(retval, entry, INETOID));
126
gbt_cidr_compress(PG_FUNCTION_ARGS)
128
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
129
GISTENTRY *retval = NULL;
131
PG_RETURN_POINTER(gbt_inet_compress_inetrnal(retval, entry, CIDROID));
136
gbt_inet_consistent_internal(
137
const GISTENTRY *entry,
139
const StrategyNumber *strategy
142
inetKEY *kkk = (inetKEY *) DatumGetPointer(entry->key);
145
key.lower = (GBT_NUMKEY *) & kkk->lower;
146
key.upper = (GBT_NUMKEY *) & kkk->upper;
149
gbt_num_consistent(&key, (void *) query, strategy, GIST_LEAF(entry), &tinfo)
155
gbt_inet_consistent(PG_FUNCTION_ARGS)
157
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
158
double query = convert_network_to_scalar(PG_GETARG_DATUM(1), INETOID);
159
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
162
gbt_inet_consistent_internal(entry, &query, &strategy)
167
gbt_cidr_consistent(PG_FUNCTION_ARGS)
169
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
170
double query = convert_network_to_scalar(PG_GETARG_DATUM(1), CIDROID);
171
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
174
gbt_inet_consistent_internal(entry, &query, &strategy)
180
gbt_inet_union(PG_FUNCTION_ARGS)
182
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
183
void *out = palloc(sizeof(inetKEY));
185
*(int *) PG_GETARG_POINTER(1) = sizeof(inetKEY);
186
PG_RETURN_POINTER(gbt_num_union((void *) out, entryvec, &tinfo));
191
gbt_inet_penalty(PG_FUNCTION_ARGS)
193
inetKEY *origentry = (inetKEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(0))->key);
194
inetKEY *newentry = (inetKEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key);
195
float *result = (float *) PG_GETARG_POINTER(2);
201
penalty_range_enlarge(origentry->lower, origentry->upper, newentry->lower, newentry->upper);
206
*result += (float) (res / ((double) (res + origentry->upper - origentry->lower)));
207
*result *= (FLT_MAX / (((GISTENTRY *) PG_GETARG_POINTER(0))->rel->rd_att->natts + 1));
210
PG_RETURN_POINTER(result);
215
gbt_inet_picksplit(PG_FUNCTION_ARGS)
217
PG_RETURN_POINTER(gbt_num_picksplit(
218
(GistEntryVector *) PG_GETARG_POINTER(0),
219
(GIST_SPLITVEC *) PG_GETARG_POINTER(1),
225
gbt_inet_same(PG_FUNCTION_ARGS)
227
inetKEY *b1 = (inetKEY *) PG_GETARG_POINTER(0);
228
inetKEY *b2 = (inetKEY *) PG_GETARG_POINTER(1);
229
bool *result = (bool *) PG_GETARG_POINTER(2);
231
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo);
232
PG_RETURN_POINTER(result);