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 ddba98159e2 [feature](Nereids) support datev1 and datetimev1 (#28581)
ddba98159e2 is described below
commit ddba98159e246d3439bf1cbdd727d8d7fadf8a63
Author: morrySnow <[email protected]>
AuthorDate: Tue Dec 19 11:31:28 2023 +0800
[feature](Nereids) support datev1 and datetimev1 (#28581)
---
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 2 +-
.../org/apache/doris/nereids/types/DataType.java | 14 ++++
.../apache/doris/nereids/types/DateTimeType.java | 10 ++-
.../org/apache/doris/nereids/types/DateType.java | 10 ++-
.../doris/nereids/parser/NereidsParserTest.java | 25 +++++-
.../data/nereids_p0/datatype/test_datev1.out | 52 +++++++++++++
.../suites/nereids_p0/datatype/test_datev1.groovy | 89 ++++++++++++++++++++++
7 files changed, 198 insertions(+), 4 deletions(-)
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index be683f5ee4b..77e8188131f 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -753,7 +753,7 @@ specifiedPartition
constant
: NULL
#nullLiteral
- | type=(DATE | DATEV1 | DATEV2 | TIMESTAMP) STRING_LITERAL
#typeConstructor
+ | type=(DATE | DATEV1 | DATEV2 | TIMESTAMP) STRING_LITERAL
#typeConstructor
| number
#numericLiteral
| booleanValue
#booleanLiteral
| STRING_LITERAL
#stringLiteral
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java
index 8f887326216..b22c6093f9a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java
@@ -216,6 +216,9 @@ public abstract class DataType {
case "date":
dataType = DateType.INSTANCE;
break;
+ case "datev1":
+ dataType = DateType.NOT_CONVERSION;
+ break;
case "datev2":
dataType = DateV2Type.INSTANCE;
break;
@@ -234,6 +237,17 @@ public abstract class DataType {
throw new AnalysisException("Nereids do not support
type: " + type);
}
break;
+ case "datetimev1":
+ switch (types.size()) {
+ case 1:
+ dataType = DateTimeType.NOT_CONVERSION;
+ break;
+ case 2:
+ throw new AnalysisException("Nereids do not support
datetimev1 type with precision");
+ default:
+ throw new AnalysisException("Nereids do not support
type: " + type);
+ }
+ break;
case "datetimev2":
switch (types.size()) {
case 1:
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeType.java
index 250a69cbd37..8a0250d7b44 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeType.java
@@ -31,15 +31,23 @@ import java.time.temporal.ChronoUnit;
public class DateTimeType extends DateLikeType {
public static final DateTimeType INSTANCE = new DateTimeType();
+ public static final DateTimeType NOT_CONVERSION = new DateTimeType(false);
private static final int WIDTH = 16;
+ private final boolean shouldConversion;
+
private DateTimeType() {
+ this.shouldConversion = true;
+ }
+
+ private DateTimeType(boolean shouldConversion) {
+ this.shouldConversion = shouldConversion;
}
@Override
public DataType conversion() {
- if (Config.enable_date_conversion) {
+ if (Config.enable_date_conversion && shouldConversion) {
return DateTimeV2Type.SYSTEM_DEFAULT;
}
return this;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateType.java
index 69572895ddd..854c50d7f1e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateType.java
@@ -31,15 +31,23 @@ import java.time.temporal.ChronoUnit;
public class DateType extends DateLikeType {
public static final DateType INSTANCE = new DateType();
+ public static final DateType NOT_CONVERSION = new DateType(false);
private static final int WIDTH = 16;
+ private final boolean shouldConversion;
+
private DateType() {
+ this.shouldConversion = true;
+ }
+
+ private DateType(boolean shouldConversion) {
+ this.shouldConversion = shouldConversion;
}
@Override
public DataType conversion() {
- if (Config.enable_date_conversion) {
+ if (Config.enable_date_conversion && shouldConversion) {
return DateV2Type.INSTANCE;
}
return this;
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
index 9d0ca7176a4..bae4d7459ce 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
@@ -22,6 +22,7 @@ import org.apache.doris.common.Config;
import org.apache.doris.common.Pair;
import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.analyzer.UnboundResultSink;
+import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.exceptions.ParseException;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.nereids.trees.expressions.Cast;
@@ -37,6 +38,8 @@ import
org.apache.doris.nereids.trees.plans.logical.LogicalCTE;
import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
+import org.apache.doris.nereids.types.DateTimeType;
+import org.apache.doris.nereids.types.DateType;
import org.apache.doris.nereids.types.DecimalV2Type;
import org.apache.doris.nereids.types.DecimalV3Type;
import org.apache.doris.qe.SessionVariable;
@@ -305,7 +308,27 @@ public class NereidsParserTest extends ParserTestBase {
.stream()
.mapToLong(e ->
e.<Set<DecimalLiteral>>collect(DecimalLiteral.class::isInstance).size())
.sum();
- Assertions.assertEquals(doubleCount, Config.enable_decimal_conversion
? 0 : 1);
+ Assertions.assertEquals(Config.enable_decimal_conversion ? 0 : 1,
doubleCount);
+ }
+
+ @Test
+ public void testDatev1() {
+ String dv1 = "SELECT CAST('2023-12-18' AS DATEV1)";
+ NereidsParser nereidsParser = new NereidsParser();
+ LogicalPlan logicalPlan = (LogicalPlan)
nereidsParser.parseSingle(dv1).child(0);
+ Assertions.assertEquals(DateType.INSTANCE,
logicalPlan.getExpressions().get(0).getDataType());
+ }
+
+ @Test
+ public void testDatetimev1() {
+ String dtv1 = "SELECT CAST('2023-12-18' AS DATETIMEV1)";
+ NereidsParser nereidsParser = new NereidsParser();
+ LogicalPlan logicalPlan = (LogicalPlan)
nereidsParser.parseSingle(dtv1).child(0);
+ Assertions.assertEquals(DateTimeType.INSTANCE,
logicalPlan.getExpressions().get(0).getDataType());
+
+ String wrongDtv1 = "SELECT CAST('2023-12-18' AS DATETIMEV1(2))";
+ Assertions.assertThrows(AnalysisException.class, () ->
nereidsParser.parseSingle(wrongDtv1).child(0));
+
}
@Test
diff --git a/regression-test/data/nereids_p0/datatype/test_datev1.out
b/regression-test/data/nereids_p0/datatype/test_datev1.out
new file mode 100644
index 00000000000..f81b8f1a698
--- /dev/null
+++ b/regression-test/data/nereids_p0/datatype/test_datev1.out
@@ -0,0 +1,52 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !sql1 --
+2016-11-04
+
+-- !sql2 --
+2016-11-04
+
+-- !sql1 --
+1 2000-01-01 2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
+-- !sql2 --
+1 2000-01-01 2000-01-01T11:11:11 1 2000-01-01
2000-01-01T11:11:11
+2 2000-02-02 2000-02-02T11:11:11 2 2000-02-02
2000-02-02T11:11:11
+3 2000-03-02 2000-03-02T11:11:11 3 2000-03-02
2000-03-02T11:11:11
+
diff --git a/regression-test/suites/nereids_p0/datatype/test_datev1.groovy
b/regression-test/suites/nereids_p0/datatype/test_datev1.groovy
new file mode 100644
index 00000000000..3ea4d2561d5
--- /dev/null
+++ b/regression-test/suites/nereids_p0/datatype/test_datev1.groovy
@@ -0,0 +1,89 @@
+
+// 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_datev1") {
+ def tbName = "test_datev1_exprs"
+
+ sql """set enable_nereids_planner=true"""
+ sql """set enable_fallback_to_original_planner=false"""
+ sql """set enable_nereids_dml=true"""
+
+ sql "DROP TABLE IF EXISTS ${tbName}"
+ sql """
+ create table ${tbName}(k1 datetimev1, k2 int) distributed by
hash(k1) buckets 1 properties("replication_num" = "1");
+ """
+ sql """ insert into ${tbName} values("2016-11-04 00:00:01", 1); """
+
+ qt_sql1 """ select dt
+ from
+ (
+ select cast(k1 as datev1) as dt
+ from ${tbName}
+ ) r; """
+ qt_sql2 """ select dt
+ from
+ (
+ select cast(k1 as date) as dt
+ from ${tbName}
+ ) r; """
+ sql "DROP TABLE ${tbName}"
+
+ tbName = "test_datev1_runtime_filter"
+ sql "DROP TABLE IF EXISTS ${tbName}"
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tbName} (
+ c0 int,
+ c2 datev1,
+ c3 datetimev1
+ )
+ DISTRIBUTED BY HASH(c0) BUCKETS 5 properties("replication_num" =
"1");
+ """
+ sql "insert into ${tbName} values(1, '2000-01-01', '2000-01-01 11:11:11')"
+ sql "insert into ${tbName} values(2, '2000-02-02', '2000-02-02 11:11:11')"
+ sql "insert into ${tbName} values(3, '2000-03-02', '2000-03-02 11:11:11')"
+
+ qt_sql1 "select * from ${tbName} ORDER BY c2"
+
+ sql " set runtime_filter_type = 1; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql " set runtime_filter_type = 2; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql " set runtime_filter_type = 4; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql " set runtime_filter_type = 8; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql " set runtime_filter_wait_time_ms = 0; "
+
+ sql " set runtime_filter_type = 1; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql " set runtime_filter_type = 2; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql " set runtime_filter_type = 4; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql " set runtime_filter_type = 8; "
+ qt_sql2 "select * from ${tbName} a, ${tbName} b WHERE a.c3 = b.c3 ORDER BY
a.c2"
+
+ sql "DROP TABLE ${tbName}"
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]