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 fefaffadf1d6d2..f059fa67f8f5d7 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 @@ -979,6 +979,10 @@ public static Type getCmpType(Type t1, Type t2) { PrimitiveType t1ResultType = t1.getResultType().getPrimitiveType(); PrimitiveType t2ResultType = t2.getResultType().getPrimitiveType(); + if (canCompareDate(t1.getPrimitiveType(), t2.getPrimitiveType())) { + return Type.DATETIME; + } + // Following logical is compatible with MySQL. if ((t1ResultType == PrimitiveType.VARCHAR && t2ResultType == PrimitiveType.VARCHAR)) { return Type.VARCHAR; @@ -1007,6 +1011,22 @@ public static Type getCmpType(Type t1, Type t2) { return Type.DOUBLE; } + public static boolean canCompareDate(PrimitiveType t1, PrimitiveType t2) { + if (t1.isDateType()) { + if (t2.isDateType() || t2.isStringType() || t2.isIntegerType()) { + return true; + } + return false; + } else if (t2.isDateType()) { + if (t1.isStringType() || t1.isIntegerType()) { + return true; + } + return false; + } else { + return false; + } + } + public Type getMaxResolutionType() { Preconditions.checkState(true, "must implemented"); return null; diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index 71a8cbb5c2cdc3..3dacff51f55b7c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -388,6 +388,19 @@ public static void beforeClass() throws Exception { "\"driver\" = \"Oracle Driver\",\n" + "\"odbc_type\" = \"mysql\"\n" + ");"); + + createTable("create table test.tbl_int_date (" + + "`date` datetime NULL," + + "`day` date NULL," + + "`site_id` int(11) NULL )" + + " ENGINE=OLAP " + + "DUPLICATE KEY(`date`, `day`, `site_id`)" + + "DISTRIBUTED BY HASH(`site_id`) BUCKETS 10 " + + "PROPERTIES (\n" + + "\"replication_num\" = \"1\",\n" + + "\"in_memory\" = \"false\",\n" + + "\"storage_format\" = \"V2\"\n" + + ");"); } @AfterClass @@ -1318,7 +1331,6 @@ public void testAggregateSatisfyOlapTableDistribution() throws Exception { Assert.assertTrue(explainString.contains("AGGREGATE (update finalize)")); } - @Test public void testLeadAndLagFunction() throws Exception { connectContext.setDatabase("default_cluster:test"); @@ -1338,6 +1350,37 @@ public void testLeadAndLagFunction() throws Exception { explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); Assert.assertTrue(explainString.contains("lag(`query_time`, 1, 2)")); } + + @Test + public void testIntDateTime() throws Exception { + connectContext.setDatabase("default_cluster:test"); + //valid date + String sql = "select day from tbl_int_date where day in ('2020-10-30')"; + String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); + Assert.assertTrue(explainString.contains("PREDICATES: `day` IN ('2020-10-30 00:00:00')")); + //valid date + sql = "select day from tbl_int_date where day in ('2020-10-30','2020-10-29')"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); + Assert.assertTrue(explainString.contains("PREDICATES: `day` IN ('2020-10-30 00:00:00', '2020-10-29 00:00:00')")); + + //valid datetime + sql = "select day from tbl_int_date where date in ('2020-10-30 12:12:30')"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); + Assert.assertTrue(explainString.contains("PREDICATES: `date` IN ('2020-10-30 12:12:30')")); + //valid datetime + sql = "select day from tbl_int_date where date in ('2020-10-30')"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); + Assert.assertTrue(explainString.contains("PREDICATES: `date` IN ('2020-10-30 00:00:00')")); + + //int date + sql = "select day from tbl_int_date where day in (20201030)"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); + Assert.assertTrue(explainString.contains("PREDICATES: `day` IN ('2020-10-30 00:00:00')")); + //int datetime + sql = "select day from tbl_int_date where date in (20201030)"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); + Assert.assertTrue(explainString.contains("PREDICATES: `date` IN ('2020-10-30 00:00:00')")); + } }