开发者社区> 问答> 正文

SQLUtils无法解析 postgresql的 jsonb操作: select '[1,2,3]'

环境 jdk 8 PostgreSQL 10.1 postgresql(驱动) 9.4.1212.jre7

SQL select '[1,2,3]'::jsonb ?| array['1']

在psql中可以正常运行,结果

test=# select '[1,2,3]'::jsonb ?| array['1']; ?column?

f (1 row)

测试代码

    String sql = "select '[1,2,3]'::jsonb ?| array['1']";
    String dbType = JdbcConstants.POSTGRESQL;
    String result = SQLUtils.format(sql, dbType);

异常内容 16:26:50.813 [main] WARN com.alibaba.druid.sql.SQLUtils - format error com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'3]'::jsonb ?| array['1']',expect QUES, actual QUES jsonb at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:230) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:324) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:120) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:115) at com.alibaba.druid.sql.SQLUtils.toStatementList(SQLUtils.java:216) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:229) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:224) at org.beiyu.study.parser_test.DruidParserTest.main(DruidParserTest.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) select '[1,2,3]'::jsonb ?| array['1']

请确认下是否为bug,谢谢!

原提问者GitHub用户beiyu

展开
收起
山海行 2023-07-05 20:33:16 61 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    ruid的SQLUtils中提供了对于PostgreSQL的支持,但是在解析JSONB操作时似乎出现了问题。具体来说,您的SQL语句select '[1,2,3]'::jsonb ?| array['1']可以在psql中正常执行,但是在使用Druid的SQLUtils解析时却出现了语法错误。

    这个问题可能是由于Druid的SQLUtils对于PostgreSQL的JSONB操作支持不完善,导致解析出现问题。为了解决这个问题,您可以尝试以下几个方法:

    使用更高版本的Druid:Druid是一个开源的Java数据库连接池和SQL解析库,如果您使用的是较老的Druid版本,可能存在一些已知的问题。您可以尝试升级到最新版本的Druid,以获得更好的兼容性和稳定性。

    自定义解析器:如果您遇到了Druid无法解析的SQL语句,您可以尝试自定义解析器,以便Druid可以正确解析该语句。具体来说,您可以通过扩展Druid的SQLParser和SQLSelectParser类来实现自定义解析器。您可以在自定义解析器中添加对于PostgreSQL的JSONB操作的支持,以便Druid可以正确解析该语句。

    使用其他的SQL解析库:如果Druid无法解析您的SQL语句,您可以尝试使用其他的SQL解析库。例如,ANTLR是一个流行的开源的语法解析器生成器,可以用于解析SQL语句。您可以尝试使用ANTLR来解析PostgreSQL的JSONB操作,以替代Druid。

    2023-07-30 14:06:59
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:52:36
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像