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 <40539150+starocean...@users.noreply.github.com> 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: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org