DLuPan / DorisParser

DorisDB SQL解析器Java实现;Clickhouse SQL解析器Java实现
Apache License 2.0
88 stars 29 forks source link

clickhouse的select解析不了吗? #5

Open timeisgoing opened 2 years ago

timeisgoing commented 2 years ago

@Test public void selctTableModifyColumnTest() { String sql = "SELECT a ,app,b from record.filter_record_all where a>1 ;"; ClickHouseLexer lexer = new ClickHouseLexer(CharStreams.fromString(sql)); CommonTokenStream commonTokenStream = new CommonTokenStream(lexer); ClickHouseParser parser = new ClickHouseParser(commonTokenStream); parser.addErrorListener(ClickHouseErrorListener.INSTANCE); ClickHouseParser.QueryStmtContext queryStmtContext = parser.queryStmt(); QueryStmtVisitor visitor = new QueryStmtVisitor().init(); queryStmtContext.accept(visitor); System.out.println(visitor.getParserVo()); }

output: columnDefList=[], tableName=filter_record_all, newTableName=null, tableChinese=null, tableDesc=null, dbName=record

没有select后面的字段,where后面的也没有? 辛苦了~~

DLuPan commented 2 years ago

image ast生成树没有问题,但是QueryStmtVisitor这个没有select部分的映射,所以输出为空,如果要的话需要加上select部分的解析逻辑。因为ck这个当时只完成DDL的部分映射,DML没有写,你可以加上,添加对应的方法重写就可以了 ` @Override public MetaDdlSqlParserVo visitColumnExprList(ClickHouseParser.ColumnExprListContext ctx) { return super.visitColumnExprList(ctx); }

@Override public MetaDdlSqlParserVo visitColumnsExprColumn(ClickHouseParser.ColumnsExprColumnContext ctx) { return super.visitColumnsExprColumn(ctx); }

@Override public MetaDdlSqlParserVo visitColumnExprIdentifier(ClickHouseParser.ColumnExprIdentifierContext ctx) { return super.visitColumnExprIdentifier(ctx); }

@Override public MetaDdlSqlParserVo visitWhereClause(ClickHouseParser.WhereClauseContext ctx) { return super.visitWhereClause(ctx); }

@Override public MetaDdlSqlParserVo visitColumnExprPrecedence3(ClickHouseParser.ColumnExprPrecedence3Context ctx) { return super.visitColumnExprPrecedence3(ctx); } `

zbhuang2008 commented 2 years ago

想试着重写这几个函数,不过有点下不了手的感觉。 你这里 columnExprList 和 columnDefList 是一个意思吧? 我觉得这里需要重写的函数好像还少 visitIdentifier(ClickHouseParser.IdentifierContext ctx),是吧?