Преглед на файлове

升级jsqlparser至4.9.

nieqiurong преди 1 година
родител
ревизия
536065b6d5

+ 1 - 1
build.gradle

@@ -18,7 +18,7 @@ ext {
         springBootVersion = '2.7.15',
         springBoot3Version = '3.2.0',
         springCloudVersion = '3.1.8',
-        jsqlparserVersion = '4.6',
+        jsqlparserVersion = '4.9',
         junitVersion = '5.9.0',
     ]
 

+ 1 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/parser/JsqlParserSupport.java

@@ -61,7 +61,7 @@ public abstract class JsqlParserSupport {
             StringBuilder sb = new StringBuilder();
             Statements statements = JsqlParserGlobal.parseStatements(sql);
             int i = 0;
-            for (Statement statement : statements.getStatements()) {
+            for (Statement statement : statements) {
                 if (i > 0) {
                     sb.append(StringPool.SEMICOLON);
                 }

+ 0 - 14
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/parser/cache/FstFactory.java

@@ -76,16 +76,13 @@ public class FstFactory {
         conf.registerClass(net.sf.jsqlparser.expression.RowConstructor.class);
         conf.registerClass(net.sf.jsqlparser.expression.RowGetExpression.class);
         conf.registerClass(net.sf.jsqlparser.expression.SQLServerHints.class);
-        conf.registerClass(net.sf.jsqlparser.expression.SafeCastExpression.class);
         conf.registerClass(net.sf.jsqlparser.expression.SignedExpression.class);
         conf.registerClass(net.sf.jsqlparser.expression.StringValue.class);
         conf.registerClass(net.sf.jsqlparser.expression.TimeKeyExpression.class);
         conf.registerClass(net.sf.jsqlparser.expression.TimeValue.class);
         conf.registerClass(net.sf.jsqlparser.expression.TimestampValue.class);
         conf.registerClass(net.sf.jsqlparser.expression.TimezoneExpression.class);
-        conf.registerClass(net.sf.jsqlparser.expression.TryCastExpression.class);
         conf.registerClass(net.sf.jsqlparser.expression.UserVariable.class);
-        conf.registerClass(net.sf.jsqlparser.expression.ValueListExpression.class);
         conf.registerClass(net.sf.jsqlparser.expression.VariableAssignment.class);
         conf.registerClass(net.sf.jsqlparser.expression.WhenClause.class);
         conf.registerClass(net.sf.jsqlparser.expression.WindowDefinition.class);
@@ -127,7 +124,6 @@ public class FstFactory {
         conf.registerClass(net.sf.jsqlparser.expression.operators.relational.MinorThanEquals.class);
         conf.registerClass(net.sf.jsqlparser.expression.operators.relational.NotEqualsTo.class);
         conf.registerClass(net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator.class);
-        conf.registerClass(net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator.class);
         conf.registerClass(net.sf.jsqlparser.expression.operators.relational.SimilarToExpression.class);
         conf.registerClass(net.sf.jsqlparser.parser.ASTNodeAccessImpl.class);
         conf.registerClass(net.sf.jsqlparser.parser.Token.class);
@@ -194,15 +190,12 @@ public class FstFactory {
         conf.registerClass(net.sf.jsqlparser.statement.merge.Merge.class);
         conf.registerClass(net.sf.jsqlparser.statement.merge.MergeInsert.class);
         conf.registerClass(net.sf.jsqlparser.statement.merge.MergeUpdate.class);
-        conf.registerClass(net.sf.jsqlparser.statement.replace.Replace.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.AllColumns.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.AllTableColumns.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Distinct.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.ExceptOp.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.ExpressionListItem.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Fetch.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.First.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.FunctionItem.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.GroupByElement.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.IntersectOp.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Join.class);
@@ -214,21 +207,16 @@ public class FstFactory {
         conf.registerClass(net.sf.jsqlparser.statement.select.Offset.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.OptimizeFor.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.OrderByElement.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.ParenthesisFromItem.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Pivot.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.PivotXml.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.PlainSelect.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Select.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.SelectExpressionItem.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.SetOperationList.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Skip.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.SubJoin.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.SubSelect.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.TableFunction.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Top.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.UnPivot.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.UnionOp.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.ValuesList.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.Wait.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.WithIsolation.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.WithItem.class);
@@ -238,7 +226,6 @@ public class FstFactory {
         conf.registerClass(net.sf.jsqlparser.statement.update.Update.class);
         conf.registerClass(net.sf.jsqlparser.statement.update.UpdateSet.class);
         conf.registerClass(net.sf.jsqlparser.statement.upsert.Upsert.class);
-        conf.registerClass(net.sf.jsqlparser.statement.values.ValuesStatement.class);
         conf.registerClass(net.sf.jsqlparser.util.cnfexpression.MultiAndExpression.class);
         conf.registerClass(net.sf.jsqlparser.util.cnfexpression.MultiOrExpression.class);
         conf.registerClass(net.sf.jsqlparser.expression.BinaryExpression.class);
@@ -246,7 +233,6 @@ public class FstFactory {
         conf.registerClass(net.sf.jsqlparser.expression.operators.relational.OldOracleJoinBinaryExpression.class);
         conf.registerClass(net.sf.jsqlparser.statement.CreateFunctionalStatement.class);
         conf.registerClass(net.sf.jsqlparser.statement.select.SetOperation.class);
-        conf.registerClass(net.sf.jsqlparser.statement.select.SpecialSubSelect.class);
         conf.registerClass(net.sf.jsqlparser.util.cnfexpression.MultipleExpression.class);
     }
 

+ 41 - 51
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/BaseMultiTableInnerInterceptor.java

@@ -46,18 +46,18 @@ import java.util.stream.Collectors;
 @SuppressWarnings({"rawtypes"})
 public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport implements InnerInterceptor {
 
-    protected void processSelectBody(SelectBody selectBody, final String whereSegment) {
+    protected void processSelectBody(Select selectBody, final String whereSegment) {
         if (selectBody == null) {
             return;
         }
         if (selectBody instanceof PlainSelect) {
             processPlainSelect((PlainSelect) selectBody, whereSegment);
-        } else if (selectBody instanceof WithItem) {
-            WithItem withItem = (WithItem) selectBody;
-            processSelectBody(withItem.getSubSelect().getSelectBody(), whereSegment);
-        } else {
+        } else if (selectBody instanceof ParenthesedSelect) {
+            ParenthesedSelect parenthesedSelect = (ParenthesedSelect) selectBody;
+            processSelectBody(parenthesedSelect.getSelect(), whereSegment);
+        } else if (selectBody instanceof SetOperationList) {
             SetOperationList operationList = (SetOperationList) selectBody;
-            List<SelectBody> selectBodyList = operationList.getSelects();
+            List<Select> selectBodyList = operationList.getSelects();
             if (CollectionUtils.isNotEmpty(selectBodyList)) {
                 selectBodyList.forEach(body -> processSelectBody(body, whereSegment));
             }
@@ -88,7 +88,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
      */
     protected void processPlainSelect(final PlainSelect plainSelect, final String whereSegment) {
         //#3087 github
-        List<SelectItem> selectItems = plainSelect.getSelectItems();
+        List<SelectItem<?>> selectItems = plainSelect.getSelectItems();
         if (CollectionUtils.isNotEmpty(selectItems)) {
             selectItems.forEach(selectItem -> processSelectItem(selectItem, whereSegment));
         }
@@ -105,7 +105,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
         // 处理 join
         List<Join> joins = plainSelect.getJoins();
         if (CollectionUtils.isNotEmpty(joins)) {
-            mainTables = processJoins(mainTables, joins, whereSegment);
+             processJoins(mainTables, joins, whereSegment);
         }
 
         // 当有 mainTable 时,进行 where 条件追加
@@ -116,18 +116,18 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
 
     private List<Table> processFromItem(FromItem fromItem, final String whereSegment) {
         // 处理括号括起来的表达式
-        while (fromItem instanceof ParenthesisFromItem) {
-            fromItem = ((ParenthesisFromItem) fromItem).getFromItem();
-        }
+//        while (fromItem instanceof ParenthesedFromItem) {
+//            fromItem = ((ParenthesedFromItem) fromItem).getFromItem();
+//        }
 
         List<Table> mainTables = new ArrayList<>();
         // 无 join 时的处理逻辑
         if (fromItem instanceof Table) {
             Table fromTable = (Table) fromItem;
             mainTables.add(fromTable);
-        } else if (fromItem instanceof SubJoin) {
+        } else if (fromItem instanceof ParenthesedFromItem ) {
             // SubJoin 类型则还需要添加上 where 条件
-            List<Table> tables = processSubJoin((SubJoin) fromItem, whereSegment);
+            List<Table> tables = processSubJoin((ParenthesedFromItem) fromItem, whereSegment);
             mainTables.addAll(tables);
         } else {
             // 处理下 fromItem
@@ -177,8 +177,8 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
                 // in
                 InExpression expression = (InExpression) where;
                 Expression inExpression = expression.getRightExpression();
-                if (inExpression instanceof SubSelect) {
-                    processSelectBody(((SubSelect) inExpression).getSelectBody(), whereSegment);
+                if (inExpression instanceof Select) {
+                    processSelectBody(((Select) inExpression), whereSegment);
                 }
             } else if (where instanceof ExistsExpression) {
                 // exists
@@ -196,14 +196,11 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
     }
 
     protected void processSelectItem(SelectItem selectItem, final String whereSegment) {
-        if (selectItem instanceof SelectExpressionItem) {
-            SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
-            final Expression expression = selectExpressionItem.getExpression();
-            if (expression instanceof SubSelect) {
-                processSelectBody(((SubSelect) expression).getSelectBody(), whereSegment);
-            } else if (expression instanceof Function) {
-                processFunction((Function) expression, whereSegment);
-            }
+        Expression expression = selectItem.getExpression();
+        if (expression instanceof Select) {
+            processSelectBody(((Select) expression), whereSegment);
+        } else if (expression instanceof Function) {
+            processFunction((Function) expression, whereSegment);
         }
     }
 
@@ -215,11 +212,11 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
      * @param function
      */
     protected void processFunction(Function function, final String whereSegment) {
-        ExpressionList parameters = function.getParameters();
+        ExpressionList<?> parameters = function.getParameters();
         if (parameters != null) {
-            parameters.getExpressions().forEach(expression -> {
-                if (expression instanceof SubSelect) {
-                    processSelectBody(((SubSelect) expression).getSelectBody(), whereSegment);
+            parameters.forEach(expression -> {
+                if (expression instanceof Select) {
+                    processSelectBody(((Select) expression), whereSegment);
                 } else if (expression instanceof Function) {
                     processFunction((Function) expression, whereSegment);
                 }
@@ -232,25 +229,15 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
      */
     protected void processOtherFromItem(FromItem fromItem, final String whereSegment) {
         // 去除括号
-        while (fromItem instanceof ParenthesisFromItem) {
-            fromItem = ((ParenthesisFromItem) fromItem).getFromItem();
-        }
-
-        if (fromItem instanceof SubSelect) {
-            SubSelect subSelect = (SubSelect) fromItem;
-            if (subSelect.getSelectBody() != null) {
-                processSelectBody(subSelect.getSelectBody(), whereSegment);
-            }
-        } else if (fromItem instanceof ValuesList) {
+//        while (fromItem instanceof ParenthesisFromItem) {
+//            fromItem = ((ParenthesisFromItem) fromItem).getFromItem();
+//        }
+
+        if (fromItem instanceof ParenthesedSelect) {
+            Select subSelect = (Select) fromItem;
+            processSelectBody(subSelect, whereSegment);
+        } else if (fromItem instanceof ParenthesedFromItem) {
             logger.debug("Perform a subQuery, if you do not give us feedback");
-        } else if (fromItem instanceof LateralSubSelect) {
-            LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;
-            if (lateralSubSelect.getSubSelect() != null) {
-                SubSelect subSelect = lateralSubSelect.getSubSelect();
-                if (subSelect.getSelectBody() != null) {
-                    processSelectBody(subSelect.getSelectBody(), whereSegment);
-                }
-            }
         }
     }
 
@@ -260,12 +247,15 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
      * @param subJoin subJoin
      * @return Table subJoin 中的主表
      */
-    private List<Table> processSubJoin(SubJoin subJoin, final String whereSegment) {
+    private List<Table> processSubJoin(ParenthesedFromItem subJoin, final String whereSegment) {
         List<Table> mainTables = new ArrayList<>();
-        if (subJoin.getJoinList() != null) {
-            List<Table> list = processFromItem(subJoin.getLeft(), whereSegment);
+        while (subJoin.getJoins() == null && subJoin.getFromItem() instanceof ParenthesedFromItem) {
+            subJoin = (ParenthesedFromItem) subJoin.getFromItem();
+        }
+        if (subJoin.getJoins() != null) {
+            List<Table> list = processFromItem(subJoin.getFromItem(), whereSegment);
             mainTables.addAll(list);
-            mainTables = processJoins(mainTables, subJoin.getJoinList(), whereSegment);
+            processJoins(mainTables, subJoin.getJoins(), whereSegment);
         }
         return mainTables;
     }
@@ -299,8 +289,8 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
             if (joinItem instanceof Table) {
                 joinTables = new ArrayList<>();
                 joinTables.add((Table) joinItem);
-            } else if (joinItem instanceof SubJoin) {
-                joinTables = processSubJoin((SubJoin) joinItem, whereSegment);
+            } else if (joinItem instanceof ParenthesedFromItem ) {
+                joinTables = processSubJoin((ParenthesedFromItem ) joinItem, whereSegment);
             }
 
             if (joinTables != null) {

+ 23 - 29
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataChangeRecorderInnerInterceptor.java

@@ -36,6 +36,7 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import net.sf.jsqlparser.statement.select.Values;
 import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.mapping.BoundSql;
 import org.apache.ibatis.mapping.MappedStatement;
@@ -72,13 +73,10 @@ import net.sf.jsqlparser.statement.select.AllColumns;
 import net.sf.jsqlparser.statement.select.FromItem;
 import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.statement.select.Select;
-import net.sf.jsqlparser.statement.select.SelectBody;
-import net.sf.jsqlparser.statement.select.SelectExpressionItem;
 import net.sf.jsqlparser.statement.select.SelectItem;
 import net.sf.jsqlparser.statement.select.SetOperationList;
 import net.sf.jsqlparser.statement.update.Update;
 import net.sf.jsqlparser.statement.update.UpdateSet;
-import net.sf.jsqlparser.statement.values.ValuesStatement;
 
 /**
  * <p>
@@ -205,7 +203,6 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
 
     public OperationResult processUpdate(Update updateStmt, MappedStatement mappedStatement, BoundSql boundSql, Connection connection) {
         Expression where = updateStmt.getWhere();
-        Select selectStmt = new Select();
         PlainSelect selectBody = new PlainSelect();
         Table table = updateStmt.getTable();
         final Set<String> ignoredColumns = ignoredTableColumns.get(table.getName().toUpperCase());
@@ -226,9 +223,8 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
         Columns2SelectItemsResult buildColumns2SelectItems = buildColumns2SelectItems(table.getName(), updateColumns);
         selectBody.setSelectItems(buildColumns2SelectItems.getSelectItems());
         selectBody.setWhere(where);
-        selectStmt.setSelectBody(selectBody);
-
-        BoundSql boundSql4Select = new BoundSql(mappedStatement.getConfiguration(), selectStmt.toString(),
+        SelectItem<PlainSelect> plainSelectSelectItem = new SelectItem<>(selectBody);
+        BoundSql boundSql4Select = new BoundSql(mappedStatement.getConfiguration(),  plainSelectSelectItem.toString(),
             prepareParameterMapping4Select(boundSql.getParameterMappings(), updateStmt),
             boundSql.getParameterObject());
         PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
@@ -238,7 +234,7 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
                 boundSql4Select.setAdditionalParameter(ety.getKey(), ety.getValue());
             }
         }
-        OriginalDataObj originalData = buildOriginalObjectData(selectStmt, buildColumns2SelectItems.getPk(), mappedStatement, boundSql4Select, connection);
+        OriginalDataObj originalData = buildOriginalObjectData(selectBody, buildColumns2SelectItems.getPk(), mappedStatement, boundSql4Select, connection);
         OperationResult result = new OperationResult();
         result.setOperation("update");
         result.setTableName(table.getName());
@@ -257,7 +253,7 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
     private List<ParameterMapping> prepareParameterMapping4Select(List<ParameterMapping> originalMappingList, Update updateStmt) {
         List<Expression> updateValueExpressions = new ArrayList<>();
         for (UpdateSet updateSet : updateStmt.getUpdateSets()) {
-            updateValueExpressions.addAll(updateSet.getExpressions());
+            updateValueExpressions.addAll(updateSet.getValues());
         }
         int removeParamCount = 0;
         for (Expression expression : updateValueExpressions) {
@@ -282,9 +278,9 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
             int index = 0;
             for (UpdateSet updateSet : updateStmt.getUpdateSets()) {
                 selectItemsFromUpdateSql.addAll(updateSet.getColumns());
-                final List<Expression> updateList = updateSet.getExpressions();
-                for (int i = 0; i < updateList.size(); ++i) {
-                    Expression updateExps = updateList.get(i);
+                ExpressionList<?> values = updateSet.getValues();
+                for (int i = 0; i < values.size(); ++i) {
+                    Expression updateExps = values.get(i);
                     if (!(updateExps instanceof JdbcParameter)) {
                         columnNameValMap.put(updateSet.getColumns().get(i).getColumnName().toUpperCase(), updateExps.toString());
                     }
@@ -397,23 +393,23 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
         Map<String, String> columnNameValMap = new HashMap<>(4);
         final Select select = insert.getSelect();
         List<Column> columns = insert.getColumns();
-        if (select != null && select.getSelectBody() instanceof SetOperationList) {
-            SetOperationList setOperationList = (SetOperationList) select.getSelectBody();
-            final List<SelectBody> selects = setOperationList.getSelects();
+        if (select != null && select instanceof SetOperationList) {
+            SetOperationList setOperationList = (SetOperationList) select;
+            final List<Select> selects = setOperationList.getSelects();
             if (CollectionUtils.isEmpty(selects)) {
                 return columnNameValMap;
             }
-            final SelectBody selectBody = selects.get(0);
-            if (!(selectBody instanceof ValuesStatement)) {
+            final Select selectBody = selects.get(0);
+            if (!(selectBody instanceof Values)) {
                 return columnNameValMap;
             }
-            ValuesStatement valuesStatement = (ValuesStatement) selectBody;
+            Values valuesStatement = (Values) selectBody;
             if (valuesStatement.getExpressions() instanceof ExpressionList) {
                 ExpressionList expressionList = (ExpressionList) valuesStatement.getExpressions();
                 List<Expression> expressions = expressionList.getExpressions();
                 for (Expression expression : expressions) {
                     if (expression instanceof RowConstructor) {
-                        final ExpressionList exprList = ((RowConstructor) expression).getExprList();
+                        final ExpressionList exprList = ((RowConstructor) expression);
                         if (exprList != null) {
                             final List<Expression> insertExpList = exprList.getExpressions();
                             for (int i = 0; i < insertExpList.size(); ++i) {
@@ -605,16 +601,16 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
 
     private Columns2SelectItemsResult buildColumns2SelectItems(String tableName, List<Column> columns) {
         if (columns == null || columns.isEmpty()) {
-            return Columns2SelectItemsResult.build(Collections.singletonList(new AllColumns()), 0);
+            return Columns2SelectItemsResult.build(Collections.singletonList(new SelectItem<>(new AllColumns())), 0);
         }
-        List<SelectItem> selectItems = new ArrayList<>(columns.size());
+        List<SelectItem<?>> selectItems = new ArrayList<>(columns.size());
         for (Column column : columns) {
-            selectItems.add(new SelectExpressionItem(column));
+            selectItems.add(new SelectItem<>(column));
         }
         for (TableInfo tableInfo : TableInfoHelper.getTableInfos()) {
             if (tableName.equalsIgnoreCase(tableInfo.getTableName())) {
                 Column pk = new Column(tableInfo.getKeyColumn());
-                selectItems.add(new SelectExpressionItem(pk));
+                selectItems.add(new SelectItem<>(pk));
                 Columns2SelectItemsResult result = Columns2SelectItemsResult.build(selectItems, 1);
                 result.setPk(pk);
                 return result;
@@ -658,13 +654,11 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
     public OperationResult processDelete(Delete deleteStmt, MappedStatement mappedStatement, BoundSql boundSql, Connection connection) {
         Table table = deleteStmt.getTable();
         Expression where = deleteStmt.getWhere();
-        Select selectStmt = new Select();
         PlainSelect selectBody = new PlainSelect();
         selectBody.setFromItem(table);
-        selectBody.setSelectItems(Collections.singletonList(new AllColumns()));
+        selectBody.setSelectItems(Collections.singletonList(new SelectItem<>((new AllColumns()))));
         selectBody.setWhere(where);
-        selectStmt.setSelectBody(selectBody);
-        String originalData = buildOriginalData(selectStmt, mappedStatement, boundSql, connection);
+        String originalData = buildOriginalData(selectBody, mappedStatement, boundSql, connection);
         OperationResult result = new OperationResult();
         result.setOperation("delete");
         result.setTableName(table.getName());
@@ -780,13 +774,13 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
         /**
          * all column with additional columns: ID, etc.
          */
-        private List<SelectItem> selectItems;
+        private List<SelectItem<?>> selectItems;
         /**
          * newly added column count from meta data.
          */
         private int additionalItemCount;
 
-        public static Columns2SelectItemsResult build(List<SelectItem> selectItems, int additionalItemCount) {
+        public static Columns2SelectItemsResult build(List<SelectItem<?>> selectItems, int additionalItemCount) {
             Columns2SelectItemsResult result = new Columns2SelectItemsResult();
             result.setSelectItems(selectItems);
             result.setAdditionalItemCount(additionalItemCount);

+ 6 - 8
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataPermissionInterceptor.java

@@ -43,7 +43,6 @@ import net.sf.jsqlparser.schema.Table;
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.statement.select.Select;
-import net.sf.jsqlparser.statement.select.SelectBody;
 import net.sf.jsqlparser.statement.select.SetOperationList;
 import net.sf.jsqlparser.statement.select.WithItem;
 import net.sf.jsqlparser.statement.update.Update;
@@ -96,19 +95,18 @@ public class DataPermissionInterceptor extends BaseMultiTableInnerInterceptor im
         if (dataPermissionHandler instanceof MultiDataPermissionHandler) {
             // 参照 com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.processSelect 做的修改
             final String whereSegment = (String) obj;
-            processSelectBody(select.getSelectBody(), whereSegment);
+            processSelectBody(select, whereSegment);
             List<WithItem> withItemsList = select.getWithItemsList();
             if (!CollectionUtils.isEmpty(withItemsList)) {
                 withItemsList.forEach(withItem -> processSelectBody(withItem, whereSegment));
             }
         } else {
             // 兼容原来的旧版 DataPermissionHandler 场景
-            SelectBody selectBody = select.getSelectBody();
-            if (selectBody instanceof PlainSelect) {
-                this.setWhere((PlainSelect) selectBody, (String) obj);
-            } else if (selectBody instanceof SetOperationList) {
-                SetOperationList setOperationList = (SetOperationList) selectBody;
-                List<SelectBody> selectBodyList = setOperationList.getSelects();
+            if (select instanceof PlainSelect) {
+                this.setWhere((PlainSelect) select, (String) obj);
+            } else if (select instanceof SetOperationList) {
+                SetOperationList setOperationList = (SetOperationList) select;
+                List<Select> selectBodyList = setOperationList.getSelects();
                 selectBodyList.forEach(s -> this.setWhere((PlainSelect) s, (String) obj));
             }
         }

+ 7 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/IllegalSQLInnerInterceptor.java

@@ -26,6 +26,7 @@ import lombok.Data;
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.Function;
+import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction;
 import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
 import net.sf.jsqlparser.expression.operators.relational.InExpression;
 import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
@@ -35,8 +36,6 @@ import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.select.Join;
 import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.statement.select.Select;
-import net.sf.jsqlparser.statement.select.SelectBody;
-import net.sf.jsqlparser.statement.select.SubSelect;
 import net.sf.jsqlparser.statement.update.Update;
 import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.mapping.BoundSql;
@@ -117,9 +116,8 @@ public class IllegalSQLInnerInterceptor extends JsqlParserSupport implements Inn
 
     @Override
     protected void processSelect(Select select, int index, String sql, Object obj) {
-        SelectBody selectBody = select.getSelectBody();
-        if (selectBody instanceof PlainSelect) {
-            PlainSelect plainSelect = (PlainSelect) selectBody;
+        if (select instanceof PlainSelect) {
+            PlainSelect plainSelect = (PlainSelect) select;
             Expression where = plainSelect.getWhere();
             Assert.notNull(where, "非法SQL,必须要有where条件");
             Table table = (Table) plainSelect.getFromItem();
@@ -172,14 +170,14 @@ public class IllegalSQLInnerInterceptor extends JsqlParserSupport implements Inn
                 Function function = (Function) binaryExpression.getLeftExpression();
                 throw new MybatisPlusException("非法SQL,where条件中不能使用数据库函数,错误函数信息:" + function.toString());
             }
-            if (binaryExpression.getRightExpression() instanceof SubSelect) {
-                SubSelect subSelect = (SubSelect) binaryExpression.getRightExpression();
+            if (binaryExpression.getRightExpression() instanceof Subtraction) {
+                Subtraction subSelect = (Subtraction) binaryExpression.getRightExpression();
                 throw new MybatisPlusException("非法SQL,where条件中不能使用子查询,错误子查询SQL信息:" + subSelect.toString());
             }
         } else if (expression instanceof InExpression) {
             InExpression inExpression = (InExpression) expression;
-            if (inExpression.getRightItemsList() instanceof SubSelect) {
-                SubSelect subSelect = (SubSelect) inExpression.getRightItemsList();
+            if (inExpression.getRightExpression() instanceof Subtraction) {
+                Subtraction subSelect = (Subtraction) inExpression.getRightExpression();
                 throw new MybatisPlusException("非法SQL,where条件中不能使用子查询,错误子查询SQL信息:" + subSelect.toString());
             }
         }

+ 9 - 11
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java

@@ -66,8 +66,8 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
     /**
      * 获取jsqlparser中count的SelectItem
      */
-    protected static final List<SelectItem> COUNT_SELECT_ITEM = Collections.singletonList(
-        new SelectExpressionItem(new Column().withColumnName("COUNT(*)")).withAlias(new Alias("total"))
+    protected static final List<SelectItem<?>> COUNT_SELECT_ITEM = Collections.singletonList(
+        new SelectItem<>(new Column().withColumnName("COUNT(*)")).withAlias(new Alias("total"))
     );
     protected static final Map<String, MappedStatement> countMsCache = new ConcurrentHashMap<>();
     protected final Log logger = LogFactory.getLog(this.getClass());
@@ -262,12 +262,11 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
         }
         try {
             Select select = (Select) JsqlParserGlobal.parse(sql);
-            SelectBody selectBody = select.getSelectBody();
             // https://github.com/baomidou/mybatis-plus/issues/3920  分页增加union语法支持
-            if (selectBody instanceof SetOperationList) {
+            if (select instanceof SetOperationList) {
                 return lowLevelCountSql(sql);
             }
-            PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
+            PlainSelect plainSelect = (PlainSelect) select;
             Distinct distinct = plainSelect.getDistinct();
             GroupByElement groupBy = plainSelect.getGroupBy();
 
@@ -318,8 +317,8 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
                         if (rightItem instanceof Table) {
                             Table table = (Table) rightItem;
                             str = Optional.ofNullable(table.getAlias()).map(Alias::getName).orElse(table.getName()) + StringPool.DOT;
-                        } else if (rightItem instanceof SubSelect) {
-                            SubSelect subSelect = (SubSelect) rightItem;
+                        } else if (rightItem instanceof ParenthesedSelect) {
+                            ParenthesedSelect subSelect = (ParenthesedSelect) rightItem;
                             /* 如果 left join 是子查询,并且子查询里包含 ?(代表有入参) 或者 where 条件里包含使用 join 的表的字段作条件,就不移除 join */
                             if (subSelect.toString().contains(StringPool.QUESTION_MARK)) {
                                 canRemoveJoin = false;
@@ -381,20 +380,19 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
      */
     public String concatOrderBy(String originalSql, List<OrderItem> orderList) {
         try {
-            Select select = (Select) JsqlParserGlobal.parse(originalSql);
-            SelectBody selectBody = select.getSelectBody();
+            Select selectBody = (Select) JsqlParserGlobal.parse(originalSql);
             if (selectBody instanceof PlainSelect) {
                 PlainSelect plainSelect = (PlainSelect) selectBody;
                 List<OrderByElement> orderByElements = plainSelect.getOrderByElements();
                 List<OrderByElement> orderByElementsReturn = addOrderByElements(orderList, orderByElements);
                 plainSelect.setOrderByElements(orderByElementsReturn);
-                return select.toString();
+                return plainSelect.toString();
             } else if (selectBody instanceof SetOperationList) {
                 SetOperationList setOperationList = (SetOperationList) selectBody;
                 List<OrderByElement> orderByElements = setOperationList.getOrderByElements();
                 List<OrderByElement> orderByElementsReturn = addOrderByElements(orderList, orderByElements);
                 setOperationList.setOrderByElements(orderByElementsReturn);
-                return select.toString();
+                return setOperationList.toString();
             } else if (selectBody instanceof WithItem) {
                 // todo: don't known how to resole
                 return originalSql;

+ 44 - 42
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java

@@ -26,8 +26,7 @@ import net.sf.jsqlparser.expression.RowConstructor;
 import net.sf.jsqlparser.expression.StringValue;
 import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
 import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
-import net.sf.jsqlparser.expression.operators.relational.ItemsList;
-import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
+import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
 import net.sf.jsqlparser.statement.delete.Delete;
@@ -45,7 +44,6 @@ import org.apache.ibatis.session.RowBounds;
 
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
@@ -89,7 +87,7 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i
     @Override
     protected void processSelect(Select select, int index, String sql, Object obj) {
         final String whereSegment = (String) obj;
-        processSelectBody(select.getSelectBody(), whereSegment);
+        processSelectBody(select, whereSegment);
         List<WithItem> withItemsList = select.getWithItemsList();
         if (!CollectionUtils.isEmpty(withItemsList)) {
             withItemsList.forEach(withItem -> processSelectBody(withItem, whereSegment));
@@ -113,41 +111,38 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i
             return;
         }
         columns.add(new Column(tenantIdColumn));
-
+        Expression tenantId = tenantLineHandler.getTenantId();
         // fixed gitee pulls/141 duplicate update
-        List<Expression> duplicateUpdateColumns = insert.getDuplicateUpdateExpressionList();
+        List<UpdateSet> duplicateUpdateColumns = insert.getDuplicateUpdateSets();
         if (CollectionUtils.isNotEmpty(duplicateUpdateColumns)) {
             EqualsTo equalsTo = new EqualsTo();
             equalsTo.setLeftExpression(new StringValue(tenantIdColumn));
-            equalsTo.setRightExpression(tenantLineHandler.getTenantId());
-            duplicateUpdateColumns.add(equalsTo);
+            equalsTo.setRightExpression(tenantId);
+            duplicateUpdateColumns.add(new UpdateSet(new Column(tenantIdColumn), tenantId));
         }
 
         Select select = insert.getSelect();
-        if (select != null && (select.getSelectBody() instanceof PlainSelect)) { //fix github issue 4998  修复升级到4.5版本的问题
-            this.processInsertSelect(select.getSelectBody(), (String) obj);
-        } else if (insert.getItemsList() != null) {
+        if (select instanceof PlainSelect) { //fix github issue 4998  修复升级到4.5版本的问题
+            this.processInsertSelect(select, (String) obj);
+        } else if (insert.getValues() != null) {
             // fixed github pull/295
-            ItemsList itemsList = insert.getItemsList();
-            Expression tenantId = tenantLineHandler.getTenantId();
-            if (itemsList instanceof MultiExpressionList) {
-                ((MultiExpressionList) itemsList).getExpressionLists().forEach(el -> el.getExpressions().add(tenantId));
+            Values values = insert.getValues();
+            ExpressionList<Expression> expressions = (ExpressionList<Expression>) values.getExpressions();
+            if (expressions instanceof ParenthesedExpressionList) {
+                expressions.addExpression(tenantId);
             } else {
-                List<Expression> expressions = ((ExpressionList) itemsList).getExpressions();
                 if (CollectionUtils.isNotEmpty(expressions)) {//fix github issue 4998 jsqlparse 4.5 批量insert ItemsList不是MultiExpressionList 了,需要特殊处理
                     int len = expressions.size();
                     for (int i = 0; i < len; i++) {
                         Expression expression = expressions.get(i);
-                        if (expression instanceof RowConstructor) {
-                            ((RowConstructor) expression).getExprList().getExpressions().add(tenantId);
-                        } else if (expression instanceof Parenthesis) {
-                            RowConstructor rowConstructor = new RowConstructor()
-                                .withExprList(new ExpressionList(((Parenthesis) expression).getExpression(), tenantId));
+                        if (expression instanceof Parenthesis) {
+                            ExpressionList rowConstructor = new RowConstructor<>()
+                                .withExpressions(new ExpressionList<>(((Parenthesis) expression).getExpression(), tenantId));
                             expressions.set(i, rowConstructor);
+                        } else if (expression instanceof ParenthesedExpressionList) {
+                            ((ParenthesedExpressionList) expression).addExpression(tenantId);
                         } else {
-                            if (len - 1 == i) { // (?,?) 只有最后一个expre的时候才拼接tenantId
-                                expressions.add(tenantId);
-                            }
+                            expressions.add(tenantId);
                         }
                     }
                 } else {
@@ -169,11 +164,11 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i
             // 过滤退出执行
             return;
         }
-        ArrayList<UpdateSet> sets = update.getUpdateSets();
+        List<UpdateSet> sets = update.getUpdateSets();
         if (!CollectionUtils.isEmpty(sets)) {
-            sets.forEach(us -> us.getExpressions().forEach(ex -> {
-                if (ex instanceof SubSelect) {
-                    processSelectBody(((SubSelect) ex).getSelectBody(), (String) obj);
+            sets.forEach(us -> us.getValues().forEach(ex -> {
+                if (ex instanceof Select) {
+                    processSelectBody(((Select) ex), (String) obj);
                 }
             }));
         }
@@ -199,17 +194,23 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i
      *
      * @param selectBody SelectBody
      */
-    protected void processInsertSelect(SelectBody selectBody, final String whereSegment) {
-        PlainSelect plainSelect = (PlainSelect) selectBody;
-        FromItem fromItem = plainSelect.getFromItem();
-        if (fromItem instanceof Table) {
-            // fixed gitee pulls/141 duplicate update
-            processPlainSelect(plainSelect, whereSegment);
-            appendSelectItem(plainSelect.getSelectItems());
-        } else if (fromItem instanceof SubSelect) {
-            SubSelect subSelect = (SubSelect) fromItem;
-            appendSelectItem(plainSelect.getSelectItems());
-            processInsertSelect(subSelect.getSelectBody(), whereSegment);
+    protected void processInsertSelect(Select selectBody, final String whereSegment) {
+        if(selectBody instanceof PlainSelect){
+            PlainSelect plainSelect = (PlainSelect) selectBody;
+            FromItem fromItem = plainSelect.getFromItem();
+            if (fromItem instanceof Table) {
+                // fixed gitee pulls/141 duplicate update
+                processPlainSelect(plainSelect, whereSegment);
+                appendSelectItem(plainSelect.getSelectItems());
+            } else if (fromItem instanceof Select) {
+                Select subSelect = (Select) fromItem;
+                appendSelectItem(plainSelect.getSelectItems());
+                processInsertSelect(subSelect, whereSegment);
+            }
+        } else if(selectBody instanceof ParenthesedSelect){
+            ParenthesedSelect parenthesedSelect = (ParenthesedSelect) selectBody;
+            processInsertSelect(parenthesedSelect.getSelect(), whereSegment);
+
         }
     }
 
@@ -218,17 +219,18 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i
      *
      * @param selectItems SelectItem
      */
-    protected void appendSelectItem(List<SelectItem> selectItems) {
+    protected void appendSelectItem(List<SelectItem<?>> selectItems) {
         if (CollectionUtils.isEmpty(selectItems)) {
             return;
         }
         if (selectItems.size() == 1) {
             SelectItem item = selectItems.get(0);
-            if (item instanceof AllColumns || item instanceof AllTableColumns) {
+            Expression expression = item.getExpression();
+            if (expression instanceof AllColumns) {
                 return;
             }
         }
-        selectItems.add(new SelectExpressionItem(new Column(tenantLineHandler.getTenantIdColumn())));
+        selectItems.add(new SelectItem<>(new Column(tenantLineHandler.getTenantIdColumn())));
     }
 
     /**

+ 10 - 1
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/IllegalSQLInnerInterceptorTest.java

@@ -1,5 +1,7 @@
 package com.baomidou.mybatisplus.extension.plugins.inner;
 
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -7,10 +9,17 @@ import org.junit.jupiter.api.Test;
  * @since 2022-04-11
  */
 class IllegalSQLInnerInterceptorTest {
+
     private final IllegalSQLInnerInterceptor interceptor = new IllegalSQLInnerInterceptor();
 
     @Test
     void test() {
-        interceptor.parserSingle("SELECT COUNT(*) AS total FROM t_user WHERE (client_id = ?)", null);
+        Assertions.assertDoesNotThrow(() -> interceptor.parserSingle("SELECT COUNT(*) AS total FROM t_user WHERE (client_id = ?)", null));
+        Assertions.assertThrows(MybatisPlusException.class, () -> interceptor.parserSingle("select * from t_user", null));
+        Assertions.assertThrows(MybatisPlusException.class, () -> interceptor.parserSingle("update t_user set age = 18", null));
+        Assertions.assertThrows(MybatisPlusException.class, () -> interceptor.parserSingle("delete from t_user set age = 18", null));
+        Assertions.assertThrows(MybatisPlusException.class, () -> interceptor.parserSingle("select * from t_user where age != 1", null));
+        Assertions.assertThrows(MybatisPlusException.class, () -> interceptor.parserSingle("select * from t_user where age = 1 or name = 'test'", null));
     }
+
 }

+ 6 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptorTest.java

@@ -463,6 +463,12 @@ class TenantLineInnerInterceptorTest {
             "SELECT u.username FROM sys_user u LEFT JOIN sys_user_role r ON u.id = r.user_id AND r.tenant_id = 1 WHERE u.tenant_id = 1");
     }
 
+    @Test
+    void testDuplicateKeyUpdate() {
+        assertSql("INSERT INTO entity (name,age) VALUES ('秋秋',18),('秋秋','22') ON DUPLICATE KEY UPDATE age=18",
+            "INSERT INTO entity (name, age, tenant_id) VALUES ('秋秋', 18, 1), ('秋秋', '22', 1) ON DUPLICATE KEY UPDATE age = 18, tenant_id = 1");
+    }
+
     void assertSql(String sql, String targetSql) {
         assertThat(interceptor.parserSingle(sql, null)).isEqualTo(targetSql);
     }