Skip to content

Commit

Permalink
Merge branch 'jsqlparser4.9' into 3.0
Browse files Browse the repository at this point in the history
# Conflicts:
#	mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataChangeRecorderInnerInterceptor.java
  • Loading branch information
nieqiurong committed Apr 3, 2024
2 parents 22dd565 + 3feead7 commit d03188f
Show file tree
Hide file tree
Showing 12 changed files with 185 additions and 201 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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',
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,30 @@
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.Statements;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* @author miemie
* @since 2023-08-05
*/
public class JsqlParserGlobal {

/**
* 默认解析处理线程池
* <p>注意: 由于项目情况,机器配置等不一样因素,请自行根据情况创建指定线程池.</p>
*
* @see java.util.concurrent.ThreadPoolExecutor
* @since 3.5.6
*/
public static ExecutorService executorService = Executors.newFixedThreadPool((Runtime.getRuntime().availableProcessors() + 1) / 2);

@Setter
private static JsqlParserFunction<String, Statement> parserSingleFunc = CCJSqlParserUtil::parse;
private static JsqlParserFunction<String, Statement> parserSingleFunc = sql -> CCJSqlParserUtil.parse(sql, executorService, null);

@Setter
private static JsqlParserFunction<String, Statements> parserMultiFunc = CCJSqlParserUtil::parseStatements;
private static JsqlParserFunction<String, Statements> parserMultiFunc = sql -> CCJSqlParserUtil.parseStatements(sql, executorService, null);

@Setter
private static JsqlParseCache jsqlParseCache;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public String parserMulti(String sql, Object obj) {
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,13 @@ public 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);
Expand Down Expand Up @@ -127,7 +124,6 @@ public 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);
Expand Down Expand Up @@ -194,15 +190,12 @@ public 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);
Expand All @@ -214,21 +207,16 @@ public 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);
Expand All @@ -238,15 +226,13 @@ public 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);
conf.registerClass(net.sf.jsqlparser.expression.operators.relational.ComparisonOperator.class);
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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,18 +46,18 @@
@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));
}
Expand Down Expand Up @@ -88,7 +88,7 @@ protected Expression andExpression(Table table, Expression where, final String w
*/
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));
}
Expand All @@ -105,7 +105,7 @@ protected void processPlainSelect(final PlainSelect plainSelect, final String wh
// 处理 join
List<Join> joins = plainSelect.getJoins();
if (CollectionUtils.isNotEmpty(joins)) {
mainTables = processJoins(mainTables, joins, whereSegment);
processJoins(mainTables, joins, whereSegment);
}

// 当有 mainTable 时,进行 where 条件追加
Expand All @@ -116,18 +116,18 @@ protected void processPlainSelect(final PlainSelect plainSelect, final String wh

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
Expand Down Expand Up @@ -177,8 +177,8 @@ protected void processWhereSubSelect(Expression where, final String whereSegment
// 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
Expand All @@ -196,14 +196,11 @@ protected void processWhereSubSelect(Expression where, final String whereSegment
}

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);
}
}

Expand All @@ -215,11 +212,11 @@ protected void processSelectItem(SelectItem selectItem, final String whereSegmen
* @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);
}
Expand All @@ -232,25 +229,15 @@ protected void processFunction(Function function, final String whereSegment) {
*/
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);
}
}
}
}

Expand All @@ -260,12 +247,15 @@ protected void processOtherFromItem(FromItem fromItem, final String whereSegment
* @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;
}
Expand Down Expand Up @@ -299,8 +289,8 @@ private List<Table> processJoins(List<Table> mainTables, List<Join> joins, final
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) {
Expand Down
Loading

0 comments on commit d03188f

Please sign in to comment.