@@ -1074,7 +1074,7 @@ mdb_cursor_chk(MDB_cursor *mc)
1074
1074
MDB_node * node ;
1075
1075
MDB_page * mp ;
1076
1076
1077
- if (!mc -> mc_snum ) return ;
1077
+ if (!mc -> mc_snum && !( mc -> mc_flags & C_INITIALIZED ) ) return ;
1078
1078
for (i = 0 ; i < mc -> mc_top ; i ++ ) {
1079
1079
mp = mc -> mc_pg [i ];
1080
1080
node = NODEPTR (mp , mc -> mc_ki [i ]);
@@ -5765,7 +5765,7 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
5765
5765
unsigned int nflags )
5766
5766
{
5767
5767
unsigned int flags ;
5768
- int rc = MDB_SUCCESS , ins_new = 0 , new_root = 0 , newpos = 1 ;
5768
+ int rc = MDB_SUCCESS , ins_new = 0 , new_root = 0 , newpos = 1 , did_split = 0 ;
5769
5769
indx_t newindx ;
5770
5770
pgno_t pgno = 0 ;
5771
5771
unsigned int i , j , split_indx , nkeys , pmax ;
@@ -5834,6 +5834,8 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
5834
5834
5835
5835
nkeys = NUMKEYS (mp );
5836
5836
split_indx = (nkeys + 1 ) / 2 ;
5837
+ if (newindx < split_indx )
5838
+ newpos = 0 ;
5837
5839
5838
5840
if (IS_LEAF2 (rp )) {
5839
5841
char * split , * ins ;
@@ -5953,32 +5955,30 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
5953
5955
if (SIZELEFT (mn .mc_pg [ptop ]) < mdb_branch_size (mc -> mc_txn -> mt_env , & sepkey )) {
5954
5956
mn .mc_snum -- ;
5955
5957
mn .mc_top -- ;
5958
+ did_split = 1 ;
5956
5959
rc = mdb_page_split (& mn , & sepkey , NULL , rp -> mp_pgno , 0 );
5957
5960
5961
+ /* root split? */
5962
+ if (mn .mc_snum == mc -> mc_snum ) {
5963
+ mc -> mc_pg [mc -> mc_snum ] = mc -> mc_pg [mc -> mc_top ];
5964
+ mc -> mc_ki [mc -> mc_snum ] = mc -> mc_ki [mc -> mc_top ];
5965
+ mc -> mc_pg [mc -> mc_top ] = mc -> mc_pg [ptop ];
5966
+ mc -> mc_ki [mc -> mc_top ] = mc -> mc_ki [ptop ];
5967
+ mc -> mc_snum ++ ;
5968
+ mc -> mc_top ++ ;
5969
+ ptop ++ ;
5970
+ }
5958
5971
/* Right page might now have changed parent.
5959
5972
* Check if left page also changed parent.
5960
5973
*/
5961
5974
if (mn .mc_pg [ptop ] != mc -> mc_pg [ptop ] &&
5962
5975
mc -> mc_ki [ptop ] >= NUMKEYS (mc -> mc_pg [ptop ])) {
5963
- /* root split? */
5964
- if (mn .mc_snum == mc -> mc_snum ) {
5965
- mc -> mc_pg [mc -> mc_snum ] = mc -> mc_pg [mc -> mc_top ];
5966
- mc -> mc_ki [mc -> mc_snum ] = mc -> mc_ki [mc -> mc_top ];
5967
- mc -> mc_ki [mc -> mc_top ] = mn .mc_ki [mc -> mc_top ] - 1 ;
5968
- mc -> mc_pg [mc -> mc_top ] = mn .mc_pg [mc -> mc_top ];
5969
- for (i = 0 ; i < mc -> mc_top ; i ++ ) {
5970
- mc -> mc_pg [i ] = mn .mc_pg [i ];
5971
- mc -> mc_ki [i ] = mn .mc_ki [i ];
5972
- }
5973
- mc -> mc_snum ++ ;
5974
- mc -> mc_top ++ ;
5975
- ptop ++ ;
5976
- } else {
5977
- for (i = 0 ; i < ptop ; i ++ )
5978
- mc -> mc_ki [i ] = mn .mc_ki [i ];
5979
- mc -> mc_pg [ptop ] = mn .mc_pg [ptop ];
5980
- mc -> mc_ki [ptop ] = mn .mc_ki [ptop ] - 1 ;
5976
+ for (i = 0 ; i < ptop ; i ++ ) {
5977
+ mc -> mc_pg [i ] = mn .mc_pg [i ];
5978
+ mc -> mc_ki [i ] = mn .mc_ki [i ];
5981
5979
}
5980
+ mc -> mc_pg [ptop ] = mn .mc_pg [ptop ];
5981
+ mc -> mc_ki [ptop ] = mn .mc_ki [ptop ] - 1 ;
5982
5982
}
5983
5983
} else {
5984
5984
mn .mc_top -- ;
@@ -6094,6 +6094,7 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
6094
6094
/* Adjust other cursors pointing to mp */
6095
6095
MDB_cursor * m2 , * m3 ;
6096
6096
MDB_dbi dbi = mc -> mc_dbi ;
6097
+ int fixup = NUMKEYS (mp );
6097
6098
6098
6099
if (mc -> mc_flags & C_SUB )
6099
6100
dbi -- ;
@@ -6127,14 +6128,12 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
6127
6128
if (m3 -> mc_pg [mc -> mc_top ] == mp ) {
6128
6129
if (m3 -> mc_ki [mc -> mc_top ] >= newindx && !(nflags & MDB_SPLIT_REPLACE ))
6129
6130
m3 -> mc_ki [mc -> mc_top ]++ ;
6130
- if (m3 -> mc_ki [mc -> mc_top ] >= split_indx ) {
6131
+ if (m3 -> mc_ki [mc -> mc_top ] >= fixup ) {
6131
6132
m3 -> mc_pg [mc -> mc_top ] = rp ;
6132
- m3 -> mc_ki [mc -> mc_top ] -= split_indx ;
6133
- if ((nflags & MDB_SPLIT_REPLACE ) && !newpos )
6134
- m3 -> mc_ki [mc -> mc_top ]-- ;
6133
+ m3 -> mc_ki [mc -> mc_top ] -= fixup ;
6135
6134
m3 -> mc_ki [ptop ] = mn .mc_ki [ptop ];
6136
6135
}
6137
- } else if (m3 -> mc_pg [ptop ] == mc -> mc_pg [ptop ] &&
6136
+ } else if (! did_split && m3 -> mc_pg [ptop ] == mc -> mc_pg [ptop ] &&
6138
6137
m3 -> mc_ki [ptop ] >= mc -> mc_ki [ptop ]) {
6139
6138
m3 -> mc_ki [ptop ]++ ;
6140
6139
}
0 commit comments