本文将带领大家从源码层面过一下 Drop Table 的实现,下面我们先回顾一下之前介绍过的 MiniOB 框架,SQL 语句的解析过程中,当前已经实现的只有 Parser、Resolver 和 Executor 模块。

首先看一下源代码相关的模块,如下图,在 src/observer/sql 文件夹下就是上面提到的蓝色部分模块,当前已经实现的重点模块在 executorparser 下:

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 解析相关推荐

  1. OceanBase 从0到1数据库内核实战教程学习笔记 - 3.OceanBase基础架构和开发技巧

    这篇文章主要介绍王泽林老师分享的 <OceanBase 的基础架构和开发技巧>.如果您看过第一篇文章的对应视频,会发现整个系列主要分为 MiniOB 和 OceanBase 两个系列,本篇 ...

  2. 【编程不良人】MongoDB最新实战教程学习笔记

    简介 视频链接:01.简介和历史_哔哩哔哩_bilibili 文档地址: https://docs.mongodb.com/manual/ MongoDB教程:MongoDB 教程 | 菜鸟教程 注意 ...

  3. 【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑

    前 言

  4. db4o_8.0对象数据库官方文档翻译_学习笔记三

    紧接上篇:db4o_8.0对象数据库官方文档翻译_学习笔记二 3. Object Manager Enterprise Overview(OME视图)即OME插件的使用 If you did not  ...

  5. Python3《机器学习实战》学习笔记(三):决策树实战篇

    转载请注明作者和出处: http://blog.csdn.net/c406495762  运行平台: Windows  Python版本: Python3.x  IDE: Sublime text3 ...

  6. Python3《机器学习实战》学习笔记(三):决策树实战篇之为自己配个隐形眼镜

    转载请注明作者和出处: http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 一 前 ...

  7. 《Angular4从入门到实战》学习笔记

    <Angular4从入门到实战>学习笔记 腾讯课堂:米斯特吴 视频讲座 二〇一九年二月十三日星期三14时14分 What Is Angular?(简介) 前端最流行的主流JavaScrip ...

  8. Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM

    原 Python3<机器学习实战>学习笔记(八):支持向量机原理篇之手撕线性SVM 置顶 2017年09月23日 17:50:18 阅读数:12644 转载请注明作者和出处: https: ...

  9. 《机器学习实战》学习笔记(八):预测数值型数据 - 回归

    欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...

最新文章

  1. vc6静态库的生成和调用
  2. python中使用socket编程实现带有界面的客户端向服务端发送文件和下载文件
  3. c#执行oracle存储过程,C#中如何执行存储过程方法
  4. linux access函数_构建一个即时消息应用(九):Conversation 页面 | Linux 中国
  5. 视觉盛宴篇!推荐 12 个好用的 CSS 的开源项目,YYDS !
  6. python同时输出多个值_python如何实现输出多个值?
  7. linux登陆界面卡死_Linux 上最好的五款音乐播放器
  8. ***CI查询辅助函数:insert_id()、affected_rows()
  9. Guitar Por如何演奏刮弦
  10. UVAoj 11324 - The Largest Clique(tarjan + dp)
  11. 温度 数值模拟 matlab,西安交通大学——温度场数值模拟(matlab)
  12. iOS - CALayer 绘图层
  13. 定制软件项目经理应该善于说“NO”
  14. 【商品架构day8】京东几百亿的商品怎么搜索
  15. cad转dwf格式怎么转换?
  16. java画脸_用Java画人脸
  17. Linux之安装显卡驱动
  18. 手机app开发成本预算
  19. 细说微信h5棋牌游戏如何在微信中做好防封防屏蔽下载工作
  20. HFS安装PHP,Http-File-Server 一个好用的HFS模版,界面非常漂亮,功能也很齐全。 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...

热门文章

  1. 拉丁美洲有多少个国家?
  2. 用matlab编写数值积分,数值积分的matlab实现
  3. CTS GTS 测试记录
  4. Matlab内存问题
  5. 打造灵动办公新体验,金山数字办公助力建筑央企实现办公“效率+安全“双提升
  6. STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口
  7. 远视眼并不是老花眼,远视并不是这么简单!
  8. 一小时入门Python爬虫,连我都会了!Python爬取租房数据实例
  9. git操作时出现error: cannot stat 'path/file': Permission denied
  10. 你好,链表(^.^)