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