Ответ: зависит .
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]