JSQL Parser - 关于解析函数的信息

JSQL Parser - Info on parsing functions

JSQLParser 可以区分 SELECT 查询中的 View/Function/Table 吗?

例如,如果通过以下方式执行函数: select * 来自 public.new(10); select public.new(10);

JSQL 是否有可能弄清楚它正在执行一个函数并return那个信息?

答案是:视情况而定

JSqlParser 只是一个解析器,没有关于数据库架构的信息。在一些数据库中,无参数函数被允许在没有括号的情况下被调用,例如select NOW(希望这确实是一个函数;))。在这种情况下,NOW 将被接受为列名。

但是JSqlParser支持参数化函数,例如select testfunc(param1)。在这种情况下,它将被接受为 function.

在语法上 viewtable 的用法是相同的,并且 JSqlParser不能区分那些。视图名称将被接受为 table 名称。

获得差异化:

  1. 首先你会让 JSqlParser 解析你的语句
  2. 提取所有列名、table 名称、函数名(这里的一个好的开始是 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]