*** ./src/backend/access/gin.orig/ginentrypage.c Thu Oct 25 22:11:56 2007 --- ./src/backend/access/gin/ginentrypage.c Thu Oct 25 22:43:17 2007 *************** *** 404,409 **** --- 404,434 ---- } /* + * Returns new tuple with copied value from source tuple. + * New tuple will not store posting list + */ + static IndexTuple + copyIndexTuple(IndexTuple itup, Page page) + { + IndexTuple nitup; + + if (GinPageIsLeaf(page) && !GinIsPostingTree(itup)) + { + nitup = (IndexTuple) palloc(MAXALIGN(GinGetOrigSizePosting(itup))); + memcpy(nitup, itup, GinGetOrigSizePosting(itup)); + nitup->t_info &= ~INDEX_SIZE_MASK; + nitup->t_info |= GinGetOrigSizePosting(itup); + } + else + { + nitup = (IndexTuple) palloc(MAXALIGN(IndexTupleSize(itup))); + memcpy(nitup, itup, IndexTupleSize(itup)); + } + + return nitup; + } + + /* * Place tuple and split page, original buffer(lbuf) leaves untouched, * returns shadow page of lbuf filled new data. * Tuples are distributed between pages by equal size on its, not *************** *** 424,431 **** IndexTuple itup, leftrightmost = NULL; static ginxlogSplit data; - Datum value; - bool isnull; Page page; Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf)); Page rpage = BufferGetPage(rbuf); --- 449,454 ---- *************** *** 494,502 **** ptr += MAXALIGN(IndexTupleSize(itup)); } ! value = index_getattr(leftrightmost, FirstOffsetNumber, btree->ginstate->tupdesc, &isnull); ! btree->entry = GinFormTuple(btree->ginstate, value, NULL, 0); ItemPointerSet(&(btree->entry)->t_tid, BufferGetBlockNumber(lbuf), InvalidOffsetNumber); btree->rightblkno = BufferGetBlockNumber(rbuf); data.node = btree->index->rd_node; --- 517,525 ---- ptr += MAXALIGN(IndexTupleSize(itup)); } ! btree->entry = copyIndexTuple(leftrightmost, lpage); ItemPointerSet(&(btree->entry)->t_tid, BufferGetBlockNumber(lbuf), InvalidOffsetNumber); + btree->rightblkno = BufferGetBlockNumber(rbuf); data.node = btree->index->rd_node; *************** *** 533,552 **** Page page = BufferGetPage(buf); itup = getRightMostTuple(page); ! if (GinPageIsLeaf(page) && !GinIsPostingTree(itup)) ! { ! nitup = (IndexTuple) palloc(MAXALIGN(GinGetOrigSizePosting(itup))); ! memcpy(nitup, itup, GinGetOrigSizePosting(itup)); ! nitup->t_info &= ~INDEX_SIZE_MASK; ! nitup->t_info |= GinGetOrigSizePosting(itup); ! } ! else ! { ! nitup = (IndexTuple) palloc(MAXALIGN(IndexTupleSize(itup))); ! memcpy(nitup, itup, IndexTupleSize(itup)); ! } ! ItemPointerSet(&nitup->t_tid, BufferGetBlockNumber(buf), InvalidOffsetNumber); return nitup; } --- 556,564 ---- Page page = BufferGetPage(buf); itup = getRightMostTuple(page); ! nitup = copyIndexTuple(itup, page); ItemPointerSet(&nitup->t_tid, BufferGetBlockNumber(buf), InvalidOffsetNumber); + return nitup; }