作者在数据库内核设计从业十余年;设计开发分布式数据内核;编写从零手写数据库教程;现在将过去的数据库内核经验一一分享,有兴趣的朋友加个关注。

一、概述
为了理解解析树的结构,将新加的解析树分支添加到显示处理中,在node.c中增加解析树的显示处理逻辑。
二、节点显示处理
为新增的解析树节点增加显示函数,显示各自的成员信息,如果成员是节点类型时,递归调用节点分发处理函数。
为了显示层次性,在显示开头用空格进行缩进处理。
2.1 INSERT节点
INSERT插入命令节点中,显示表名称,其它两个成员为List节点类型,递归调用,并且层数递增。
static void ShowNodInsertStmt(InsertStmt* node, int level)
{
ShowBlank(level+1);
printf("tableName:%s \n", node->tableName);
ShowNode(node->attrNameList, level+1);
ShowNode(node->valuesList, level+1);
return;
}
2.2 属性名称节点
属性列名称节点中,显示唯一一个属性列名称成员。
static void ShowNodAttrName(AttrName* node, int level)
{
ShowBlank(level+1);
printf("attrName:%s \n", node->attrName);
return;
}
2.3 属性值节点
数据值节点的显示函数,这里只显示一个数据类型名称,数据值需要转换才能显示,这里暂时没有处理,这些信息已经足够显示解析树的结构。
static void ShowNodValuesData(ValuesData* node, int level)
{
ShowBlank(level+1);
printf("colType:%s \n", GetDataTypeName(node->dataType));
return;
}
2.4 命令分发处理
最后在ShowNode函数中增加命令的分发处理,根据节点类型分发到新增的三个节点的显示函数。
case T_InsertStmt:
ShowNodInsertStmt((InsertStmt*)n, level);
break;
case T_AttrName:
ShowNodAttrName((AttrName*)n, level);
break;
case T_ValuesData:
ShowNodValuesData((ValuesData*)n, level);
break;
2.5 INSERT语法树显示
首先创建一张customer表,有三个字段,分别为整型,两个字符串类型。
[senllang@hatch exam_24]$ ./sqlparser
create table customer(cid integer, cname varchar, production varchar);
然后插入两行数据,指定插入的列名称,同时在values子句中用两个括号分别代表两行数据。
insert into customer(cid, cname,production) values(2,'apple','iphone'),(3,'xinuo','cup');
parser tree :
{
tableName:customer
{
length:3
{
attrName:cid
}
{
attrName:cname
}
{
attrName:production
}
}
{
length:2
{
length:3
{
colType:integer
}
{
colType:varchar
}
{
colType:varchar
}
}
{
length:3
{
colType:integer
}
{
colType:varchar
}
{
colType:varchar
}
}
}
}
可以看到,顶层有三个子句,表名称,后面有两个{}
,分别是三个子句的内容。前一个是属性名称列表的子句,长度为3,有三个属性列名称打印。后一个长度为2,分别为两组属性列值的打印。
三、总结
本节主要为了方便检查,打印出解析树的结构,新增代码位于exam_24目录下。
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




