Тип корневого узла инструкции SELECT синтаксического анализатора SQL Calcite не всегда SqlSelect

У меня есть простое приложение, которое выполняет подстановку текста в литералах в предложении WHERE оператора SELECT. Я запускаю SqlParser.parseQuery() и применяю .getWhere() к результату.

Однако для следующего запроса корневым узлом является не SqlSelect, а SqlOrderBy:

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

Если мы используем «группировать по» вместо «упорядочить по», то корнем является SqlSelect, как и ожидалось.

Это предполагаемое поведение?


person Guy Middleton    schedule 02.09.2019    source источник


Ответы (1)


Да, это предназначено. 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).

person Julian Hyde    schedule 04.09.2019