开发者社区> 问答> 正文

find a bug of druid when parse 'not' key word in w

public static void main(String[] args){ String sql = "select * from company where id=1 and not (name='e') and addr='a'"; SQLStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseStatement(); System.out.println(statement.toString()); } the result as follows: SELECT * FROM company WHERE id = 1 AND NOT (name = 'e' AND addr = 'a')

原提问者GitHub用户digdeep126

展开
收起
山海行 2023-07-05 22:03:46 51 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    这段Java代码使用了阿里巴巴的SQL解析器(druid-parser)来解析SQL语句,并将解析结果输出到控制台。

    具体来说,该代码首先定义了一个SQL语句字符串sql,其中包含了一个带有多个条件的SELECT查询语句。然后,使用MySqlStatementParser类来解析SQL语句,该类是针对MySQL语法的解析器。解析器会将SQL语句解析成一个SQLStatement对象,该对象表示了SQL语句的语法结构。最后,使用toString()方法将解析结果转换为字符串,并输出到控制台。

    在这个例子中,SQL解析器将SQL语句解析成了一个带有多个条件的SELECT查询语句,其中包含了一个NOT运算符。具体地,查询条件包括:

    id=1
    name不等于'e'
    addr等于'a'
    由于NOT运算符优先级较高,因此name和addr之间的关系被括号括起来,表示先计算括号内的条件,再对其取反。最终的查询结果是包含这三个条件的SELECT语句。

    2023-07-29 23:09:26
    赞同 展开评论 打赏
  • 测试druid 1.0.9版本没有问题

    原回答者GitHub用户wuyongwen

    2023-07-06 12:58:40
    赞同 展开评论 打赏
  • 根据您提供的信息,这个 Bug 在解析 SQL 语句时存在问题,无法正确处理 "NOT" 关键字的优先级,导致解析结果错误。

    在 SQL 解析过程中,需要正确处理运算符优先级和逻辑运算顺序。针对您提供的例子,正确的解析结果应该是 "ID=1 AND (NOT name='e') AND addr='a'",而不是 "ID=1 AND NOT (name='e' AND addr='a') "。

    通常情况下,这种 Bug 可以通过修改相应的代码来解决。例如,可以使用优先级表达式树,或通过重载运算符优先级等方式,来保证 SQL 解析的正确性和可靠性。

    2023-07-06 08:51:49
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

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