···568568 in
569569 find 0
570570571571- (* Find child page for rowid in interior page *)
571571+ (* Find child page for rowid in interior page.
572572+ SQLite B-tree: keys < separator go left, keys >= separator go right. *)
572573 let find_child _t page header rowid =
573574 let ptrs = cell_pointers page 0 header in
574575 let rec loop i =
575576 if i >= header.cell_count then Option.get header.right_child
576577 else
577578 let cell, _ = Cell.parse_table_interior page ptrs.(i) in
578578- if rowid <= cell.rowid then cell.left_child else loop (i + 1)
579579+ if rowid < cell.rowid then cell.left_child else loop (i + 1)
579580 in
580581 loop 0
581582···586587 if i >= header.cell_count then i (* right child *)
587588 else
588589 let cell, _ = Cell.parse_table_interior page ptrs.(i) in
589589- if rowid <= cell.rowid then i else loop (i + 1)
590590+ if rowid < cell.rowid then i else loop (i + 1)
590591 in
591592 loop 0
592593···820821 (* Need to split *)
821822 let split = split_leaf t page_num in
822823823823- (* Insert into appropriate page *)
824824- if rowid < split.separator_rowid then
825825- insert_into_leaf t page_num ~rowid ~data ~parent_stack:[]
826826- else insert_into_leaf t split.new_page ~rowid ~data ~parent_stack:[];
824824+ (* Determine target page and insert directly (no recursion needed -
825825+ after split, both pages have ~half capacity, plenty of room) *)
826826+ let target_page =
827827+ if rowid < split.separator_rowid then page_num else split.new_page
828828+ in
829829+ let target = Pager.read t.pager target_page in
830830+ let target_header = parse_page_header target 0 in
831831+ let target_buf = Bytes.of_string target in
832832+ let insert_idx = find_insert_idx t target target_header rowid in
833833+ let cell_start =
834834+ write_cell target_buf
835835+ ~cell_content_start:target_header.cell_content_start ~cell
836836+ in
837837+ set_u16_be target_buf 5 cell_start;
838838+ insert_cell_pointer target_buf ~header_offset:0 ~page_type:Leaf_table
839839+ ~cell_count:target_header.cell_count ~index:insert_idx ~ptr:cell_start;
840840+ set_u16_be target_buf 3 (target_header.cell_count + 1);
841841+ Pager.write t.pager target_page (Bytes.unsafe_to_string target_buf);
827842828843 (* Propagate split up *)
829844 propagate_split t ~parent_stack ~left_page:page_num