This is an automated email from the ASF dual-hosted git repository.
starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 646348ccc4d [fix](nereids)add visitMarkJoinReference method in
ExpressionDeepCopier (#25874)
646348ccc4d is described below
commit 646348ccc4d557fdda34bd8572c6e408131590db
Author: starocean999 <[email protected]>
AuthorDate: Fri Nov 3 20:34:29 2023 +0800
[fix](nereids)add visitMarkJoinReference method in ExpressionDeepCopier
(#25874)
---
.../glue/translator/ExpressionTranslator.java | 4 ++--
.../nereids/trees/copier/ExpressionDeepCopier.java | 27 +++++++++++++++++-----
.../trees/expressions/ArrayItemReference.java | 10 +++++++-
.../expressions/visitor/ExpressionVisitor.java | 6 ++---
.../data/nereids_p0/subquery/test_subquery.out | 3 +++
.../nereids_p0/subquery/test_subquery.groovy | 2 ++
6 files changed, 40 insertions(+), 12 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
index 336da68dd35..f63f9062dd5 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
@@ -276,8 +276,8 @@ public class ExpressionTranslator extends
DefaultExpressionVisitor<Expr, PlanTra
}
@Override
- public Expr visitArrayItemSlot(SlotReference slotReference,
PlanTranslatorContext context) {
- return context.findColumnRef(slotReference.getExprId());
+ public Expr visitArrayItemSlot(ArrayItemReference.ArrayItemSlot
arrayItemSlot, PlanTranslatorContext context) {
+ return context.findColumnRef(arrayItemSlot.getExprId());
}
@Override
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/ExpressionDeepCopier.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/ExpressionDeepCopier.java
index 84cdb9cbaae..ad7c44f369b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/ExpressionDeepCopier.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/copier/ExpressionDeepCopier.java
@@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.copier;
import org.apache.doris.nereids.trees.expressions.Alias;
+import org.apache.doris.nereids.trees.expressions.ArrayItemReference;
import org.apache.doris.nereids.trees.expressions.Exists;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.Expression;
@@ -70,15 +71,14 @@ public class ExpressionDeepCopier extends
DefaultExpressionRewriter<DeepCopierCo
@Override
public Expression visitSlotReference(SlotReference slotReference,
DeepCopierContext context) {
Map<ExprId, ExprId> exprIdReplaceMap = context.exprIdReplaceMap;
+ ExprId newExprId;
if (exprIdReplaceMap.containsKey(slotReference.getExprId())) {
- ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId());
- return slotReference.withExprId(newExprId);
+ newExprId = exprIdReplaceMap.get(slotReference.getExprId());
} else {
- SlotReference newOne = new SlotReference(slotReference.getName(),
slotReference.getDataType(),
- slotReference.nullable(), slotReference.getQualifier());
- exprIdReplaceMap.put(slotReference.getExprId(),
newOne.getExprId());
- return newOne;
+ newExprId = StatementScopeIdGenerator.newExprId();
+ exprIdReplaceMap.put(slotReference.getExprId(), newExprId);
}
+ return slotReference.withExprId(newExprId);
}
@Override
@@ -105,6 +105,21 @@ public class ExpressionDeepCopier extends
DefaultExpressionRewriter<DeepCopierCo
return newOne;
}
+ @Override
+ public Expression visitArrayItemReference(ArrayItemReference
arrayItemSlot, DeepCopierContext context) {
+ Expression arrayExpression =
arrayItemSlot.getArrayExpression().accept(this, context);
+ Map<ExprId, ExprId> exprIdReplaceMap = context.exprIdReplaceMap;
+ ArrayItemReference newOne;
+ if (exprIdReplaceMap.containsKey(arrayItemSlot.getExprId())) {
+ newOne = new
ArrayItemReference(exprIdReplaceMap.get(arrayItemSlot.getExprId()),
+ arrayItemSlot.getName(), arrayExpression);
+ } else {
+ newOne = new ArrayItemReference(arrayItemSlot.getName(),
arrayExpression);
+ exprIdReplaceMap.put(arrayItemSlot.getExprId(),
newOne.getExprId());
+ }
+ return newOne;
+ }
+
@Override
public Expression visitExistsSubquery(Exists exists, DeepCopierContext
context) {
LogicalPlan logicalPlan =
LogicalPlanDeepCopier.INSTANCE.deepCopy(exists.getQueryPlan(), context);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
index 95c29eac87a..226e8d1f9b2 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ArrayItemReference.java
@@ -129,7 +129,10 @@ public class ArrayItemReference extends NamedExpression
implements ExpectsInputT
return
ImmutableList.of(ArrayType.of(AnyDataType.INSTANCE_WITHOUT_INDEX));
}
- static class ArrayItemSlot extends SlotReference implements
SlotNotFromChildren {
+ /**
+ * it is slot representation of ArrayItemReference
+ */
+ public static class ArrayItemSlot extends SlotReference implements
SlotNotFromChildren {
/**
* Constructor for SlotReference.
*
@@ -142,6 +145,11 @@ public class ArrayItemReference extends NamedExpression
implements ExpectsInputT
super(exprId, name, dataType, nullable, ImmutableList.of(), null,
Optional.empty());
}
+ @Override
+ public ArrayItemSlot withExprId(ExprId exprId) {
+ return new ArrayItemSlot(exprId, name, dataType, nullable);
+ }
+
@Override
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitArrayItemSlot(this, context);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
index 308a4387ce9..e9298c4893d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
@@ -221,8 +221,8 @@ public abstract class ExpressionVisitor<R, C>
return visitSlot(slotReference, context);
}
- public R visitArrayItemSlot(SlotReference arrayItemSlot, C context) {
- return visit(arrayItemSlot, context);
+ public R visitArrayItemSlot(ArrayItemReference.ArrayItemSlot
arrayItemSlot, C context) {
+ return visitSlotReference(arrayItemSlot, context);
}
public R visitMarkJoinReference(MarkJoinSlotReference
markJoinSlotReference, C context) {
@@ -434,7 +434,7 @@ public abstract class ExpressionVisitor<R, C>
}
public R visitVirtualReference(VirtualSlotReference virtualSlotReference,
C context) {
- return visit(virtualSlotReference, context);
+ return visitSlotReference(virtualSlotReference, context);
}
public R visitArrayItemReference(ArrayItemReference arrayItemReference, C
context) {
diff --git a/regression-test/data/nereids_p0/subquery/test_subquery.out
b/regression-test/data/nereids_p0/subquery/test_subquery.out
index 284361624e6..2344cedddd5 100644
--- a/regression-test/data/nereids_p0/subquery/test_subquery.out
+++ b/regression-test/data/nereids_p0/subquery/test_subquery.out
@@ -23,3 +23,6 @@ true 15 1992 3021 11011920 0.000 true
9999-12-12 2015-04-02T00:00 3.141592653 2
-- !sql_subquery_one_row_relation --
1
+-- !sql_mark_join --
+1
+
diff --git a/regression-test/suites/nereids_p0/subquery/test_subquery.groovy
b/regression-test/suites/nereids_p0/subquery/test_subquery.groovy
index 2f9962d9216..1c2dd55676d 100644
--- a/regression-test/suites/nereids_p0/subquery/test_subquery.groovy
+++ b/regression-test/suites/nereids_p0/subquery/test_subquery.groovy
@@ -84,5 +84,7 @@ suite("test_subquery") {
qt_sql_subquery_one_row_relation """select * from test_one_row_relation;"""
+ qt_sql_mark_join """with A as (select count(*) n1 from
test_one_row_relation where exists (select 1 from test_one_row_relation t where
t.user_id = test_one_row_relation.user_id) or 1 = 1) select * from A;"""
+
sql """drop table if exists test_one_row_relation;"""
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]