This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 192cdd4d76 [Bug](cast) change binary predicate finally cast to varchar 
(#11796)
192cdd4d76 is described below

commit 192cdd4d760d9bef7669fd7811ff2153f979ee4f
Author: Pxl <pxl...@qq.com>
AuthorDate: Sun Aug 21 10:13:47 2022 +0800

    [Bug](cast) change binary predicate finally cast to varchar (#11796)
---
 .../org/apache/doris/analysis/BinaryPredicate.java | 16 +++------
 .../java/org/apache/doris/analysis/CastExpr.java   |  1 -
 .../main/java/org/apache/doris/catalog/Type.java   | 40 ++++++++++++++++++----
 .../type_inference/test_binary_predicate_cast.out  |  6 ++++
 .../test_binary_predicate_cast.groovy              | 36 +++++++++++++++++++
 5 files changed, 80 insertions(+), 19 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
index 154e724f4f..83d4e3cdc4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
@@ -376,18 +376,12 @@ public class BinaryPredicate extends Predicate implements 
Writable {
         // When int column compares with string, Mysql will convert string to 
int.
         // So it is also compatible with Mysql.
 
-        if (t1 == PrimitiveType.BIGINT && (t2 == PrimitiveType.VARCHAR || t2 
== PrimitiveType.STRING)) {
-            Expr rightChild = getChild(1);
-            Long parsedLong = Type.tryParseToLong(rightChild);
-            if (parsedLong != null) {
-                return Type.BIGINT;
+        if (t1.isStringType() || t2.isStringType()) {
+            if ((t1 == PrimitiveType.BIGINT || t1 == PrimitiveType.LARGEINT) 
&& Type.canParseTo(getChild(1), t1)) {
+                return Type.fromPrimitiveType(t1);
             }
-        }
-        if ((t1 == PrimitiveType.VARCHAR || t1 == PrimitiveType.STRING) && t2 
== PrimitiveType.BIGINT) {
-            Expr leftChild = getChild(0);
-            Long parsedLong = Type.tryParseToLong(leftChild);
-            if (parsedLong != null) {
-                return Type.BIGINT;
+            if ((t2 == PrimitiveType.BIGINT || t2 == PrimitiveType.LARGEINT) 
&& Type.canParseTo(getChild(0), t2)) {
+                return Type.fromPrimitiveType(t2);
             }
         }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
index 8b63d461ff..c07a8d8029 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
@@ -414,7 +414,6 @@ public class CastExpr extends Expr {
         } else if (type.isDecimalV2() || type.isDecimalV3()) {
             return new DecimalLiteral(value.getStringValue());
         } else if (type.isFloatingPointType()) {
-
             return new FloatLiteral(value.getDoubleValue(), type);
         } else if (type.isStringType()) {
             return new StringLiteral(value.getStringValue());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
index 2520c9850c..164f125da4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Type.java
@@ -18,7 +18,9 @@
 package org.apache.doris.catalog;
 
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.LargeIntLiteral;
 import org.apache.doris.analysis.StringLiteral;
+import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.Pair;
 import org.apache.doris.thrift.TColumnType;
@@ -545,15 +547,39 @@ public abstract class Type {
     }
 
     /**
-     * Returns null if this expr is not instance of StringLiteral or 
StringLiteral
-     * inner value could not parse to long. otherwise return parsed Long 
result.
+     * Returns true if expr is StringLiteral and can parse to valid type, false
+     * otherwise.
+     * This function only support LargeInt and BigInt now.
      */
-    public static Long tryParseToLong(Expr expectStringExpr) {
-        if (expectStringExpr instanceof StringLiteral) {
-            String value = ((StringLiteral) expectStringExpr).getValue();
-            return Longs.tryParse(value);
+    public static boolean canParseTo(Expr expr, PrimitiveType type) {
+        if (expr instanceof StringLiteral) {
+            if (type == PrimitiveType.BIGINT) {
+                return canParseToBigInt((StringLiteral) expr);
+            } else if (type == PrimitiveType.LARGEINT) {
+                return canParseToLargeInt((StringLiteral) expr);
+            }
         }
-        return null;
+        return false;
+    }
+
+    /**
+     * Returns true if expr can parse to valid BigInt, false otherwise.
+     */
+    private static boolean canParseToBigInt(StringLiteral expr) {
+        String value = ((StringLiteral) expr).getValue();
+        return Longs.tryParse(value) != null;
+    }
+
+    /**
+     * Returns true if expr can parse to valid LargeInt, false otherwise.
+     */
+    private static boolean canParseToLargeInt(Expr expr) {
+        try {
+            new LargeIntLiteral(((StringLiteral) expr).getValue());
+        } catch (AnalysisException e) {
+            return false;
+        }
+        return true;
     }
 
     /**
diff --git 
a/regression-test/data/query/type_inference/test_binary_predicate_cast.out 
b/regression-test/data/query/type_inference/test_binary_predicate_cast.out
new file mode 100644
index 0000000000..bef4895eb9
--- /dev/null
+++ b/regression-test/data/query/type_inference/test_binary_predicate_cast.out
@@ -0,0 +1,6 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !test_largeint_string --
+10003  195456789345678955654444443878
+10004  195456789345678955654444443878
+10006  195456789345678955654444443878
+10009  195456789345678955654444443878
diff --git 
a/regression-test/suites/query/type_inference/test_binary_predicate_cast.groovy 
b/regression-test/suites/query/type_inference/test_binary_predicate_cast.groovy
new file mode 100644
index 0000000000..c3e7b6d72d
--- /dev/null
+++ 
b/regression-test/suites/query/type_inference/test_binary_predicate_cast.groovy
@@ -0,0 +1,36 @@
+// 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.
+
+suite("test_binary_predicate_cast") {
+sql """
+    CREATE TABLE IF NOT EXISTS test_demo
+    (
+    `user_id` LARGEINT NOT NULL COMMENT "用户id",
+    `phone` LARGEINT COMMENT "用户电话"
+    )
+    UNIQUE KEY(`user_id`)
+    DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
+    PROPERTIES (
+    "replication_allocation" = "tag.location.default: 1"
+    );
+    """
+sql """insert into test_demo values 
(10003,195456789345678955654444443875),(10003,195456789345678955654444443874),(10003,195456789345678955654444443873),(10003,195456789345678955654444443877),(10003,195456789345678955654444443878),(10004,195456789345678955654444443878),(10005,195456789345678955654444443877),(10006,195456789345678955654444443878),(10009,195456789345678955654444443878)
+    """
+
+qt_test_largeint_string "select * from test_demo where 
phone='195456789345678955654444443878' order by user_id"
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to