PostgreSQL Source Code: src/backend/access/gin/ginbulk.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
16
17#include <limits.h>
18
22
23
24#define DEF_NENTRY 2048
25#define DEF_NPTR 5
26
27
28
29static void
31{
35
36
37
38
40 {
43 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
44 errmsg("posting list is too long"),
45 errhint("Reduce \"maintenance_work_mem\".")));
46
52 }
53
54
56 {
57 int res;
58
61
62 if (res > 0)
64 }
65
68}
69
70
71static int
73{
77
81}
82
83
86{
89
90
91
92
93
95 {
99 }
100
101
104
106}
107
108void
110{
111
119 NULL,
120 accum);
121}
122
123
124
125
126
129{
132
136 else
137 {
140 }
141 return res;
142}
143
144
145
146
147static void
151{
154 bool isNew;
155
156
157
158
159
163
164 eatmp.list = heapptr;
165
167 &isNew);
168
169 if (isNew)
170 {
171
172
173
174
181 ea->list[0] = *heapptr;
183 }
184 else
185 {
186
187
188
189 }
190}
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208void
213{
214 uint32 step = nentries;
215
216 if (nentries <= 0)
217 return;
218
220
221
222
223
224 step |= (step >> 1);
225 step |= (step >> 2);
226 step |= (step >> 4);
227 step |= (step >> 8);
228 step |= (step >> 16);
229 step >>= 1;
230 step++;
231
232 while (step > 0)
233 {
234 int i;
235
236 for (i = step - 1; i < nentries && i >= 0; i += step << 1 )
238 entries[i], categories[i]);
239
240 step >>= 1;
241 }
242}
243
244static int
246{
248
249
251 return res;
252}
253
254
255void
257{
259}
260
261
262
263
264
265
270{
273
275
276 if (entry == NULL)
277 return NULL;
278
283 *n = entry->count;
284
286
290
292}
Datum datumCopy(Datum value, bool typByVal, int typLen)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define palloc_array(type, count)
static int ginCompareItemPointers(ItemPointer a, ItemPointer b)
signed char GinNullCategory
static int qsortCompareItemPointers(const void *a, const void *b)
void ginBeginBAScan(BuildAccumulator *accum)
ItemPointerData * ginGetBAEntry(BuildAccumulator *accum, OffsetNumber *attnum, Datum *key, GinNullCategory *category, uint32 *n)
static void ginCombineData(RBTNode *existing, const RBTNode *newdata, void *arg)
static RBTNode * ginAllocEntryAccumulator(void *arg)
void ginInsertBAEntries(BuildAccumulator *accum, ItemPointer heapptr, OffsetNumber attnum, Datum *entries, GinNullCategory *categories, int32 nentries)
static int cmpEntryAccumulator(const RBTNode *a, const RBTNode *b, void *arg)
void ginInitBA(BuildAccumulator *accum)
static Datum getDatumCopy(BuildAccumulator *accum, OffsetNumber attnum, Datum value)
static void ginInsertBAEntry(BuildAccumulator *accum, ItemPointer heapptr, OffsetNumber attnum, Datum key, GinNullCategory category)
int ginCompareAttEntries(GinState *ginstate, OffsetNumber attnuma, Datum a, GinNullCategory categorya, OffsetNumber attnumb, Datum b, GinNullCategory categoryb)
Assert(PointerIsAligned(start, uint64))
static bool ItemPointerIsValid(const ItemPointerData *pointer)
Size GetMemoryChunkSpace(void *pointer)
void * repalloc_huge(void *pointer, Size size)
#define FirstOffsetNumber
#define qsort(a, b, c, d)
static Pointer DatumGetPointer(Datum X)
RBTNode * rbt_iterate(RBTreeIterator *iter)
RBTNode * rbt_insert(RBTree *rbt, const RBTNode *data, bool *isNew)
void rbt_begin_iterate(RBTree *rbt, RBTOrderControl ctrl, RBTreeIterator *iter)
RBTree * rbt_create(Size node_size, rbt_comparator comparator, rbt_combiner combiner, rbt_allocfunc allocfunc, rbt_freefunc freefunc, void *arg)
GinEntryAccumulator * entryallocator
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)