druid 版本 1.2.9 原本SQL:select * from mc_job a inner join (mc_role b inner join mc_source c on b.id = c.id) as tem2 on tem2.user_id = a.id ; //能正确执行.SQLUtils.format(sql, DbType.postgresql)格式化后的sql: SELECT * FROM mc_job a INNER JOIN ((mc_role b INNER JOIN mc_source c ON b.id = c.id) AS tem2) ON tem2.user_id = a.id; //不能执行 格式化时在inner join 的右边加()时把别名也包进去了. 如果我将原本的sql改为:select * from mc_job a inner join (select * from mc_role b inner join mc_source c on b.id = c.id) as tem2 on tem2.user_id = a.id ; 格式化后为: SELECT * FROM mc_job a INNER JOIN ( SELECT * FROM mc_role b INNER JOIN mc_source c ON b.id = c.id ) tem2 ON tem2.user_id = a.id; 这样格式化后是没有问题的.我能提供的信息就这些了,大佬看下哪的问题吧.
今天发现mysql也有一样的问题,类似于select * from t1 inner join (t2 inner join t3) as tt2 on t1.id = tt2.id ...这样的sql也会format成错误的sql语句,错误的现象和我提出的pgsql的一样.不知道大佬你的这次fix能不能覆盖到mysql.
原提问者GitHub用户capitalR
在您提供的例子中,原始 SQL 语句中使用了子查询,而在使用 SQLUtils.format 方法进行格式化时,Druid SQL 工具库按照标准 SQL 的语法规则将子查询转换为一个表,这个表可以拥有别名。在这种情况下,如果您想要保留子查询的原始语法结构,您可以将原始 SQL 语句中的子查询括号部分保留,并在进行格式化时指定保留子查询的选项。
即在使用 SQLUtils.format 方法将 SQL 语句格式化时,如果在 INNER JOIN 的右侧使用了括号,并在括号内使用了别名,那么格式化后的 SQL 语句会出现错误。
这个问题可能是由于 SQLUtils.format 方法在处理这种情况时存在一些逻辑上的限制,导致别名被错误地包含在括号内。
很抱歉你遇到了这个问题。根据你的描述,我了解到在使用Druid版本1.2.9时,SQLUtils.format方法在格式化SQL语句时可能会出现问题。原始的SQL语句包含内连接以及别名,并且在格式化后,生成的SQL语句中将别名也包含在内。
你提供的信息是有限的,但是我可以尝试给出一些解决方案。对于你的第一个例子,如果你将原始的SQL语句修改为在内连接的括号里加入"SELECT * FROM ...",然后在别名之后添加空格,即类似于:
select * from mc_job a inner join (select * from mc_role b inner join mc_source c on b.id = c.id) as tem2 on tem2.user_id = a.id;
那么执行SQLUtils.format(sql, DbType.postgresql)
方法后,生成的格式化SQL语句应该是正确的:
SELECT * FROM mc_job a INNER JOIN (
SELECT * FROM mc_role b INNER JOIN mc_source c ON b.id = c.id
) tem2 ON tem2.user_id = a.id;
至于你提到的MySQL上的类似问题,由于我是基于OpenAI的ChatGPT模型,我无法进行具体的实验来验证修复是否适用于MySQL。然而,如果Druid的修复是一个通用的修复,那么它应该可以解决类似的问题,不论数据库类型是什么。
最好的解决方案是尝试更新Druid到最新版本,看看是否修复了这个问题。如果问题仍然存在,请向Druid社区或开发团队报告该问题,以便他们能够提供更具体的帮助和支持。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。