Age Owner Branch data TLA Line data Source code
1 : : /*
2 : : * contrib/btree_gist/btree_text.c
3 : : */
4 : : #include "postgres.h"
5 : :
6 : : #include "btree_gist.h"
7 : : #include "btree_utils_var.h"
8 : : #include "utils/builtins.h"
9 : :
10 : : /*
11 : : ** Text ops
12 : : */
7261 teodor@sigaev.ru 13 :CBC 4 : PG_FUNCTION_INFO_V1(gbt_text_compress);
14 : 2 : PG_FUNCTION_INFO_V1(gbt_bpchar_compress);
15 : 5 : PG_FUNCTION_INFO_V1(gbt_text_union);
16 : 5 : PG_FUNCTION_INFO_V1(gbt_text_picksplit);
17 : 4 : PG_FUNCTION_INFO_V1(gbt_text_consistent);
18 : 2 : PG_FUNCTION_INFO_V1(gbt_bpchar_consistent);
19 : 5 : PG_FUNCTION_INFO_V1(gbt_text_penalty);
20 : 5 : PG_FUNCTION_INFO_V1(gbt_text_same);
21 : :
22 : :
23 : : /* define for comparison */
24 : :
25 : : static bool
2581 andrew@dunslane.net 26 : 1195 : gbt_textgt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
27 : : {
4751 tgl@sss.pgh.pa.us 28 : 1195 : return DatumGetBool(DirectFunctionCall2Coll(text_gt,
29 : : collation,
30 : : PointerGetDatum(a),
31 : : PointerGetDatum(b)));
32 : : }
33 : :
34 : : static bool
2581 andrew@dunslane.net 35 : 1202 : gbt_textge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
36 : : {
4751 tgl@sss.pgh.pa.us 37 : 1202 : return DatumGetBool(DirectFunctionCall2Coll(text_ge,
38 : : collation,
39 : : PointerGetDatum(a),
40 : : PointerGetDatum(b)));
41 : : }
42 : :
43 : : static bool
2581 andrew@dunslane.net 44 : 295 : gbt_texteq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
45 : : {
4751 tgl@sss.pgh.pa.us 46 : 295 : return DatumGetBool(DirectFunctionCall2Coll(texteq,
47 : : collation,
48 : : PointerGetDatum(a),
49 : : PointerGetDatum(b)));
50 : : }
51 : :
52 : : static bool
2581 andrew@dunslane.net 53 : 1065 : gbt_textle(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
54 : : {
4751 tgl@sss.pgh.pa.us 55 : 1065 : return DatumGetBool(DirectFunctionCall2Coll(text_le,
56 : : collation,
57 : : PointerGetDatum(a),
58 : : PointerGetDatum(b)));
59 : : }
60 : :
61 : : static bool
2581 andrew@dunslane.net 62 : 995 : gbt_textlt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
63 : : {
4751 tgl@sss.pgh.pa.us 64 : 995 : return DatumGetBool(DirectFunctionCall2Coll(text_lt,
65 : : collation,
66 : : PointerGetDatum(a),
67 : : PointerGetDatum(b)));
68 : : }
69 : :
70 : : static int32
2581 andrew@dunslane.net 71 : 62857 : gbt_textcmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
72 : : {
4751 tgl@sss.pgh.pa.us 73 : 62857 : return DatumGetInt32(DirectFunctionCall2Coll(bttextcmp,
74 : : collation,
75 : : PointerGetDatum(a),
76 : : PointerGetDatum(b)));
77 : : }
78 : :
79 : : static gbtree_vinfo tinfo =
80 : : {
81 : : gbt_t_text,
82 : : 0,
83 : : false,
84 : : gbt_textgt,
85 : : gbt_textge,
86 : : gbt_texteq,
87 : : gbt_textle,
88 : : gbt_textlt,
89 : : gbt_textcmp,
90 : : NULL
91 : : };
92 : :
93 : : /* bpchar needs its own comparison rules */
94 : :
95 : : static bool
827 96 : 596 : gbt_bpchargt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
97 : : {
98 : 596 : return DatumGetBool(DirectFunctionCall2Coll(bpchargt,
99 : : collation,
100 : : PointerGetDatum(a),
101 : : PointerGetDatum(b)));
102 : : }
103 : :
104 : : static bool
105 : 605 : gbt_bpcharge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
106 : : {
107 : 605 : return DatumGetBool(DirectFunctionCall2Coll(bpcharge,
108 : : collation,
109 : : PointerGetDatum(a),
110 : : PointerGetDatum(b)));
111 : : }
112 : :
113 : : static bool
114 : 71 : gbt_bpchareq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
115 : : {
116 : 71 : return DatumGetBool(DirectFunctionCall2Coll(bpchareq,
117 : : collation,
118 : : PointerGetDatum(a),
119 : : PointerGetDatum(b)));
120 : : }
121 : :
122 : : static bool
123 : 534 : gbt_bpcharle(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
124 : : {
125 : 534 : return DatumGetBool(DirectFunctionCall2Coll(bpcharle,
126 : : collation,
127 : : PointerGetDatum(a),
128 : : PointerGetDatum(b)));
129 : : }
130 : :
131 : : static bool
132 : 463 : gbt_bpcharlt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
133 : : {
134 : 463 : return DatumGetBool(DirectFunctionCall2Coll(bpcharlt,
135 : : collation,
136 : : PointerGetDatum(a),
137 : : PointerGetDatum(b)));
138 : : }
139 : :
140 : : static int32
141 : 71 : gbt_bpcharcmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
142 : : {
143 : 71 : return DatumGetInt32(DirectFunctionCall2Coll(bpcharcmp,
144 : : collation,
145 : : PointerGetDatum(a),
146 : : PointerGetDatum(b)));
147 : : }
148 : :
149 : : static gbtree_vinfo bptinfo =
150 : : {
151 : : gbt_t_bpchar,
152 : : 0,
153 : : false,
154 : : gbt_bpchargt,
155 : : gbt_bpcharge,
156 : : gbt_bpchareq,
157 : : gbt_bpcharle,
158 : : gbt_bpcharlt,
159 : : gbt_bpcharcmp,
160 : : NULL
161 : : };
162 : :
163 : :
164 : : /**************************************************
165 : : * Text ops
166 : : **************************************************/
167 : :
168 : :
169 : : Datum
7168 bruce@momjian.us 170 : 3019 : gbt_text_compress(PG_FUNCTION_ARGS)
171 : : {
172 : 3019 : GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
173 : :
6756 174 [ + + ]: 3019 : if (tinfo.eml == 0)
175 : : {
6862 teodor@sigaev.ru 176 : 4 : tinfo.eml = pg_database_encoding_max_length();
177 : : }
178 : :
7168 bruce@momjian.us 179 : 3019 : PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
180 : : }
181 : :
182 : : Datum
183 : 1010 : gbt_bpchar_compress(PG_FUNCTION_ARGS)
184 : : {
185 : : /* This should never have been distinct from gbt_text_compress */
827 tgl@sss.pgh.pa.us 186 : 1010 : return gbt_text_compress(fcinfo);
187 : : }
188 : :
189 : :
190 : :
191 : : Datum
7261 teodor@sigaev.ru 192 : 4823 : gbt_text_consistent(PG_FUNCTION_ARGS)
193 : : {
7168 bruce@momjian.us 194 : 4823 : GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
195 : 4823 : void *query = (void *) DatumGetTextP(PG_GETARG_DATUM(1));
196 : 4823 : StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
197 : :
198 : : /* Oid subtype = PG_GETARG_OID(3); */
5844 tgl@sss.pgh.pa.us 199 : 4823 : bool *recheck = (bool *) PG_GETARG_POINTER(4);
200 : : bool retval;
201 : 4823 : GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
7168 bruce@momjian.us 202 : 4823 : GBT_VARKEY_R r = gbt_var_key_readable(key);
203 : :
204 : : /* All cases served by this function are exact */
5844 tgl@sss.pgh.pa.us 205 : 4823 : *recheck = false;
206 : :
6756 bruce@momjian.us 207 [ - + ]: 4823 : if (tinfo.eml == 0)
208 : : {
6862 teodor@sigaev.ru 209 :UBC 0 : tinfo.eml = pg_database_encoding_max_length();
210 : : }
211 : :
4741 tgl@sss.pgh.pa.us 212 :CBC 9646 : retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
2581 andrew@dunslane.net 213 : 4823 : GIST_LEAF(entry), &tinfo, fcinfo->flinfo);
214 : :
7168 bruce@momjian.us 215 : 4823 : PG_RETURN_BOOL(retval);
216 : : }
217 : :
218 : :
219 : : Datum
7261 teodor@sigaev.ru 220 : 2333 : gbt_bpchar_consistent(PG_FUNCTION_ARGS)
221 : : {
7168 bruce@momjian.us 222 : 2333 : GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
2400 tgl@sss.pgh.pa.us 223 : 2333 : void *query = (void *) DatumGetTextP(PG_GETARG_DATUM(1));
7168 bruce@momjian.us 224 : 2333 : StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
225 : :
226 : : /* Oid subtype = PG_GETARG_OID(3); */
5844 tgl@sss.pgh.pa.us 227 : 2333 : bool *recheck = (bool *) PG_GETARG_POINTER(4);
228 : : bool retval;
229 : 2333 : GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
7168 bruce@momjian.us 230 : 2333 : GBT_VARKEY_R r = gbt_var_key_readable(key);
231 : :
232 : : /* All cases served by this function are exact */
5844 tgl@sss.pgh.pa.us 233 : 2333 : *recheck = false;
234 : :
827 235 [ + + ]: 2333 : if (bptinfo.eml == 0)
236 : : {
237 : 1 : bptinfo.eml = pg_database_encoding_max_length();
238 : : }
239 : :
240 : 4666 : retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
241 : 2333 : GIST_LEAF(entry), &bptinfo, fcinfo->flinfo);
7168 bruce@momjian.us 242 : 2333 : PG_RETURN_BOOL(retval);
243 : : }
244 : :
245 : :
246 : : Datum
7261 teodor@sigaev.ru 247 : 2492 : gbt_text_union(PG_FUNCTION_ARGS)
248 : : {
7168 bruce@momjian.us 249 : 2492 : GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
250 : 2492 : int32 *size = (int *) PG_GETARG_POINTER(1);
251 : :
4741 tgl@sss.pgh.pa.us 252 : 2492 : PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),
253 : : &tinfo, fcinfo->flinfo));
254 : : }
255 : :
256 : :
257 : : Datum
7261 teodor@sigaev.ru 258 : 19 : gbt_text_picksplit(PG_FUNCTION_ARGS)
259 : : {
7168 bruce@momjian.us 260 : 19 : GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
261 : 19 : GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
262 : :
4741 tgl@sss.pgh.pa.us 263 : 19 : gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),
264 : : &tinfo, fcinfo->flinfo);
7168 bruce@momjian.us 265 : 19 : PG_RETURN_POINTER(v);
266 : : }
267 : :
268 : : Datum
7261 teodor@sigaev.ru 269 : 2489 : gbt_text_same(PG_FUNCTION_ARGS)
270 : : {
7168 bruce@momjian.us 271 : 2489 : Datum d1 = PG_GETARG_DATUM(0);
272 : 2489 : Datum d2 = PG_GETARG_DATUM(1);
273 : 2489 : bool *result = (bool *) PG_GETARG_POINTER(2);
274 : :
2581 andrew@dunslane.net 275 : 2489 : *result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
4741 tgl@sss.pgh.pa.us 276 : 2489 : PG_RETURN_POINTER(result);
277 : : }
278 : :
279 : :
280 : : Datum
7261 teodor@sigaev.ru 281 : 9555 : gbt_text_penalty(PG_FUNCTION_ARGS)
282 : : {
7168 bruce@momjian.us 283 : 9555 : GISTENTRY *o = (GISTENTRY *) PG_GETARG_POINTER(0);
284 : 9555 : GISTENTRY *n = (GISTENTRY *) PG_GETARG_POINTER(1);
6912 neilc@samurai.com 285 : 9555 : float *result = (float *) PG_GETARG_POINTER(2);
286 : :
4741 tgl@sss.pgh.pa.us 287 : 9555 : PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),
288 : : &tinfo, fcinfo->flinfo));
289 : : }
|