This is an automated email from the ASF dual-hosted git repository.
terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new bbd5a96b870 Fix duplicate NOT subquery extraction (#40344)
bbd5a96b870 is described below
commit bbd5a96b87037ab28e088c72be20479fa5251ead
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Oct 22 20:06:30 2026 +0800
Fix duplicate NOT subquery extraction (#40344)
---
.../statement/core/extractor/SubqueryExtractor.java | 3 ---
.../core/extractor/SubqueryExtractorTest.java | 18 +++++++++++++++++-
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractor.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractor.java
index a2a02278b08..c3baea7ddaa 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractor.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractor.java
@@ -251,9 +251,6 @@ public final class SubqueryExtractor {
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);
}
diff --git
a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractorTest.java
b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractorTest.java
index e1ddd1a6b83..a3381b8677f 100644
---
a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractorTest.java
+++
b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/extractor/SubqueryExtractorTest.java
@@ -27,6 +27,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Coll
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.RowExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.UnaryOperationExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonExpressionSegment;
@@ -264,6 +265,17 @@ class SubqueryExtractorTest {
SubquerySegment collateNested = new SubquerySegment(2, 8,
SelectStatement.builder().projections(new ProjectionsSegment(0, 0)).build(),
"");
SubquerySegment collateOuter =
createSubqueryWithNestedPredicate(collateNested);
CollateExpression collate = new CollateExpression(0, 15, new
LiteralExpressionSegment(12, 14, "C"), new
SubqueryExpressionSegment(collateOuter));
+ SubquerySegment directNotNested = new SubquerySegment(2, 8,
SelectStatement.builder().projections(new ProjectionsSegment(0, 0)).build(),
"");
+ SubquerySegment directNotOuter =
createSubqueryWithNestedPredicate(directNotNested);
+ SelectStatement directNotPredicate =
SelectStatement.builder().projections(new ProjectionsSegment(0, 0))
+ .where(new WhereSegment(0, 10, new NotExpression(0, 10, new
SubqueryExpressionSegment(directNotOuter), true))).build();
+ SubquerySegment recursiveNotNested = new SubquerySegment(2, 8,
SelectStatement.builder().projections(new ProjectionsSegment(0, 0)).build(),
"");
+ SubquerySegment recursiveNotOuter =
createSubqueryWithNestedPredicate(recursiveNotNested);
+ SelectStatement recursiveNotPredicate =
SelectStatement.builder().projections(new ProjectionsSegment(0, 0))
+ .where(new WhereSegment(0, 10, new NotExpression(0, 10, new
SubqueryExpressionSegment(recursiveNotOuter), true))).build();
+ SubquerySegment nestedNotSubquery = new SubquerySegment(1, 9,
SelectStatement.builder().projections(new ProjectionsSegment(0, 0)).build(),
"");
+ NotExpression innerNot = new NotExpression(0, 10, new
SubqueryExpressionSegment(nestedNotSubquery), true);
+ SelectStatement nestedNotPredicate =
SelectStatement.builder().projections(new ProjectionsSegment(0, 0)).where(new
WhereSegment(0, 10, new NotExpression(0, 10, innerNot, true))).build();
return Stream.of(
Arguments.of("Empty common expression",
createSelectWithExpressionProjection(new CommonExpressionSegment(0, 0,
"legacy", Collections.emptyList())), false,
Collections.emptyList(), Collections.emptyList()),
@@ -280,7 +292,11 @@ class SubqueryExtractorTest {
Arrays.asList(firstRow, secondRow),
Arrays.asList(SubqueryType.PROJECTION, SubqueryType.PROJECTION)),
Arguments.of("Unary predicate without SELECT recursion",
unaryPredicate, false, Collections.singletonList(unaryOuter),
Collections.singletonList(SubqueryType.PREDICATE)),
Arguments.of("Collate with SELECT recursion",
createSelectWithExpressionProjection(collate), true,
- Arrays.asList(collateOuter, collateNested),
Arrays.asList(SubqueryType.PROJECTION, SubqueryType.PREDICATE)));
+ Arrays.asList(collateOuter, collateNested),
Arrays.asList(SubqueryType.PROJECTION, SubqueryType.PREDICATE)),
+ Arguments.of("Not predicate without SELECT recursion",
directNotPredicate, false, Collections.singletonList(directNotOuter),
Collections.singletonList(SubqueryType.PREDICATE)),
+ Arguments.of("Not predicate with SELECT recursion",
recursiveNotPredicate, true,
+ Arrays.asList(recursiveNotOuter, recursiveNotNested),
Arrays.asList(SubqueryType.PREDICATE, SubqueryType.PREDICATE)),
+ Arguments.of("Nested not predicate", nestedNotPredicate,
false, Collections.singletonList(nestedNotSubquery),
Collections.singletonList(SubqueryType.PREDICATE)));
}
private static SubquerySegment createSubqueryWithNestedPredicate(final
SubquerySegment nested) {