OceanBase 从0到1数据库内核实战教程学习笔记 - 8.MiniOB Drop Table 解析
本文将带领大家从源码层面过一下 Drop Table 的实现,下面我们先回顾一下之前介绍过的 MiniOB 框架,SQL 语句的解析过程中,当前已经实现的只有 Parser、Resolver 和 Executor 模块。
首先看一下源代码相关的模块,如下图,在 src/observer/sql
文件夹下就是上面提到的蓝色部分模块,当前已经实现的重点模块在 executor
和 parser
下:
在 src/observer/sql/parser
文件夹下,包含 词法解析、语法解析和 resolver。我们本篇文章要实现的 Drop Table 实际上已经实现了词法解析和语法解析,大家可以从文件中找到词法解析的 TOKEN 和语法解析的 drop_table:
通常网络消息到达 parser 以后呢,会先到达 handle_event:
void ParseStage::handle_event(StageEvent *event)
{LOG_TRACE("Enter\n");RC rc = handle_request(event);if (RC::SUCCESS != rc) {callback_event(event, nullptr);return;}CompletionCallback *cb = new (std::nothrow) CompletionCallback(this, nullptr);if (cb == nullptr) {LOG_ERROR("Failed to new callback for SQLStageEvent");callback_event(event, nullptr);return;}event->push_callback(cb);resolve_stage_->handle_event(event);event->done_immediate();LOG_TRACE("Exit\n");return;
}
然后进行请求处理:
RC ParseStage::handle_request(StageEvent *event)
{SQLStageEvent *sql_event = static_cast<SQLStageEvent *>(event);const std::string &sql = sql_event->sql();Query *query_result = query_create();if (nullptr == query_result) {LOG_ERROR("Failed to create query.");return RC::INTERNAL;}RC ret = parse(sql.c_str(), query_result);if (ret != RC::SUCCESS) {// set error information to eventsql_event->session_event()->set_response("Failed to parse sql\n");query_destroy(query_result);return RC::INTERNAL;}sql_event->set_query(query_result);return RC::SUCCESS;
}
请求处理代码中,经过了词法语法解析:
RC ret = parse(sql.c_str(), query_result);
解析完成后会生成一个 Query,可以从 src/observer/sql/parser/parse_defs.h
中看到对应的定义:
// struct of flag and sql_struct
typedef struct Query {enum SqlCommandFlag flag;union Queries sstr;
} Query;
union Queries {Selects selection;Inserts insertion;Deletes deletion;Updates update;CreateTable create_table;DropTable drop_table;CreateIndex create_index;DropIndex drop_index;DescTable desc_table;LoadData load_data;char *errors;
};
在 handle_event
中,完成了 handle_request
解析后,会进入下一个阶段 :resolve_stage_
resolve_stage_->handle_event(event);
在这个阶段,我们仍然从文件 src/observer/sql/parser/resolve_stage.cpp
中找到对应的 handle_event
,这个阶段有很多内容都没有实现,可以直接跳转到执行阶段。
void ResolveStage::handle_event(StageEvent *event)
{LOG_TRACE("Enter\n");SQLStageEvent *sql_event = static_cast<SQLStageEvent *>(event);if (nullptr == sql_event) {LOG_WARN("failed to get sql stage event");return;}SessionEvent *session_event = sql_event->session_event();Db *db = session_event->session()->get_current_db();if (nullptr == db) {LOG_ERROR("cannot current db");return ;}Query *query = sql_event->query();Stmt *stmt = nullptr;RC rc = Stmt::create_stmt(db, *query, stmt);if (rc != RC::SUCCESS && rc != RC::UNIMPLENMENT) {LOG_WARN("failed to create stmt. rc=%d:%s", rc, strrc(rc));session_event->set_response("FAILURE\n");return;}sql_event->set_stmt(stmt);query_cache_stage_->handle_event(sql_event);LOG_TRACE("Exit\n");return;
}
执行阶段的代码位于 src/observer/sql/executor/execute_stage.cpp
,从代码中可以找到对应的建表和删表操作,当前的删表操作还没有实现:
case SCF_CREATE_TABLE: {do_create_table(sql_event);} break;case SCF_CREATE_INDEX: {do_create_index(sql_event);} break;case SCF_SHOW_TABLES: {do_show_tables(sql_event);} break;case SCF_DESC_TABLE: {do_desc_table(sql_event);} break;case SCF_DROP_TABLE:case SCF_DROP_INDEX:
从上面的代码中可以看到有很多功能已经实现,比如 create table
操作,所以 Drop Table 操作的实现比较简单,可以模仿着实现。
由于整个实现过程比较枯燥,这里只简单列一下大体思路,主要分为 5 步:
- 删除索引;
- 销毁 record handler;
- 销毁 buffer pool;
- 删除数据文件;
- 删除元数据文件。
今天的内容大概就这些~
最后的最后,如果大家感兴趣,可以多关注和参与 OB 的活动:https://ask.oceanbase.com/t/topic/35601006。
OceanBase 从0到1数据库内核实战教程学习笔记 - 8.MiniOB Drop Table 解析相关推荐
- OceanBase 从0到1数据库内核实战教程学习笔记 - 3.OceanBase基础架构和开发技巧
这篇文章主要介绍王泽林老师分享的 <OceanBase 的基础架构和开发技巧>.如果您看过第一篇文章的对应视频,会发现整个系列主要分为 MiniOB 和 OceanBase 两个系列,本篇 ...
- 【编程不良人】MongoDB最新实战教程学习笔记
简介 视频链接:01.简介和历史_哔哩哔哩_bilibili 文档地址: https://docs.mongodb.com/manual/ MongoDB教程:MongoDB 教程 | 菜鸟教程 注意 ...
- 【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑
前 言
- db4o_8.0对象数据库官方文档翻译_学习笔记三
紧接上篇:db4o_8.0对象数据库官方文档翻译_学习笔记二 3. Object Manager Enterprise Overview(OME视图)即OME插件的使用 If you did not ...
- Python3《机器学习实战》学习笔记(三):决策树实战篇
转载请注明作者和出处: http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 ...
- Python3《机器学习实战》学习笔记(三):决策树实战篇之为自己配个隐形眼镜
转载请注明作者和出处: http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 一 前 ...
- 《Angular4从入门到实战》学习笔记
<Angular4从入门到实战>学习笔记 腾讯课堂:米斯特吴 视频讲座 二〇一九年二月十三日星期三14时14分 What Is Angular?(简介) 前端最流行的主流JavaScrip ...
- Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM
原 Python3<机器学习实战>学习笔记(八):支持向量机原理篇之手撕线性SVM 置顶 2017年09月23日 17:50:18 阅读数:12644 转载请注明作者和出处: https: ...
- 《机器学习实战》学习笔记(八):预测数值型数据 - 回归
欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...
最新文章
- vc6静态库的生成和调用
- python中使用socket编程实现带有界面的客户端向服务端发送文件和下载文件
- c#执行oracle存储过程,C#中如何执行存储过程方法
- linux access函数_构建一个即时消息应用(九):Conversation 页面 | Linux 中国
- 视觉盛宴篇!推荐 12 个好用的 CSS 的开源项目,YYDS !
- python同时输出多个值_python如何实现输出多个值?
- linux登陆界面卡死_Linux 上最好的五款音乐播放器
- ***CI查询辅助函数:insert_id()、affected_rows()
- Guitar Por如何演奏刮弦
- UVAoj 11324 - The Largest Clique(tarjan + dp)
- 温度 数值模拟 matlab,西安交通大学——温度场数值模拟(matlab)
- iOS - CALayer 绘图层
- 定制软件项目经理应该善于说“NO”
- 【商品架构day8】京东几百亿的商品怎么搜索
- cad转dwf格式怎么转换?
- java画脸_用Java画人脸
- Linux之安装显卡驱动
- 手机app开发成本预算
- 细说微信h5棋牌游戏如何在微信中做好防封防屏蔽下载工作
- HFS安装PHP,Http-File-Server 一个好用的HFS模版,界面非常漂亮,功能也很齐全。 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
热门文章
- 拉丁美洲有多少个国家?
- 用matlab编写数值积分,数值积分的matlab实现
- CTS GTS 测试记录
- Matlab内存问题
- 打造灵动办公新体验,金山数字办公助力建筑央企实现办公“效率+安全“双提升
- STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口
- 远视眼并不是老花眼,远视并不是这么简单!
- 一小时入门Python爬虫,连我都会了!Python爬取租房数据实例
- git操作时出现error: cannot stat 'path/file': Permission denied
- 你好,链表(^.^)