From 855def58e8e20414fda450c32b0f10594cee124d Mon Sep 17 00:00:00 2001 From: 924060929 Date: Mon, 1 Sep 2025 14:17:23 +0800 Subject: [PATCH] [opt](nereids) improve performance of cast big string to complex type (#55476) improve performance of cast big string to complex type 1. avoid throw cast exception 2. avoid compute full hash code of the big string literal ```sql select cast('[1,2,3,4,5,6,7,8,...,99999]' as array); ``` --- .../expression/rules/FoldConstantRuleOnFE.java | 4 ++++ .../expressions/literal/StringLikeLiteral.java | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java index afd6e788cd10ed..d9b794707f9db6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java @@ -494,6 +494,10 @@ public Expression visitCast(Cast cast, ExpressionRewriteContext context) { } } try { + // TODO: support no throw exception in `checkedCastTo` and return Optional + if (cast.child().getDataType().isStringLikeType() && dataType.isComplexType()) { + return cast; + } Expression castResult = child.checkedCastTo(dataType); if (!Objects.equals(castResult, cast) && !Objects.equals(castResult, child)) { castResult = rewrite(castResult, context); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java index d1d98fe218afd5..9c52e763a1ae6e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/StringLikeLiteral.java @@ -75,6 +75,24 @@ public boolean equals(Object o) { return Objects.equals(value, that.value); } + @Override + public int fastChildrenHashCode() { + return doComputeHashCode(); + } + + @Override + protected int computeHashCode() { + return doComputeHashCode(); + } + + private int doComputeHashCode() { + if (value != null && value.length() > 36) { + return value.substring(0, 36).hashCode(); + } else { + return Objects.hashCode(getValue()); + } + } + @Override public String toString() { return "'" + value + "'";