You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by zh...@apache.org on 2020/04/21 00:30:13 UTC

[incubator-doris] branch master updated: [Bug] Partition key's type has been changed after executing queries (#3348)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new a2c8d14  [Bug] Partition key's type has been changed after executing queries (#3348)
a2c8d14 is described below

commit a2c8d14fd902cd858a43f62ca674b5103b9d2f47
Author: Mingyu Chen <mo...@gmail.com>
AuthorDate: Tue Apr 21 08:30:02 2020 +0800

    [Bug] Partition key's type has been changed after executing queries (#3348)
    
    Expr's `uncheckedCastTo()` method should return a new instance of casted expr.
    The origin expr should remain unchanged.
---
 .../org/apache/doris/analysis/DateLiteral.java     |  8 ++-
 .../main/java/org/apache/doris/analysis/Expr.java  |  1 -
 .../org/apache/doris/analysis/FloatLiteral.java    |  6 +-
 .../java/org/apache/doris/analysis/IntLiteral.java |  6 +-
 .../org/apache/doris/analysis/NullLiteral.java     |  6 +-
 .../org/apache/doris/analysis/StringLiteral.java   |  5 +-
 .../java/org/apache/doris/planner/EsScanNode.java  |  1 -
 .../java/org/apache/doris/analysis/ExprTest.java   | 73 ++++++++++++++++++++++
 8 files changed, 96 insertions(+), 10 deletions(-)

diff --git a/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java b/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java
index cb80a79..b2d2f49 100644
--- a/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -321,14 +321,16 @@ public class DateLiteral extends LiteralExpr {
     @Override
     protected Expr uncheckedCastTo(Type targetType) throws AnalysisException {
         if (targetType.isDateType()) {
+            if (type.equals(targetType)) {
+                return this;
+            }
             if (targetType.equals(Type.DATE)) {
-                this.castToDate();                            
+                return new DateLiteral(this.year, this.month, this.day);
             } else if (targetType.equals(Type.DATETIME)) {
-                this.type = Type.DATETIME;                            
+                return new DateLiteral(this.year, this.month, this.day, this.hour, this.minute, this.second);
             } else {
                 throw new AnalysisException("Error date literal type : " + type);
             }
-            return this;
         } else if (targetType.isStringType()) {
             return new StringLiteral(getStringValue());
         } else if (Type.isImplicitlyCastable(this.type, targetType, true)) {
diff --git a/fe/src/main/java/org/apache/doris/analysis/Expr.java b/fe/src/main/java/org/apache/doris/analysis/Expr.java
index 76ceaf2..9a1b66e 100644
--- a/fe/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/src/main/java/org/apache/doris/analysis/Expr.java
@@ -1227,7 +1227,6 @@ abstract public class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
      * Create an expression equivalent to 'this' but returning targetType;
      * possibly by inserting an implicit cast,
      * or by returning an altogether new expression
-     * or by returning 'this' with a modified return type'.
      *
      * @param targetType type to be cast to
      * @return cast expression, or converted literal,
diff --git a/fe/src/main/java/org/apache/doris/analysis/FloatLiteral.java b/fe/src/main/java/org/apache/doris/analysis/FloatLiteral.java
index af49a88..ea73d97 100644
--- a/fe/src/main/java/org/apache/doris/analysis/FloatLiteral.java
+++ b/fe/src/main/java/org/apache/doris/analysis/FloatLiteral.java
@@ -156,7 +156,11 @@ public class FloatLiteral extends LiteralExpr {
             return super.uncheckedCastTo(targetType);
         }
         if (targetType.isFloatingPointType()) {
-            type = targetType;
+            if (!type.equals(targetType)) {
+                FloatLiteral floatLiteral = new FloatLiteral(this);
+                floatLiteral.setType(targetType);
+                return floatLiteral;
+            }
             return this;
         } else if (targetType.isDecimal() || targetType.isDecimalV2()) {
             return new DecimalLiteral(new BigDecimal(value));
diff --git a/fe/src/main/java/org/apache/doris/analysis/IntLiteral.java b/fe/src/main/java/org/apache/doris/analysis/IntLiteral.java
index 1033c8c..86112c5 100644
--- a/fe/src/main/java/org/apache/doris/analysis/IntLiteral.java
+++ b/fe/src/main/java/org/apache/doris/analysis/IntLiteral.java
@@ -296,7 +296,11 @@ public class IntLiteral extends LiteralExpr {
         }
         if (targetType.isFixedPointType()) {
             if (!targetType.isScalarType(PrimitiveType.LARGEINT)) {
-                this.type = targetType;
+                if (!type.equals(targetType)) {
+                    IntLiteral intLiteral = new IntLiteral(this);
+                    intLiteral.setType(targetType);
+                    return intLiteral;
+                }
                 return this;
             } else {
                 //return new LargeIntLiteral(Long.toString(value));
diff --git a/fe/src/main/java/org/apache/doris/analysis/NullLiteral.java b/fe/src/main/java/org/apache/doris/analysis/NullLiteral.java
index 2d937e0..1a7114a 100644
--- a/fe/src/main/java/org/apache/doris/analysis/NullLiteral.java
+++ b/fe/src/main/java/org/apache/doris/analysis/NullLiteral.java
@@ -120,7 +120,11 @@ public class NullLiteral extends LiteralExpr {
     @Override
     protected Expr uncheckedCastTo(Type targetType) throws AnalysisException {
         Preconditions.checkState(targetType.isValid());
-        type = targetType;
+        if (!type.equals(targetType)) {
+            NullLiteral nullLiteral = new NullLiteral(this);
+            nullLiteral.setType(targetType);
+            return nullLiteral;
+        }
         return this;
     }
 
diff --git a/fe/src/main/java/org/apache/doris/analysis/StringLiteral.java b/fe/src/main/java/org/apache/doris/analysis/StringLiteral.java
index 8e90136..e6dcdea 100644
--- a/fe/src/main/java/org/apache/doris/analysis/StringLiteral.java
+++ b/fe/src/main/java/org/apache/doris/analysis/StringLiteral.java
@@ -207,8 +207,9 @@ public class StringLiteral extends LiteralExpr {
         } else if (targetType.equals(type)) {
             return this;
         } else if (targetType.isStringType()) {
-            type = targetType;
-            return this;
+            StringLiteral stringLiteral = new StringLiteral(this);
+            stringLiteral.setType(targetType);
+            return stringLiteral;
         }
         return super.uncheckedCastTo(targetType);
     }
diff --git a/fe/src/main/java/org/apache/doris/planner/EsScanNode.java b/fe/src/main/java/org/apache/doris/planner/EsScanNode.java
index 48ab435..1412ef4 100644
--- a/fe/src/main/java/org/apache/doris/planner/EsScanNode.java
+++ b/fe/src/main/java/org/apache/doris/planner/EsScanNode.java
@@ -128,7 +128,6 @@ public class EsScanNode extends ScanNode {
             esScanNode.setFields_context(table.fieldsContext());
         }
         msg.es_scan_node = esScanNode;
-
     }
 
     // TODO(ygl) assign backend that belong to the same cluster
diff --git a/fe/src/test/java/org/apache/doris/analysis/ExprTest.java b/fe/src/test/java/org/apache/doris/analysis/ExprTest.java
index 92c7dc4..cf924f0 100644
--- a/fe/src/test/java/org/apache/doris/analysis/ExprTest.java
+++ b/fe/src/test/java/org/apache/doris/analysis/ExprTest.java
@@ -18,6 +18,7 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 
@@ -86,4 +87,76 @@ public class ExprTest {
         Assert.assertNotEquals(tableBColumns, null);
         Assert.assertTrue(tableBColumns.contains("c1"));
     }
+
+    @Test
+    public void testUncheckedCastTo() throws AnalysisException {
+        // uncheckedCastTo should return new object
+
+        // date
+        DateLiteral dateLiteral = new DateLiteral(2020, 4, 5, 12, 0, 5);
+        Assert.assertTrue(dateLiteral.getType().equals(Type.DATETIME));
+        DateLiteral castLiteral = (DateLiteral) dateLiteral.uncheckedCastTo(Type.DATE);
+        Assert.assertFalse(dateLiteral == castLiteral);
+        Assert.assertTrue(dateLiteral.getType().equals(Type.DATETIME));
+        Assert.assertTrue(castLiteral.getType().equals(Type.DATE));
+
+        Assert.assertEquals(0, castLiteral.getHour());
+        Assert.assertEquals(0, castLiteral.getMinute());
+        Assert.assertEquals(0, castLiteral.getSecond());
+
+        Assert.assertEquals(12, dateLiteral.getHour());
+        Assert.assertEquals(0, dateLiteral.getMinute());
+        Assert.assertEquals(5, dateLiteral.getSecond());
+
+        DateLiteral dateLiteral2 = new DateLiteral(2020, 4, 5);
+        Assert.assertTrue(dateLiteral2.getType().equals(Type.DATE));
+        castLiteral = (DateLiteral) dateLiteral2.uncheckedCastTo(Type.DATETIME);
+        Assert.assertFalse(dateLiteral2 == castLiteral);
+        Assert.assertTrue(dateLiteral2.getType().equals(Type.DATE));
+        Assert.assertTrue(castLiteral.getType().equals(Type.DATETIME));
+
+        Assert.assertEquals(0, castLiteral.getHour());
+        Assert.assertEquals(0, castLiteral.getMinute());
+        Assert.assertEquals(0, castLiteral.getSecond());
+
+        // float
+        FloatLiteral floatLiteral = new FloatLiteral(0.1, Type.FLOAT);
+        Assert.assertTrue(floatLiteral.getType().equals(Type.FLOAT));
+        FloatLiteral castFloatLiteral = (FloatLiteral) floatLiteral.uncheckedCastTo(Type.DOUBLE);
+        Assert.assertTrue(floatLiteral.getType().equals(Type.FLOAT));
+        Assert.assertTrue(castFloatLiteral.getType().equals(Type.DOUBLE));
+        Assert.assertFalse(floatLiteral == castFloatLiteral);
+        FloatLiteral castFloatLiteral2 = (FloatLiteral) floatLiteral.uncheckedCastTo(Type.FLOAT);
+        Assert.assertTrue(floatLiteral == castFloatLiteral2);
+
+        // int
+        IntLiteral intLiteral = new IntLiteral(200);
+        Assert.assertTrue(intLiteral.getType().equals(Type.SMALLINT));
+        IntLiteral castIntLiteral = (IntLiteral) intLiteral.uncheckedCastTo(Type.INT);
+        Assert.assertTrue(intLiteral.getType().equals(Type.SMALLINT));
+        Assert.assertTrue(castIntLiteral.getType().equals(Type.INT));
+        Assert.assertFalse(intLiteral == castIntLiteral);
+        IntLiteral castIntLiteral2 = (IntLiteral) intLiteral.uncheckedCastTo(Type.SMALLINT);
+        Assert.assertTrue(intLiteral == castIntLiteral2);
+
+        // null
+        NullLiteral nullLiternal = NullLiteral.create(Type.DATE);
+        Assert.assertTrue(nullLiternal.getType().equals(Type.DATE));
+        NullLiteral castNullLiteral = (NullLiteral) nullLiternal.uncheckedCastTo(Type.DATETIME);
+        Assert.assertTrue(nullLiternal.getType().equals(Type.DATE));
+        Assert.assertTrue(castNullLiteral.getType().equals(Type.DATETIME));
+        Assert.assertFalse(nullLiternal == castNullLiteral);
+        NullLiteral castNullLiteral2 = (NullLiteral) nullLiternal.uncheckedCastTo(Type.DATE);
+        Assert.assertTrue(nullLiternal == castNullLiteral2);
+
+        // string
+        StringLiteral stringLiteral = new StringLiteral("abc");
+        Assert.assertTrue(stringLiteral.getType().equals(Type.VARCHAR));
+        StringLiteral castStringLiteral = (StringLiteral) stringLiteral.uncheckedCastTo(Type.CHAR);
+        Assert.assertTrue(stringLiteral.getType().equals(Type.VARCHAR));
+        Assert.assertTrue(castStringLiteral.getType().equals(Type.CHAR));
+        Assert.assertFalse(stringLiteral == castStringLiteral);
+        StringLiteral castStringLiteral2 = (StringLiteral) stringLiteral.uncheckedCastTo(Type.VARCHAR);
+        Assert.assertTrue(stringLiteral == castStringLiteral2);
+    }
 }


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