alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.97k stars 8.58k forks source link

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

Open xkrivzooh opened 4 years ago

xkrivzooh commented 4 years ago

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

wenshao commented 4 years ago

什么数据库?

xkrivzooh commented 4 years ago

什么数据库?

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

funaiy commented 3 years ago

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

funaiy commented 3 years ago

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

lizongbo commented 11 months ago

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

KolorYan commented 8 months ago

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