暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库内核miniToadb】第32天 INSERT解析树的展示

开源无限 2025-01-22
31

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



一、概述 


为了理解解析树的结构,将新加的解析树分支添加到显示处理中,在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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论