一、概述
DELETE命令经过语法解析之后,将命令携带的信息记录在结构体当前,如何按命令的语义执行呢?这就需要将命令信息转换成执行计划,分为两个阶段:一是逻辑执行计划,将它转换为关系代数的形式,方便进行逻辑层面的优化;二是物理执行计划,关联到真正执行的算子,并且将各个算子串联成执行路径。
二、逻辑执行计划
前一节DELETE命令语法规则中,它的from子句中只有一个目标表,更多的筛选条件在where子句中,当然可以使用子查询来实现更复杂的多表关联。在逻辑执行计划阶段,按照关系运算操作要素来划分,主要对基本数据表和选择操作的要素进行整理。
2.1 基本数据表
基本数据表其实只有一个,加入链表当中,复用SELECT命令的处理逻辑。
int LogicalDeletePlan(QueryStmt *queryStmt)/* base relations */retCode = TableNodeProcess(queryStmt, delStmt->targetRel);if(retCode < 0)return retCode;
2.2 条件表达式
选择操作对应where子句的各种条件表达式,其中含有嵌套子查询,这里只是留了一个扩展接口,并没有实现子查询的处理,条件表达式的处理也是复用SELECT命令的where子句的处理逻辑。
retCode = WhereClauseRelationProcess(queryStmt, delStmt->whereList);if(retCode <0)return retCode;/* expre */retCode = WhereExprProcess(queryStmt, delStmt->whereList);if(retCode < 0)return retCode;
三、总结
在DELETE命令的逻辑执行计划当中,命令传递的信息不同,处理逻辑仍然是SELECT命令子句处理,这也使得各命令之间相同子句的处理逻辑复用,简化了编码的过程,同时处理逻辑在各命令中得到充分的验证。
经过逻辑计划阶段的整理之后,选择操作被归纳成为表达式的二叉树,它的根节点是一个逻辑表达式。
本节实现在exam_71 目录下的plan.c文件中。
【手写数据库核心揭秘系列】第112节 终于到DELETE命令啦~
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




