暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库核心揭秘系列】第102节 UPDATE命令语法节点定义,走近人机交互,如何将SQL转换为程序结构数据

开源无限 2025-06-19
80


💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!
🚀 从存储引擎、查询优化到分布式事务,手把手拆解核心模块;从语法解析树构建到执行计划生成,逐行代码还原设计精髓
🌟 无论你是数据库开发者、系统架构师,还是对底层技术充满好奇的极客,这里都有你想要的“硬核干货”!点击关注,与行业老兵共同探索数据库技术的星辰大海!
公众号:开源无限

一、概述 


UPDATE的语法规则用上下文无关的文法来表示,首先定义新的分词规则,进行词法解析,得到命令中的关键词;然后将UPDATE命令拆分为四个部分,分别进行语法规则的定义。

二、 词法解析 


新增两个关键词UPDATE、SET,将它们的分词规则在sqlscanner.l文件中定义,返回对应的token值。

    ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
    UPDATE          {
                        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(line
        typedef 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(line
          typedef 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论