page 1: p1
mtr.m_memo:
[0] - index s-lock
[1] - page 1 latch, p1
Case 1, cursor points to root, don’t unlatch anything
page 1: p1, p2
mtr.m_memo:
[0] - index s-lock
[1] - page 1 latch, p1, p2
Case 1, cursor points to root, don’t unlatch anything
page 1: p2
mtr.m_memo:
[0] - index s-lock
[1] - page 1 latch, p2
[2] - page 2 latch, p1
page 2: p1
Case 2, p1’s parent is p2, don’t unlatch anything
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 1 latch
[2] - page 2 latch, p1, p2
page 2: p1, p2
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 2 latch, p1, p2
page 2: p1, p2
Case 3, p2 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 2 latch, p2
[2] - page 3 latch, p1
page 2: p2
page 3: p1
page 4
Case 2, p1’s parent is p2, don’t unlatch anything
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 2 latch
[2] - page 3 latch, p1
[3] - page 4 latch, p2
page 2
page 3: p1
page 4: p2
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 3 latch, p1
[2] - page 4 latch, p2
page 2
page 3: p1
page 4: p2
Case 3, p2 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 3 latch
[2] - page 4 latch, p2
[3] - page 5 latch, p1
page 2
page 3
page 4: p2
page 5: p1
page 6
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 4 latch, p2
[2] - page 5 latch, p1
page 2
page 3
page 4: p2
page 5: p1
page 6
Case 4, p1 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 4 latch
[2] - page 5 latch, p1
[3] - page 6 latch, p2
page 2
page 3
page 4
page 5: p1
page 6: p2
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 5 latch, p1
[2] - page 6 latch, p2
page 2
page 3
page 4
page 5: p1
page 6: p2
Case 3, p2 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 5 latch
[2] - page 6 latch, p2
[3] - page 7 latch, p1
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch, p2
[2] - page 7 latch, p1
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
Case 4, p1 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch, p2
[2] - page 7 latch, p1
[3] - page 8 latch
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
Estimate n_rows on level.
Case 5, first page is fetched during estimating n_rows in level, don’t unlatch anything.
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch, p2
[2] - page 7 latch, p1
[3] - page 8 latch
[4] - page 9 latch
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
Estimate n_rows on level.
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch, p2
[2] - page 7 latch, p1
[3] - page 9 latch
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
Estimate n_rows on level.
Case 6, next page is fetched during estimating n_rows in level, unlatch mtr.m_memo[3]
(or last - 1).
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch, p2
[2] - page 7 patch, p1
[3] - page 9 latch
[4] - page 10 latch
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
Estimate n_rows on level.
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch, p2
[2] - page 7 latch, p1
[3] - page 10 latch
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
Estimate n_rows on level.
Case 6, next page is fetched during estimating n_rows in level, unlatch mtr.m_memo[3]
(or last - 1).
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch, p2
[2] - page 7 latch, p1
page 2
page 3
page 4
page 5
page 6: p2
page 7: p1
page 11
page 9
page 10
page 8
Case 7, last page is fetched during estimating n_rows in level, unlatch mtr.m_memo[3] (or last).
Estimate n_rows on level.
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 6 latch
[2] - page 7 latch, p1
[3] - page 11 latch, p2
page 2
page 3
page 4
page 5
page 6
page 7: p1
page 11: p2
page 9
page 10
page 8
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 7 latch
[2] - page 11 latch, p2
[3] - page 12 latch, p1
page 2
page 3
page 4
page 5
page 6
page 7
page 11: p2
page 9
page 10
page 8
page 12: p1
page 50
page 21
page 20
…
…
Case 3, p2 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 11 latch, p2
[2] - page 12 latch, p1
page 2
page 3
page 4
page 5
page 6
page 7
page 11: p2
page 9
page 10
page 8
page 12: p1
page 50
page 21
page 20
…
…
Case 4, p1 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 11 latch, p2
[2] - page 12 latch, p1
…
page 2
page 3
page 4
page 5
page 6
page 7
page 11: p2
page 9
page 10
page 8
page 12: p1
page 50
page 21
page 20
…
…
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 11 latch, p2
[2] - page 12 latch, p1
[3] - page 20 latch
page 2
page 3
page 4
page 5
page 6
page 7
page 11: p2
page 9
page 10
page 8
page 12: p1
page 50
page 21
page 20
…
…
Estimate n_rows on level.
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 11 patch, p2
[2] - page 12 latch, p1
[3] - page 20 latch
[4] - page 21 latch
page 2
page 3
page 4
page 5
page 6
page 7
page 11: p2
page 9
page 10
page 8
page 12: p1
page 50
page 21
page 20
…
…
Estimate n_rows on level.
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 11 latch, p2
[2] - page 12 latch, p1
[3] - page 21 latch
page 2
page 3
page 4
page 5
page 6
page 7
page 11: p2
page 9
page 10
page 8
page 12: p1
page 50
page 21
page 20
…
…
Estimate n_rows on level.
Case 6, next page is fetched during estimating n_rows in level, unlatch mtr.m_memo[3]
(or last - 1).
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 11 latch, p2
[2] - page 12 latch, p1
page 2
page 3
page 4
page 5
page 6
page 7
page 11: p2
page 9
page 10
page 8
page 12: p1
page 50
page 21
page 20
…
…
Estimate n_rows on level.
Case 7, last page is fetched during estimating n_rows in level, unlatch mtr.m_memo[3] (or last).
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 11 patch
[2] - page 12 latch, p1
[3] - page 50 latch, p2
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12: p1
page 50: p2
page 21
page 20
…
…
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 12 patch
[2] - page 50 latch, p2
[3] - page 51 latch, p1
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12
page 50: p2
page 21
page 20
…
page 51: p1
page 100
…
…
leaves
Case 3, p2 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 50 latch, p2
[2] - page 51 latch, p1
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12
page 50: p2
page 21
page 20
…
page 51: p1
page 100
…
…
leaves
Case 4, p1 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 50 latch, p2
[2] - page 51 latch, p1
…
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12
page 50: p2
page 21
page 20
…
page 51: p1
page 100
…
…
leaves
Estimate n_rows on level.
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 50 latch
[2] - page 51 latch, p1
[3] - page 100 latch, p2
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12
page 50
page 21
page 20
…
page 51: p1
page 100: p2
…
…
leaves
page 1
mtr.m_memo:
[0] - index s-lock
[1] - page 51 latch, p1
[2] - page 100 latch, p2
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12
page 50
page 21
page 20
…
page 51: p1
page 100: p2
…
…
leaves
Case 3, p2 fetching, erase mtr.m_memo[1]
page 1
mtr.m_memo:
[0] - page 51 latch, p1
[1] - page 100 latch, p2
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12
page 50
page 21
page 20
…
page 51: p1
page 100: p2
…
…
leaves
Unlatch index s-lock. We can’t do it earlier, because page 100 can’t be latched(and page 50 unlatched) before we finish estimating rows on 0 level.
page 1
mtr.m_memo:
commit
page 2
page 3
page 4
page 5
page 6
page 7
page 11
page 9
page 10
page 8
page 12
page 50
page 21
page 20
…
page 51
page 100
…
…
leaves
Cases 1,2,3,4 can be joined in the following code in btr_est_cur_t::fetch_child():
if (parent_block && parent_block != right_parent) mtr.rollback_to_savepoint(1, 2);