JSQL Parser - информация о функциях синтаксического анализа

Может ли JSQLParser различать View/Function/Table в запросе SELECT?

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

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

1 ответ

Решение

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

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]
Другие вопросы по тегам