From 646348ccc4d557fdda34bd8572c6e408131590db Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Fri, 3 Nov 2023 20:34:29 +0800 Subject: [PATCH] [fix](nereids)add visitMarkJoinReference method in ExpressionDeepCopier (#25874) --- .../glue/translator/ExpressionTranslator.java | 4 +-- .../trees/copier/ExpressionDeepCopier.java | 27 ++++++++++++++----- .../trees/expressions/ArrayItemReference.java | 10 ++++++- .../visitor/ExpressionVisitor.java | 6 ++--- .../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 336da68dd3..f63f9062dd 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 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 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 95c29eac87..226e8d1f9b 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 accept(ExpressionVisitor 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 308a4387ce..e9298c4893 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 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 } 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 284361624e..2344cedddd 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 2f9962d921..1c2dd55676 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;""" }