[SDU软件工程实践]Blog13-ASTNode

2021SC@SDUSC

ASTNode中的异常

为了能更好地观察ASTNode这个操作树的结构,我使用了一个带子查询的hql

select * from test where id in (select * from test);

然后呢,我就看到了这个
??
我们集中关注children,里面居然有一个TOK_INSERT?明明是一个查询语句为什么会有insert
只能决心彻底理清这个树的结构了,于是就有了一段痛苦的翻阅过程……

ASTNode的具体结构

每一个节点都有以下几个特征:

  • 有一个“名字”,在debug的图里也能看到
  • 以列表children存储子节点
  • 有一个叫做childrenIndex的字段

我在梳理结构时,还记录这个节点有没有被父节点说明为“childrenIndex”。如果有,则用(child)标注。经过漫长的翻阅,结果如下(注意,我用引号标出并不代表它们仅仅是一个字符串,而是为了与系统的枚举量区别开来而已):

TOK_QUERY
	TOK_FROM(child)
		TOK_TABREF(child)
			TOK_TABLENAME(child)
				"test"
	TOK_INSERT
		TOK_DESTINATION
			TOK_DIR(child)
				TOK_TMP_FILE(child)
		TOK_SELECT(child)
			TOK_SELEXPR
				TOK_ALLCOLREF(child)
		TOK_WHERE
			TOK_SUBQUERY_EXPR
				TOK_SUBQUERY_OP(child)
					KW_IN(child)
				TOK_QUERY
					TOK_FROM
						TOK_TABREF(child)
							TOK_TABNAME(child)
								"test"(child)
					TOK_INSERT(child)
						TOK_DESTINATION
							TOK_DIR(child)
								TOK_TMP_FILE(child)
						TOK_SELECT(child)
							TOK_SELEXPR
								TOK_ALLCOLREF(child)
				TOK_TABLE_OR_COL
					"id"

并不是所有的节点的childrenIndex都会正确地指向某一个子节点。有时候会出现childrenIndex超出children的情况。
一头雾水。不过好在我的队友曾经查到过相关的资料,给我指出了重要的一点:TOK_INSERT其实是查询主体。那么处于第二层的TOK_FROM应当是hql中的最外层from,一看hql结构,也能合理地解释它为何很快就能在叶节点中找到test
这样,我们可以放心地去着重分析TOK_INSERT部分

TOK_INSERT

以下都是在讨论TOK_INSERT为根的子树了

TOK_INSERT
		TOK_DESTINATION
			TOK_DIR(child)
				TOK_TMP_FILE(child)
		TOK_SELECT(child)
			TOK_SELEXPR
				TOK_ALLCOLREF(child)
		TOK_WHERE
			TOK_SUBQUERY_EXPR
				TOK_SUBQUERY_OP(child)
					KW_IN(child)
				TOK_QUERY
					TOK_FROM
						TOK_TABREF(child)
							TOK_TABNAME(child)
								"test"(child)
					TOK_INSERT(child)
						TOK_DESTINATION
							TOK_DIR(child)
								TOK_TMP_FILE(child)
						TOK_SELECT(child)
							TOK_SELEXPR
								TOK_ALLCOLREF(child)
				TOK_TABLE_OR_COL
					"id"

经队友指点,TOK_DESTINATION是查询暂存相关的内容,TOK_SELECT当然也不会有什么内容了,TOK_ALLCOLREF的英文所指和贴合hql语句嘛。
TOK_WHERE下有明显TOK_SUBQUERY_EXPR,应该是对应我的子查询的。
TOK_SUBQUERY_OP指明了这个子查询的操作,KW_IN这样的格式在之前其实见到过哦。最后的TOK_TABLE_OR_COL和其中的叶子节点"id"充分表达了where的内容。
而同层的TOK_QUERY则是一个子查询了,结构和外层很相似,你仍然可以见到"test"的出现。

总览

这即是树的结构了,最让我意想不到的是主体查询被加在TOK_INSERT里这件事。
这个树除了之前提到的属性之外,还有parent属性。这个树的结构是存在上下翻飞,来回读取的可能的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值