在上一节我们完成了 select 语句的解释执行,本节我们看看 Update 和 Delete 对应的语句如何解释执行,当然他们的实现原理跟我们前面实现的 select 语句执行大同小异。无论是 update还是 delete 都是对数据表的修改,因此他们的实现方法基本相同。
假设我们要执行如下 sql 语句:
update STUDENT set MajorId=20 where MajorId=30 and GradYear=2020
delete from STUDENT where MajorId=30 and GradYear=2020
要完成上面的代码,我们需要 scan底层的文件块,找到所有满足 where 条件的记录,如果语句是 update,那么把找到的记录修改掉,如果是 delete,那么把找到的记录给删除掉。我们看看具体的代码实现,首先我们添加 UpdatePlanner 的接口定义,在 planner 的 interface.go 文件中增加代码如下:
package planner
import (
"parser"
"record_manager"
"tx"
)
type Plan interface {
Open() interface{
}
BlocksAccessed() int //对应 B(s)
RecordsOutput() int //对应 R(s)
DistinctValues(fldName string) int //对应 V(s,F)
Schema() record_manager.SchemaInterface
}
type QueryPlanner interface {
CreatePlan(data *parser.QueryData, tx *tx.Transation) Plan
}
type UpdatePlanner interface {
/*
解释执行 insert 语句,返回被修改的记录条数
*/
ExecuteInsert(data *parser.InsertData, tx *tx.Transation) int
/*
解释执行 delete 语句,返回被删除的记录数
*/
ExecuteDelete(data *parser.DeleteData, tx *tx.Transation) int
/*
解释执行 create table 语句,返回新建表中的记录数
*/
ExecuteCreateTable(data *parser.CreateTableData, tx *tx.Transation) int
/*
解释执行 create index 语句,返回当前建立了索引的记录数
TODO
*/
//ExecuteCreateIndex(data *parser.CreateIndexData, tx *tx.Transation) int
}
在 planner 目录下新建文件 update_planner.go,输入代码如下:
package planner
import (
metadata_manager "metadata_management"
"parser"
"query"
"tx"
)
type BasicUpdatePlanner struct {
mdm *metadata_manager.MetaDataManager
}
func NewBasicUpdatePlanner(mdm *metadata_manager.MetaDataManager) *BasicUpdatePlanner {
return &BasicUpdatePlanner{
mdm: mdm,
}
}
func (b *BasicUpdatePlanner) ExecuteDelete(data *parser.DeleteData, tx *tx