PolarDB-for-PostgreSQL
211 строк · 4.6 Кб
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/builtins.h"9#include "utils/bytea.h"10#include "utils/varbit.h"11
12
13/*
14** Bit ops
15*/
16PG_FUNCTION_INFO_V1(gbt_bit_compress);17PG_FUNCTION_INFO_V1(gbt_bit_union);18PG_FUNCTION_INFO_V1(gbt_bit_picksplit);19PG_FUNCTION_INFO_V1(gbt_bit_consistent);20PG_FUNCTION_INFO_V1(gbt_bit_penalty);21PG_FUNCTION_INFO_V1(gbt_bit_same);22
23
24/* define for comparison */
25
26static bool27gbt_bitgt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)28{
29return DatumGetBool(DirectFunctionCall2(bitgt,30PointerGetDatum(a),31PointerGetDatum(b)));32}
33
34static bool35gbt_bitge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)36{
37return DatumGetBool(DirectFunctionCall2(bitge,38PointerGetDatum(a),39PointerGetDatum(b)));40}
41
42static bool43gbt_biteq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)44{
45return DatumGetBool(DirectFunctionCall2(biteq,46PointerGetDatum(a),47PointerGetDatum(b)));48}
49
50static bool51gbt_bitle(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)52{
53return DatumGetBool(DirectFunctionCall2(bitle,54PointerGetDatum(a),55PointerGetDatum(b)));56}
57
58static bool59gbt_bitlt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)60{
61return DatumGetBool(DirectFunctionCall2(bitlt,62PointerGetDatum(a),63PointerGetDatum(b)));64}
65
66static int3267gbt_bitcmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)68{
69return DatumGetInt32(DirectFunctionCall2(byteacmp,70PointerGetDatum(a),71PointerGetDatum(b)));72}
73
74
75static bytea *76gbt_bit_xfrm(bytea *leaf)77{
78bytea *out = leaf;79int sz = VARBITBYTES(leaf) + VARHDRSZ;80int padded_sz = INTALIGN(sz);81
82out = (bytea *) palloc(padded_sz);83/* initialize the padding bytes to zero */84while (sz < padded_sz)85((char *) out)[sz++] = 0;86SET_VARSIZE(out, padded_sz);87memcpy((void *) VARDATA(out), (void *) VARBITS(leaf), VARBITBYTES(leaf));88return out;89}
90
91
92
93
94static GBT_VARKEY *95gbt_bit_l2n(GBT_VARKEY *leaf, FmgrInfo *flinfo)96{
97GBT_VARKEY *out = leaf;98GBT_VARKEY_R r = gbt_var_key_readable(leaf);99bytea *o;100
101o = gbt_bit_xfrm(r.lower);102r.upper = r.lower = o;103out = gbt_var_key_copy(&r);104pfree(o);105
106return out;107
108}
109
110static const gbtree_vinfo tinfo =111{
112gbt_t_bit,1130,114true,115gbt_bitgt,116gbt_bitge,117gbt_biteq,118gbt_bitle,119gbt_bitlt,120gbt_bitcmp,121gbt_bit_l2n
122};123
124
125/**************************************************
126* Bit ops
127**************************************************/
128
129Datum
130gbt_bit_compress(PG_FUNCTION_ARGS)131{
132GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);133
134PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));135}
136
137Datum
138gbt_bit_consistent(PG_FUNCTION_ARGS)139{
140GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);141void *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));142StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);143
144/* Oid subtype = PG_GETARG_OID(3); */145bool *recheck = (bool *) PG_GETARG_POINTER(4);146bool retval;147GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);148GBT_VARKEY_R r = gbt_var_key_readable(key);149
150/* All cases served by this function are exact */151*recheck = false;152
153if (GIST_LEAF(entry))154retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),155true, &tinfo, fcinfo->flinfo);156else157{158bytea *q = gbt_bit_xfrm((bytea *) query);159
160retval = gbt_var_consistent(&r, q, strategy, PG_GET_COLLATION(),161false, &tinfo, fcinfo->flinfo);162}163PG_RETURN_BOOL(retval);164}
165
166
167
168Datum
169gbt_bit_union(PG_FUNCTION_ARGS)170{
171GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);172int32 *size = (int *) PG_GETARG_POINTER(1);173
174PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),175&tinfo, fcinfo->flinfo));176}
177
178
179Datum
180gbt_bit_picksplit(PG_FUNCTION_ARGS)181{
182GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);183GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);184
185gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),186&tinfo, fcinfo->flinfo);187PG_RETURN_POINTER(v);188}
189
190Datum
191gbt_bit_same(PG_FUNCTION_ARGS)192{
193Datum d1 = PG_GETARG_DATUM(0);194Datum d2 = PG_GETARG_DATUM(1);195bool *result = (bool *) PG_GETARG_POINTER(2);196
197*result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);198PG_RETURN_POINTER(result);199}
200
201
202Datum
203gbt_bit_penalty(PG_FUNCTION_ARGS)204{
205GISTENTRY *o = (GISTENTRY *) PG_GETARG_POINTER(0);206GISTENTRY *n = (GISTENTRY *) PG_GETARG_POINTER(1);207float *result = (float *) PG_GETARG_POINTER(2);208
209PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),210&tinfo, fcinfo->flinfo));211}
212