JSqlParser4.3版本无法解析mysql中JSON_OBJECT函数抛出ParseException异常

news/2024/11/18 8:29:08/

2022年3月31日,找了一下午的bug
bug 已经提交issues,详情请看GitHub,地址:https://github.com/JSQLParser/JSqlParser/issues/1504
使用JSqlparser4.3版作者提供的补丁版后解决,下载地址:https://download.csdn.net/download/qq_19749625/85099964

2022年4月9号 新增bug: JSqlParser4.3补丁版本无法解析mysql中JSON_OBJECT函数存在其它函数问题
以上问题使用JSqlparser4.4版作者提供的应急版后解决,下载地址:https://download.csdn.net/download/qq_19749625/85099990

作者提供的在线sql解析网站(访问非常慢):jsqlformatter

2022年3月31日,找了一下午的bug
异常sql:
如下方代码中所展示的那样,JSON_OBJECT函数会报ParseException异常。

// this is true
SELECT JSON_OBJECT(key person value account,key personName value account_name) obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is true
SELECT JSON_OBJECT(person:account,personName:account) obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is bad
SELECT JSON_OBJECT(person:trr.account,personName:tp.account) obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is bad
SELECT JSON_OBJECT(person:'1',personName:'1') obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account
// this is bad
SELECT JSON_OBJECT(key person value '1',key personName value '1') obj FROM tb_review_result trr LEFT JOIN tb_person tp ON trr.account = tp.account

异常:

at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39)at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:52)at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:72)at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:169)at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:178)at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:121)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)... 157 more
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "SELECT" <K_SELECT>at line 18, column 10.Was expecting one of:"!""(""NOT"at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:32047)at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:31880)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9818)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9811)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:9709)at net.sf.jsqlparser.parser.CCJSqlParser.SelectExpressionItem(CCJSqlParser.java:6338)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItem(CCJSqlParser.java:6490)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItemsList(CCJSqlParser.java:6328)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5663)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:5534)at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:223)at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:144)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:188)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:63)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:38)

2022年4月9号新增bug: JSqlParser4.3补丁版本无法解析mysql中JSON_OBJECT函数存在其它函数问题
以上问题使用JSqlparser4.4版作者提供的应急版后解决,下载地址:https://download.csdn.net/download/qq_19749625/85099990
异常sql如下:

SELECT JSON_ARRAYAGG(obj) FROM (SELECT trt.relevance_id,JSON_OBJECT('id',CAST(trt.id AS CHAR),'taskName',trt.task_name,'openStatus',trt.open_status,'taskSort',trt.task_sort) as obj FROM tb_review_task trt ORDER BY trt.task_sort ASC)

异常如下

Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Failed to process, Error SQL: select count(0) from ( 
SELECT*FROM(SELECTtct.id as relevance_id,tct.declare_id,'0' as review_type,tct.contests_name,tct.contests_level,tct.contests_type,tct.principals,tp.person_name,tct.deleted,(SELECT JSON_ARRAYAGG(obj) FROM (SELECT trt.relevance_id,JSON_OBJECT('id',CAST(trt.id AS CHAR),'taskName',trt.task_name,'openStatus',trt.open_status,'taskSort',trt.task_sort) as obj  FROM tb_review_task trt ORDER BY trt.task_sort ASC)tmp  WHERE tmp.relevance_id = tct.id)  as task_sort_list,IFNULL((SELECT COUNT(id) FROM tb_contests_apply tcp WHERE tcp.handle_id = tct.id AND tcp.contests_state = 1 AND tcp.deleted = 0),0) as total,
--         (SELECT COUNT(id) FROM tb_review_task trt WHERE trt.relevance_id = tct.id AND trt.review_type = 0 AND trt.task_sort = 1 AND trt.deleted = 0) as calculatedIFNULL((SELECT COUNT(id) FROM tb_review_total_score WHERE relevance_id = tct.id AND deleted = 0 GROUP BY apply_id),0) as calculatedFROM tb_contests_transact tctLEFT JOIN tb_person tp ON tp.account = tct.principals) tmpWHERE (deleted = ?)) tmp_countat com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39)at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:52)at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:72)at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:169)at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:178)at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:121)at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)at com.sun.proxy.$Proxy166.query(Unknown Source)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)... 157 more
Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "SELECT" <K_SELECT>at line 18, column 10.Was expecting one of:"!""(""NOT"at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:32047)at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:31880)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9818)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:9811)at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:9757)at net.sf.jsqlparser.parser.CCJSqlParser.XorExpression(CCJSqlParser.java:9738)at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:9709)at net.sf.jsqlparser.parser.CCJSqlParser.SelectExpressionItem(CCJSqlParser.java:6338)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItem(CCJSqlParser.java:6490)at net.sf.jsqlparser.parser.CCJSqlParser.SelectItemsList(CCJSqlParser.java:6328)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5663)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:14458)at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:8013)at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:5676)at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:5892)at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:5540)at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:5534)at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:223)at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:144)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:188)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:63)at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:38)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Supported Standard Compliant Syntax is shown here.// this was the correct syntax
SELECT JSON_OBJECT(key 'account' value account_col) as obj FROM tb_team;// this was also the correct syntax
SELECT JSON_OBJECT(key account :  account_col) as obj FROM tb_team;// this was also the correct syntax
SELECT JSON_OBJECT( account : account_col) as obj FROM tb_team;// this is success sql
SELECT JSON_OBJECT('account','some string') as obj FROM tb_team;
You can test it here online

老外给的答案,经过测试,可信、可行、可用,但是数据库连接工具会报错

记录一次bug
在mybatis-plus中使用拦截器时,一般都会使用到jsqlParser解析器,但是这个解析器还无法识别JSON_OBJECT函数中存在表字段问题,虽然4.3版本中已经增加了对JSON_OBJECT函数的关键词支持,并没有对JSON_OBJECT中使用表字段增加支持

为了让老外看到懂,我还用辣鸡英语写了一份英文版的,在GitHub上提iss…了
Mysql version: 8.0

JSQLParser verison: 4.3

sql example:

// this is bad sql
SELECT JSON_OBJECT('account',account) as obj FROM tb_team;// this is success sql
SELECT JSON_OBJECT('account','some string') as obj FROM tb_team;

bad sql exception:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q8eifku1-1649207235975)(/Users/mt-mac/Library/Application Support/typora-user-images/image-20220406085901301.png)]

DDL

CREATE TABLE `tb_team` (`id` bigint(20) NOT NULL COMMENT '雪花id',`process_instance_id` varchar(64) DEFAULT NULL COMMENT '流程id',`relevance_id` bigint(20) DEFAULT NULL COMMENT '发布id',`apply_id` bigint(20) DEFAULT NULL COMMENT '报名id',`account` varchar(32) DEFAULT NULL COMMENT '学工号',`originator` varchar(32) DEFAULT NULL COMMENT '发起人',`team_type` tinyint(4) DEFAULT NULL COMMENT '类型',`member_type` tinyint(4) DEFAULT NULL COMMENT '成员类型',`join_type` tinyint(4) DEFAULT NULL COMMENT '加入类型',`open_status` tinyint(4) DEFAULT NULL COMMENT '成员状态',`creator` varchar(64) DEFAULT NULL COMMENT '创建者',`updater` varchar(64) DEFAULT NULL COMMENT '修改者',`update_time` datetime DEFAULT NULL COMMENT '修改时间',`deleted` bit(1) DEFAULT b'0' COMMENT '删除标志',`tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='队伍成员表';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuGKXNXI-1649207235976)(/Users/mt-mac/Library/Application Support/typora-user-images/image-20220406090151758.png)]

An exception will occur if the ‘account’ column comes from the tb_team table


http://www.ppmy.cn/news/258168.html

相关文章

BUUCTF初学解题记录——Basic篇

目录 Linux LabBUU LFI COURSE 1Upload-Labs-LinuxBUU CODE REVIEW 1BUU BRUTE 1sqli-labsLess-1 未完待续。。。 Linux Lab # 地址和端口为示例&#xff0c;需要更改为动态分配后的地址和端口 ssh rootnode233.buuoj.cn -p 233 # 输入默认密码123456 cat /flag.txt # 输出fla…

centos7安装docker ctfd以及CTFd-Whale (包括配置中的问题以及解决方案)2020.10.18更新

centos7安装docker ctfd以及CTFd-Whale &#xff08;包括配置中的问题以及解决方案&#xff09;2020.10.18更新 centos7下安装docker并且配置ctfd以及CTFd-Whale1.centos7安装Docker 和 Docker-Compose&#xff0c;并且启用 Docker Swarm1.1Docker 要求 CentOS 系统的内核版本高…

控制配置文件是否生效之@ConditionalOnProperty

文章目录 前言ConditionalOnProperty使用方法ConditionalOnProperty源码属性含义 使用逻辑demo属性值不是boolean类型属性值为boolean类型 前言 避免重复造轮子&#xff0c;就要自己动手写一下公共组件&#xff0c;或者公共类对外提供插件功能。有时候会有用不到的的一些配置类…

EasyExcel 如何导出大量数据 和 并发测试大量数据导出

文章目录 前言WriteWorkbook对象字段解析创建文件对象创建行对象写入磁盘测试10w条数据导出结论预约导出批量查询导出操作多线程并发导出测试 官方使用文档&#xff1a;https://alibaba-easyexcel.github.io/ 前言 EasyExcel怎么避免OOM的&#xff1f;大量数据导出怎么处理&a…

Ubuntu下,dpkg安装出错的修复

参考 http://www.khattam.info/2009/08/04/solved-subprocess-pre-removal-script-returned-error-exit-status-2-error/ 我在ubuntu上安装ldap-account-manager的时候出错&#xff0c; 当sudo aptitude install ldap-account-manager 出现如下错误&#xff1a; Reading pa…

错误 ORA-01102: cannot mount database in EXCLUSIVE mode 的处理方法

今天启动数据库时报错了&#xff01; SQL> startup mount ORACLE instance started. Total System Global Area 608174080 bytes Fixed Size 1220844 bytes Variable Size 176164628 bytes Database Buffers 427819008 bytes Redo…

OK6410 LCD驱动移植

今天完成了 OK6410 的LCD 驱动移植&#xff0c;那么直接进入正题&#xff0c;我的操作环境是&#xff1a; 主机&#xff1a; XP系统&#xff0c; VMware Ubuntu 10.10 虚拟机。 开发板&#xff1a;OK6410&#xff0c;A板&#xff0c;256M2G 。 LCD &#xff1a;飞凌4.3 寸…

(更新)从零开始利用docker搭建CTFd动态独立靶机的靶场

更新 由于CTFd版本和ctfd-whale版本更新&#xff0c;以下的配置可能会出现不成功的情况&#xff0c;鉴于此&#xff0c;做出以下更新&#xff0c;请移步到以下链接 CTFd动态靶机靶场搭建 一、前言 1.最近准备毕业设计&#xff0c;准备搭建CTFd动态独立靶机的靶场(ctfdctfd-w…