This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 71a18663c4851f127535009ce779103b3cebe78c Author: morrySnow <[email protected]> AuthorDate: Tue Apr 16 17:19:07 2024 +0800 [fix](Nereids) could not query variant that not from table (#33704) --- .../doris/nereids/glue/translator/ExpressionTranslator.java | 6 ++++-- .../apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java | 8 +++++++- regression-test/data/variant_p0/sql/select_from_value.out | 4 ++++ regression-test/suites/variant_p0/sql/select_from_value.sql | 1 + 4 files changed, 16 insertions(+), 3 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 cc2034aa746..6c7a1bd82c1 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 @@ -209,8 +209,10 @@ public class ExpressionTranslator extends DefaultExpressionVisitor<Expr, PlanTra } SlotReference rewrittenSlot = (SlotReference) context.getConnectContext() .getStatementContext().getRewrittenSlotRefByOriginalExpr(elementAt); - Preconditions.checkNotNull(rewrittenSlot); - return context.findSlotRef(rewrittenSlot.getExprId()); + // rewrittenSlot == null means variant is not from table. so keep element_at function + if (rewrittenSlot != null) { + return context.findSlotRef(rewrittenSlot.getExprId()); + } } return visitScalarFunction(elementAt, context); } 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 56ca1b3a8c4..954675a28c8 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 @@ -94,6 +94,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; /** ExpressionAnalyzer */ @@ -370,7 +371,12 @@ public class ExpressionAnalyzer extends SubExprAnalyzer<ExpressionRewriteContext && !ConnectContext.get().getSessionVariable().isEnableRewriteElementAtToSlot()) { return boundFunction; } - Slot slot = boundFunction.getInputSlots().stream().findFirst().get(); + // TODO: push down logic here is very tricky, we will refactor it later + Set<Slot> inputSlots = boundFunction.getInputSlots(); + if (inputSlots.isEmpty()) { + return boundFunction; + } + Slot slot = inputSlots.iterator().next(); if (slot.hasUnbound()) { slot = (Slot) slot.accept(this, context); } diff --git a/regression-test/data/variant_p0/sql/select_from_value.out b/regression-test/data/variant_p0/sql/select_from_value.out new file mode 100644 index 00000000000..ef562a658e9 --- /dev/null +++ b/regression-test/data/variant_p0/sql/select_from_value.out @@ -0,0 +1,4 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_from_value -- +"b" + diff --git a/regression-test/suites/variant_p0/sql/select_from_value.sql b/regression-test/suites/variant_p0/sql/select_from_value.sql new file mode 100644 index 00000000000..389aa0df61f --- /dev/null +++ b/regression-test/suites/variant_p0/sql/select_from_value.sql @@ -0,0 +1 @@ +select cast('{"a":"b"}' as variant)['a']; \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
