一、概述
UPDATE的语法规则用上下文无关的文法来表示,首先定义新的分词规则,进行词法解析,得到命令中的关键词;然后将UPDATE命令拆分为四个部分,分别进行语法规则的定义。
二、 词法解析
新增两个关键词UPDATE、SET,将它们的分词规则在sqlscanner.l文件中定义,返回对应的token值。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineUPDATE {return UPDATE;}SET {return SET;}
token值在语法模块文件sqlgram.y中定义。
ounter(lineounter(line%token UPDATE%token SET
三、语法节点
语法规则由四部分组成:
UPDATE命令主体部分,由关键词和三个子句组成; SET子句,由赋值语句组成的列表; from子句,可选,同SELECT命令; where子句,可选,同SELECT命令。
在UPDATE命令中from子句与where子句,复用SELECT命令中的语法规则定义,因此只需新增前两部分即可。
子树根节点
UPDATE根节点,主要记录了命令中待修改表名称,和三个子句的信息。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linetypedef struct UpdateStmt{NodeType type;Node *targetRel;Node *setList;Node *fromList;Node *whereList;}UpdateStmt;
「节点成员说明」:
targetRel,待修改的目标数据表名称;
setList,修改属性列和值的键值对列表;
fromList,from子句的子树,与SELECT命令相同,进行多表关联查询的数据表;
whereList,where子句的子树,与SELECT命令相同,对查询结果进行条件过滤。
赋值节点
在SET子句中,每个赋值语句是一个赋值节点,记录了等号左右的属性列名称和值表达式信息。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(linetypedef struct AssignElement{NodeType type;Node *columnList;Node *value;}AssignElement;
「节点成员说明」:
columnList,属性列名称,在多个属性列赋值为相同值表达式时,语法中可以简写为一个属性列的列表与一个值表达式的等式,所以这里属性列也可以是一个列表; value,目标值。
SET子句中,可以有多个属性列与值的赋值对出现,同时对多个属性列的值进行修改。
四、总结
本节UPDATE语法解析的代码,实现在目录exam_60。
【手写数据库内核miniToadb】第101节 UPDATE原地更新VS多版本更新,N2OVSO2N 多种存储机制内核实现
【手写数据库核心揭秘系列】第100节 带USING条件的联接查询,简化了SQL复杂度,而内核中承担了什么
【手写数据库核心揭秘系列】第99节 多表联合查询演示,高复杂度查询SQL,四张数据表混合联合类型的查询
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




