This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch dev-1.0.1 in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit 01b8ef64cdd0d51c91525be7fc221e7db0c71de2 Author: morningman <[email protected]> AuthorDate: Mon Apr 11 11:40:23 2022 +0800 [Bug] Fix some bugs(rewrite rule/symbol transport) of like predicate (#8770) --- .../java/org/apache/doris/analysis/Analyzer.java | 2 - .../org/apache/doris/analysis/LikePredicate.java | 12 +++--- .../java/org/apache/doris/catalog/FunctionSet.java | 10 +++-- .../org/apache/doris/catalog/ScalarFunction.java | 18 +++++--- .../doris/rewrite/RewriteLikePredicateRule.java | 50 ---------------------- 5 files changed, 25 insertions(+), 67 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index 2addbbde7f..e46831100d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -49,7 +49,6 @@ import org.apache.doris.rewrite.RewriteAliasFunctionRule; import org.apache.doris.rewrite.RewriteBinaryPredicatesRule; import org.apache.doris.rewrite.RewriteEncryptKeyRule; import org.apache.doris.rewrite.RewriteFromUnixTimeRule; -import org.apache.doris.rewrite.RewriteLikePredicateRule; import org.apache.doris.rewrite.RewriteDateLiteralRule; import org.apache.doris.rewrite.mvrewrite.CountDistinctToBitmap; import org.apache.doris.rewrite.mvrewrite.CountDistinctToBitmapOrHLLRule; @@ -317,7 +316,6 @@ public class Analyzer { rules.add(RewriteDateLiteralRule.INSTANCE); rules.add(RewriteEncryptKeyRule.INSTANCE); rules.add(RewriteAliasFunctionRule.INSTANCE); - rules.add(RewriteLikePredicateRule.INSTANCE); List<ExprRewriteRule> onceRules = Lists.newArrayList(); onceRules.add(ExtractCommonFactorsRule.INSTANCE); onceRules.add(InferFiltersRule.INSTANCE); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java index 97d8f2afdd..8d72c2a112 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java @@ -113,14 +113,16 @@ public class LikePredicate extends Predicate { @Override public void analyzeImpl(Analyzer analyzer) throws AnalysisException { super.analyzeImpl(analyzer); - if (!getChild(0).getType().isStringType() && !getChild(0).getType().isFixedPointType() - && !getChild(0).getType().isNull()) { + if (getChild(0).getType().isObjectStored()) { throw new AnalysisException( - "left operand of " + op.toString() + " must be of type STRING or FIXED_POINT_TYPE: " + toSql()); + "left operand of " + op.toString() + " must not be Bitmap or HLL: " + toSql()); } if (!getChild(1).getType().isStringType() && !getChild(1).getType().isNull()) { - throw new AnalysisException( - "right operand of " + op.toString() + " must be of type STRING: " + toSql()); + throw new AnalysisException("right operand of " + op.toString() + " must be of type STRING: " + toSql()); + } + + if (!getChild(0).getType().isStringType()) { + uncheckedCastChild(Type.VARCHAR, 0); } fn = getBuiltinFunction(analyzer, op.toString(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java index 9ec3cfef5c..60912c9bdf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java @@ -1201,10 +1201,12 @@ public class FunctionSet<min_initIN9doris_udf12DecimalV2ValEEEvPNS2_15FunctionCo vecFns = Lists.newArrayList(); vectorizedFunctions.put(fn.functionName(), vecFns); } - ScalarFunction scalarFunction = (ScalarFunction)fn; - vecFns.add(ScalarFunction.createVecBuiltin(scalarFunction.functionName(), scalarFunction.getSymbolName(), - Lists.newArrayList(scalarFunction.getArgs()), scalarFunction.hasVarArgs(), - scalarFunction.getReturnType(), scalarFunction.isUserVisible(), scalarFunction.getNullableMode())); + ScalarFunction scalarFunction = (ScalarFunction) fn; + vecFns.add(ScalarFunction.createVecBuiltin(scalarFunction.functionName(), scalarFunction.getPrepareFnSymbol(), + scalarFunction.getSymbolName(), scalarFunction.getCloseFnSymbol(), + Lists.newArrayList(scalarFunction.getArgs()), scalarFunction.hasVarArgs(), + scalarFunction.getReturnType(), scalarFunction.isUserVisible(), + scalarFunction.getNullableMode())); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java index 66f0a6252b..d9c4b0252e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java @@ -284,16 +284,22 @@ public class ScalarFunction extends Function { public static ScalarFunction createVecBuiltinOperator( String name, String symbol, ArrayList<Type> argTypes, Type retType, NullableMode nullableMode) { - return createVecBuiltin(name, symbol, argTypes, false, retType, false, nullableMode); + return createVecBuiltin(name, null, symbol, null, argTypes, false, retType, false, nullableMode); } //TODO: This method should not be here, move to other place in the future - public static ScalarFunction createVecBuiltin( - String name, String symbol, ArrayList<Type> argTypes, - boolean hasVarArgs, Type retType, boolean userVisible, NullableMode nullableMode) { - ScalarFunction fn = new ScalarFunction( - new FunctionName(name), argTypes, retType, hasVarArgs, userVisible, true); + public static ScalarFunction createVecBuiltin(String name, String prepareFnSymbolBName, String symbol, + String closeFnSymbolName, ArrayList<Type> argTypes, boolean hasVarArgs, Type retType, boolean userVisible, + NullableMode nullableMode) { + ScalarFunction fn = new ScalarFunction(new FunctionName(name), argTypes, retType, hasVarArgs, userVisible, + true); + if (prepareFnSymbolBName != null) { + fn.prepareFnSymbol = prepareFnSymbolBName; + } fn.symbolName = symbol; + if (closeFnSymbolName != null) { + fn.closeFnSymbol = closeFnSymbolName; + } fn.nullableMode = nullableMode; return fn; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteLikePredicateRule.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteLikePredicateRule.java deleted file mode 100644 index c9679e8a33..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteLikePredicateRule.java +++ /dev/null @@ -1,50 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package org.apache.doris.rewrite; - -import org.apache.doris.analysis.Analyzer; -import org.apache.doris.analysis.CastExpr; -import org.apache.doris.analysis.Expr; -import org.apache.doris.analysis.LikePredicate; -import org.apache.doris.analysis.SlotRef; -import org.apache.doris.analysis.TypeDef; -import org.apache.doris.catalog.Type; -import org.apache.doris.common.AnalysisException; - -/** - * Rewrite `int` to `string` in like predicate - * in order to support `int` in like predicate, same as MySQL - */ -public class RewriteLikePredicateRule implements ExprRewriteRule { - public static RewriteLikePredicateRule INSTANCE = new RewriteLikePredicateRule(); - - @Override - public Expr apply(Expr expr, Analyzer analyzer, ExprRewriter.ClauseType clauseType) throws AnalysisException { - if (expr instanceof LikePredicate) { - Expr leftChild = expr.getChild(0); - if (leftChild instanceof SlotRef) { - Type type = leftChild.getType(); - if (type.isFixedPointType()) { - return new LikePredicate(((LikePredicate) expr).getOp(), - new CastExpr(new TypeDef(Type.VARCHAR), leftChild), expr.getChild(1)); - } - } - } - return expr; - } -} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
