|
19 | 19 | #include "catalog/index.h"
|
20 | 20 | #include "miscadmin.h"
|
21 | 21 | #include "storage/bufmgr.h"
|
| 22 | +#include "storage/smgr.h" |
22 | 23 | #include "storage/indexfsm.h"
|
23 | 24 | #include "utils/memutils.h"
|
24 | 25 |
|
@@ -411,6 +412,47 @@ ginbuild(PG_FUNCTION_ARGS)
|
411 | 412 | PG_RETURN_POINTER(result);
|
412 | 413 | }
|
413 | 414 |
|
| 415 | +/* |
| 416 | + * ginbuildempty() -- build an empty gin index in the initialization fork |
| 417 | + */ |
| 418 | +Datum |
| 419 | +ginbuildempty(PG_FUNCTION_ARGS) |
| 420 | +{ |
| 421 | + Relation index = (Relation) PG_GETARG_POINTER(0); |
| 422 | + Buffer RootBuffer, |
| 423 | + MetaBuffer; |
| 424 | + |
| 425 | + /* An empty GIN index has two pages. */ |
| 426 | + MetaBuffer = |
| 427 | + ReadBufferExtended(index, INIT_FORKNUM, P_NEW, RBM_NORMAL, NULL); |
| 428 | + LockBuffer(MetaBuffer, BUFFER_LOCK_EXCLUSIVE); |
| 429 | + RootBuffer = |
| 430 | + ReadBufferExtended(index, INIT_FORKNUM, P_NEW, RBM_NORMAL, NULL); |
| 431 | + LockBuffer(RootBuffer, BUFFER_LOCK_EXCLUSIVE); |
| 432 | + |
| 433 | + /* Initialize both pages, mark them dirty, unlock and release buffer. */ |
| 434 | + START_CRIT_SECTION(); |
| 435 | + GinInitMetabuffer(MetaBuffer); |
| 436 | + MarkBufferDirty(MetaBuffer); |
| 437 | + GinInitBuffer(RootBuffer, GIN_LEAF); |
| 438 | + MarkBufferDirty(RootBuffer); |
| 439 | + |
| 440 | + /* XLOG the new pages */ |
| 441 | + log_newpage(&index->rd_smgr->smgr_rnode.node, INIT_FORKNUM, |
| 442 | + BufferGetBlockNumber(MetaBuffer), |
| 443 | + BufferGetPage(MetaBuffer)); |
| 444 | + log_newpage(&index->rd_smgr->smgr_rnode.node, INIT_FORKNUM, |
| 445 | + BufferGetBlockNumber(RootBuffer), |
| 446 | + BufferGetPage(RootBuffer)); |
| 447 | + END_CRIT_SECTION(); |
| 448 | + |
| 449 | + /* Unlock and release the buffers. */ |
| 450 | + UnlockReleaseBuffer(MetaBuffer); |
| 451 | + UnlockReleaseBuffer(RootBuffer); |
| 452 | + |
| 453 | + PG_RETURN_VOID(); |
| 454 | +} |
| 455 | + |
414 | 456 | /*
|
415 | 457 | * Inserts value during normal insertion
|
416 | 458 | */
|
|
0 commit comments