自己动手写数据库:实现一个小型 SQL 解释器(下)

本节我们完成 SQL 解释器的最后一部分,它涉及到数据的删除和更改,首先我们看删除语句的解析。我们先看 delete 对应的语法:

Delete -> DELETE FROM ID (where Predicate)?

从语法规则可以看出,delete 语句必须以关键字 DELETE , FROM 开始,然后接着的字符串必须要满足 ID 的定义,最后可能接着 where 关键字,然后进入 Predicate 的解析,我们看看代码实现,在 parser.go 中的 Delete 函数增加代码如下:

func (p *SQLParser) Delete() interface{} {/*第一个关键字 delete,第二个关键字必须 from*/p.checkWordTag(lexer.DELETE)p.checkWordTag(lexer.FROM)p.checkWordTag(lexer.ID)tblName := p.sqlLexer.Lexemepred := query.NewPredicate()if p.isMatchTag(lexer.WHERE) {pred = p.Predicate()}return NewDeleteData(tblName, pred)
}

新增一个 delete_data.go 文件,添加代码如下:

package parserimport "query"type DeleteData struct {tblName stringpred    *query.Predicate
}func NewDeleteData(tblName string, pred *query.Predicate) *DeleteData {return &DeleteData{tblName: tblName,pred:    pred,}
}func (d *DeleteData) TableName() string {return d.tblName
}func (d *DeleteData) Pred() *query.Predicate {return d.pred
}

最后在 main.go 增加代码如下:

func main() {sql := "DELETE FROM Customers WHERE CustomerName=\"Alfreds Futterkiste\""sqlParser := parser.NewSQLParser(sql)sqlParser.UpdateCmd()}

以上代码的调试演示过程请在 B 站搜索 coding 迪斯尼查看相关视频。我们还剩下最后一个语句,那就是 update,先看看 update 语句对应的语法:

Modify -> UPDATE ID SET Field EQUAL Expression (WHERE Predicate)?

首先它必须以关键字 update 开头,然后跟着的字符串必须满足 ID 的定义,然后跟着关键字 SET, 后面跟着的一系列字符串要满足 Field 的定义,其实这里 Field 对应列名,下面跟着等号关键字,等号后面则是一个计算表达式,在最后我们还得判断是否接着 where 关键字,如果有,我们还要解析 where 后面对应的表达式,我们看看对应代码实现:

func (p *SQLParser) Modify() interface{} {p.checkWordTag(lexer.UPDATE)p.checkWordTag(lexer.ID)//获得表名tblName := p.sqlLexer.Lexemep.checkWordTag(lexer.SET)_, fldName := p.Field()p.checkWordTag(lexer.ASSIGN_OPERATOR)newVal := p.Expression()pred := query.NewPredicate()if p.isMatchTag(lexer.WHERE) {pred = p.Predicate()}return NewModifyData(tblName, fldName, newVal, pred)
}

接下来增加一个文件 modify_data.go,添加如下代码:

package parserimport "query"type ModifyData struct {tblName stringfldName stringnewVal  *query.Expressionpred    *query.Predicate
}func NewModifyData(tblName string, fldName string, newVal *query.Expression, pred *query.Predicate) *ModifyData {return &ModifyData{tblName: tblName,fldName: fldName,newVal:  newVal,pred:    pred,}
}func (m *ModifyData) TableName() string {return m.tblName
}func (m *ModifyData) TargetField() string {return m.fldName
}func (m *ModifyData) NewValue() *query.Expression {return m.newVal
}func (m *ModifyData) Pred() *query.Predicate {return m.pred
}

到这里我们就基本完成了一个小型 SQL 解释器,更详细的调试演示和讲解请在 B 站参看 coding 迪斯尼,代码下载地址:
https://github.com/wycl16514/SQL_PARSER_FINISH.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ STL set容器使用教程

文章目录 引用头文件初始化赋值遍历 set 容器1. 迭代器遍历2. auto3. range for循环4. for_each 迭代器vector 常用方法返回 set 长度插入元素删除元素 set 为关联式容器,翻译为集合,其中的元素类型为 pair,需要注意 set 容器存储的各个键值对…

Docker学习笔记(持续更新)

Docker学习目录 1.基础1.1 Docker简介1.1.1 Why Docker?1.1.2 Docker理念1.1.3 容器与虚拟机1.1.4 Docker能做什么? 1.2 Docker的基本组成1.2.1 Docker的三要素1.2.2 Docker平台架构 1.基础 1.1 Docker简介 1.1.1 Why Docker? 在个人笔记本…

Ramp 有点意思的题目

粗一看都不知道这个要干什么,这 B 装得不错。 IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKJycnCktlZXAgdXMgb3V0IG9mIGdvb2dsZSBzZWFyY2ggcmVzdWx0cy4uCgokIG9kIC1kIC9kZXYvdXJhbmRvbSB8IGhlYWQKMDAwMDAwMCAgICAgNjAyMTUgICAyODc3OCAgIDI5MjI3ICAgMjg1NDggICA2MjY4NiAgIDQ1MT…

无涯教程-Android - 应用组件

应用程序组件是Android应用程序的基本组成部分,这些组件需要在应用程序清单文件 AndroidManifest.xml 注册,该文件描述了应用程序的每个组件以及它们如何交互。 Android应用程序可以使用以下四个主要组件- Sr.NoComponents & 描述1 Activities 它们…

【网络通信 -- WebRTC】项目实战记录 -- linux 环境下 libmediasoup 编译与测试

【网络通信 -- WebRTC】项目实战记录 -- linux 环境下 libmediasoup 编译与测试 【1】编译配置 libwebrtc 【1.1】下载并配置 depot_tools 下载 depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git编辑 ~/.bashrc 将 depot_tools 添加…

【8 排序】简单选择排序。

顺序表&#xff1a; void Swap(int &a,int &b){int temp;tempa;ab;btemp; } void SelectSort(int A[],int n){int min,i,j;for(i0;i<n-1;i){mini;for(ji1;j<n;j)if(A[j]<A[min])minj;if(min!i)Swap(A[i],A[min]);} } 单链表&#xff1a; void SelectSort…

JVM 对象引用类型

对象引用类型 对象引用类型分为强引用、软引用、弱引用和虚引用。 强引用 声明对象时虚拟机生成的引用&#xff0c;是指在程序代码之中普遍存在的引用赋值。强引用环境下&#xff0c;垃圾回收时需要严格判断当前对象是否被强引用&#xff0c;如果被强引用&#xff0c;…

中科驭数以DPU先进计算技术,夯实下一代金融IT基础设施底座

由中国计算机学会主办的第19届CCF全国高性能计算学术年会&#xff08;CCF HPC China 2023&#xff09;于8月23日至26日在青岛成功召开。在“高性能金融计算”主题论坛上&#xff0c;中科驭数高级副总裁、CTO卢文岩应邀发表了题为《DPU先进计算技术助力下一代交易底座》的演讲&a…

Java设计模式:四、行为型模式-06:观察者模式

文章目录 一、定义&#xff1a;观察者模式二、模拟场景&#xff1a;观察者模式2.1 观察者模式2.2 引入依赖2.3 工程结构2.4 模拟摇号2.4.1 摇号服务接口2.4.2 摇号返回结果类 三、违背方案&#xff1a;观察者模式3.0 引入依赖3.1 工程结构3.2 添加摇号接口和实现3.2.1 摇号服务…

MySQL 数据库常用命令大全(完整版)

文章目录 1. MySQL命令2. MySQL基础命令3. MySQL命令简介4. MySQL常用命令4.1 MySQL准备篇4.1.1 启动和停止MySQL服务4.1.2 修改MySQL账户密码4.1.3 MySQL的登陆和退出4.1.4 查看MySQL版本 4.2 DDL篇&#xff08;数据定义&#xff09;4.2.1 查询数据库4.2.2 创建数据库4.2.3 使…

9月1日,每日信息差

1、美团多场直播交易额破亿元。数据显示&#xff0c;美团“线上美博会”“爱健康”“爱漂亮”三个直播间交易额均突破亿元&#xff0c;其中&#xff0c;首届“线上美博会”单场直播交易额突破1.2亿元 2、美国8月非农就业人数增加18.7万人&#xff0c;预估增加为17万人&#xf…

小试 InsCode AI 创作助手

个人理解&#xff1a; 自ChatGPT新版现世&#xff0c;一直被视面替代人工工作的世大挑战&#xff0c;各类人工智能语言生成工目层出不穷&#xff0c;也在不断影响着我们日常的工作和生活 小试CSDN的InsCode AI&#xff1a; - 基本概念查询方便&#xff0c;与个人了解&…

JVM内存模型介绍

java内存中变量的存储位置 局部变量&#xff1a;方法中的局部变量存在于栈内存。每当程序调用一个方法时&#xff0c;系统都会为该方法建立一个方法栈&#xff0c;所在方法中声明的变量就放在方法栈中&#xff0c;方法结束系统会销毁该方法栈&#xff0c;在该方法中声明的变量随…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》山东农大许少辉八一新书

2023开学礼《乡村振兴战略下传统村落文化旅游设计》山东农大许少辉八一新书

move与函数指针的简单使用

std::move() C11的标准库 提供了一个非常有用的函数 std::move()&#xff0c;std::move() 函数将一个左值强制转化为右值引用&#xff0c;以用于移动语义。 就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝 #include <iostream&g…

ceph源码阅读 buffer

ceph::buffer是ceph非常底层的实现&#xff0c;负责管理ceph的内存。ceph::buffer的设计较为复杂&#xff0c;但本身没有任何内容&#xff0c;主要包含buffer::list、buffer::ptr、buffer::hash。这三个类都定义在src/include/buffer.h和src/common/http://buffer.cc中。 buffe…

Java“魂牵”京东商品详情描述数据,京东商品详情API接口,京东API接口申请指南

要通过京东的API获取商品详情描述数据&#xff0c;您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过京东开放平台API获取商品详情&#xff1a; 首先&#xff0c;确保您已注册成为京东开放平台的开发者&#xff0c;并创…

php提交表单将html相互字符转化的封装函数

在 PHP 中&#xff0c;您可以使用 htmlspecialchars() 函数将 HTML 字符转换为文本。该函数将把 <、>、" 和 等特殊字符转换为对应的 HTML 实体&#xff0c;从而避免跨站点脚本&#xff08;XSS&#xff09;攻击。 例如&#xff0c;如果您有一个表单输入字段的值&a…

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测&#xff1b; 2.运行环境…

cmd: Union[List[str], str], ^ SyntaxError: invalid syntax

跑项目在调用from easyprocess import EasyProcess 遇到报错&#xff1a; cmd: Union[List[str], str], ^ SyntaxError: invalid syntax猜测是EasyProcess版本与python版本不对应 pip show EasyProcess查证一下&#xff1a; WARNING: pip is being invoked by an old…