PostgreSQL Source Code git master
Loading...
Searching...
No Matches
btree_bit.c
Go to the documentation of this file.
1/*
2 * contrib/btree_gist/btree_bit.c
3 */
4#include "postgres.h"
5
6#include "btree_gist.h"
7#include "btree_utils_var.h"
8#include "utils/fmgrprotos.h"
9#include "utils/sortsupport.h"
10#include "utils/varbit.h"
11#include "varatt.h"
12
13/* GiST support functions */
22
23
24/* define for comparison */
25
26static bool
27gbt_bitgt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
28{
32}
33
34static bool
35gbt_bitge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
36{
40}
41
42static bool
43gbt_biteq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
44{
48}
49
50static bool
51gbt_bitle(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
52{
56}
57
58static bool
59gbt_bitlt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
60{
64}
65
66static int32
67gbt_bitcmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
68{
72}
73
74
75static bytea *
77{
78 bytea *out = leaf;
79 int sz = VARBITBYTES(leaf) + VARHDRSZ;
80 int padded_sz = INTALIGN(sz);
81
82 out = (bytea *) palloc(padded_sz);
83 /* initialize the padding bytes to zero */
84 while (sz < padded_sz)
85 ((char *) out)[sz++] = 0;
88 return out;
89}
90
91
92
93
94static GBT_VARKEY *
96{
97 GBT_VARKEY *out = leaf;
99 bytea *o;
100
101 o = gbt_bit_xfrm(r.lower);
102 r.upper = r.lower = o;
103 out = gbt_var_key_copy(&r);
104 pfree(o);
105
106 return out;
107}
108
109static const gbtree_vinfo tinfo =
110{
111 gbt_t_bit,
112 0,
113 true,
114 gbt_bitgt,
115 gbt_bitge,
116 gbt_biteq,
117 gbt_bitle,
118 gbt_bitlt,
121};
122
123
124/**************************************************
125 * GiST support functions
126 **************************************************/
127
128Datum
135
136Datum
138{
139 GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
140 void *query = DatumGetByteaP(PG_GETARG_DATUM(1));
142#ifdef NOT_USED
143 Oid subtype = PG_GETARG_OID(3);
144#endif
145 bool *recheck = (bool *) PG_GETARG_POINTER(4);
146 bool retval;
147 GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
149
150 /* All cases served by this function are exact */
151 *recheck = false;
152
153 if (GIST_LEAF(entry))
154 retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
155 true, &tinfo, fcinfo->flinfo);
156 else
157 {
158 bytea *q = gbt_bit_xfrm((bytea *) query);
159
160 retval = gbt_var_consistent(&r, q, strategy, PG_GET_COLLATION(),
161 false, &tinfo, fcinfo->flinfo);
162 }
163 PG_RETURN_BOOL(retval);
164}
165
166Datum
175
176Datum
186
187Datum
189{
190 Datum d1 = PG_GETARG_DATUM(0);
191 Datum d2 = PG_GETARG_DATUM(1);
192 bool *result = (bool *) PG_GETARG_POINTER(2);
193
194 *result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
195 PG_RETURN_POINTER(result);
196}
197
198Datum
200{
203 float *result = (float *) PG_GETARG_POINTER(2);
204
206 &tinfo, fcinfo->flinfo));
207}
208
209static int
211{
214
217 Datum result;
218
219 /* for leaf items we expect lower == upper, so only compare lower */
221 PointerGetDatum(arg1.lower),
222 PointerGetDatum(arg2.lower));
223
226
227 return DatumGetInt32(result);
228}
229
230Datum
240
241Datum
static bool gbt_bitge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
Definition btree_bit.c:35
Datum gbt_bit_same(PG_FUNCTION_ARGS)
Definition btree_bit.c:188
static bool gbt_bitgt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
Definition btree_bit.c:27
static int32 gbt_bitcmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
Definition btree_bit.c:67
Datum gbt_bit_sortsupport(PG_FUNCTION_ARGS)
Definition btree_bit.c:231
Datum gbt_varbit_sortsupport(PG_FUNCTION_ARGS)
Definition btree_bit.c:242
static bool gbt_bitle(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
Definition btree_bit.c:51
static const gbtree_vinfo tinfo
Definition btree_bit.c:109
Datum gbt_bit_consistent(PG_FUNCTION_ARGS)
Definition btree_bit.c:137
Datum gbt_bit_penalty(PG_FUNCTION_ARGS)
Definition btree_bit.c:199
Datum gbt_bit_compress(PG_FUNCTION_ARGS)
Definition btree_bit.c:129
static bool gbt_biteq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
Definition btree_bit.c:43
static bool gbt_bitlt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
Definition btree_bit.c:59
static GBT_VARKEY * gbt_bit_l2n(GBT_VARKEY *leaf, FmgrInfo *flinfo)
Definition btree_bit.c:95
static int gbt_bit_ssup_cmp(Datum x, Datum y, SortSupport ssup)
Definition btree_bit.c:210
Datum gbt_bit_union(PG_FUNCTION_ARGS)
Definition btree_bit.c:167
static bytea * gbt_bit_xfrm(bytea *leaf)
Definition btree_bit.c:76
Datum gbt_bit_picksplit(PG_FUNCTION_ARGS)
Definition btree_bit.c:177
@ gbt_t_bit
Definition btree_gist.h:34
GBT_VARKEY * gbt_var_union(const GistEntryVector *entryvec, int32 *size, Oid collation, const gbtree_vinfo *tinfo, FmgrInfo *flinfo)
bool gbt_var_consistent(GBT_VARKEY_R *key, const void *query, StrategyNumber strategy, Oid collation, bool is_leaf, const gbtree_vinfo *tinfo, FmgrInfo *flinfo)
GISTENTRY * gbt_var_compress(GISTENTRY *entry, const gbtree_vinfo *tinfo)
GIST_SPLITVEC * gbt_var_picksplit(const GistEntryVector *entryvec, GIST_SPLITVEC *v, Oid collation, const gbtree_vinfo *tinfo, FmgrInfo *flinfo)
GBT_VARKEY_R gbt_var_key_readable(const GBT_VARKEY *k)
float * gbt_var_penalty(float *res, const GISTENTRY *o, const GISTENTRY *n, Oid collation, const gbtree_vinfo *tinfo, FmgrInfo *flinfo)
GBT_VARKEY * gbt_var_key_copy(const GBT_VARKEY_R *u)
bool gbt_var_same(Datum d1, Datum d2, Oid collation, const gbtree_vinfo *tinfo, FmgrInfo *flinfo)
#define GBT_FREE_IF_COPY(ptr1, ptr2)
Datum byteacmp(PG_FUNCTION_ARGS)
Definition bytea.c:959
#define INTALIGN(LEN)
Definition c.h:823
#define VARHDRSZ
Definition c.h:711
int32_t int32
Definition c.h:542
#define PG_RETURN_VOID()
Definition fmgr.h:350
#define PG_GETARG_OID(n)
Definition fmgr.h:275
#define DirectFunctionCall2(func, arg1, arg2)
Definition fmgr.h:686
#define PG_GETARG_POINTER(n)
Definition fmgr.h:277
#define PG_GETARG_DATUM(n)
Definition fmgr.h:268
#define PG_FUNCTION_INFO_V1(funcname)
Definition fmgr.h:417
#define PG_GETARG_UINT16(n)
Definition fmgr.h:272
#define PG_DETOAST_DATUM(datum)
Definition fmgr.h:240
#define PG_RETURN_POINTER(x)
Definition fmgr.h:363
#define PG_GET_COLLATION()
Definition fmgr.h:198
#define PG_FUNCTION_ARGS
Definition fmgr.h:193
#define PG_RETURN_BOOL(x)
Definition fmgr.h:360
#define DatumGetByteaP(X)
Definition fmgr.h:332
#define GIST_LEAF(entry)
Definition gist.h:171
int y
Definition isn.c:76
int b
Definition isn.c:74
int x
Definition isn.c:75
int a
Definition isn.c:73
void pfree(void *pointer)
Definition mcxt.c:1616
void * palloc(Size size)
Definition mcxt.c:1387
static bool DatumGetBool(Datum X)
Definition postgres.h:100
static Datum PointerGetDatum(const void *X)
Definition postgres.h:352
uint64_t Datum
Definition postgres.h:70
static Pointer DatumGetPointer(Datum X)
Definition postgres.h:342
static int32 DatumGetInt32(Datum X)
Definition postgres.h:212
unsigned int Oid
static int fb(int x)
struct SortSupportData * SortSupport
Definition sortsupport.h:58
uint16 StrategyNumber
Definition stratnum.h:22
Datum key
Definition gist.h:161
int(* comparator)(Datum x, Datum y, SortSupport ssup)
Definition c.h:706
static char * VARDATA(const void *PTR)
Definition varatt.h:305
static void SET_VARSIZE(void *PTR, Size len)
Definition varatt.h:432
Datum bitge(PG_FUNCTION_ARGS)
Definition varbit.c:934
Datum bitle(PG_FUNCTION_ARGS)
Definition varbit.c:904
Datum biteq(PG_FUNCTION_ARGS)
Definition varbit.c:841
Datum bitlt(PG_FUNCTION_ARGS)
Definition varbit.c:889
Datum bitgt(PG_FUNCTION_ARGS)
Definition varbit.c:919
#define VARBITBYTES(PTR)
Definition varbit.h:73
#define VARBITS(PTR)
Definition varbit.h:71