PostgreSQL Source Code: src/backend/access/hash/hashinsert.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
17
24
27
28
29
30
31
32
33
34
35
36
37void
39{
53
54
55
56
58
59
61 itemsz = MAXALIGN(itemsz);
62
63
65
66
67
68
69
70
73
74
75
76
77
78
79
80
84 errmsg("index row size %zu exceeds hash maximum %zu",
86 errhint("Values larger than a buffer page cannot be indexed.")));
87
88
92
94
95
97
101
102
103
104
105
106
107
108
109
110
112 {
113
115
120
121
125 }
126
127
129 {
131
132
133
134
135
136
138 {
139
141 {
143
145 break;
146 }
147 }
148
149
150
151
152 nextblkno = pageopaque->hasho_nextblkno;
153
155 {
156
157
158
159
160
161
162
165 else
169 }
170 else
171 {
172
173
174
175
176
177
179
180
183
184
186 }
190 }
191
192
193
194
195
197
198
200
201
204
205
207 metap->hashm_ntuples += 1;
208
209
211 (double) metap->hashm_ffactor * (metap->hashm_maxbucket + 1);
212
214
215
217 {
220
222
225
227
230
232
235 }
236
238
239
241
242
243
244
245
249
250
253
254
256}
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
276{
279
282
283
284
285
286
288 {
290
291#ifdef USE_ASSERT_CHECKING
292
294 {
297
300
303 }
304#endif
305 }
306 else
307 {
309
311 }
312
315
317}
318
319
320
321
322
323
324
325
326
327
328void
331{
335 int i;
336
339
341 {
343
346
347
350
352
355 }
356}
357
358
359
360
361
362
363
364
365static void
367{
371 maxoff;
375
376
379 offnum <= maxoff;
381 {
383
386 }
387
389 {
391
392 snapshotConflictHorizon =
395
396
397
398
400
401
403
405
406
407
408
409
410
411
412
413
416
419
422
423
425 {
428
430 xlrec.snapshotConflictHorizon = snapshotConflictHorizon;
432
436
437
438
439
440
441
444
446
448
451 }
452
454
455
456
457
458
460 }
461}
static bool BlockNumberIsValid(BlockNumber blockNumber)
BlockNumber BufferGetBlockNumber(Buffer buffer)
bool IsBufferCleanupOK(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
Size PageGetFreeSpace(const PageData *page)
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define Assert(condition)
int errcode(int sqlerrcode)
int errhint(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
TransactionId index_compute_xid_horizon_for_tuples(Relation irel, Relation hrel, Buffer ibuf, OffsetNumber *itemnos, int nitems)
#define HashPageGetOpaque(page)
#define H_BUCKET_BEING_SPLIT(opaque)
#define HashPageGetMeta(page)
#define H_HAS_DEAD_TUPLES(opaque)
#define HashMaxItemSize(page)
#define XLOG_HASH_VACUUM_ONE_PAGE
#define SizeOfHashVacuumOnePage
void _hash_doinsert(Relation rel, IndexTuple itup, Relation heapRel, bool sorted)
OffsetNumber _hash_pgaddtup(Relation rel, Buffer buf, Size itemsize, IndexTuple itup, bool appendtup)
void _hash_pgaddmultitup(Relation rel, Buffer buf, IndexTuple *itups, OffsetNumber *itup_offsets, uint16 nitups)
static void _hash_vacuum_one_page(Relation rel, Relation hrel, Buffer metabuf, Buffer buf)
Buffer _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin)
void _hash_relbuf(Relation rel, Buffer buf)
void _hash_dropbuf(Relation rel, Buffer buf)
Buffer _hash_getbuf(Relation rel, BlockNumber blkno, int access, int flags)
void _hash_finish_split(Relation rel, Buffer metabuf, Buffer obuf, Bucket obucket, uint32 maxbucket, uint32 highmask, uint32 lowmask)
Buffer _hash_getbucketbuf_from_hashkey(Relation rel, uint32 hashkey, int access, HashMetaPage *cachedmetap)
void _hash_expandtable(Relation rel, Buffer metabuf)
uint32 _hash_get_indextuple_hashkey(IndexTuple itup)
OffsetNumber _hash_binsearch(Page page, uint32 hash_value)
void _hash_checkpage(Relation rel, Buffer buf, int flags)
#define ItemIdIsDead(itemId)
IndexTupleData * IndexTuple
static Size IndexTupleSize(const IndexTupleData *itup)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define InvalidOffsetNumber
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
static char buf[DEFAULT_XLOG_SEG_SIZE]
void CheckForSerializableConflictIn(Relation relation, const ItemPointerData *tid, BlockNumber blkno)
#define RelationGetRelationName(relation)
#define RelationIsAccessibleInLogicalDecoding(relation)
#define RelationNeedsWAL(relation)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterBufData(uint8 block_id, const void *data, uint32 len)
void XLogRegisterData(const void *data, uint32 len)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)