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..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 @@ -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: @@ -1126,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(), slot.getQualifier())); } public static boolean sameTableName(String boundSlot, String unboundSlot) { 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)