JSQL Parser - информация о функциях синтаксического анализа - PullRequest
0 голосов
/ 26 апреля 2018

Может ли JSQLParser различать представление / функцию / таблицу в запросе SELECT?

Если, например, выполнить функцию следующими способами: выберите * из public.new (10); выберите public.new (10);

Возможно ли для JSQL выяснить, что он выполняет функцию, и вернуть эту информацию?

1 Ответ

0 голосов
/ 27 апреля 2018

Ответ: зависит .

JSqlParser является только синтаксическим анализатором и не имеет информации о схеме базы данных. В некоторых базах данных функции без параметров могут вызываться без скобок, например, select NOW (надеюсь, что это действительно функция;)). В этом случае СЕЙЧАС будет принято в качестве имени столбца.

Но JSqlParser поддерживает параметризованные функции, например select testfunc(param1). В этом случае она будет принята как функция .

Синтаксически использование view и table идентично и JSqlParser не может различаться между ними. Имя представления будет принято в качестве имени таблицы.

Чтобы получить дифференциацию:

  1. сначала вы позволите JSqlParser проанализировать ваше заявление
  2. извлечение всех имен столбцов, имен таблиц, имен функций (хорошее начало здесь - утилита TableNameFinder JSqlParser )
  3. получите окончательный тип, который вам нужен, чтобы проверить его по схеме базы данных

Итак, вот небольшой пример для пунктов 1 и 2:

Statement statement = CCJSqlParserUtil.parse("select myfunc(5), now from public.new(10), mytable");

TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
    @Override
    public void visit(Column tableColumn) {
        System.out.println("column = " + tableColumn);
    }

    @Override
    public void visit(Function function) {
        System.out.println("function = " + function.getName());
        super.visit(function); 
    }

    @Override
    public void visit(Table tableName) {
        System.out.println("table = " + tableName.getFullyQualifiedName());
        super.visit(tableName); 
    }

    @Override
    public void visit(TableFunction valuesList) {
        System.out.println("table function = " + valuesList.getFunction().getName());
        super.visit(valuesList); 
    }
};

System.out.println("all extracted tables=" + tablesNamesFinder.getTableList(statement));

и результат:

function = myfunc
column = now
table function = public.new
table = mytable
all extracted tables=[mytable]
...