Age Owner Branch data TLA Line data Source code
1 : : /*
2 : : * contrib/btree_gist/btree_bytea.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 : :
11 : : /* GiST support functions */
7961 teodor@sigaev.ru 12 :CBC 4 : PG_FUNCTION_INFO_V1(gbt_bytea_compress);
13 : 4 : PG_FUNCTION_INFO_V1(gbt_bytea_union);
14 : 4 : PG_FUNCTION_INFO_V1(gbt_bytea_picksplit);
15 : 4 : PG_FUNCTION_INFO_V1(gbt_bytea_consistent);
16 : 4 : PG_FUNCTION_INFO_V1(gbt_bytea_penalty);
17 : 4 : PG_FUNCTION_INFO_V1(gbt_bytea_same);
346 heikki.linnakangas@i 18 : 4 : PG_FUNCTION_INFO_V1(gbt_bytea_sortsupport);
19 : :
20 : :
21 : : /* define for comparison */
22 : :
23 : : static bool
3281 andrew@dunslane.net 24 : 617 : gbt_byteagt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
25 : : {
5441 tgl@sss.pgh.pa.us 26 : 617 : return DatumGetBool(DirectFunctionCall2(byteagt,
27 : : PointerGetDatum(a),
28 : : PointerGetDatum(b)));
29 : : }
30 : :
31 : : static bool
3281 andrew@dunslane.net 32 : 617 : gbt_byteage(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
33 : : {
5441 tgl@sss.pgh.pa.us 34 : 617 : return DatumGetBool(DirectFunctionCall2(byteage,
35 : : PointerGetDatum(a),
36 : : PointerGetDatum(b)));
37 : : }
38 : :
39 : : static bool
3281 andrew@dunslane.net 40 : 1234 : gbt_byteaeq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
41 : : {
5441 tgl@sss.pgh.pa.us 42 : 1234 : return DatumGetBool(DirectFunctionCall2(byteaeq,
43 : : PointerGetDatum(a),
44 : : PointerGetDatum(b)));
45 : : }
46 : :
47 : : static bool
3281 andrew@dunslane.net 48 : 989 : gbt_byteale(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
49 : : {
5441 tgl@sss.pgh.pa.us 50 : 989 : return DatumGetBool(DirectFunctionCall2(byteale,
51 : : PointerGetDatum(a),
52 : : PointerGetDatum(b)));
53 : : }
54 : :
55 : : static bool
3281 andrew@dunslane.net 56 : 1607 : gbt_bytealt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
57 : : {
5441 tgl@sss.pgh.pa.us 58 : 1607 : return DatumGetBool(DirectFunctionCall2(bytealt,
59 : : PointerGetDatum(a),
60 : : PointerGetDatum(b)));
61 : : }
62 : :
63 : : static int32
3281 andrew@dunslane.net 64 : 10436 : gbt_byteacmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
65 : : {
5441 tgl@sss.pgh.pa.us 66 : 10436 : return DatumGetInt32(DirectFunctionCall2(byteacmp,
67 : : PointerGetDatum(a),
68 : : PointerGetDatum(b)));
69 : : }
70 : :
71 : : static const gbtree_vinfo tinfo =
72 : : {
73 : : gbt_t_bytea,
74 : : 0,
75 : : true,
76 : : gbt_byteagt,
77 : : gbt_byteage,
78 : : gbt_byteaeq,
79 : : gbt_byteale,
80 : : gbt_bytealt,
81 : : gbt_byteacmp,
82 : : NULL
83 : : };
84 : :
85 : :
86 : : /**************************************************
87 : : * GiST support functions
88 : : **************************************************/
89 : :
90 : : Datum
7868 bruce@momjian.us 91 : 995 : gbt_bytea_compress(PG_FUNCTION_ARGS)
92 : : {
93 : 995 : GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
94 : :
95 : 995 : PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
96 : : }
97 : :
98 : : Datum
7961 teodor@sigaev.ru 99 : 5106 : gbt_bytea_consistent(PG_FUNCTION_ARGS)
100 : : {
7868 bruce@momjian.us 101 : 5106 : GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
472 peter@eisentraut.org 102 : 5106 : void *query = DatumGetByteaP(PG_GETARG_DATUM(1));
7868 bruce@momjian.us 103 : 5106 : StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
104 : : #ifdef NOT_USED
105 : : Oid subtype = PG_GETARG_OID(3);
106 : : #endif
6544 tgl@sss.pgh.pa.us 107 : 5106 : bool *recheck = (bool *) PG_GETARG_POINTER(4);
108 : : bool retval;
109 : 5106 : GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
7868 bruce@momjian.us 110 : 5106 : GBT_VARKEY_R r = gbt_var_key_readable(key);
111 : :
112 : : /* All cases served by this function are exact */
6544 tgl@sss.pgh.pa.us 113 : 5106 : *recheck = false;
114 : :
5441 115 : 10212 : retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
3281 andrew@dunslane.net 116 : 5106 : GIST_LEAF(entry), &tinfo, fcinfo->flinfo);
7868 bruce@momjian.us 117 : 5106 : PG_RETURN_BOOL(retval);
118 : : }
119 : :
120 : : Datum
7961 teodor@sigaev.ru 121 : 1 : gbt_bytea_union(PG_FUNCTION_ARGS)
122 : : {
7868 bruce@momjian.us 123 : 1 : GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
124 : 1 : int32 *size = (int *) PG_GETARG_POINTER(1);
125 : :
5441 tgl@sss.pgh.pa.us 126 : 1 : PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),
127 : : &tinfo, fcinfo->flinfo));
128 : : }
129 : :
130 : : Datum
7961 teodor@sigaev.ru 131 : 5 : gbt_bytea_picksplit(PG_FUNCTION_ARGS)
132 : : {
7868 bruce@momjian.us 133 : 5 : GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
134 : 5 : GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
135 : :
5441 tgl@sss.pgh.pa.us 136 : 5 : gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),
137 : : &tinfo, fcinfo->flinfo);
7868 bruce@momjian.us 138 : 5 : PG_RETURN_POINTER(v);
139 : : }
140 : :
141 : : Datum
7961 teodor@sigaev.ru 142 :UBC 0 : gbt_bytea_same(PG_FUNCTION_ARGS)
143 : : {
7868 bruce@momjian.us 144 : 0 : Datum d1 = PG_GETARG_DATUM(0);
145 : 0 : Datum d2 = PG_GETARG_DATUM(1);
146 : 0 : bool *result = (bool *) PG_GETARG_POINTER(2);
147 : :
3281 andrew@dunslane.net 148 : 0 : *result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
5441 tgl@sss.pgh.pa.us 149 : 0 : PG_RETURN_POINTER(result);
150 : : }
151 : :
152 : : Datum
7961 teodor@sigaev.ru 153 : 0 : gbt_bytea_penalty(PG_FUNCTION_ARGS)
154 : : {
7868 bruce@momjian.us 155 : 0 : GISTENTRY *o = (GISTENTRY *) PG_GETARG_POINTER(0);
156 : 0 : GISTENTRY *n = (GISTENTRY *) PG_GETARG_POINTER(1);
7612 neilc@samurai.com 157 : 0 : float *result = (float *) PG_GETARG_POINTER(2);
158 : :
5441 tgl@sss.pgh.pa.us 159 : 0 : PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),
160 : : &tinfo, fcinfo->flinfo));
161 : : }
162 : :
163 : : static int
346 heikki.linnakangas@i 164 :CBC 10773 : gbt_bytea_ssup_cmp(Datum x, Datum y, SortSupport ssup)
165 : : {
166 : 10773 : GBT_VARKEY *key1 = PG_DETOAST_DATUM(x);
167 : 10773 : GBT_VARKEY *key2 = PG_DETOAST_DATUM(y);
168 : :
169 : 10773 : GBT_VARKEY_R xkey = gbt_var_key_readable(key1);
170 : 10773 : GBT_VARKEY_R ykey = gbt_var_key_readable(key2);
171 : : Datum result;
172 : :
173 : : /* for leaf items we expect lower == upper, so only compare lower */
174 : 10773 : result = DirectFunctionCall2(byteacmp,
175 : : PointerGetDatum(xkey.lower),
176 : : PointerGetDatum(ykey.lower));
177 : :
178 [ + - ]: 10773 : GBT_FREE_IF_COPY(key1, x);
179 [ + - ]: 10773 : GBT_FREE_IF_COPY(key2, y);
180 : :
181 : 10773 : return DatumGetInt32(result);
182 : : }
183 : :
184 : : Datum
185 : 1 : gbt_bytea_sortsupport(PG_FUNCTION_ARGS)
186 : : {
187 : 1 : SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
188 : :
189 : 1 : ssup->comparator = gbt_bytea_ssup_cmp;
190 : 1 : ssup->ssup_extra = NULL;
191 : :
192 : 1 : PG_RETURN_VOID();
193 : : }
|