This is an automated email from the ASF dual-hosted git repository.
kxiao 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 8b561cfb03 [fix](nereids)create datev2 and datetimev2 literal if
enable_date_conversion is true (#21065)
8b561cfb03 is described below
commit 8b561cfb03da08dd42ebadd6f1ff9c68ea7b1b7e
Author: starocean999 <[email protected]>
AuthorDate: Wed Jun 21 20:29:36 2023 +0800
[fix](nereids)create datev2 and datetimev2 literal if
enable_date_conversion is true (#21065)
---
.../apache/doris/nereids/parser/LogicalPlanBuilder.java | 12 +++++++-----
.../org/apache/doris/nereids/parser/NereidsParser.java | 3 +--
.../doris/nereids/trees/expressions/literal/Literal.java | 4 ++--
.../main/java/org/apache/doris/nereids/types/DataType.java | 14 +++++++++-----
.../doris/nereids/rules/expression/FoldConstantTest.java | 4 +++-
.../java/org/apache/doris/nereids/types/DataTypeTest.java | 11 ++++-------
.../data/nereids_tpcds_shape_sf100_p0/shape/query94.out | 2 +-
.../data/nereids_tpcds_shape_sf100_p0/shape/query95.out | 2 +-
8 files changed, 28 insertions(+), 24 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 8492390979..dc186625be 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -193,6 +193,7 @@ import
org.apache.doris.nereids.trees.expressions.literal.BigIntLiteral;
import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal;
import org.apache.doris.nereids.trees.expressions.literal.DateV2Literal;
import org.apache.doris.nereids.trees.expressions.literal.DecimalLiteral;
import org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal;
@@ -1020,7 +1021,8 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
@Override
public Expression visitCast(DorisParser.CastContext ctx) {
- DataType dataType = typedVisit(ctx.dataType());
+ List<String> types = typedVisit(ctx.dataType());
+ DataType dataType = DataType.convertPrimitiveFromStrings(types, true);
Expression cast = ParserUtils.withOrigin(ctx, () ->
new Cast(getExpression(ctx.expression()), dataType));
if (dataType.isStringLikeType() && ((CharacterType) dataType).getLen()
>= 0) {
@@ -1182,9 +1184,9 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
String type = ctx.type.getText().toUpperCase();
switch (type) {
case "DATE":
- return new DateLiteral(value);
+ return Config.enable_date_conversion ? new
DateV2Literal(value) : new DateLiteral(value);
case "TIMESTAMP":
- return new DateTimeLiteral(value);
+ return Config.enable_date_conversion ? new
DateTimeV2Literal(value) : new DateTimeLiteral(value);
case "DATEV2":
return new DateV2Literal(value);
default:
@@ -1880,11 +1882,11 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
}
@Override
- public DataType visitPrimitiveDataType(PrimitiveDataTypeContext ctx) {
+ public List<String> visitPrimitiveDataType(PrimitiveDataTypeContext ctx) {
String dataType = ctx.identifier().getText().toLowerCase(Locale.ROOT);
List<String> l = Lists.newArrayList(dataType);
ctx.INTEGER_VALUE().stream().map(ParseTree::getText).forEach(l::add);
- return DataType.convertPrimitiveFromStrings(l);
+ return l;
}
private Expression parseFunctionWithOrderKeys(String functionName, boolean
isDistinct,
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
index 895f057a69..70065c7eda 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
@@ -25,7 +25,6 @@ import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
-import org.apache.doris.nereids.types.DataType;
import com.google.common.collect.Lists;
import org.antlr.v4.runtime.CharStreams;
@@ -75,7 +74,7 @@ public class NereidsParser {
return parse(expression, DorisParser::expression);
}
- public DataType parseDataType(String dataType) {
+ public List<String> parseDataType(String dataType) {
return parse(dataType, DorisParser::dataType);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java
index 58c7ee0999..123aa618f4 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java
@@ -220,9 +220,9 @@ public abstract class Literal extends Expression implements
LeafExpression, Comp
} else if (targetType instanceof StringType) {
return new StringLiteral(desc);
} else if (targetType.isDateType()) {
- return Config.enable_date_conversion ? new DateV2Literal(desc) :
new DateLiteral(desc);
+ return new DateLiteral(desc);
} else if (targetType.isDateTimeType()) {
- return Config.enable_date_conversion ? new DateTimeV2Literal(desc)
: new DateTimeLiteral(desc);
+ return new DateTimeLiteral(desc);
} else if (targetType.isDecimalV2Type()) {
return new DecimalLiteral((DecimalV2Type) targetType, new
BigDecimal(desc));
} else if (targetType.isDecimalV3Type()) {
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 0941a4a1e9..affa20df2b 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
@@ -111,7 +111,7 @@ public abstract class DataType implements AbstractDataType {
* @param types data type in string representation
* @return data type in Nereids
*/
- public static DataType convertPrimitiveFromStrings(List<String> types) {
+ public static DataType convertPrimitiveFromStrings(List<String> types,
boolean tryConvert) {
String type = types.get(0).toLowerCase().trim();
switch (type) {
case "bool":
@@ -133,7 +133,7 @@ public abstract class DataType implements AbstractDataType {
case "double":
return DoubleType.INSTANCE;
case "decimal":
- if (Config.enable_decimal_conversion) {
+ if (Config.enable_decimal_conversion && tryConvert) {
switch (types.size()) {
case 1:
return DecimalV3Type.SYSTEM_DEFAULT;
@@ -198,7 +198,8 @@ public abstract class DataType implements AbstractDataType {
case "null_type": // ScalarType.NULL.toSql() return "null_type",
so support it
return NullType.INSTANCE;
case "date":
- return DateType.INSTANCE;
+ return Config.enable_date_conversion && tryConvert ?
DateV2Type.INSTANCE
+ : DateType.INSTANCE;
case "datev2":
return DateV2Type.INSTANCE;
case "time":
@@ -206,7 +207,9 @@ public abstract class DataType implements AbstractDataType {
case "datetime":
switch (types.size()) {
case 1:
- return DateTimeType.INSTANCE;
+ return Config.enable_date_conversion && tryConvert
+ ? DateTimeV2Type.SYSTEM_DEFAULT
+ : DateTimeType.INSTANCE;
case 2:
return
DateTimeV2Type.of(Integer.parseInt(types.get(1)));
default:
@@ -243,7 +246,8 @@ public abstract class DataType implements AbstractDataType {
*/
public static DataType convertFromString(String type) {
try {
- return PARSER.parseDataType(type);
+ List<String> types = PARSER.parseDataType(type);
+ return DataType.convertPrimitiveFromStrings(types, false);
} catch (Exception e) {
// TODO: remove it when Nereids parser support array
if (type.startsWith("array")) {
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
index bdf937815d..c9f74bc7f2 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
@@ -229,7 +229,9 @@ public class FoldConstantTest extends
ExpressionRewriteTestHelper {
interval = "date '1991-05-01' + interval 10 / 2 + 1 day";
e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
- e8 = new DateLiteral(1991, 5, 7);
+ e8 = Config.enable_date_conversion
+ ? new DateV2Literal(1991, 5, 7)
+ : new DateLiteral(1991, 5, 7);
assertRewrite(e7, e8);
interval = "interval '1' day + '1991-05-01'";
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/types/DataTypeTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/types/DataTypeTest.java
index 03f399e114..c0c14bcb4a 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/types/DataTypeTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/types/DataTypeTest.java
@@ -18,7 +18,6 @@
package org.apache.doris.nereids.types;
import org.apache.doris.catalog.Type;
-import org.apache.doris.common.Config;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -79,9 +78,7 @@ public class DataTypeTest {
// double
Assertions.assertEquals(DoubleType.INSTANCE,
DataType.convertFromString("double"));
// decimalv2
- Assertions.assertEquals(
- Config.enable_decimal_conversion ?
DecimalV3Type.createDecimalV3Type(13, 9)
- : DecimalV2Type.createDecimalV2Type(13, 9),
+ Assertions.assertEquals(DecimalV2Type.createDecimalV2Type(13, 9),
DataType.convertFromString("decimal(13, 9)"));
// decimalv3
Assertions.assertEquals(DecimalV3Type.createDecimalV3Type(13, 9),
@@ -105,10 +102,10 @@ public class DataTypeTest {
Assertions.assertEquals(DateV2Type.INSTANCE,
DataType.convertFromString("datev2"));
// time
Assertions.assertEquals(TimeType.INSTANCE,
DataType.convertFromString("time"));
+
// datetime
- Assertions.assertEquals(Config.enable_date_conversion ?
DateTimeV2Type.of(0) : DateTimeType.INSTANCE,
- Config.enable_date_conversion ?
DataType.convertFromString("datetimev2(0)")
- : DataType.convertFromString("datetime"));
+ Assertions.assertEquals(DateTimeType.INSTANCE,
DataType.convertFromString("datetime"));
+
// datetimev2
Assertions.assertEquals(DateTimeV2Type.of(3),
DataType.convertFromString("datetimev2(3)"));
// hll
diff --git
a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query94.out
b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query94.out
index 95758b3574..e12f8482f5 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query94.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query94.out
@@ -9,7 +9,7 @@ PhysicalTopN
------------PhysicalProject
--------------hashJoin[INNER_JOIN](ws1.ws_ship_date_sk = date_dim.d_date_sk)
----------------PhysicalProject
-------------------filter((date_dim.d_date >= 2000-02-01)(cast(d_date as
DATETIMEV2(0)) <= cast(days_add(cast('2000-2-01' as DATE), INTERVAL 60 DAY) as
DATETIMEV2(0))))
+------------------filter((date_dim.d_date >= 2000-02-01)(cast(d_date as
DATETIMEV2(0)) <= cast(days_add(cast('2000-2-01' as DATEV2), INTERVAL 60 DAY)
as DATETIMEV2(0))))
--------------------PhysicalOlapScan[date_dim]
----------------PhysicalDistribute
------------------PhysicalProject
diff --git
a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query95.out
b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query95.out
index 50b0b5f13c..ccb9b6ff50 100644
--- a/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query95.out
+++ b/regression-test/data/nereids_tpcds_shape_sf100_p0/shape/query95.out
@@ -19,7 +19,7 @@ CteAnchor[cteId= ( CTEId#3=] )
--------------PhysicalProject
----------------hashJoin[INNER_JOIN](ws1.ws_ship_date_sk = date_dim.d_date_sk)
------------------PhysicalProject
---------------------filter((date_dim.d_date >= 1999-02-01)(cast(d_date as
DATETIMEV2(0)) <= cast(days_add(cast('1999-2-01' as DATE), INTERVAL 60 DAY) as
DATETIMEV2(0))))
+--------------------filter((date_dim.d_date >= 1999-02-01)(cast(d_date as
DATETIMEV2(0)) <= cast(days_add(cast('1999-2-01' as DATEV2), INTERVAL 60 DAY)
as DATETIMEV2(0))))
----------------------PhysicalOlapScan[date_dim]
------------------PhysicalDistribute
--------------------hashJoin[RIGHT_SEMI_JOIN](ws1.ws_order_number =
web_returns.wr_order_number)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]