btree index (15)

_bt_pagedel

btree indexのページを削除する。
(1)ページが削除可能かチェックする。一番右のページ、ルートページは削除できない。ページにアイテムが残っている場合も削除できない。
(2)削除するページ(target page)の情報を取得。
(3)親のページの位置を調べるため、targetpageのhigh keyを検索キーにして、btree indexを検索。dead lockを防ぐため検索を実行する前にtarget pageのRead Lockを開放している。
(4)target pageの左のページ, target page, 右のページ, 親のページの順にWrite Lockする。dead lockが発生しないように左からロックする必要がある。
(5)target pageが親のページの一番右のアイテムの場合、target pageは削除できない。ただし、親のページの最後のアイテムだった場合、parent_half_deadフラグを設定して、削除できる。
(6)target pageを削除した結果、fast pageが変わる場合、meta pageを取得する
(7)parent_half_deadフラグが設定されていたら、親ページにBTP_HALF_DEADフラグを設定する。それ以外は親ページからtarget pageへのリンクを削除する。この処理では、target pageへリンクしているアイテムのリンクを右のページに設定し、現在右のページを指しているアイテムを削除している。
(8)左右のページのleft, rightリンクを設定する。target pageを飛ばして、左右のページが接続される。
(9)target pageにBTP_DELETEDを設定する。トランザクションID(xact)も設定する。
(10)fast rootを変更できる場合は、meta pageに設定する。
(11)ログレコードを出力
(12)parent_half_deadの場合、_bt_pagedelを再帰的に実行して親ページを削除する。親ページにアイテムが1つだけになり、target pageの右のページが空の場合は、_bt_pagedelで右のページを削除する(右のページを削除した結果、親のページも削除できる)。

_bt_mkscankey

インデックスのアイテムから、btree indexを検索するためのScanKeyを作成する。これは_bt_doinsertでbtree indexにアイテムを登録するときに、挿入位置を決めるために使われる。また、_bt_pagedelで削除するページの親のページを探すためにも使われる。