开发者社区> 问答> 正文

druid sqlparser卡住

对于sql:

select job_names.job_name from cover_rage_job_org as org RIGHT JOIN ( select job_names.job_name as job_name from ( SELECT '1' as job_name ) job_name_all) as job_names on job_names.job_name = org.job_name

,sqlparser会卡住

List sqlStatements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); for (SQLStatement sqlStatement : sqlStatements) { MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); sqlStatement.accept(visitor); }

在com.alibaba.druid.sql.visitor.SchemaStatVisitor unwrapExpr 这个表达式上会卡住, 建议在825行附近增加逻辑:

if (selectItem != null) { SQLExpr expr1 = selectItem.getExpr(); if (expr1.equals(expr)) { break; } expr = expr1; continue; }

使用的是1.1.12的druid版本

原提问者GitHub用户yanshuai

展开
收起
山海行 2023-07-05 19:45:29 74 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    供的SQL语句包含了RIGHT JOIN,sqlparser分析这个SQL时可能会出现性能问题。

    可以尝试以下解决方法:

    升级Druid版本。不同版本的Druid对SQL的解析性能有所不同,你可以尝试使用最新的Druid版本。

    简化SQL语句。尽量避免使用RIGHT JOIN,使用普通的INNER JOIN或LEFT JOIN会更高效。

    限制解析范围。你可以在SchemaStatVisitor中限制转化AST节点的深度,以避免解析关键字密集的语句。

    避免在循环内解析SQL。像你的示例代码那样,在循环内解析每一个SQL会影响性能。

    自行编写SQL解析器。如果Druid解析器无法满足性能要求,你也可以考虑自行编写基于规则的SQL解析器。

    2023-07-30 15:42:48
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:04:42
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载