druid SQL解析真对Limit语句的toString存在问题

yv5phkfx  于 4个月前  发布在  Druid
关注(0)|答案(6)|浏览(57)

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进行参数设置时,会导致参数的顺序反过来了。

t9eec4r0

t9eec4r02#

什么数据库?

mysql数据库。我已经在方法SQLUtils.parseSingleStatement(sql, JdbcConstants.MYSQL, SkipComments);中指定了API

xyhw6mcr

xyhw6mcr3#

我也遇到该问题。limit ? offset ?,这部分被druid解析为语法树然后重新生成SQL会变成:LIMIT ?, ? 数据库类型mysql

jei2mxaa

jei2mxaa4#

@xkrivzooh 是否已经解决该问题?

ocebsuys

ocebsuys5#

看上去是解析sql然后进行修改,然后再执行setString的场景?这种场景确实要考虑下保持参数顺序不变,我研究看下

wqnecbli

wqnecbli6#

话说这个问题修复了吗,或者有没其它参数控制忽略LIMIT OFFSET的转换

相关问题