RedBase SQL解析源码分析
来源:互联网 发布:离线ip数据库 编辑:程序博客网 时间:2024/04/27 20:25
@原创文章,转载请注明: 转载自 镜中影的技术博客
本文链接地址: RedBase SQL解析源码分析)
URL:http://blog.csdn.net/linkpark1904/article/details/49884017
1. 背景介绍
RedBase是斯坦福的数据库系统实现这门课程(cs346)的一个项目,实现了一个简易的数据库系统,包括底层存储层(Paged File Component),记录管理层(Record Management Component),索引管理层(Indexing Component),系统管理层(System Management Component),SQL解析层(Query Language Component)。
其项目主页为:http://cs.stanford.edu/people/widom/cs346/project.html
项目源代码在:http://cs.stanford.edu/people/widom/cs346/project.html
这里主要对SQL解析层(QL)源代码进行分析,主要是为了弄清楚,数据库从SQL语法解析生成语法树到SQL逻辑计划生成的过程,以及逻辑计划是如何用数据结构进行表征的。
2. RedBase语法树描述
RedBase语法树节点是一个大的联合体,和很多数据库的设计类似,节点都具有一个节点类型,用一个联合体进行表征。RedBase实现的SQL语句相对很简单,节点定义代码位于parser_internal.h文件中。
针对每一种不同的节点类型,定义不同的节点内容,其声明描述大致如下:
typedef struct node{ NODEKIND kind; union{ struct{ char *relname; struct node *attrlist; } CREATETABLE; …… struct{ struct node *relattrlist; struct node *rellist; struct node *conditionlist; struct node *orderrelattr; struct node *grouprelattr; } QUERY; struct{ char *relname; struct node *valuelist; } INSERT; struct{ char *relname; struct node *conditionlist; } DELETE; struct{ char *relname; struct node *relattr; struct node *relorvalue; struct node *conditionlist; } UPDATE; ……struct{ char *attrname; char *type; } ATTRTYPE; …… /* relation node */ struct{ char *relname; } RELATION; /* list node */ struct{ struct node *curr; struct node *next; } LIST; } u;} NODE;
这一点在语法树节点设计上,和OceanBase有所不同,RedBase将不同类型的节点统一放到一个联合体里面定义好,并且针对不同节点类型的子节点个数其也确定好了。个人感觉OceanBase的语法树节点的设计更为灵活一些,增加节点类型,只需要增加对应生成节点的规则即可,同时,如果要修改现有节点子节点的个数,也只需要修改对应生成节点的规则就可以,而不需要重新设计语法树节点的数据结构。
对于语法树的生成,RedBase针对不同类型的语法树节点有不同的生成函数,具体可以看如下代码规则:
以SELECT为例,看SELECT语法树是如何生成的:
语法规则如下(定义在文件parse.y中):
query : RW_SELECT non_mt_select_clause RW_FROM non_mt_relation_list opt_where_clause opt_order_by_clause opt_group_by_clause { $$ = query_node($2, $4, $5, $6, $7); }与语法规则相匹配的生成函数如下(定义在nodes.cc中):NODE *query_node(NODE *relattrlist, NODE *rellist, NODE *conditionlist, NODE *order_relattr, NODE *group_relattr){ NODE *n = newnode(N_QUERY); n->u.QUERY.relattrlist = relattrlist; n->u.QUERY.rellist = rellist; n->u.QUERY.conditionlist = conditionlist; n->u.QUERY.orderrelattr = order_relattr; n->u.QUERY.grouprelattr = group_relattr; return n;}
举一个具体的实例,一个SQL语句生成的语法树如下图所示: Select name from student where age = 10
对比于OceanBase的语法树描述,RedBase数据库在语法树生成上相对简单,每一条规则生成一个既有的语法树的节点。
- RedBase SQL解析源码分析
- postgresql源码分析--解析sql--类型系统
- OceanBase SQL解析源码分析(一)
- OceanBase SQL解析源码分析(二)
- OceanBase SQL解析源码分析(三)
- Mybatis源码分析 之 sql解析
- RedBase点滴
- Mybatis3源码分析(12)-Sql解析执行-MetaObject
- Mybatis3源码分析(14)-Sql解析执行-StatementHandler
- Mybatis3源码分析(17)-Sql解析执行-缓存的实现
- Mycat源码篇 : Mycat sql解析模块分析
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(二)之SQL解析
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(一)之语法解析
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(六)之删除SQL
- 通过源码分析MyBatis的缓存/Mybatis解析动态sql原理分析
- 源码分析MyCat之SQL解析篇-----sql解析引擎druid之抽象语法树(mycat1.6)
- 优化hibernate性能的几点建议
- HDU 1227 Fast Food(经典DP)
- CentOS针对磁盘IO[jdb2进程]的优化
- 卸载Visual Studio
- wordpress去掉评论响应式图片srcset属性
- RedBase SQL解析源码分析
- Android Camera API2.0下全新的Camera FW/HAL架构简述
- 一道关于二级指针传参的问题
- #学习笔记#(51)angular自定义标签director
- Android性能优化之Activity 泄漏
- Java IO读写
- Android Studio使用简介
- 第5章 让他人喜欢自己的心理策略
- linux面试基础考题