You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2020/09/13 11:16:02 UTC

[incubator-doris] branch master updated: [SQL][Planner] Support int datekey format implicit cast to date (#4591)

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

morningman 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 4f4c22b  [SQL][Planner] Support int datekey format implicit cast to date (#4591)
4f4c22b is described below

commit 4f4c22b45960f583b9317e80e933ec434369f83f
Author: xueyan.li <as...@163.com>
AuthorDate: Sun Sep 13 19:15:53 2020 +0800

    [SQL][Planner] Support int datekey format implicit cast to date (#4591)
---
 .../org/apache/doris/analysis/BinaryPredicate.java |  4 +-
 .../java/org/apache/doris/analysis/CastExpr.java   |  2 +-
 .../org/apache/doris/analysis/DateLiteral.java     | 13 ++++++-
 .../org/apache/doris/analysis/StringLiteral.java   |  2 +-
 .../org/apache/doris/analysis/SelectStmtTest.java  | 45 ++++++++++++++++------
 5 files changed, 50 insertions(+), 16 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 ff5ccbf..30ae974 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
@@ -264,12 +264,12 @@ public class BinaryPredicate extends Predicate implements Writable {
 
     private boolean canCompareDate(PrimitiveType t1, PrimitiveType t2) {
         if (t1.isDateType()) {
-            if (t2.isDateType() || t2.isStringType()) {
+            if (t2.isDateType() || t2.isStringType() || t2.isIntegerType()) {
                 return true;
             }
             return false;
         } else if (t2.isDateType()) {
-            if (t1.isStringType()) {
+            if (t1.isStringType() || t1.isIntegerType()) {
                 return true;
             }
             return false;
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 aa39144..83480a9 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
@@ -289,7 +289,7 @@ public class CastExpr extends Expr {
         } else if (type.isStringType()) {
             return new StringLiteral(value.getStringValue());
         } else if (type.isDateType()) {
-            return new DateLiteral(value.getStringValue(), type);
+            return new StringLiteral(value.getStringValue()).convertToDate(type);
         } else if (type.isBoolean()) {
             return new BoolLiteral(value.getStringValue());
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index effaead..257e6fd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -60,7 +60,9 @@ public class DateLiteral extends LiteralExpr {
     private static final DateLiteral MIN_DATETIME = new DateLiteral(0000, 1, 1, 0, 0, 0);
     private static final DateLiteral MAX_DATETIME = new DateLiteral(9999, 12, 31, 23, 59, 59);
     public static final DateLiteral UNIX_EPOCH_TIME = new DateLiteral(1970, 01, 01, 00, 00, 00);
-    
+
+    private static final int DATEKEY_LENGTH = 8;
+
     private static DateTimeFormatter DATE_TIME_FORMATTER = null;
     private static DateTimeFormatter DATE_FORMATTER = null;
     /* 
@@ -71,6 +73,12 @@ public class DateLiteral extends LiteralExpr {
      * */
     private static DateTimeFormatter DATE_TIME_FORMATTER_TWO_DIGIT = null;
     private static DateTimeFormatter DATE_FORMATTER_TWO_DIGIT = null;
+    /*
+     *  The datekey type is widely used in data warehouses
+     *  For example, 20121229 means '2012-12-29'
+     *  and data in the form of 'yyyymmdd' is generally called the datekey type.
+     */
+    private static DateTimeFormatter DATEKEY_FORMATTER = null;
 
     private static Map<String, Integer> MONTH_NAME_DICT = Maps.newHashMap();
     private static Map<String, Integer> MONTH_ABBR_NAME_DICT = Maps.newHashMap();
@@ -82,6 +90,7 @@ public class DateLiteral extends LiteralExpr {
         try {
             DATE_TIME_FORMATTER = formatBuilder("%Y-%m-%d %H:%i:%s").toFormatter();
             DATE_FORMATTER = formatBuilder("%Y-%m-%d").toFormatter();
+            DATEKEY_FORMATTER = formatBuilder("%Y%m%d").toFormatter();
             DATE_TIME_FORMATTER_TWO_DIGIT = formatBuilder("%y-%m-%d %H:%i:%s").toFormatter();
             DATE_FORMATTER_TWO_DIGIT = formatBuilder("%y-%m-%d").toFormatter();
         } catch (AnalysisException e) {
@@ -249,6 +258,8 @@ public class DateLiteral extends LiteralExpr {
             if (type.equals(Type.DATE)) {
                 if (s.split("-")[0].length() == 2) {
                     dateTime = DATE_FORMATTER_TWO_DIGIT.parseLocalDateTime(s);
+                } else if(s.length() == DATEKEY_LENGTH) {
+                    dateTime = DATEKEY_FORMATTER.parseLocalDateTime(s);
                 } else {
                     dateTime = DATE_FORMATTER.parseLocalDateTime(s);
                 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
index 5e55ae1..baeda47 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
@@ -173,7 +173,7 @@ public class StringLiteral extends LiteralExpr {
      * @return new converted literal (not null)
      * @throws AnalysisException when entire given string cannot be transformed into a date
      */
-    private LiteralExpr convertToDate(Type targetType) throws AnalysisException {
+    public LiteralExpr convertToDate(Type targetType) throws AnalysisException {
         LiteralExpr newLiteral = null;
         try {
             newLiteral = new DateLiteral(value, targetType);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
index e49a8f2..b46c3aa 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/SelectStmtTest.java
@@ -72,7 +72,22 @@ public class SelectStmtTest {
                 "\"storage_type\" = \"COLUMN\",\n" +
                 "\"replication_num\" = \"1\"\n" +
                 ");";
-
+        String createDatePartitionTableStr = "CREATE TABLE db1.date_partition_table (\n" +
+                "  `dt` date NOT NULL COMMENT \"\",\n" +
+                "  `poi_id` bigint(20) NULL COMMENT \"poi_id\",\n" +
+                "  `uv1` bitmap BITMAP_UNION NOT NULL COMMENT \"\",\n" +
+                "  `uv2` bitmap BITMAP_UNION NOT NULL COMMENT \"\"\n" +
+                ") ENGINE=OLAP\n" +
+                "PARTITION BY RANGE(`dt`)\n" +
+                "(    PARTITION `p201701` VALUES LESS THAN (\"2020-09-08\"),\n" +
+                "    PARTITION `p201702` VALUES LESS THAN (\"2020-09-09\"),\n" +
+                "    PARTITION `p201703` VALUES LESS THAN (\"2020-09-10\"))\n" +
+                "DISTRIBUTED BY HASH(`poi_id`) BUCKETS 20\n" +
+                "PROPERTIES (\n" +
+                "\"replication_num\" = \"1\",\n" +
+                "\"in_memory\" = \"false\",\n" +
+                "\"storage_format\" = \"DEFAULT\"\n" +
+                ");";
         String tbl1 = "CREATE TABLE db1.table1 (\n" +
                 "  `siteid` int(11) NULL DEFAULT \"10\" COMMENT \"\",\n" +
                 "  `citycode` smallint(6) NULL COMMENT \"\",\n" +
@@ -106,6 +121,7 @@ public class SelectStmtTest {
         dorisAssert.withTable(createTblStmtStr)
                    .withTable(createBaseAllStmtStr)
                    .withTable(createPratitionTableStr)
+                   .withTable(createDatePartitionTableStr)
                    .withTable(tbl1)
                    .withTable(tbl2);
     }
@@ -431,25 +447,32 @@ public class SelectStmtTest {
         dorisAssert.query(sql).explainQuery();
         sql = "select rand() from db1.tbl1;";
         dorisAssert.query(sql).explainQuery();
-   }
+    }
 
     @Test
-    public void testVarcharToLongSupport() throws Exception {
-        String sql = "select count(*)\n" +
-                "from db1.partition_table\n" +
-                "where datekey='20200730'";
+    public void testImplicitConvertSupport() throws Exception {
+        String sql1 = "select count(*) from db1.partition_table where datekey='20200730'";
         Assert.assertTrue(dorisAssert
-                .query(sql)
+                .query(sql1)
                 .explainQuery()
                 .contains("`datekey` = 20200730"));
-        sql = "select count(*)\n" +
-                "from db1.partition_table\n" +
-                "where '20200730'=datekey";
+        String sql2 = "select count(*) from db1.partition_table where '20200730'=datekey";
         Assert.assertTrue(dorisAssert
-                .query(sql)
+                .query(sql2)
                 .explainQuery()
                 .contains("`datekey` = 20200730"));
+        String sql3= "select count() from db1.date_partition_table where dt=20200908";
+        Assert.assertTrue(dorisAssert
+                .query(sql3)
+                .explainQuery()
+                .contains("`dt` = '2020-09-08 00:00:00'"));
+        String sql4= "select count() from db1.date_partition_table where dt='2020-09-08'";
+        Assert.assertTrue(dorisAssert
+                .query(sql4)
+                .explainQuery()
+                .contains("`dt` = '2020-09-08 00:00:00'"));
     }
+
     @Test
     public void testDeleteSign() throws Exception {
         String sql1 = "SELECT * FROM db1.table1  LEFT ANTI JOIN db1.table2 ON db1.table1.siteid = db1.table2.siteid;";


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