int ex2, *ex2p;
if (op == MDB_GET_BOTH) {
ex2p = &ex2;
+ ex2 = 0;
} else {
ex2p = NULL;
}
/* Maximum free space in an empty page */
pmax = txn->mt_env->me_psize - PAGEHDRSZ;
nsize = mdb_leaf_size(txn->mt_env, newkey, newdata);
- if (newindx <= split_indx) {
-split1:
+ if (newindx < split_indx) {
psize = nsize;
for (i=0; i<split_indx; i++) {
node = NODEPTR(&mdp->p, i);
- psize += NODESIZE + NODEKSZ(node);
+ psize += NODESIZE + NODEKSZ(node) + sizeof(indx_t);
if (F_ISSET(node->mn_flags, F_BIGDATA))
psize += sizeof(pgno_t);
else
psize += NODEDSZ(node);
if (psize > pmax) {
- split_indx--;
- goto split1;
+ split_indx = i;
+ break;
}
}
} else {
-split2:
psize = nsize;
- for (i=split_indx; i<nkeys; i++) {
+ for (i=nkeys-1; i>=split_indx; i--) {
node = NODEPTR(&mdp->p, i);
- psize += NODESIZE + NODEKSZ(node);
+ psize += NODESIZE + NODEKSZ(node) + sizeof(indx_t);
if (F_ISSET(node->mn_flags, F_BIGDATA))
psize += sizeof(pgno_t);
else
psize += NODEDSZ(node);
if (psize > pmax) {
- split_indx++;
- goto split2;
+ split_indx = i+1;
+ break;
}
}
}