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数据库在语法树生成上相对简单,每一条规则生成一个既有的语法树的节点。

0 0
原创粉丝点击