|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.70 2000/12/03 10:27:26 vadim Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.71 2000/12/28 13:00:07 vadim Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -520,39 +520,40 @@ _bt_insertonpg(Relation rel,
|
520 | 520 | {
|
521 | 521 | /* XLOG stuff */
|
522 | 522 | {
|
523 |
| -charxlbuf[sizeof(xl_btree_insert)+ |
524 |
| -sizeof(CommandId)+sizeof(RelFileNode)]; |
525 |
| -xl_btree_insert*xlrec= (xl_btree_insert*)xlbuf; |
526 |
| -inthsize=SizeOfBtreeInsert; |
527 |
| -BTItemDatatruncitem; |
528 |
| -BTItemxlitem=btitem; |
529 |
| -Sizexlsize=IndexTupleDSize(btitem->bti_itup)+ |
530 |
| -(sizeof(BTItemData)-sizeof(IndexTupleData)); |
| 523 | +xl_btree_insertxlrec; |
| 524 | +uint8flag=XLOG_BTREE_INSERT; |
531 | 525 | XLogRecPtrrecptr;
|
| 526 | +XLogRecDatardata[2]; |
532 | 527 |
|
533 |
| -xlrec->target.node=rel->rd_node; |
534 |
| -ItemPointerSet(&(xlrec->target.tid),BufferGetBlockNumber(buf),newitemoff); |
535 |
| -if (P_ISLEAF(lpageop)) |
536 |
| - { |
537 |
| -CommandIdcid=GetCurrentCommandId(); |
538 |
| -memcpy(xlbuf+hsize,&cid,sizeof(CommandId)); |
539 |
| -hsize+=sizeof(CommandId); |
540 |
| -memcpy(xlbuf+hsize,&(_xlheapRel->rd_node),sizeof(RelFileNode)); |
541 |
| -hsize+=sizeof(RelFileNode); |
542 |
| -} |
543 |
| -/* |
544 |
| - * Read comments in _bt_pgaddtup |
545 |
| - */ |
546 |
| -elseif (newitemoff==P_FIRSTDATAKEY(lpageop)) |
| 528 | +xlrec.target.node=rel->rd_node; |
| 529 | +ItemPointerSet(&(xlrec.target.tid),BufferGetBlockNumber(buf),newitemoff); |
| 530 | +rdata[0].buffer=InvalidBuffer; |
| 531 | +rdata[0].data= (char*)&xlrec; |
| 532 | +rdata[0].len=SizeOfBtreeInsert; |
| 533 | +rdata[0].next=&(rdata[1]); |
| 534 | + |
| 535 | +/* Read comments in _bt_pgaddtup */ |
| 536 | +if (!(P_ISLEAF(lpageop))&&newitemoff==P_FIRSTDATAKEY(lpageop)) |
547 | 537 | {
|
548 |
| -truncitem=*btitem; |
| 538 | +BTItemDatatruncitem=*btitem; |
| 539 | + |
549 | 540 | truncitem.bti_itup.t_info=sizeof(BTItemData);
|
550 |
| -xlitem=&truncitem; |
551 |
| -xlsize=sizeof(BTItemData); |
| 541 | +rdata[1].data= (char*)&truncitem; |
| 542 | +rdata[1].len=sizeof(BTItemData); |
| 543 | +} |
| 544 | +else |
| 545 | +{ |
| 546 | +rdata[1].data= (char*)btitem; |
| 547 | +rdata[1].len=IndexTupleDSize(btitem->bti_itup)+ |
| 548 | +(sizeof(BTItemData)-sizeof(IndexTupleData)); |
552 | 549 | }
|
| 550 | +rdata[1].buffer=buf; |
| 551 | +rdata[1].next=NULL; |
553 | 552 |
|
554 |
| -recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_INSERT, |
555 |
| -xlbuf,hsize, (char*)xlitem,xlsize); |
| 553 | +if (P_ISLEAF(lpageop)) |
| 554 | +flag |=XLOG_BTREE_LEAF; |
| 555 | + |
| 556 | +recptr=XLogInsert(RM_BTREE_ID,flag,rdata); |
556 | 557 |
|
557 | 558 | PageSetLSN(page,recptr);
|
558 | 559 | PageSetSUI(page,ThisStartUpID);
|
@@ -774,71 +775,63 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
|
774 | 775 | */
|
775 | 776 | START_CRIT_CODE;
|
776 | 777 | {
|
777 |
| -charxlbuf[sizeof(xl_btree_split)+ |
778 |
| -sizeof(CommandId)+sizeof(RelFileNode)+BLCKSZ]; |
779 |
| -xl_btree_split*xlrec= (xl_btree_split*)xlbuf; |
780 |
| -inthsize=SizeOfBtreeSplit; |
781 |
| -intflag= (newitemonleft) ? |
782 |
| -XLOG_BTREE_SPLEFT :XLOG_BTREE_SPLIT; |
783 |
| -BlockNumberblkno; |
784 |
| -XLogRecPtrrecptr; |
785 |
| - |
786 |
| -xlrec->target.node=rel->rd_node; |
787 |
| -ItemPointerSet(&(xlrec->target.tid),*itup_blkno,*itup_off); |
788 |
| -if (P_ISLEAF(lopaque)) |
789 |
| -{ |
790 |
| -CommandIdcid=GetCurrentCommandId(); |
791 |
| -memcpy(xlbuf+hsize,&cid,sizeof(CommandId)); |
792 |
| -hsize+=sizeof(CommandId); |
793 |
| -memcpy(xlbuf+hsize,&(_xlheapRel->rd_node),sizeof(RelFileNode)); |
794 |
| -hsize+=sizeof(RelFileNode); |
795 |
| -} |
796 |
| -else |
797 |
| -{ |
798 |
| -Sizeitemsz=IndexTupleDSize(lhikey->bti_itup)+ |
799 |
| -(sizeof(BTItemData)-sizeof(IndexTupleData)); |
800 |
| -memcpy(xlbuf+hsize, (char*)lhikey,itemsz); |
801 |
| -hsize+=itemsz; |
802 |
| -} |
| 778 | +xl_btree_splitxlrec; |
| 779 | +intflag= (newitemonleft) ? |
| 780 | +XLOG_BTREE_SPLEFT :XLOG_BTREE_SPLIT; |
| 781 | +BlockNumberblkno; |
| 782 | +XLogRecPtrrecptr; |
| 783 | +XLogRecDatardata[4]; |
| 784 | + |
| 785 | +xlrec.target.node=rel->rd_node; |
| 786 | +ItemPointerSet(&(xlrec.target.tid),*itup_blkno,*itup_off); |
803 | 787 | if (newitemonleft)
|
804 | 788 | {
|
805 |
| -/* |
806 |
| - * Read comments in _bt_pgaddtup. |
807 |
| - * Actually, seems that in non-leaf splits newitem shouldn't |
808 |
| - * go to first data key position on left page. |
809 |
| - */ |
810 |
| -if (!P_ISLEAF(lopaque)&&*itup_off==P_FIRSTDATAKEY(lopaque)) |
811 |
| -{ |
812 |
| -BTItemDatatruncitem=*newitem; |
813 |
| -truncitem.bti_itup.t_info=sizeof(BTItemData); |
814 |
| -memcpy(xlbuf+hsize,&truncitem,sizeof(BTItemData)); |
815 |
| -hsize+=sizeof(BTItemData); |
816 |
| -} |
817 |
| -else |
818 |
| -{ |
819 |
| -Sizeitemsz=IndexTupleDSize(newitem->bti_itup)+ |
820 |
| -(sizeof(BTItemData)-sizeof(IndexTupleData)); |
821 |
| -memcpy(xlbuf+hsize, (char*)newitem,itemsz); |
822 |
| -hsize+=itemsz; |
823 |
| -} |
824 | 789 | blkno=BufferGetBlockNumber(rbuf);
|
825 |
| -BlockIdSet(&(xlrec->otherblk),blkno); |
| 790 | +BlockIdSet(&(xlrec.otherblk),blkno); |
826 | 791 | }
|
827 | 792 | else
|
828 | 793 | {
|
829 | 794 | blkno=BufferGetBlockNumber(buf);
|
830 |
| -BlockIdSet(&(xlrec->otherblk),blkno); |
| 795 | +BlockIdSet(&(xlrec.otherblk),blkno); |
831 | 796 | }
|
832 |
| - |
833 |
| -BlockIdSet(&(xlrec->rightblk),ropaque->btpo_next); |
834 |
| - |
| 797 | +BlockIdSet(&(xlrec.parentblk),lopaque->btpo_parent); |
| 798 | +BlockIdSet(&(xlrec.leftblk),lopaque->btpo_prev); |
| 799 | +BlockIdSet(&(xlrec.rightblk),ropaque->btpo_next); |
835 | 800 | /*
|
836 | 801 | * Dirrect access to page is not good but faster - we should
|
837 | 802 | * implement some new func in page API.
|
838 | 803 | */
|
839 |
| -recptr=XLogInsert(RM_BTREE_ID,flag,xlbuf, |
840 |
| -hsize, (char*)rightpage+ ((PageHeader)rightpage)->pd_upper, |
841 |
| -((PageHeader)rightpage)->pd_special- ((PageHeader)rightpage)->pd_upper); |
| 804 | +xlrec.leftlen= ((PageHeader)leftpage)->pd_special- |
| 805 | +((PageHeader)leftpage)->pd_upper; |
| 806 | +rdata[0].buffer=InvalidBuffer; |
| 807 | +rdata[0].data= (char*)&xlrec; |
| 808 | +rdata[0].len=SizeOfBtreeSplit; |
| 809 | +rdata[0].next=&(rdata[1]); |
| 810 | + |
| 811 | +rdata[1].buffer=InvalidBuffer; |
| 812 | +rdata[1].data= (char*)leftpage+ ((PageHeader)leftpage)->pd_upper; |
| 813 | +rdata[1].len=xlrec.leftlen; |
| 814 | +rdata[1].next=&(rdata[2]); |
| 815 | + |
| 816 | +rdata[2].buffer=InvalidBuffer; |
| 817 | +rdata[2].data= (char*)rightpage+ ((PageHeader)rightpage)->pd_upper; |
| 818 | +rdata[2].len= ((PageHeader)rightpage)->pd_special- |
| 819 | +((PageHeader)rightpage)->pd_upper; |
| 820 | +rdata[2].next=NULL; |
| 821 | + |
| 822 | +if (!P_RIGHTMOST(ropaque)) |
| 823 | +{ |
| 824 | +rdata[2].next=&(rdata[3]); |
| 825 | +rdata[3].buffer=sbuf; |
| 826 | +rdata[3].data=NULL; |
| 827 | +rdata[3].len=0; |
| 828 | +rdata[3].next=NULL; |
| 829 | +} |
| 830 | + |
| 831 | +if (P_ISLEAF(lopaque)) |
| 832 | +flag |=XLOG_BTREE_LEAF; |
| 833 | + |
| 834 | +recptr=XLogInsert(RM_BTREE_ID,flag,rdata); |
842 | 835 |
|
843 | 836 | PageSetLSN(leftpage,recptr);
|
844 | 837 | PageSetSUI(leftpage,ThisStartUpID);
|
@@ -1143,25 +1136,29 @@ _bt_getstackbuf(Relation rel, BTStack stack)
|
1143 | 1136 | void
|
1144 | 1137 | _bt_newroot(Relationrel,Bufferlbuf,Bufferrbuf)
|
1145 | 1138 | {
|
1146 |
| -Bufferrootbuf; |
1147 |
| -Pagelpage, |
1148 |
| -rpage, |
1149 |
| -rootpage; |
1150 |
| -BlockNumberlbkno, |
1151 |
| -rbkno; |
1152 |
| -BlockNumberrootblknum; |
1153 |
| -BTPageOpaquerootopaque; |
1154 |
| -ItemIditemid; |
1155 |
| -BTItemitem; |
1156 |
| -Sizeitemsz; |
1157 |
| -BTItemnew_item; |
1158 |
| -Buffermetabuf; |
| 1139 | +Bufferrootbuf; |
| 1140 | +Pagelpage, |
| 1141 | +rpage, |
| 1142 | +rootpage; |
| 1143 | +BlockNumberlbkno, |
| 1144 | +rbkno; |
| 1145 | +BlockNumberrootblknum; |
| 1146 | +BTPageOpaquerootopaque; |
| 1147 | +ItemIditemid; |
| 1148 | +BTItemitem; |
| 1149 | +Sizeitemsz; |
| 1150 | +BTItemnew_item; |
| 1151 | +Buffermetabuf; |
| 1152 | +Pagemetapg; |
| 1153 | +BTMetaPageData*metad; |
1159 | 1154 |
|
1160 | 1155 | /* get a new root page */
|
1161 | 1156 | rootbuf=_bt_getbuf(rel,P_NEW,BT_WRITE);
|
1162 | 1157 | rootpage=BufferGetPage(rootbuf);
|
1163 | 1158 | rootblknum=BufferGetBlockNumber(rootbuf);
|
1164 |
| -metabuf=_bt_getbuf(rel,BTREE_METAPAGE,BT_WRITE); |
| 1159 | +metabuf=_bt_getbuf(rel,BTREE_METAPAGE,BT_WRITE); |
| 1160 | +metapg=BufferGetPage(metabuf); |
| 1161 | +metad=BTPageGetMeta(metapg); |
1165 | 1162 |
|
1166 | 1163 | /* NO ELOG(ERROR) from here till newroot op is logged */
|
1167 | 1164 | START_CRIT_CODE;
|
@@ -1222,39 +1219,46 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
|
1222 | 1219 | elog(STOP,"btree: failed to add rightkey to new root page");
|
1223 | 1220 | pfree(new_item);
|
1224 | 1221 |
|
| 1222 | +metad->btm_root=rootblknum; |
| 1223 | +(metad->btm_level)++; |
| 1224 | + |
1225 | 1225 | /* XLOG stuff */
|
1226 | 1226 | {
|
1227 | 1227 | xl_btree_newrootxlrec;
|
1228 |
| -Pagemetapg=BufferGetPage(metabuf); |
1229 |
| -BTMetaPageData*metad=BTPageGetMeta(metapg); |
1230 | 1228 | XLogRecPtrrecptr;
|
| 1229 | +XLogRecDatardata[2]; |
1231 | 1230 |
|
1232 | 1231 | xlrec.node=rel->rd_node;
|
| 1232 | +xlrec.level=metad->btm_level; |
1233 | 1233 | BlockIdSet(&(xlrec.rootblk),rootblknum);
|
| 1234 | +rdata[0].buffer=InvalidBuffer; |
| 1235 | +rdata[0].data= (char*)&xlrec; |
| 1236 | +rdata[0].len=SizeOfBtreeNewroot; |
| 1237 | +rdata[0].next=&(rdata[1]); |
1234 | 1238 |
|
1235 | 1239 | /*
|
1236 | 1240 | * Dirrect access to page is not good but faster - we should
|
1237 | 1241 | * implement some new func in page API.
|
1238 | 1242 | */
|
1239 |
| -recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_NEWROOT, |
1240 |
| -(char*)&xlrec,SizeOfBtreeNewroot, |
1241 |
| -(char*)rootpage+ ((PageHeader)rootpage)->pd_upper, |
1242 |
| -((PageHeader)rootpage)->pd_special- ((PageHeader)rootpage)->pd_upper); |
| 1243 | +rdata[1].buffer=InvalidBuffer; |
| 1244 | +rdata[1].data= (char*)rootpage+ ((PageHeader)rootpage)->pd_upper; |
| 1245 | +rdata[1].len= ((PageHeader)rootpage)->pd_special- |
| 1246 | +((PageHeader)rootpage)->pd_upper; |
| 1247 | +rdata[1].next=NULL; |
1243 | 1248 |
|
1244 |
| -metad->btm_root=rootblknum; |
1245 |
| -(metad->btm_level)++; |
| 1249 | +recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_NEWROOT,rdata); |
1246 | 1250 |
|
1247 | 1251 | PageSetLSN(rootpage,recptr);
|
1248 | 1252 | PageSetSUI(rootpage,ThisStartUpID);
|
1249 | 1253 | PageSetLSN(metapg,recptr);
|
1250 | 1254 | PageSetSUI(metapg,ThisStartUpID);
|
1251 | 1255 |
|
1252 |
| -_bt_wrtbuf(rel,metabuf); |
1253 | 1256 | }
|
1254 | 1257 | END_CRIT_CODE;
|
1255 | 1258 |
|
1256 | 1259 | /* write and let go of the new root buffer */
|
1257 | 1260 | _bt_wrtbuf(rel,rootbuf);
|
| 1261 | +_bt_wrtbuf(rel,metabuf); |
1258 | 1262 |
|
1259 | 1263 | /* update and release new sibling, and finally the old root */
|
1260 | 1264 | _bt_wrtbuf(rel,rbuf);
|
|