Druid的SQL解析针对Limit部分的语法树输出有潜在问题。如下示例:
@Test
public void test_limit2() {
String sql = "select id, name from print_template_main order by name asc limit ? offset ?";
SQLStatement sqlStatement = SQLUtils.parseSingleStatement(sql, JdbcConstants.MYSQL, SkipComments);
Assert.assertEquals("SELECT id, name\n" +
"FROM print_template_main\n" +
"ORDER BY name ASC\n" +
"LIMIT ?, ?", sqlStatement.toString());
}
如果用户的limit部分的写法是: limit ? offset ?
,这部分被druid解析为语法树然后重新生成SQL会变成: LIMIT ?, ?
。
如果用户上层使用JDBC中的 PreparedStatement
中的
void setString(int parameterIndex, String x) throws SQLException;
API进行参数设置时,会导致参数的顺序反过来了。
6条答案
按热度按时间ki1q1bka1#
什么数据库?
t9eec4r02#
什么数据库?
mysql数据库。我已经在方法SQLUtils.parseSingleStatement(sql, JdbcConstants.MYSQL, SkipComments);中指定了API
xyhw6mcr3#
我也遇到该问题。limit ? offset ?,这部分被druid解析为语法树然后重新生成SQL会变成:LIMIT ?, ? 数据库类型mysql
jei2mxaa4#
@xkrivzooh 是否已经解决该问题?
ocebsuys5#
看上去是解析sql然后进行修改,然后再执行setString的场景?这种场景确实要考虑下保持参数顺序不变,我研究看下
wqnecbli6#
话说这个问题修复了吗,或者有没其它参数控制忽略LIMIT OFFSET的转换