方解石SQL解析器-SELECT语句的根节点类型并不总是SqlSelect

时间:2019-09-02 21:19:50

标签: apache-calcite

我有一个简单的应用程序,它对SELECT语句的WHERE子句中的文字进行文本替换。我运行SqlParser.parseQuery()并将.getWhere()应用于结果。

但是,对于以下查询,根节点不是SqlSelect,而是SqlOrderBy:

select EventID, Subject
from WorkOrder
where OwnerID = 100 and Active = 1 and Type = 2
order by Subject

如果我们使用“分组依据”而不是“排序依据”,则根目录是预期的SqlSelect。

这是预期的行为吗?

1 个答案:

答案 0 :(得分:0)

是的,这是有意的。 ORDER BY并不是SELECT的子句。考虑

SELECT deptno FROM Emp
UNION
SELECT deptno FROM Dept
ORDER BY 1

ORDER BY子句适用于整个UNION,而不适用于第二个SELECT。因此,我们使其成为一个独立的节点。

当您要求方解石解析查询时,返回的顶级节点可以是SqlSelectSELECT),SqlOrderByORDER BY),{{1 }}(SqlBasicCallUNIONINTERSECTEXCEPT)或VALUESSqlWith)。