|
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 | +Relationindex= (Relation)PG_GETARG_POINTER(0); |
| 422 | +BufferRootBuffer, |
| 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 | */
|
|