JSQLParser可以在SELECT查询中区分View / Function / Table吗?
例如,如果以下列方式执行功能: select * from public.new(10); select public.new(10);
JSQL是否有可能发现它正在执行一个函数并返回该信息?
答案 0 :(得分:0)
答案是:取决于。
JSqlParser只是一个解析器,没有关于数据库架构的信息。在一些数据库中,允许在没有括号的情况下调用无参数函数,例如, select NOW
(希望这确实是一个功能;))。在这种情况下, NOW 将被接受为列名。
但JSqlParser支持参数化功能,例如select testfunc(param1)
。在这种情况下,它将被接受为功能。
从语法上讲,视图和表格的用法是相同的, 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]