背景
题目描述
删除表。清除表相关的资源。 注意:要删除所有与表关联的数据,不仅仅是在create table时创建的资源,还包括索引等数据。
测例
代码阅读
由于 Drop Table 基本可以理解为 Create Table 的逆操作,因此我们可以先阅读一下 Create Table 的代码和基本流程。
具体的调用链为:handle_event => do_create_table => db->create_table => table->create
handle_event
:执行器的入口函数,会根据解析到的语句,调用不同的执行函数。do_create_table
:获取当前的 Database,并调用其create_table
成员函数,以及设置 Response 等工作db->create_table
:- 检查表名是否重复
- 调用
table->create
对table对象进行初始化 - 将初始化完成的
table
对象移入opened_tables_
进行管理
table->create
:核心函数
建表的关键代码在于 table 对象的 create
函数,该函数的主要流程有:
- 检查输入信息:表名是否为空,attr 个数是否为0
- 判断表文件是否存在
- 创建
.table
文件,并将元数据写入文件中 - 调用
BufferPoolManager
创建数据文件.data
- 调用
init_record_handler
初始化record_handler_
- 初始化 BufferPoolManager,并设置
disk_buffer_pool_
- 初始化
record_handler
- 初始化 BufferPoolManager,并设置
Drop Table 代码实现
Drop Table 的调用链应该与 Create Table 是类似的:handle_event => do_drop_table => db->dorp_table => table->drop
首先要在handle_event
入口函数中,加入对应的代码使得识别到为drop
语句时,调用对应的do_drop_table
函数。这个没啥难度。
do_drop_table
函数与do_create_table
函数类似,只是简单获取当前使用的 database,就直接调用 database 的drop_table
函数,并设置对应的Response。
db->drop_table
的流程:
- 检查表名是否存在
- 从
opened_tables_
获取对应的 Table 对象 - 调用
table->drop
- 从
open_tables
中删除对应的对象,并释放 Table 对象的指针
table->drop
基本为table->create
的逆过程:
- 检查输入信息:表名是否为空
- 判断表文件是否存在,不存在则退出
- 移除
record_handler
(这里可以封装成remove_record_handler
)- 调用
record_hanlder
的close
函数,并释放 - 从
data_buffer_pool
中移除
- 调用
- 删除 BufferPoolManager 创建的
.data
文件(封装成一个remove_file
函数) - 删除
.table
文件
具体实现见:add drop table by wuxiaobai24 · Pull Request #1 · wuxiaobai24/miniob · GitHub
==这里drop_file
还没有删除 index 文件==