Hi 同學,
我覺得你的問題很好!
但有些地方我想修正一下,
以 test2 測 lo_key = 10000 來講,
其實就是在測 如果 lo_key 比 btree 裡面的所有 key 還大的話,
這時該怎麼辦。
而希望的作法是,在 findRunStart 不要回傳 Error (就仍然回傳 OK),
只不過 RID 會被設為 invalid。
如果你直接呼叫 BTLeafPage 裡的 get_next() 應該就會沒問題。
參考一下 get_next() 吧!
※ 引述《kiwaygo (雞尾酒)》之銘言:
: 在這個 test 中
: driver 會用很多不合理的 scan range 來測試 B+ tree
: 讀了 btree_driver.C 後可知
: driver 檢察 B+ tree正確性的作法
: 是先從 BTreeFile::new_scan(...) 中拿到 IndexFileScan 物件
: 然後檢查 IndexFileScan::get_next(...) ?= OK
: 若其 == OK 則程式是不正確的
: 我遇到的問題如下:
: BTreeFile::new_scan(...) 會呼叫 BTreeFile::findRunStart(...) 找出 scan range
: 當我們寫的程式在 BTreeFile::findRunStart(...)
: 接到不合理的 lo_key 時 (例如 lo_key == 10000)
: 理論上,findRunStart 應回傳 error 給呼叫他的 BTreeFile::new_scan(...)
: 然後 new_scan 就會因此向再上一層的 driver 回傳 NULL pointer
: 不幸的是,btree_driver.C 中
: driver 並未檢查拿到的 IndexFileScan* 是否為 NULL pointer
: 就直接呼叫其 IndexFileScan::get_next(...) method
: 結果就變成了 segmentation fault
: 想請問助教或同學們,在findRunStart(...) 中
: 若接到不合理的 lo_key
: 究竟應該如何處理呢?
: 有辦法回傳 error 但又不會在 driver 產生 segmentation fault 嗎?
: 期待回覆,謝謝!