} GISTBuildState;
/* prototypes for private functions */
+static void GistInitMetabuffer(Relation index, Buffer buffer, BlockNumber root);
static void gistInitBuffering(GISTBuildState *buildstate);
static int calculatePagesPerBuffer(GISTBuildState *buildstate, int levelStep);
static void gistBuildCallback(Relation index,
IndexBuildResult *result;
double reltuples;
GISTBuildState buildstate;
- Buffer rootbuffer;
- Page rootpage;
+ Buffer metabuffer,
+ rootbuffer;
+ Page metapage,
+ rootpage;
+ BlockNumber rootblock;
MemoryContext oldcxt = CurrentMemoryContext;
int fillfactor;
*/
buildstate.giststate->tempCxt = createTempGistContext();
- /* initialize the root page */
+ /* initialize the metabuffer and root buffer */
+ metabuffer = gistNewBuffer(index);
+ metapage = BufferGetPage(metabuffer);
+ Assert(BufferGetBlockNumber(metabuffer) == GIST_METAPAGE_BLKNO);
rootbuffer = gistNewBuffer(index);
rootpage = BufferGetPage(rootbuffer);
+ rootblock = BufferGetBlockNumber(rootbuffer);
START_CRIT_SECTION();
+ GistInitMetabuffer(index, metabuffer, rootblock);
GISTInitBuffer(rootbuffer, F_LEAF | F_ROOT);
MarkBufferDirty(rootbuffer);
gistxlogCreateIndex xlrec;
xlrec.node = index->rd_node;
- xlrec.blkno = BufferGetBlockNumber(rootbuffer);
+ xlrec.blkno = rootblock;
rdata.data = (char *) &xlrec;
rdata.len = sizeof(RelFileNode);
PageSetLSN(rootpage, GetXLogRecPtrForTemp());
UnlockReleaseBuffer(rootbuffer);
+ UnlockReleaseBuffer(metabuffer);
END_CRIT_SECTION();
PG_RETURN_POINTER(result);
}
+/*
+ * Initialize metabuffer.
+ */
+static void
+GistInitMetabuffer(Relation index, Buffer buffer, BlockNumber root)
+{
+ GistMetaPageData *meta;
+ Page page = BufferGetPage(buffer);
+
+ GISTInitBuffer(buffer, 0);
+ MetapageInit(index, page);
+
+ meta = GistPageGetMeta(page);
+ meta->gist_magic = GIST_MAGIC;
+ meta->gist_version = GIST_VERSION;
+ meta->gist_root = root;
+}
+
/*
* Validator for "buffering" reloption on GiST indexes. Allows "on", "off"
* and "auto" values.