in parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/ExpressionExtractor.java [176:253]
public static Collection<ColumnSegment> extractColumns(final ExpressionSegment expression, final boolean containsSubQuery) {
if (expression instanceof ColumnSegment) {
return Collections.singletonList((ColumnSegment) expression);
}
Collection<ColumnSegment> result = new LinkedList<>();
if (expression instanceof AggregationProjectionSegment) {
for (ExpressionSegment each : ((AggregationProjectionSegment) expression).getParameters()) {
result.addAll(extractColumns(each, containsSubQuery));
}
}
if (expression instanceof BetweenExpression) {
result.addAll(extractColumns(((BetweenExpression) expression).getLeft(), containsSubQuery));
result.addAll(extractColumns(((BetweenExpression) expression).getBetweenExpr(), containsSubQuery));
result.addAll(extractColumns(((BetweenExpression) expression).getAndExpr(), containsSubQuery));
}
if (expression instanceof BinaryOperationExpression) {
result.addAll(extractColumns(((BinaryOperationExpression) expression).getLeft(), containsSubQuery));
result.addAll(extractColumns(((BinaryOperationExpression) expression).getRight(), containsSubQuery));
}
if (expression instanceof CaseWhenExpression) {
result.addAll(extractColumns(((CaseWhenExpression) expression).getCaseExpr(), containsSubQuery));
result.addAll(extractColumns(((CaseWhenExpression) expression).getElseExpr(), containsSubQuery));
((CaseWhenExpression) expression).getWhenExprs().forEach(each -> result.addAll(extractColumns(each, containsSubQuery)));
((CaseWhenExpression) expression).getThenExprs().forEach(each -> result.addAll(extractColumns(each, containsSubQuery)));
}
if (expression instanceof OuterJoinExpression) {
result.add(((OuterJoinExpression) expression).getColumnName());
}
if (expression instanceof DatetimeExpression) {
result.addAll(extractColumns(((DatetimeExpression) expression).getLeft(), containsSubQuery));
result.addAll(extractColumns(((DatetimeExpression) expression).getRight(), containsSubQuery));
}
if (expression instanceof ExpressionProjectionSegment) {
result.addAll(extractColumns(((ExpressionProjectionSegment) expression).getExpr(), containsSubQuery));
}
if (expression instanceof FunctionSegment) {
for (ExpressionSegment each : ((FunctionSegment) expression).getParameters()) {
result.addAll(extractColumns(each, containsSubQuery));
}
}
if (expression instanceof InExpression) {
result.addAll(extractColumns(((InExpression) expression).getLeft(), containsSubQuery));
result.addAll(extractColumns(((InExpression) expression).getRight(), containsSubQuery));
}
if (expression instanceof IntervalExpressionProjection) {
result.addAll(extractColumns(((IntervalExpressionProjection) expression).getLeft(), containsSubQuery));
result.addAll(extractColumns(((IntervalExpressionProjection) expression).getRight(), containsSubQuery));
result.addAll(extractColumns(((IntervalExpressionProjection) expression).getMinus(), containsSubQuery));
}
if (expression instanceof ListExpression) {
for (ExpressionSegment each : ((ListExpression) expression).getItems()) {
result.addAll(extractColumns(each, containsSubQuery));
}
}
if (expression instanceof MatchAgainstExpression) {
result.addAll(((MatchAgainstExpression) expression).getColumns());
result.addAll(extractColumns(((MatchAgainstExpression) expression).getExpr(), containsSubQuery));
}
if (expression instanceof MultisetExpression) {
result.addAll(extractColumns(((MultisetExpression) expression).getLeft(), containsSubQuery));
result.addAll(extractColumns(((MultisetExpression) expression).getRight(), containsSubQuery));
}
if (expression instanceof NotExpression) {
result.addAll(extractColumns(((NotExpression) expression).getExpression(), containsSubQuery));
}
if (expression instanceof ValuesExpression) {
for (InsertValuesSegment each : ((ValuesExpression) expression).getRowConstructorList()) {
each.getValues().forEach(value -> result.addAll(extractColumns(value, containsSubQuery)));
}
}
if (expression instanceof SubquerySegment && containsSubQuery) {
ColumnExtractor.extractFromSelectStatement(result, ((SubquerySegment) expression).getSelect(), true);
}
if (expression instanceof SubqueryExpressionSegment && containsSubQuery) {
ColumnExtractor.extractFromSelectStatement(result, ((SubqueryExpressionSegment) expression).getSubquery().getSelect(), true);
}
return result;
}