Как отличить использование ключевого слова AS при разборе запроса - PullRequest
1 голос
/ 15 мая 2019

При анализе запроса, и я получаю ключевое слово "AS", как определить, является ли это псевдонимом для таблицы или псевдонимом для столбца?

    @Override public void visitTerminal(TerminalNode node) {
        switch (node.getText().toUpperCase()) {
        case "AS":
            processTerminalNodeAs(node);
            break;
        }
   }

Например:

SELECT LoyaltyNumber AS LN FROM Transaction AS T;

Парсер найдет ключевое слово AS дважды.Первое вхождение это псевдоним для столбца, второе вхождение это псевдоним для таблицы.

1 Ответ

1 голос
/ 16 мая 2019

Не используйте visitTerminal метод посетителя для токенов, для которых вам нужен контекст. Вместо этого используйте методы для посещения содержащих правил. Это зависит от вашей грамматики (на которую вы здесь не ссылались), так что я могу только догадываться. Но у вас, вероятно, есть что-то вроде: SELECT selectItem* fromClause whereClause? .... Правило selectItem может содержать что-то вроде:

selectItem: expr alias?;

с

alias: AS_SYMBOL? identifier;

Теперь вы можете использовать метод посетителя visitSelectItem, чтобы определить, существует ли псевдоним столбца / подзапроса, изучив переданный в контексте (примерно: context.alias().AS_SYMBOL).

Это всего лишь один пример того, как можно использовать ключевое слово AS, но принцип тот же для всех других вхождений. Посетите содержащее правило (может быть не непосредственно содержащее правило (здесь, например, alias), но более высокое правило, которое дает вам достаточно контекста, чтобы определить, какую AS вы смотрите.

...