From 8a212610cc00a19a4767a18e616d5189ffb952df Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Wed, 25 Oct 2023 11:10:54 +0800 Subject: [PATCH 1/6] [fix](nereids)add visitMarkJoinReference method in ExpressionDeepCopier --- .../trees/copier/ExpressionDeepCopier.java | 15 +++++++++++++++ .../data/nereids_p0/subquery/test_subquery.out | 3 +++ .../nereids_p0/subquery/test_subquery.groovy | 2 ++ 3 files changed, 20 insertions(+) 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..893cbbefc8f779 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 @@ -23,6 +23,7 @@ import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.InSubquery; import org.apache.doris.nereids.trees.expressions.ListQuery; +import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference; import org.apache.doris.nereids.trees.expressions.ScalarSubquery; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.SlotReference; @@ -105,6 +106,20 @@ public Expression visitVirtualReference(VirtualSlotReference virtualSlotReferenc return newOne; } + @Override + public Expression visitMarkJoinReference(MarkJoinSlotReference slotReference, DeepCopierContext context) { + Map exprIdReplaceMap = context.exprIdReplaceMap; + if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { + ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); + return slotReference.withExprId(newExprId); + } else { + MarkJoinSlotReference newOne = new MarkJoinSlotReference(slotReference.getName(), + slotReference.isExistsHasAgg()); + exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); + return newOne; + } + } + @Override public Expression visitExistsSubquery(Exists exists, DeepCopierContext context) { LogicalPlan logicalPlan = LogicalPlanDeepCopier.INSTANCE.deepCopy(exists.getQueryPlan(), 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;""" } From d4d2ce08158fa7ea1c16a083f24db4075ff0ca9c Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Wed, 25 Oct 2023 14:21:47 +0800 Subject: [PATCH 2/6] fix bug --- .../glue/translator/ExpressionTranslator.java | 2 +- .../trees/copier/ExpressionDeepCopier.java | 47 ++++++++++++++++++- .../trees/expressions/ArrayItemReference.java | 5 +- .../visitor/ExpressionVisitor.java | 2 +- 4 files changed, 51 insertions(+), 5 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 336da68dd3580d..ff1ab4afdc204e 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,7 +276,7 @@ public Expr visitSlotReference(SlotReference slotReference, PlanTranslatorContex } @Override - public Expr visitArrayItemSlot(SlotReference slotReference, PlanTranslatorContext context) { + public Expr visitArrayItemSlot(ArrayItemReference.ArrayItemSlot slotReference, PlanTranslatorContext context) { return context.findColumnRef(slotReference.getExprId()); } 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 893cbbefc8f779..733288294e3a92 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; @@ -113,8 +114,50 @@ public Expression visitMarkJoinReference(MarkJoinSlotReference slotReference, De ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); return slotReference.withExprId(newExprId); } else { - MarkJoinSlotReference newOne = new MarkJoinSlotReference(slotReference.getName(), - slotReference.isExistsHasAgg()); + MarkJoinSlotReference newOne = slotReference.withExprId(StatementScopeIdGenerator.newExprId()); + exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); + return newOne; + } + } + + @Override + public Expression visitArrayItemSlot(ArrayItemReference.ArrayItemSlot slotReference, DeepCopierContext context) { + Map exprIdReplaceMap = context.exprIdReplaceMap; + if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { + ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); + return slotReference.withExprId(newExprId); + } else { + ArrayItemReference.ArrayItemSlot newOne = new ArrayItemReference.ArrayItemSlot( + StatementScopeIdGenerator.newExprId(), slotReference.getName(), + slotReference.getDataType(), slotReference.nullable()); + exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); + return newOne; + } + } + + @Override + public Expression visitArrayItemReference(ArrayItemReference slotReference, DeepCopierContext context) { + Map exprIdReplaceMap = context.exprIdReplaceMap; + if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { + ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); + return new ArrayItemReference(newExprId, slotReference.getName(), + slotReference.getArrayExpression()); + } else { + ArrayItemReference newOne = new ArrayItemReference(slotReference.getName(), + slotReference.getArrayExpression()); + exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); + return newOne; + } + } + + @Override + public Expression visitVirtualReference(VirtualSlotReference slotReference, DeepCopierContext context) { + Map exprIdReplaceMap = context.exprIdReplaceMap; + if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { + ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); + return slotReference.withExprId(newExprId); + } else { + VirtualSlotReference newOne = slotReference.withExprId(StatementScopeIdGenerator.newExprId()); exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); return newOne; } 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..16c247e3698969 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. * 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..8b4f500b8eaf08 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,7 +221,7 @@ public R visitSlotReference(SlotReference slotReference, C context) { return visitSlot(slotReference, context); } - public R visitArrayItemSlot(SlotReference arrayItemSlot, C context) { + public R visitArrayItemSlot(ArrayItemReference.ArrayItemSlot arrayItemSlot, C context) { return visit(arrayItemSlot, context); } From fa30a577297177bc3ba701b633a60b793f6c1a92 Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Fri, 27 Oct 2023 16:02:34 +0800 Subject: [PATCH 3/6] modified based on comments --- .../trees/copier/ExpressionDeepCopier.java | 46 +------------------ .../trees/expressions/ArrayItemReference.java | 5 ++ .../visitor/ExpressionVisitor.java | 4 +- 3 files changed, 9 insertions(+), 46 deletions(-) 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 733288294e3a92..064ef16c64901b 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 @@ -24,7 +24,6 @@ import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.InSubquery; import org.apache.doris.nereids.trees.expressions.ListQuery; -import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference; import org.apache.doris.nereids.trees.expressions.ScalarSubquery; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.SlotReference; @@ -72,9 +71,9 @@ 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()); @@ -107,34 +106,6 @@ public Expression visitVirtualReference(VirtualSlotReference virtualSlotReferenc return newOne; } - @Override - public Expression visitMarkJoinReference(MarkJoinSlotReference slotReference, DeepCopierContext context) { - Map exprIdReplaceMap = context.exprIdReplaceMap; - if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { - ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); - return slotReference.withExprId(newExprId); - } else { - MarkJoinSlotReference newOne = slotReference.withExprId(StatementScopeIdGenerator.newExprId()); - exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); - return newOne; - } - } - - @Override - public Expression visitArrayItemSlot(ArrayItemReference.ArrayItemSlot slotReference, DeepCopierContext context) { - Map exprIdReplaceMap = context.exprIdReplaceMap; - if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { - ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); - return slotReference.withExprId(newExprId); - } else { - ArrayItemReference.ArrayItemSlot newOne = new ArrayItemReference.ArrayItemSlot( - StatementScopeIdGenerator.newExprId(), slotReference.getName(), - slotReference.getDataType(), slotReference.nullable()); - exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); - return newOne; - } - } - @Override public Expression visitArrayItemReference(ArrayItemReference slotReference, DeepCopierContext context) { Map exprIdReplaceMap = context.exprIdReplaceMap; @@ -150,19 +121,6 @@ public Expression visitArrayItemReference(ArrayItemReference slotReference, Deep } } - @Override - public Expression visitVirtualReference(VirtualSlotReference slotReference, DeepCopierContext context) { - Map exprIdReplaceMap = context.exprIdReplaceMap; - if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { - ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); - return slotReference.withExprId(newExprId); - } else { - VirtualSlotReference newOne = slotReference.withExprId(StatementScopeIdGenerator.newExprId()); - exprIdReplaceMap.put(slotReference.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 16c247e3698969..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 @@ -145,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 8b4f500b8eaf08..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 @@ -222,7 +222,7 @@ public R visitSlotReference(SlotReference slotReference, C context) { } public R visitArrayItemSlot(ArrayItemReference.ArrayItemSlot arrayItemSlot, C context) { - return visit(arrayItemSlot, 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) { From f80f502a60428336f76c75a2d4b89f04090fe13e Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Tue, 31 Oct 2023 17:07:47 +0800 Subject: [PATCH 4/6] modified based on comments --- .../glue/translator/ExpressionTranslator.java | 4 ++-- .../trees/copier/ExpressionDeepCopier.java | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 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 ff1ab4afdc204e..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(ArrayItemReference.ArrayItemSlot 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 064ef16c64901b..fd9c4ebd0e5168 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 @@ -107,16 +107,16 @@ public Expression visitVirtualReference(VirtualSlotReference virtualSlotReferenc } @Override - public Expression visitArrayItemReference(ArrayItemReference slotReference, DeepCopierContext context) { + public Expression visitArrayItemReference(ArrayItemReference arrayItemSlot, DeepCopierContext context) { Map exprIdReplaceMap = context.exprIdReplaceMap; - if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { - ExprId newExprId = exprIdReplaceMap.get(slotReference.getExprId()); - return new ArrayItemReference(newExprId, slotReference.getName(), - slotReference.getArrayExpression()); + if (exprIdReplaceMap.containsKey(arrayItemSlot.getExprId())) { + ExprId newExprId = exprIdReplaceMap.get(arrayItemSlot.getExprId()); + return new ArrayItemReference(newExprId, arrayItemSlot.getName(), + arrayItemSlot.getArrayExpression()); } else { - ArrayItemReference newOne = new ArrayItemReference(slotReference.getName(), - slotReference.getArrayExpression()); - exprIdReplaceMap.put(slotReference.getExprId(), newOne.getExprId()); + ArrayItemReference newOne = new ArrayItemReference(arrayItemSlot.getName(), + arrayItemSlot.getArrayExpression()); + exprIdReplaceMap.put(arrayItemSlot.getExprId(), newOne.getExprId()); return newOne; } } From 23014a5250640ef79c309b2b16491fe6b90571c2 Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Fri, 3 Nov 2023 14:26:25 +0800 Subject: [PATCH 5/6] deep copy ArrayItemReference --- .../nereids/trees/copier/ExpressionDeepCopier.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 fd9c4ebd0e5168..51d909ecc22d8e 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 @@ -108,17 +108,17 @@ public Expression visitVirtualReference(VirtualSlotReference virtualSlotReferenc @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())) { - ExprId newExprId = exprIdReplaceMap.get(arrayItemSlot.getExprId()); - return new ArrayItemReference(newExprId, arrayItemSlot.getName(), - arrayItemSlot.getArrayExpression()); + newOne = new ArrayItemReference(exprIdReplaceMap.get(arrayItemSlot.getExprId()), + arrayItemSlot.getName(), arrayExpression); } else { - ArrayItemReference newOne = new ArrayItemReference(arrayItemSlot.getName(), - arrayItemSlot.getArrayExpression()); + newOne = new ArrayItemReference(arrayItemSlot.getName(), arrayExpression); exprIdReplaceMap.put(arrayItemSlot.getExprId(), newOne.getExprId()); - return newOne; } + return newOne; } @Override From b1b6d37acc2e19315fe8d88318c52105b83f3d35 Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Fri, 3 Nov 2023 14:42:13 +0800 Subject: [PATCH 6/6] rebase code --- .../doris/nereids/trees/copier/ExpressionDeepCopier.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 51d909ecc22d8e..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 @@ -75,11 +75,10 @@ public Expression visitSlotReference(SlotReference slotReference, DeepCopierCont if (exprIdReplaceMap.containsKey(slotReference.getExprId())) { 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