JSQL Parser - 解析函数的信息

时间:2018-04-26 09:33:16

标签: postgresql jsqlparser

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

例如,如果以下列方式执行功能: select * from public.new(10); select public.new(10);

JSQL是否有可能发现它正在执行一个函数并返回该信息?

1 个答案:

答案 0 :(得分:0)

答案是:取决于

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

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

从语法上讲,视图表格的用法是相同的, JSqlParser 在这些之间无法区分。视图名称将被接受为表名。

要获得差异化:

  1. 首先你要让 JSqlParser 解析你的陈述
  2. 提取所有列名,表名,函数名(这里有一个好的开头是 JSMLParser TableNameFinder 实用程序)
  3. 获取您需要使用数据库架构检查的最终类型
  4. 所以这是第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]