PostgreSQL Source Code: src/backend/access/gin/ginarrayproc.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
15
19#include "utils/fmgrprotos.h"
21
22
23#define GinOverlapStrategy 1
24#define GinContainsStrategy 2
25#define GinContainedStrategy 3
26#define GinEqualStrategy 4
27
28
29
30
31
34{
35
40 bool elmbyval;
41 char elmalign;
43 bool *nulls;
44 int nelems;
45
47 &elmlen, &elmbyval, &elmalign);
48
51 elmlen, elmbyval, elmalign,
52 &elems, &nulls, &nelems);
53
54 *nkeys = nelems;
55 *nullFlags = nulls;
56
57
59}
60
61
62
63
64
65
66
69{
70 if (PG_NARGS() < 3)
71 elog(ERROR, "ginarrayextract requires three arguments");
73}
74
75
76
77
80{
81
85
86
87
91 bool elmbyval;
92 char elmalign;
94 bool *nulls;
95 int nelems;
96
98 &elmlen, &elmbyval, &elmalign);
99
102 elmlen, elmbyval, elmalign,
103 &elems, &nulls, &nelems);
104
105 *nkeys = nelems;
106 *nullFlags = nulls;
107
108 switch (strategy)
109 {
112 break;
114 if (nelems > 0)
116 else
118 break;
120
122 break;
124 if (nelems > 0)
126 else
128 break;
129 default:
130 elog(ERROR, "ginqueryarrayextract: unknown strategy number: %d",
131 strategy);
132 }
133
134
136}
137
138
139
140
143{
146
147
149
150
152
153
155 bool res;
157
158 switch (strategy)
159 {
161
162 *recheck = false;
163
164 res = false;
165 for (i = 0; i < nkeys; i++)
166 {
167 if (check[i] && !nullFlags[i])
168 {
169 res = true;
170 break;
171 }
172 }
173 break;
175
176 *recheck = false;
177
178 res = true;
179 for (i = 0; i < nkeys; i++)
180 {
181 if (!check[i] || nullFlags[i])
182 {
183 res = false;
184 break;
185 }
186 }
187 break;
189
190 *recheck = true;
191
192 res = true;
193 break;
195
196 *recheck = true;
197
198
199
200
201
202
203 res = true;
204 for (i = 0; i < nkeys; i++)
205 {
206 if (!check[i])
207 {
208 res = false;
209 break;
210 }
211 }
212 break;
213 default:
214 elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
215 strategy);
216 res = false;
217 }
218
220}
221
222
223
224
227{
230
231
233
234
235
239
240 switch (strategy)
241 {
243
245 for (i = 0; i < nkeys; i++)
246 {
247 if (!nullFlags[i])
248 {
250 {
252 break;
253 }
255 {
257 }
258 }
259 }
260 break;
262
264 for (i = 0; i < nkeys; i++)
265 {
266 if (check[i] == GIN_FALSE || nullFlags[i])
267 {
269 break;
270 }
272 {
274 }
275 }
276 break;
278
280 break;
282
283
284
285
286
287
289 for (i = 0; i < nkeys; i++)
290 {
292 {
294 break;
295 }
296 }
297 break;
298 default:
299 elog(ERROR, "ginarrayconsistent: unknown strategy number: %d",
300 strategy);
301 res = false;
302 }
303
305}
#define PG_GETARG_ARRAYTYPE_P_COPY(n)
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
#define PG_GETARG_POINTER(n)
#define PG_GETARG_UINT16(n)
#define PG_GETARG_INT32(n)
#define PG_RETURN_POINTER(x)
#define PG_RETURN_BOOL(x)
#define PG_RETURN_GIN_TERNARY_VALUE(x)
#define GIN_SEARCH_MODE_ALL
#define GIN_SEARCH_MODE_DEFAULT
#define GIN_SEARCH_MODE_INCLUDE_EMPTY
Datum ginarraytriconsistent(PG_FUNCTION_ARGS)
Datum ginarrayextract_2args(PG_FUNCTION_ARGS)
Datum ginarrayextract(PG_FUNCTION_ARGS)
Datum ginarrayconsistent(PG_FUNCTION_ARGS)
#define GinOverlapStrategy
#define GinContainedStrategy
#define GinContainsStrategy
Datum ginqueryarrayextract(PG_FUNCTION_ARGS)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)