From 986f8cf76bda729871a12d51c3b95fdcaf8c2d0c Mon Sep 17 00:00:00 2001 From: 924060929 Date: Wed, 3 Dec 2025 11:46:56 +0800 Subject: [PATCH 1/5] fix --- .../doris/nereids/rules/analysis/ExpressionAnalyzer.java | 2 ++ .../nereids/rules/rewrite/PruneNestedColumnTest.java | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java index 8db98362a9cc84..b46b468bf8bb2b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java @@ -312,6 +312,8 @@ public Expression visitUnboundSlot(UnboundSlot unboundSlot, ExpressionRewriteCon } if (firstBound.getDataType() instanceof NestedColumnPrunable) { context.cascadesContext.getStatementContext().setHasNestedColumns(true); + } else if (firstBound.containsType(ElementAt.class, StructElement.class)) { + context.cascadesContext.getStatementContext().setHasNestedColumns(true); } return firstBound; default: diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java index b0692f65daf642..6f987a6648c8ee 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PruneNestedColumnTest.java @@ -414,6 +414,15 @@ public void testCteAndUnion() throws Throwable { ); } + @Test + public void testDereference() throws Exception { + assertColumn("select s.city from tbl", + "struct", + ImmutableList.of(path("s", "city")), + ImmutableList.of() + ); + } + @Test public void testPushDownThroughJoin() { PlanChecker.from(connectContext) From c6ca6e0e832dbb2b81d6485987b84d6bd2536dd4 Mon Sep 17 00:00:00 2001 From: 924060929 Date: Wed, 3 Dec 2025 14:16:54 +0800 Subject: [PATCH 2/5] fix --- .../apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java index b46b468bf8bb2b..f15e490af64d35 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java @@ -1128,7 +1128,7 @@ private Optional bindNestedFields(UnboundSlot unboundSlot, Slot slot } throw new AnalysisException("No such field '" + fieldName + "' in '" + lastFieldName + "'"); } - return Optional.of(new Alias(expression)); + return Optional.of(new Alias(expression, unboundSlot.getName())); } public static boolean sameTableName(String boundSlot, String unboundSlot) { From 55a237800139e5c2e15919bee45bfe8f096fb29f Mon Sep 17 00:00:00 2001 From: 924060929 Date: Wed, 3 Dec 2025 14:22:27 +0800 Subject: [PATCH 3/5] fix --- .../doris/nereids/rules/analysis/ExpressionAnalyzer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java index f15e490af64d35..48bd3dfaab3778 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java @@ -1128,7 +1128,10 @@ private Optional bindNestedFields(UnboundSlot unboundSlot, Slot slot } throw new AnalysisException("No such field '" + fieldName + "' in '" + lastFieldName + "'"); } - return Optional.of(new Alias(expression, unboundSlot.getName())); + List nameParts = unboundSlot.getNameParts(); + int namePartsNum = nameParts.size(); + List excludeTableParts = nameParts.subList(namePartsNum - fieldNames.size() - 1, namePartsNum); + return Optional.of(new Alias(expression, new UnboundSlot(excludeTableParts).getName())); } public static boolean sameTableName(String boundSlot, String unboundSlot) { From e75fbbac37649ddac9a169a36f51b749423f7a12 Mon Sep 17 00:00:00 2001 From: 924060929 Date: Wed, 3 Dec 2025 14:29:19 +0800 Subject: [PATCH 4/5] fix --- .../apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java index 48bd3dfaab3778..5aa53e034a9466 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java @@ -1131,7 +1131,7 @@ private Optional bindNestedFields(UnboundSlot unboundSlot, Slot slot List nameParts = unboundSlot.getNameParts(); int namePartsNum = nameParts.size(); List excludeTableParts = nameParts.subList(namePartsNum - fieldNames.size() - 1, namePartsNum); - return Optional.of(new Alias(expression, new UnboundSlot(excludeTableParts).getName())); + return Optional.of(new Alias(expression, new UnboundSlot(excludeTableParts).getName(), slot.getQualifier())); } public static boolean sameTableName(String boundSlot, String unboundSlot) { From 31421a8699316a7afde5865295e15c6f9fc17c34 Mon Sep 17 00:00:00 2001 From: 924060929 Date: Wed, 3 Dec 2025 14:40:32 +0800 Subject: [PATCH 5/5] fix --- .../doris/nereids/rules/analysis/ExpressionAnalyzer.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java index 5aa53e034a9466..e3c948d0460280 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java @@ -1128,10 +1128,7 @@ private Optional bindNestedFields(UnboundSlot unboundSlot, Slot slot } throw new AnalysisException("No such field '" + fieldName + "' in '" + lastFieldName + "'"); } - List nameParts = unboundSlot.getNameParts(); - int namePartsNum = nameParts.size(); - List excludeTableParts = nameParts.subList(namePartsNum - fieldNames.size() - 1, namePartsNum); - return Optional.of(new Alias(expression, new UnboundSlot(excludeTableParts).getName(), slot.getQualifier())); + return Optional.of(new Alias(expression, unboundSlot.getName(), slot.getQualifier())); } public static boolean sameTableName(String boundSlot, String unboundSlot) {