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 336da68dd3580d..f63f9062dd50a8 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 Expr visitSlotReference(SlotReference slotReference, PlanTranslatorContex } @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 84cdb9cbaae7eb..ad7c44f369b615 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 Expression visitAlias(Alias alias, DeepCopierContext context) { @Override public Expression visitSlotReference(SlotReference slotReference, DeepCopierContext context) { Map 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 Expression visitVirtualReference(VirtualSlotReference virtualSlotReferenc return newOne; } + @Override + public Expression visitArrayItemReference(ArrayItemReference arrayItemSlot, DeepCopierContext context) { + Expression arrayExpression = arrayItemSlot.getArrayExpression().accept(this, context); + Map 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 95c29eac87a1ef..226e8d1f9b2538 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 List expectedInputTypes() { 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 ArrayItemSlot(ExprId exprId, String name, DataType dataType, boolean null 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 308a4387ce9cd5..e9298c4893d765 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 R visitSlotReference(SlotReference slotReference, C context) { 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 R visitGroupingScalarFunction(GroupingScalarFunction groupingScalarFuncti } 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 284361624e661a..2344cedddd5077 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 2f9962d921637b..1c2dd55676d42c 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;""" }