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

【手写数据库核心揭秘系列】第104节 UPDATE基本逻辑运算分解,这就是集合运算?

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

一、概述 


UPDATE命令中含有SET子句、FROM子句和WHERE子句,涵盖了基本的逻辑运算,如投影、选择以及多个集合间的运算。

在逻辑计划阶段,将解析得到的信息转换为逻辑运算形式,这有利于通过关系代数进行优化。

二、逻辑计划接口 


新增UPDATE命令的逻辑计划处理接口,其中主要对各个子句进行处理,分别整理形成不同逻辑运算所需的信息。

    ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
    int LogicalUpdatePlan(QueryStmt *queryStmt)


    int LogicalPlan(QueryStmt *queryStmt)
        case T_UpdateStmt:
            ret = LogicalUpdatePlan(queryStmt);
            break;

    三、基本表收集 


    数据源表,在逻辑运算中,也就是集合,在UPDATE命令中涉及两个子句,一个是目标表子句,它指被修改表,同时也可以参与集合间的逻辑运算。

      ounter(lineounter(lineounter(line
          retCode = TableNodeProcess(queryStmt, updateStmt->targetRel);
          if(retCode < 0)
              return retCode;

      另一个是FROM子句,它是可选子句,复用了SELECT命令中的处理逻辑,不仅支持单表,也支持多表间不同类型的联合,对应多个集合间的逻辑操作。

        ounter(lineounter(lineounter(line
            retCode = FromClauseRelationProcess(queryStmt, updateStmt->fromList);
            if(retCode <0)
                return retCode;

        四、选择条件 


        选择过滤条件一般由where子句产生,由逻辑条件执行结果集的筛选。

        在where子句中,不仅会包含常量的逻辑条件,还可能由子查询语句给出,首先对子查询递归处理,再对所有条件进行检查和处理。

          ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
              retCode = WhereClauseRelationProcess(queryStmt, updateStmt->whereList);
              if(retCode <0)
                  return retCode;


              /* expre */
              retCode = WhereExprProcess(queryStmt, updateStmt->whereList);
              if(retCode < 0)
                  return retCode;

          这里也是复用SELECT命令中where子句的处理逻辑。

          五、投影属性列 


          在SET子句的处理,根据要修改的属性列对结果集进行投影运算,得到所有符合条件的待修改数据列。

            ounter(lineounter(line
                retCode = SetClauseProcess(queryStmt, updateStmt->setList);
                return retCode;

            六、总结 


            本节内容在exam_61 目录下的plan.c中。

            🌟 点赞收藏,分享给身边的技术伙伴,关注我们,持续获取数据库内核开发的硬核干货!一起从源码级实现到分布式架构,解锁数据库技术的每一个核心细节!🚀

            【往期精彩推荐】

            【手写数据库核心揭秘系列】第103节 UPDATE命令语法解析,语法树生成全貌,终于看到了

            【手写数据库核心揭秘系列】第99节 多表联合查询演示,高复杂度查询SQL,四张数据表混合联合类型的查询

            【手写数据库核心揭秘系列】第65讲 SELECT语法树 7大关键节点 的调试与可视化全攻略



            文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论