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]

Reply via email to