in parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractor.java [150:204]
private static void extractSubquerySegmentsFromExpression(final List<SubquerySegment> result, final ExpressionSegment expressionSegment, final SubqueryType subqueryType,
final boolean needRecursive) {
if (expressionSegment instanceof SubqueryExpressionSegment) {
SubquerySegment subquery = ((SubqueryExpressionSegment) expressionSegment).getSubquery();
subquery.getSelect().setSubqueryType(subqueryType);
result.add(subquery);
extractRecursive(needRecursive, result, subquery.getSelect(), SubqueryType.TABLE);
}
if (expressionSegment instanceof ExistsSubqueryExpression) {
SubquerySegment subquery = ((ExistsSubqueryExpression) expressionSegment).getSubquery();
subquery.getSelect().setSubqueryType(subqueryType);
result.add(subquery);
extractRecursive(needRecursive, result, subquery.getSelect(), SubqueryType.TABLE);
}
if (expressionSegment instanceof ListExpression) {
((ListExpression) expressionSegment).getItems().forEach(each -> extractSubquerySegmentsFromExpression(result, each, subqueryType, needRecursive));
}
if (expressionSegment instanceof BinaryOperationExpression) {
extractSubquerySegmentsFromExpression(result, ((BinaryOperationExpression) expressionSegment).getLeft(), subqueryType, needRecursive);
extractSubquerySegmentsFromExpression(result, ((BinaryOperationExpression) expressionSegment).getRight(), subqueryType, needRecursive);
}
if (expressionSegment instanceof InExpression) {
extractSubquerySegmentsFromExpression(result, ((InExpression) expressionSegment).getLeft(), subqueryType, needRecursive);
extractSubquerySegmentsFromExpression(result, ((InExpression) expressionSegment).getRight(), subqueryType, needRecursive);
}
if (expressionSegment instanceof BetweenExpression) {
extractSubquerySegmentsFromExpression(result, ((BetweenExpression) expressionSegment).getBetweenExpr(), subqueryType, needRecursive);
extractSubquerySegmentsFromExpression(result, ((BetweenExpression) expressionSegment).getAndExpr(), subqueryType, needRecursive);
}
if (expressionSegment instanceof NotExpression) {
extractSubquerySegmentsFromExpression(result, ((NotExpression) expressionSegment).getExpression(), subqueryType, needRecursive);
}
if (expressionSegment instanceof FunctionSegment) {
((FunctionSegment) expressionSegment).getParameters().forEach(each -> extractSubquerySegmentsFromExpression(result, each, subqueryType, needRecursive));
}
if (expressionSegment instanceof MatchAgainstExpression) {
extractSubquerySegmentsFromExpression(result, ((MatchAgainstExpression) expressionSegment).getExpr(), subqueryType, needRecursive);
}
if (expressionSegment instanceof CaseWhenExpression) {
extractSubquerySegmentsFromCaseWhenExpression(result, (CaseWhenExpression) expressionSegment, subqueryType, needRecursive);
}
if (expressionSegment instanceof CollateExpression) {
extractSubquerySegmentsFromExpression(result, ((CollateExpression) expressionSegment).getCollateName(), subqueryType, needRecursive);
}
if (expressionSegment instanceof DatetimeExpression) {
extractSubquerySegmentsFromExpression(result, ((DatetimeExpression) expressionSegment).getLeft(), subqueryType, needRecursive);
extractSubquerySegmentsFromExpression(result, ((DatetimeExpression) expressionSegment).getRight(), subqueryType, needRecursive);
}
if (expressionSegment instanceof NotExpression) {
extractSubquerySegmentsFromExpression(result, ((NotExpression) expressionSegment).getExpression(), subqueryType, needRecursive);
}
if (expressionSegment instanceof TypeCastExpression) {
extractSubquerySegmentsFromExpression(result, ((TypeCastExpression) expressionSegment).getExpression(), subqueryType, needRecursive);
}
}