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

Calcite SQL parser -- SELECT statement root node type not always SqlSelect

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

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

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

如果我们使用 "group by" 而不是 "order by",那么根就是预期的 SqlSelect。

这是预期的行为吗?

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

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

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

当你要求 Calcite 解析查询时,返回的顶级节点可以是 SqlSelect (SELECT), SqlOrderBy (ORDER BY), SqlBasicCall (UNION, INTERSECT, EXCEPTVALUES) 或 SqlWith (WITH).