开发者社区> 问答> 正文

ParameterizedOutputVisitorUtils.parameterize未能全参数化

druid 最新版本,测试代码如下:

@test public void testMergeSql() { String sql = "select\n" + " ifnull(sum(case when test_time >= '2019-04-01 11:22:33' and test_time < '2019-04-30 12:33:44' then 1 ELSE 0 end),0) today_count,\n" + " ifnull(sum(case when test_time >= '2019-04-01 11:22:33' and test_time < '2019-04-30 12:33:44' then 1 ELSE 0 end),0) month_count,\n" + " ifnull(sum(case when invest_time is not null then test_col1 ELSE 0 end),0) total_amt\n" + " \n" + " from notify_aaa\n" + " where abc='123' "; System.out.println(sql); String mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, "mysql", null, null); System.out.println(mergedSql); }

执行结果为:

SELECT ifnull(SUM(CASE WHEN test_time >= '2019-04-01 11:22:33' AND test_time < '2019-04-30 12:33:44' THEN 1 ELSE 0 END), ?) AS today_count , ifnull(SUM(CASE WHEN test_time >= '2019-04-01 11:22:33' AND test_time < '2019-04-30 12:33:44' THEN 1 ELSE 0 END), ?) AS month_count , ifnull(SUM(CASE WHEN invest_time IS NOT NULL THEN test_col1 ELSE 0 END), ?) AS total_amt FROM notify_aaa WHERE abc = ?

可以看到test_time字段后面的具体日期没有参数化成问号。

断点分析代码发现,在进入SQLASTOutputVisitor的public boolean visit(SQLAggregateExpr x)方法,this.parameterized = false; 导致不会参数化了。

T39.png

原提问者GitHub用户lizongbo

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

    若ParameterizedOutputVisitorUtils.parameterize()无法全量参数化SQL语句中的字面值,有以下几种原因:

    SQL语句中存在特殊字符未被正确转义。比如单引号会终止字符串,会导致后面的内容无法被正确解析。

    存在复合字面值,比如数字链接成字符串。仅仅加上?符号是无法被正确解析的。

    SQL存在较为复杂的嵌套结构,ParameterizeOutputVisitor无法识别。

    SQL包含数据库特定的函数或关键字,ParameterizeOutputVisitor无法支持。

    针对不同的场景,可以尝试以下过程:

    简单的查询语句如select能否被完全参数化?

    将特殊字符如单引号使用转义字符'转义,重新参数化。

    将复合字面值置于括号内作为一个整体提供给ParameterizeOutputVisitor。

    将部分SQL使用临时变量,简化结构。

    尝试升级ParameterizeOutputVisitorUtils版本。

    自行实现基于正则的SQL参数化。

    2023-07-30 15:48:50
    赞同 展开评论 打赏
  • 验证了1.2.18的版本是正常参数化了的。

    原回答者GitHub用户lizongbo

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

相关电子书

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