方解石 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
, EXCEPT
或 VALUES
) 或 SqlWith
(WITH
).
我有一个简单的应用程序,它对 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
, EXCEPT
或 VALUES
) 或 SqlWith
(WITH
).