实现一个简单的Database9(译文)


  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:  花家舍
  • 文章来源:GreatSQL社区原创



前文回顾

  • 实现一个简单的Database系列

译注:cstack在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第九篇,主要是实现B-tree的二叉搜索并解决主键重复问题

Part 9 二叉搜索与主键重复

上次注意到我们的 B 树存储 key 时仍然是非排序的。现在我们来解决这个问题,并检测和拒绝主键的重复(插入)。

现在我们的 execute_insert() 函数在插入时,选择的位置是在表的结尾处。作为替换,我们需要搜索表(树)中正确的插入位置,然后把 key 插入到这个位置上。如果 key 在这个位置上已经存在,那么就返回(键重复)报错。

ExecuteResult execute_insert(Statement* statement, Table* table) { void* node = get_page(table->pager, table->root_page_num); - if ((*leaf_node_num_cells(node) >= LEAF_NODE_MAX_CELLS)) { + uint32_t num_cells = (*leaf_node_num_cells(node)); + if (num_cells >= LEAF_NODE_MAX_CELLS) { return EXECUTE_TABLE_FULL; } Row* row_to_insert = &(statement->row_to_insert); - Cursor* cursor = table_end(table); + uint32_t key_to_insert = row_to_insert->id; + Cursor* cursor = table_find(table, key_to_insert); + + if (cursor->cell_num cell_num); + if (key_at_index == key_to_insert) { + return EXECUTE_DUPLICATE_KEY; + } + } leaf_node_insert(cursor, row_to_insert->id, row_to_insert);