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 не может различаться между ними. Имя представления будет принято как имя таблицы.
Чтобы получить дифференциацию:
- сначала вы позволите JSqlParser проанализировать ваше заявление
- извлечь все имена столбцов, имена таблиц, имена функций (хорошее начало здесь - утилита TableNameFinder из JSqlParser)
- получить окончательный тип, который вам нужен, чтобы проверить его со своей схемой базы данных
Итак, вот небольшой пример для пунктов 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]