一、概述
DELETE命令的语法解析相对比较简单,它的基本子句都已经在其它命令中实现。DELETE命令的语法解析,包括三个部分:词法分析、语法节点定义和语法解析。
二、词法分析
本次只新增一个DELETE关键词,在词法规则文件sqlscanner.l中定义分词规则。
ounter(lineounter(lineounter(lineDELETE {return DELETE;}
当匹配到DELETE分词时,返回token值,在语法规则文件中定义token值。
ounter(line%token DELETE
三、语法节点
在DELETE语法解析树中,顶层节点就是DELETE语法节点。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(linetypedef struct DeleteStmt{NodeType type;Node *targetRel;Node *whereList;}DeleteStmt;
在DELETE语法节点中包含两个成员:
targetRel,删除数据的目标表; whereList,where子句中条件列表;
同时还需要定义语法节点类型,在语法树节点中通过节点类型来区分它们的不同。
ounter(lineT_DeleteStmt,
四、语法解析
根据DELETE命令的语法规则,生成语法解析树。从顶层规则开始,将生成的语法树进行记录。
ounter(lineounter(lineounter(lineounter(line| delete_stmt{$$ = $1;}
语法树的根节点,由DELETE命令的各子句组成,将各子句生成的子语法树记录到顶层语法节点当中。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linedelete_stmt: DELETE FROM table_info where_clause{DeleteStmt *node = NewNode(DeleteStmt);node->targetRel = $3;node->whereList = $4;$$ = (Node*)node;};
组成DELETE语法规则的数据表节点和where子句,已经在其它命令中定义过,这里直接复用,至此DELETE命令的语法树生成实现。
五、总结
本节实现代码位于exam_70目录下的sqlscanner.l和sqlgram.y文件中。
【手写数据库核心揭秘系列】第112节 终于到DELETE命令啦~
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




