代码传送门:

3.1.2 参考代码(解析)

3.2.3 参考代码(执行)


3.1 delete 语句的解析

3.1.1

解析 sql 语句需要了解一些分词器和解析器

简要流程:

  1. 匹配 delete :使用 matchToken(TOKEN_RESERVED_WORD, "delete") 匹配
  2. 获取表名:使用 if 判断是否是 TOKEN_WORD 类型,如果是,获得表名;给字符串指针开空间的时候可以使用 new_id_name() 函数
  3. 匹配 where : matchToken(TOKEN_RESERVED_WORD,"where") ,注意不是所有 delete 语句都伴随一个 where 表达式
  4. 使用 parseExpressionRD() 获取值(或者表达式),并包裹在 SRA_t 中( SRA_SELECT类型),作为 sql_stmt_delete->where 的值。(语句若不伴随 where 则仅需构造SRA_TABLE ,具体实现可参考 exp_01_stmt_parser/exp_01_03_select.cpp
  5. 创建 sql_stmt_delete 类型的指针,分配内存空间并对各字段进行赋值,返回该指针

常用函数:

  • push_back(elem); //向 vector 尾部加入数据
  • Expression *Parser::parseExpressionRD(); //递归下降法解析表达式 详情看src/parser/parser.cpp 中
  • SRA_t *SRATable(TableReference_t *ref); // SRA_TABLE 构造函数
  • SRA_t *SRASelect(SRA_t *sra, Expression *cond); // SRA_SELECT 构造函数
  • void SRA_print(SRA_t *sra); //输出 SRA_t 中的数据(调试用)

3.1.2 参考代码

#include <dongmensql/sqlstatement.h>
#include <parser/StatementParser.h>/*** 在现有实现基础上,实现delete from子句**  支持的delete语法:**  DELETE FROM <table_nbame>*  WHERE <logical_expr>** 解析获得 sql_stmt_delete 结构*/sql_stmt_delete *DeleteParser::parse_sql_stmt_delete(){char *tableName;SRA_t *where;Token *token = this->parseNextToken();if (!this->matchToken( TOKEN_RESERVED_WORD, "delete")) {return NULL;}token = this->parseNextToken();if (token->type == TOKEN_WORD) {tableName = new_id_name();strcpy(tableName, token->text);} else {strcpy(this->parserMessage, "invalid sql: missing table name.");return NULL;}token = this->parseEatAndNextToken();// where 语句where = SRATable(TableReference_make(tableName, nullptr));if(this->matchToken(TOKEN_RESERVED_WORD, "where")){/*解析where子句中的条件表达式*/Expression *whereExpr = this->parseExpressionRD();if (this->parserStateType == PARSER_WRONG) {return NULL;}where = SRASelect(where, whereExpr);}//进行赋值sql_stmt_delete  *sqlStmtDelete = (sql_stmt_delete *)calloc(1, sizeof(sql_stmt_delete));sqlStmtDelete->tableName = tableName;sqlStmtDelete->where = where;return sqlStmtDelete;
};

3.2 delete 语句执行

3.2.1 物理操作

首先创建一个表扫描计划,然后用 Scan 类中的 next() 函数迭代数据库数据条目,对满足条件的条目进行修改。

Scan 类中有针对不同的物理计划的虚拟函数:

class Scan {
public:DongmenDB *m_db;Transaction *m_tx;virtual int beforeFirst()=0;virtual int next()=0;virtual int close()=0;virtual variant *getValueByIndex(int index)=0;virtual int getIntByIndex(int index)=0;virtual string getStringByIndex(int index)=0;virtual int getInt(string tableName, string fieldName) = 0;virtual variant* getValue(string fieldName)=0;virtual string getString(string tableName, string fieldName)=0;virtual int hasField(string tableName,string fieldName)=0;virtual FieldInfo * getField(string tableName, string fieldName)=0;virtual  vector<char*> getFieldsName(string tableName)=0;virtual int setInt(string tableName, string fieldName, int value)=0;virtual int setString(string tableName, string fieldName, string value)=0;virtual int deleteRecord()=0;virtual int insertRecord()=0;virtual int getRID(RecordID *recordID)=0;virtual int moveTo(RecordID *recordID)=0;Expression * evaluateExpression(Expression *expr, Scan* scan, variant *var);};

3.2.2 实现

函数的具体实现在 src/physicalplan/ 下 Scan 的多个子类中

主要思路:

  1. 使用 SRA_t 类型的 where 构造执行计划( Scan 对象);
  2. 遍历计划
  3. 在遍历计划过程的循环中,调用 scan->deleteRecord() 删除记录
  4. 在循环中更新删除的记录条数,作为最终的返回值。

3.2.3 参考代码

#include <physicalplan/ExecutionPlan.h>
#include <physicalplan/TableScan.h>
#include <physicalplan/Select.h>
#include <physicalplan/Project.h>
#include <physicalplan/Join.h>/*执行delete语句的物理计划,返回删除的记录条数* 返回大于等于0的值,表示删除的记录条数;* 返回小于0的值,表示删除过程中出现错误。* */int ExecutionPlan::executeDelete(DongmenDB *db, sql_stmt_delete *sqlStmtDelete, Transaction *tx){/*删除语句以select的物理操作为基础实现。* 1. 使用 sql_stmt_delete 的条件参数,调用 physical_scan_select_create 创建select的物理计划并初始化;* 2. 执行 select 的物理计划,完成 delete 操作* */int count = 0;Scan* scan = generateScan(db, sqlStmtDelete->where, tx);scan->beforeFirst();while(scan->next()){scan->deleteRecord();count++;}scan->close();return count;
};

指导文档由山东科技大学各位老师完成。

delete 语句解析与执行相关推荐

  1. mysql从库执行delete停止_MySQL主库大表执行delete语句,Ctrl+C具体发生了什么分析...

    MySQL主库大表执行delete语句,Ctrl+C具体发生了什么分析 1.查看表结构 localhost.qt>show create table doctor_stats_backup\G ...

  2. mysql当执行delete语句时备份_mysql中,执行delete语句时出现Lock wait timeout exceeded问题...

    问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现 错误.但过了一会再 ...

  3. oracle中执行某sql语句后,如一系列delete、update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难?

    oracle中执行某sql语句后,如一系列delete.update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难? 使 ...

  4. mysql workbench 执行delete语句

    转载:https://www.cnblogs.com/xh831213/p/5145137.html 一开始删了半天没删掉,惭愧. 首先,当前操作的数据库会被黑色加粗. 右键表名,select row ...

  5. mysql编写完怎么执行_面试官:一条MySQL更新语句是如何执行的?

    在面试中面试中如果被面试官问到在MySQL中一条更新语句是怎么执行的?,下面让我们来探究一下! 流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程 ...

  6. new和delete底层解析

    new和delete底层解析 2018年04月05日 10:26:44 龙跃十二 阅读数:205 标签: C++newdelete 更多 个人分类: C++ 所属专栏: C++ 版权声明:本文为博主原 ...

  7. 基于query语句解析mysql工作原理

    一.前言 在之前的博文中己经介绍过了mysql的编译安装,那么这次将介绍一下从一条query语句执行过程来剖析mysql是如何工作的. 二.简介(来源于维基百科) MySQL(官方发音为/maskju ...

  8. mybatis的select、insert、update、delete语句

    一.select <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String&qu ...

  9. asscess 一条记录更新数据_一条MySQL更新语句是怎么执行的?

    流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Serv ...

最新文章

  1. 宏基因组分析技术研讨会第5期-最后3个名额,下周开课
  2. 理解Java中的弱引用(Weak Reference)
  3. Invalid packet stream index
  4. 一图看懂py2/py3编码
  5. SAP ABAP编辑器里的Code Completion(代码自动完成)的等待时间设置
  6. ShowMsg函数妙用
  7. 【WebRTC---入门篇】(十三)WebRTC音视频数据采集
  8. 项目运行报错java.sql.SQLSyntaxErrorException: Table ‘sell.hibernate_sequence‘ doesn‘t exist
  9. 渗透工具—反制爬虫之Burp Suite RCE
  10. [转载] python 等号 重载_python运算符重载2
  11. LA 3268 号码簿分组(最大流+二分)
  12. uboot研读笔记 | 14 - uboot启动流程分析(2016.03版本)
  13. Unity3D手机斗地主游戏开发实战(04)_出牌判断大小
  14. [HTML] 百度搜索框的基本实现 源码
  15. 直播第三方美颜sdk是什么?
  16. 分享一个横向打印二叉树图形的方法
  17. 人民网:“2021数字基建论坛”在京召开,共议行业高质量发展
  18. 北京计算机非全日制研究生哪个学校最好考,这所211,因校名被隐藏得很好,考上北京二环“有车有房”不是梦...
  19. 被偷窥隐私要怎么追责
  20. 关于UNITY中System.Drawing引用失败的处理方法

热门文章

  1. win7 任务计划功能的使用
  2. 浙江好运来皮革制品有限公司
  3. 191-天地人和,从头顶的灿烂星空,到人性的变与不变【 2023年Q1 读书笔记】
  4. 最小费用流matlab,计算最小费用最大流MATLAB源代码.doc
  5. 全球市场药丸收纳盒市场销售情况及需求规模预测报告(新版)2022年
  6. (PC+WAP)带手机端pbootcms模板门窗设计类网站
  7. 【AIChallenger 2018 】【眼底水肿病变区域分割】冠军解决方案
  8. 两款C++静态检查工具
  9. Python-Django毕业设计天津市杨柳青智慧景区信息系统(程序+LW)
  10. Java 8 中需要知道的4个函数式接口-Function、Consumer、Supplier、Predicate