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 3c44d84c93 [refactor] (datetimev2) refactor FEFunctions for datev2/datetimev2 (#11296) 3c44d84c93 is described below commit 3c44d84c93cb1dbe065fea2f4ba41517e71e1a6c Author: Gabriel <gabrielleeb...@gmail.com> AuthorDate: Fri Jul 29 10:22:25 2022 +0800 [refactor] (datetimev2) refactor FEFunctions for datev2/datetimev2 (#11296) --- fe/fe-core/src/main/cup/sql_parser.cup | 14 +- .../java/org/apache/doris/analysis/Analyzer.java | 3 +- .../java/org/apache/doris/analysis/ColumnDef.java | 4 +- .../org/apache/doris/analysis/DateLiteral.java | 55 +---- .../apache/doris/analysis/ExpressionFunctions.java | 20 +- .../org/apache/doris/analysis/FloatLiteral.java | 2 +- .../apache/doris/analysis/FunctionCallExpr.java | 16 +- .../org/apache/doris/analysis/ShowAlterStmt.java | 2 +- .../apache/doris/analysis/ShowPartitionsStmt.java | 2 +- .../org/apache/doris/analysis/StringLiteral.java | 10 +- .../doris/analysis/TimestampArithmeticExpr.java | 4 +- .../doris/catalog/HiveMetaStoreClientHelper.java | 4 +- .../org/apache/doris/catalog/PrimitiveType.java | 4 +- .../java/org/apache/doris/catalog/ScalarType.java | 31 ++- .../main/java/org/apache/doris/catalog/Type.java | 7 +- .../main/java/org/apache/doris/common/Config.java | 5 +- .../doris/common/util/DynamicPartitionUtil.java | 5 +- .../apache/doris/common/util/PropertyAnalyzer.java | 4 +- .../apache/doris/external/hive/util/HiveUtil.java | 6 +- .../external/iceberg/util/TypeToDorisType.java | 5 +- .../org/apache/doris/qe/cache/PartitionRange.java | 3 +- .../java/org/apache/doris/rewrite/FEFunctions.java | 229 +-------------------- .../doris/rewrite/RewriteDateLiteralRule.java | 3 +- fe/fe-core/src/main/jflex/sql_scanner.flex | 2 + .../java/org/apache/doris/analysis/ExprTest.java | 4 +- .../org/apache/doris/planner/QueryPlanTest.java | 15 +- .../org/apache/doris/rewrite/FEFunctionsTest.java | 16 +- .../doris/rewrite/RewriteDateLiteralRuleTest.java | 13 +- 28 files changed, 163 insertions(+), 325 deletions(-) diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 1042783da3..16e2bac79b 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -244,7 +244,7 @@ terminal String KW_ADD, KW_ADMIN, KW_AFTER, KW_AGGREGATE, KW_ALIAS, KW_ALL, KW_A KW_CANCEL, KW_CASE, KW_CAST, KW_CHAIN, KW_CHAR, KW_CHARSET, KW_CHECK, KW_CLUSTER, KW_CLUSTERS, KW_CLEAN, KW_CURRENT_TIMESTAMP, KW_COLLATE, KW_COLLATION, KW_COLUMN, KW_COLUMNS, KW_COMMENT, KW_COMMIT, KW_COMMITTED, KW_COMPACT, KW_CONFIG, KW_CONNECTION, KW_CONNECTION_ID, KW_CONSISTENT, KW_CONVERT, KW_COUNT, KW_CREATE, KW_CREATION, KW_CROSS, KW_CUBE, KW_CURRENT, KW_CURRENT_USER, - KW_DATA, KW_DATABASE, KW_DATABASES, KW_DATE, KW_DATETIME, KW_DAY, KW_DECIMAL, KW_DECOMMISSION, KW_DEFAULT, KW_DESC, KW_DESCRIBE, + KW_DATA, KW_DATABASE, KW_DATABASES, KW_DATE, KW_DATETIME, KW_DATEV2, KW_DATETIMEV2, KW_DAY, KW_DECIMAL, KW_DECOMMISSION, KW_DEFAULT, KW_DESC, KW_DESCRIBE, KW_DELETE, KW_UPDATE, KW_DIAGNOSE, KW_DISK, KW_DISTINCT, KW_DISTINCTPC, KW_DISTINCTPCSA, KW_DISTRIBUTED, KW_DISTRIBUTION, KW_DYNAMIC, KW_BUCKETS, KW_DIV, KW_DOUBLE, KW_DROP, KW_DROPP, KW_DUPLICATE, KW_ELSE, KW_ENABLE, KW_ENCRYPTKEY, KW_ENCRYPTKEYS, KW_END, KW_ENGINE, KW_ENGINES, KW_ENTER, KW_ERRORS, KW_EVENTS, KW_EXCEPT, KW_EXCLUDE, KW_EXISTS, KW_EXPORT, KW_EXTENDED, KW_EXTERNAL, KW_EXTRACT, @@ -4688,6 +4688,12 @@ type ::= {: RESULT = ScalarType.createTimeV2Type(precision.intValue()); :} | KW_TIME {: RESULT = ScalarType.createTimeType(); :} + | KW_DATEV2 + {: RESULT = ScalarType.createDateV2Type(); :} + | KW_DATETIMEV2 LPAREN INTEGER_LITERAL:precision RPAREN + {: RESULT = ScalarType.createDatetimeV2Type(precision.intValue()); :} + | KW_DATETIMEV2 + {: RESULT = ScalarType.createDatetimeV2Type(0); :} | KW_BITMAP {: RESULT = Type.BITMAP; :} | KW_QUANTILE_STATE @@ -4944,6 +4950,8 @@ non_pred_expr ::= {: RESULT = e; :} | KW_DATE STRING_LITERAL:l {: RESULT = new StringLiteral(l); :} + | KW_DATEV2 STRING_LITERAL:l + {: RESULT = new StringLiteral(l); :} | KW_TIMESTAMP STRING_LITERAL:l {: RESULT = new StringLiteral(l); :} | KW_EXTRACT LPAREN function_name:fn_name KW_FROM func_arg_list:exprs RPAREN @@ -5650,6 +5658,10 @@ keyword ::= {: RESULT = id; :} | KW_DATETIME:id {: RESULT = id; :} + | KW_DATEV2:id + {: RESULT = id; :} + | KW_DATETIMEV2:id + {: RESULT = id; :} | KW_DECIMAL:id {: RESULT = id; :} | KW_DIAGNOSE:id diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index a0b96d32ec..edf9f03e0d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -26,6 +26,7 @@ import org.apache.doris.catalog.Env; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.OlapTable.OlapTableState; import org.apache.doris.catalog.Partition.PartitionState; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.TableIf; import org.apache.doris.catalog.TableIf.TableType; @@ -1835,7 +1836,7 @@ public class Analyzer { } if (compatibleType.equals(Type.VARCHAR)) { if (exprs.get(0).getType().isDateType()) { - compatibleType = DateLiteral.getDefaultDateType(Type.DATETIME); + compatibleType = ScalarType.getDefaultDateType(Type.DATETIME); } } // Add implicit casts if necessary. diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java index cea5925b6a..b74f34d00d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java @@ -342,12 +342,12 @@ public class ColumnDef { break; case DATE: case DATEV2: - new DateLiteral(defaultValue, DateLiteral.getDefaultDateType(type)); + new DateLiteral(defaultValue, ScalarType.getDefaultDateType(type)); break; case DATETIME: case DATETIMEV2: if (defaultValueExprDef == null) { - new DateLiteral(defaultValue, DateLiteral.getDefaultDateType(type)); + new DateLiteral(defaultValue, ScalarType.getDefaultDateType(type)); } else { if (defaultValueExprDef.getExprName().equals(DefaultValue.NOW)) { break; 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 18cf7bff6a..61b3bf116b 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 @@ -260,7 +260,7 @@ public class DateLiteral extends LiteralExpr { this.year = year; this.month = month; this.day = day; - this.type = DateLiteral.getDefaultDateType(Type.DATE); + this.type = ScalarType.getDefaultDateType(Type.DATE); } public DateLiteral(long year, long month, long day, Type type) { @@ -279,7 +279,7 @@ public class DateLiteral extends LiteralExpr { this.year = year; this.month = month; this.day = day; - this.type = DateLiteral.getDefaultDateType(Type.DATETIME); + this.type = ScalarType.getDefaultDateType(Type.DATETIME); } public DateLiteral(long year, long month, long day, long hour, long minute, long second, long microsecond) { @@ -606,7 +606,7 @@ public class DateLiteral extends LiteralExpr { } public void castToDate() { - if (Config.use_date_v2_by_default) { + if (Config.enable_date_conversion) { this.type = Type.DATEV2; } else { this.type = Type.DATE; @@ -669,24 +669,6 @@ public class DateLiteral extends LiteralExpr { this.type = Type.DATETIME; } - private void fromPackedDatetimeV2(long packedTime) { - microsecond = (packedTime % (1L << 24)); - long ymdhms = (packedTime >> 24); - long ymd = ymdhms >> 17; - day = ymd % (1 << 5); - long ym = ymd >> 5; - month = ym % (1 << 4); - year = ym >> 4; - - long hms = ymdhms % (1 << 17); - second = hms % (1 << 6); - minute = (hms >> 6) % (1 << 6); - hour = (hms >> 12); - // set default date literal type to DATETIME - // date literal read from meta will set type by flag bit; - this.type = Type.DATETIMEV2; - } - public void readFields(DataInput in) throws IOException { super.readFields(in); short dateLiteralType = in.readShort(); @@ -696,10 +678,8 @@ public class DateLiteral extends LiteralExpr { } else if (dateLiteralType == DateLiteralType.DATE.value()) { this.type = Type.DATE; } else if (dateLiteralType == DateLiteralType.DATETIMEV2.value()) { - fromPackedDatetime(in.readLong()); this.type = ScalarType.createDatetimeV2Type(in.readInt()); } else if (dateLiteralType == DateLiteralType.DATEV2.value()) { - fromPackedDatetime(in.readLong()); this.type = Type.DATEV2; } else { throw new IOException("Error date literal type : " + type); @@ -1273,9 +1253,9 @@ public class DateLiteral extends LiteralExpr { if (microSecondPartUsed) { this.type = Type.DATETIMEV2; } else if (timePartUsed) { - this.type = getDefaultDateType(Type.DATETIME); + this.type = ScalarType.getDefaultDateType(Type.DATETIME); } else { - this.type = getDefaultDateType(Type.DATE); + this.type = ScalarType.getDefaultDateType(Type.DATE); } } @@ -1531,34 +1511,13 @@ public class DateLiteral extends LiteralExpr { microsecond = dateVal[6]; if (numField == 3) { - type = getDefaultDateType(Type.DATE); + type = ScalarType.getDefaultDateType(Type.DATE); } else { - type = getDefaultDateType(Type.DATETIME); + type = ScalarType.getDefaultDateType(Type.DATETIME); } if (checkRange() || checkDate()) { throw new AnalysisException("Datetime value is out of range: " + dateStr); } } - - public static Type getDefaultDateType(Type type) { - switch (type.getPrimitiveType()) { - case DATE: - if (Config.use_date_v2_by_default) { - return Type.DATEV2; - } else { - return Type.DATE; - } - case DATETIME: - if (Config.use_date_v2_by_default) { - return Type.DATETIMEV2; - } else { - return Type.DATETIME; - } - case DATEV2: - case DATETIMEV2: - default: - return type; - } - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java index 66e4a5bbca..cf48861964 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java @@ -116,17 +116,31 @@ public enum ExpressionFunctions { return null; } for (FEFunctionInvoker invoker : functionInvokers) { - if (!invoker.getSignature().returnType.equals(signature.getReturnType())) { + // Make functions for date/datetime applicable to datev2/datetimev2 + if (!(invoker.getSignature().returnType.isDate() && signature.getReturnType().isDateV2()) + && !(invoker.getSignature().returnType.isDatetime() && signature.getReturnType().isDatetimeV2()) + && !invoker.getSignature().returnType.equals(signature.getReturnType())) { continue; } Type[] argTypes1 = invoker.getSignature().getArgTypes(); Type[] argTypes2 = signature.getArgTypes(); - if (!Arrays.equals(argTypes1, argTypes2)) { + if (argTypes1.length != argTypes2.length) { continue; } - return invoker; + boolean match = true; + for (int i = 0; i < argTypes1.length; i++) { + if (!(argTypes1[i].isDate() && argTypes2[i].isDateV2()) + && !(argTypes1[i].isDatetime() && argTypes2[i].isDatetimeV2()) + && !argTypes1[i].equals(argTypes2[i])) { + match = false; + break; + } + } + if (match) { + return invoker; + } } return null; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java index 4e00a8ea25..75d5961d43 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java @@ -139,7 +139,7 @@ public class FloatLiteral extends LiteralExpr { public static Type getDefaultTimeType(Type type) throws AnalysisException { switch (type.getPrimitiveType()) { case TIME: - if (Config.use_date_v2_by_default) { + if (Config.enable_date_conversion) { return Type.TIMEV2; } else { return Type.TIME; diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index 0ad927f0cd..07cd36f260 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -1063,9 +1063,9 @@ public class FunctionCallExpr extends Expr { for (int i = 0; i < argTypes.length - orderByElements.size(); ++i) { // For varargs, we must compare with the last type in callArgs.argTypes. int ix = Math.min(args.length - 1, i); - if (!argTypes[i].matchesType(args[ix]) && Config.use_date_v2_by_default + if (!argTypes[i].matchesType(args[ix]) && Config.enable_date_conversion && !argTypes[i].isDateType() && (args[ix].isDate() || args[ix].isDatetime())) { - uncheckedCastChild(DateLiteral.getDefaultDateType(args[ix]), i); + uncheckedCastChild(ScalarType.getDefaultDateType(args[ix]), i); } else if (!argTypes[i].matchesType(args[ix]) && !( argTypes[i].isDateType() && args[ix].isDateType())) { uncheckedCastChild(args[ix], i); @@ -1103,19 +1103,19 @@ public class FunctionCallExpr extends Expr { Expr child1Result = getChild(1).getResultValue(); if (child1Result instanceof StringLiteral) { if (DateLiteral.hasTimePart(((StringLiteral) child1Result).getStringValue())) { - this.type = DateLiteral.getDefaultDateType(Type.DATETIME); + this.type = ScalarType.getDefaultDateType(Type.DATETIME); } else { - this.type = DateLiteral.getDefaultDateType(Type.DATE); + this.type = ScalarType.getDefaultDateType(Type.DATE); } } else { - this.type = DateLiteral.getDefaultDateType(Type.DATETIME); + this.type = ScalarType.getDefaultDateType(Type.DATETIME); } } else { this.type = fn.getReturnType(); } Type[] childTypes = collectChildReturnTypes(); - if ((this.type.isDate() || this.type.isDatetime()) && Config.use_date_v2_by_default + if ((this.type.isDate() || this.type.isDatetime()) && Config.enable_date_conversion && fn.getArgs().length == childTypes.length) { boolean implicitCastToDate = false; for (int i = 0; i < fn.getArgs().length; i++) { @@ -1125,8 +1125,8 @@ public class FunctionCallExpr extends Expr { } } if (implicitCastToDate) { - this.type = DateLiteral.getDefaultDateType(fn.getReturnType()); - fn.setReturnType(DateLiteral.getDefaultDateType(fn.getReturnType())); + this.type = ScalarType.getDefaultDateType(fn.getReturnType()); + fn.setReturnType(ScalarType.getDefaultDateType(fn.getReturnType())); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java index 6b108a35e9..81a5c345f5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java @@ -121,7 +121,7 @@ public class ShowAlterStmt extends ShowStmt { + "\"2019-12-02|2019-12-02 14:54:00\""); } subExpr.setChild(1, (subExpr.getChild(1)).castTo( - DateLiteral.getDefaultDateType(Type.DATETIME))); + ScalarType.getDefaultDateType(Type.DATETIME))); } else { throw new AnalysisException("The columns of TableName/CreateTime/FinishTime/State are supported."); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java index f295c2104e..1e79ef8f54 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java @@ -195,7 +195,7 @@ public class ShowPartitionsStmt extends ShowStmt { + "\"2019-12-22|2019-12-22 22:22:00\""); } subExpr.setChild(1, (subExpr.getChild(1)).castTo( - Objects.requireNonNull(DateLiteral.getDefaultDateType(Type.DATETIME)))); + Objects.requireNonNull(ScalarType.getDefaultDateType(Type.DATETIME)))); } else if (!leftKey.equalsIgnoreCase(FILTER_PARTITION_ID) && !leftKey.equalsIgnoreCase(FILTER_BUCKETS) && !leftKey.equalsIgnoreCase(FILTER_REPLICATION_NUM)) { throw new AnalysisException("Only the columns of PartitionId/PartitionName/" 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 f3f454dca5..017d5e13bc 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 @@ -21,6 +21,7 @@ package org.apache.doris.analysis; import org.apache.doris.catalog.PrimitiveType; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.DdlException; @@ -175,11 +176,14 @@ public class StringLiteral extends LiteralExpr { public LiteralExpr convertToDate(Type targetType) throws AnalysisException { LiteralExpr newLiteral = null; try { - newLiteral = new DateLiteral(value, DateLiteral.getDefaultDateType(targetType)); + newLiteral = new DateLiteral(value, ScalarType.getDefaultDateType(targetType)); } catch (AnalysisException e) { if (targetType.isScalarType(PrimitiveType.DATETIME)) { - newLiteral = new DateLiteral(value, DateLiteral.getDefaultDateType(Type.DATE)); - newLiteral.setType(DateLiteral.getDefaultDateType(Type.DATETIME)); + newLiteral = new DateLiteral(value, ScalarType.getDefaultDateType(Type.DATE)); + newLiteral.setType(ScalarType.getDefaultDateType(Type.DATETIME)); + } else if (targetType.isScalarType(PrimitiveType.DATETIMEV2)) { + newLiteral = new DateLiteral(value, Type.DATEV2); + newLiteral.setType(targetType); } else { throw e; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java index 36b34616a0..9a9229e741 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java @@ -119,7 +119,7 @@ public class TimestampArithmeticExpr extends Expr { if (t1 == PrimitiveType.DATEV2) { return Type.DATEV2; } - if (Config.use_date_v2_by_default + if (Config.enable_date_conversion && PrimitiveType.isImplicitCast(t1, PrimitiveType.DATETIMEV2)) { return Type.DATETIMEV2; } @@ -141,7 +141,7 @@ public class TimestampArithmeticExpr extends Expr { } Type dateType = fixType(); if (dateType.isDate() && timeUnit.isDateTime()) { - dateType = DateLiteral.getDefaultDateType(Type.DATETIME); + dateType = ScalarType.getDefaultDateType(Type.DATETIME); } // The first child must return a timestamp or null. if (!getChild(0).getType().isDateType() && !getChild(0).getType().isNull()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java index ea347a4486..a364568ed7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/HiveMetaStoreClientHelper.java @@ -767,9 +767,9 @@ public class HiveMetaStoreClientHelper { case "bigint": return Type.BIGINT; case "date": - return DateLiteral.getDefaultDateType(Type.DATE); + return ScalarType.getDefaultDateType(Type.DATE); case "timestamp": - return DateLiteral.getDefaultDateType(Type.DATETIME); + return ScalarType.getDefaultDateType(Type.DATETIME); case "float": return Type.FLOAT; case "double": diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java index 7dd410410a..a063cfaba9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java @@ -1156,9 +1156,9 @@ public enum PrimitiveType { public static PrimitiveType getDatePrimitiveType(PrimitiveType type) { switch (type) { case DATE: - return Config.use_date_v2_by_default ? DATEV2 : DATE; + return Config.enable_date_conversion ? DATEV2 : DATE; case DATETIME: - return Config.use_date_v2_by_default ? DATETIMEV2 : DATETIME; + return Config.enable_date_conversion ? DATETIMEV2 : DATETIME; default: return type; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java index f3f3784b6f..8b20a8f074 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java @@ -351,7 +351,7 @@ public class ScalarType extends Type { @SuppressWarnings("checkstyle:MissingJavadocMethod") public static ScalarType createDatetimeType() { - if (!Config.use_date_v2_by_default) { + if (!Config.enable_date_conversion) { return new ScalarType(PrimitiveType.DATETIME); } ScalarType type = new ScalarType(PrimitiveType.DATETIMEV2); @@ -362,7 +362,7 @@ public class ScalarType extends Type { @SuppressWarnings("checkstyle:MissingJavadocMethod") public static ScalarType createDateType() { - if (Config.use_date_v2_by_default) { + if (Config.enable_date_conversion) { return new ScalarType(PrimitiveType.DATEV2); } else { return new ScalarType(PrimitiveType.DATE); @@ -371,7 +371,7 @@ public class ScalarType extends Type { @SuppressWarnings("checkstyle:MissingJavadocMethod") public static ScalarType createTimeType() { - if (!Config.use_date_v2_by_default) { + if (!Config.enable_date_conversion) { return new ScalarType(PrimitiveType.TIME); } ScalarType type = new ScalarType(PrimitiveType.TIMEV2); @@ -380,6 +380,31 @@ public class ScalarType extends Type { return type; } + public static ScalarType createDateV2Type() { + return new ScalarType(PrimitiveType.DATEV2); + } + + public static Type getDefaultDateType(Type type) { + switch (type.getPrimitiveType()) { + case DATE: + if (Config.enable_date_conversion) { + return Type.DATEV2; + } else { + return Type.DATE; + } + case DATETIME: + if (Config.enable_date_conversion) { + return Type.DATETIMEV2; + } else { + return Type.DATETIME; + } + case DATEV2: + case DATETIMEV2: + default: + return type; + } + } + /** * create a wider decimal type. */ 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 ecf7ac5350..07705d759c 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 @@ -17,7 +17,6 @@ package org.apache.doris.catalog; -import org.apache.doris.analysis.DateLiteral; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.StringLiteral; import org.apache.doris.common.DdlException; @@ -1529,13 +1528,13 @@ public abstract class Type { private static Type getDateComparisonResultType(ScalarType t1, ScalarType t2) { if (t1.isDate() && t2.isDate()) { - return DateLiteral.getDefaultDateType(Type.DATE); + return ScalarType.getDefaultDateType(Type.DATE); } else if ((t1.isDateV2() && t2.isDate()) || t1.isDate() && t2.isDateV2()) { return Type.DATEV2; } else if (t1.isDateV2() && t2.isDateV2()) { return Type.DATEV2; } else if (t1.isDatetime() && t2.isDatetime()) { - return DateLiteral.getDefaultDateType(Type.DATETIME); + return ScalarType.getDefaultDateType(Type.DATETIME); } else if (t1.isDatetime() && t2.isDatetimeV2()) { return t2; } else if (t1.isDatetimeV2() && t2.isDatetime()) { @@ -1547,7 +1546,7 @@ public abstract class Type { } else if (t2.isDatetimeV2()) { return t2; } else { - return DateLiteral.getDefaultDateType(Type.DATETIME); + return ScalarType.getDefaultDateType(Type.DATETIME); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/Config.java b/fe/fe-core/src/main/java/org/apache/doris/common/Config.java index 289c4d24bd..26f180ea28 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/Config.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/Config.java @@ -1688,8 +1688,11 @@ public class Config extends ConfigBase { @ConfField(mutable = false, masterOnly = true) public static boolean be_rebalancer_fuzzy_test = false; + /** + * If set to TRUE, FE will convert date/datetime to datev2/datetimev2(0) automatically. + */ @ConfField(mutable = true, masterOnly = true) - public static boolean use_date_v2_by_default = false; + public static boolean enable_date_conversion = false; @ConfField(mutable = false, masterOnly = true) public static boolean enable_multi_tags = false; diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java index 2282f6ffd0..5d97fcd036 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java @@ -669,9 +669,10 @@ public class DynamicPartitionUtil { } public static String getPartitionFormat(Column column) throws DdlException { - if (column.getDataType().equals(PrimitiveType.DATE)) { + if (column.getDataType().equals(PrimitiveType.DATE) || column.getDataType().equals(PrimitiveType.DATEV2)) { return DATE_FORMAT; - } else if (column.getDataType().equals(PrimitiveType.DATETIME)) { + } else if (column.getDataType().equals(PrimitiveType.DATETIME) + || column.getDataType().equals(PrimitiveType.DATETIMEV2)) { return DATETIME_FORMAT; } else if (PrimitiveType.getIntegerTypes().contains(column.getDataType())) { // TODO: For Integer Type, only support format it as yyyyMMdd now diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java index 317beb78d0..e332a47e35 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/PropertyAnalyzer.java @@ -158,12 +158,12 @@ public class PropertyAnalyzer { throw new AnalysisException("Invalid storage medium: " + value); } } else if (key.equalsIgnoreCase(PROPERTIES_STORAGE_COOLDOWN_TIME)) { - DateLiteral dateLiteral = new DateLiteral(value, DateLiteral.getDefaultDateType(Type.DATETIME)); + DateLiteral dateLiteral = new DateLiteral(value, ScalarType.getDefaultDateType(Type.DATETIME)); cooldownTimeStamp = dateLiteral.unixTimestamp(TimeUtils.getTimeZone()); } else if (key.equalsIgnoreCase(PROPERTIES_REMOTE_STORAGE_POLICY)) { remoteStoragePolicy = value; } else if (key.equalsIgnoreCase(PROPERTIES_DATA_BASE_TIME)) { - DateLiteral dateLiteral = new DateLiteral(value, DateLiteral.getDefaultDateType(Type.DATETIME)); + DateLiteral dateLiteral = new DateLiteral(value, ScalarType.getDefaultDateType(Type.DATETIME)); dataBaseTimeMs = dateLiteral.unixTimestamp(TimeUtils.getTimeZone()); } else if (!hasStoragePolicy && key.equalsIgnoreCase(PROPERTIES_STORAGE_POLICY)) { if (!Strings.isNullOrEmpty(value)) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/external/hive/util/HiveUtil.java b/fe/fe-core/src/main/java/org/apache/doris/external/hive/util/HiveUtil.java index 3ac1806dbf..cd7c0f2f49 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/external/hive/util/HiveUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/external/hive/util/HiveUtil.java @@ -17,9 +17,9 @@ package org.apache.doris.external.hive.util; -import org.apache.doris.analysis.DateLiteral; import org.apache.doris.catalog.ArrayType; import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; @@ -154,9 +154,9 @@ public final class HiveUtil { case VARCHAR: return Type.VARCHAR; case DATE: - return DateLiteral.getDefaultDateType(Type.DATE); + return ScalarType.getDefaultDateType(Type.DATE); case TIMESTAMP: - return DateLiteral.getDefaultDateType(Type.DATETIME); + return ScalarType.getDefaultDateType(Type.DATETIME); case DECIMAL: return Config.enable_decimalv3 ? Type.DECIMAL128 : Type.DECIMALV2; default: diff --git a/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/util/TypeToDorisType.java b/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/util/TypeToDorisType.java index 43fe10aa03..2fc05d96b5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/util/TypeToDorisType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/util/TypeToDorisType.java @@ -17,7 +17,6 @@ package org.apache.doris.external.iceberg.util; -import org.apache.doris.analysis.DateLiteral; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; @@ -79,9 +78,9 @@ public class TypeToDorisType extends TypeUtil.SchemaVisitor<Type> { Types.DecimalType decimal = (Types.DecimalType) primitive; return ScalarType.createDecimalType(decimal.precision(), decimal.scale()); case DATE: - return DateLiteral.getDefaultDateType(Type.DATE); + return ScalarType.getDefaultDateType(Type.DATE); case TIMESTAMP: - return DateLiteral.getDefaultDateType(Type.DATETIME); + return ScalarType.getDefaultDateType(Type.DATETIME); case STRING: return Type.STRING; // use varchar diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionRange.java b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionRange.java index 3a4e7dd45b..038bcd138d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionRange.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/cache/PartitionRange.java @@ -32,6 +32,7 @@ import org.apache.doris.catalog.PartitionItem; import org.apache.doris.catalog.PartitionKey; import org.apache.doris.catalog.RangePartitionInfo; import org.apache.doris.catalog.RangePartitionItem; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; @@ -459,7 +460,7 @@ public class PartitionRange { LiteralExpr newLiteral; if (key.keyType == KeyType.DATE) { try { - newLiteral = new DateLiteral(key.toString(), DateLiteral.getDefaultDateType(Type.DATE)); + newLiteral = new DateLiteral(key.toString(), ScalarType.getDefaultDateType(Type.DATE)); } catch (Exception e) { LOG.warn("Date's format is error {},{}", key.toString(), e); continue; diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java index b7f5fe4bd0..c3da65f9e2 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java @@ -26,6 +26,7 @@ import org.apache.doris.analysis.LargeIntLiteral; import org.apache.doris.analysis.LiteralExpr; import org.apache.doris.analysis.NullLiteral; import org.apache.doris.analysis.StringLiteral; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.InvalidFormatException; @@ -129,84 +130,12 @@ public class FEFunctions { return new StringLiteral(result); } - @FEFunction(name = "timediff", argTypes = { "DATETIMEV2", "DATETIMEV2" }, returnType = "TIME") - public static FloatLiteral timeDiffV2(LiteralExpr first, LiteralExpr second) throws AnalysisException { - long firstTimestamp = ((DateLiteral) first).unixTimestamp(TimeUtils.getTimeZone()); - long secondTimestamp = ((DateLiteral) second).unixTimestamp(TimeUtils.getTimeZone()); - return new FloatLiteral((double) (firstTimestamp - secondTimestamp) / 1000, - FloatLiteral.getDefaultTimeType(Type.TIME)); - } - - @FEFunction(name = "datediff", argTypes = { "DATETIMEV2", "DATETIMEV2" }, returnType = "INT") - public static IntLiteral dateDiffV2(LiteralExpr first, LiteralExpr second) throws AnalysisException { - DateLiteral firstDate = ((DateLiteral) first); - DateLiteral secondDate = ((DateLiteral) second); - // DATEDIFF function only uses the date part for calculations and ignores the time part - firstDate.castToDate(); - secondDate.castToDate(); - long datediff = (firstDate.unixTimestamp(TimeUtils.getTimeZone()) - - secondDate.unixTimestamp(TimeUtils.getTimeZone())) / 1000 / 60 / 60 / 24; - return new IntLiteral(datediff, Type.INT); - } - - @FEFunction(name = "date_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral dateAddV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { - return daysAddV2(date, day); - } - - @FEFunction(name = "adddate", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral addDateV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { - return daysAddV2(date, day); - } - - @FEFunction(name = "years_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral yearsAddV2(LiteralExpr date, LiteralExpr year) throws AnalysisException { - DateLiteral dateLiteral = (DateLiteral) date; - return dateLiteral.plusYears((int) year.getLongValue()); - } - - @FEFunction(name = "months_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral monthsAddV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { - DateLiteral dateLiteral = (DateLiteral) date; - return dateLiteral.plusMonths((int) month.getLongValue()); - } - - @FEFunction(name = "days_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral daysAddV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { - DateLiteral dateLiteral = (DateLiteral) date; - return dateLiteral.plusDays((int) day.getLongValue()); - } - - @FEFunction(name = "hours_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral hoursAddV2(LiteralExpr date, LiteralExpr hour) throws AnalysisException { - DateLiteral dateLiteral = (DateLiteral) date; - return dateLiteral.plusHours((int) hour.getLongValue()); - } - - @FEFunction(name = "minutes_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral minutesAddV2(LiteralExpr date, LiteralExpr minute) throws AnalysisException { - DateLiteral dateLiteral = (DateLiteral) date; - return dateLiteral.plusMinutes((int) minute.getLongValue()); - } - - @FEFunction(name = "seconds_add", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral secondsAddV2(LiteralExpr date, LiteralExpr second) throws AnalysisException { - DateLiteral dateLiteral = (DateLiteral) date; - return dateLiteral.plusSeconds((int) second.getLongValue()); - } - - @FEFunction(name = "date_format", argTypes = { "DATETIMEV2", "VARCHAR" }, returnType = "VARCHAR") - public static StringLiteral dateFormatV2(LiteralExpr date, StringLiteral fmtLiteral) throws AnalysisException { - String result = ((DateLiteral) date).dateFormat(fmtLiteral.getStringValue()); - return new StringLiteral(result); - } - @FEFunction(name = "str_to_date", argTypes = { "VARCHAR", "VARCHAR" }, returnType = "DATETIME") public static DateLiteral dateParse(StringLiteral date, StringLiteral fmtLiteral) throws AnalysisException { DateLiteral dateLiteral = new DateLiteral(); try { dateLiteral.fromDateFormatStr(fmtLiteral.getStringValue(), date.getStringValue(), false); - dateLiteral.setType(DateLiteral.getDefaultDateType(dateLiteral.getType())); + dateLiteral.setType(ScalarType.getDefaultDateType(dateLiteral.getType())); return dateLiteral; } catch (InvalidFormatException e) { e.printStackTrace(); @@ -287,74 +216,6 @@ public class FEFunctions { return new IntLiteral(unixTime, Type.INT); } - @FEFunction(name = "date_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral dateSubV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { - return dateAddV2(date, new IntLiteral(-(int) day.getLongValue())); - } - - @FEFunction(name = "years_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral yearsSubV2(LiteralExpr date, LiteralExpr year) throws AnalysisException { - return yearsAddV2(date, new IntLiteral(-(int) year.getLongValue())); - } - - @FEFunction(name = "months_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral monthsSubV2(LiteralExpr date, LiteralExpr month) throws AnalysisException { - return monthsAddV2(date, new IntLiteral(-(int) month.getLongValue())); - } - - @FEFunction(name = "days_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral daysSubV2(LiteralExpr date, LiteralExpr day) throws AnalysisException { - return daysAddV2(date, new IntLiteral(-(int) day.getLongValue())); - } - - @FEFunction(name = "hours_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral hoursSubV2(LiteralExpr date, LiteralExpr hour) throws AnalysisException { - return hoursAddV2(date, new IntLiteral(-(int) hour.getLongValue())); - } - - @FEFunction(name = "minutes_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral minutesSubV2(LiteralExpr date, LiteralExpr minute) throws AnalysisException { - return minutesAddV2(date, new IntLiteral(-(int) minute.getLongValue())); - } - - @FEFunction(name = "seconds_sub", argTypes = { "DATETIMEV2", "INT" }, returnType = "DATETIME") - public static DateLiteral secondsSubV2(LiteralExpr date, LiteralExpr second) throws AnalysisException { - return secondsAddV2(date, new IntLiteral(-(int) second.getLongValue())); - } - - @FEFunction(name = "year", argTypes = { "DATETIMEV2" }, returnType = "INT") - public static IntLiteral yearV2(LiteralExpr arg) throws AnalysisException { - return new IntLiteral(((DateLiteral) arg).getYear(), Type.INT); - } - - @FEFunction(name = "month", argTypes = { "DATETIMEV2" }, returnType = "INT") - public static IntLiteral monthV2(LiteralExpr arg) throws AnalysisException { - return new IntLiteral(((DateLiteral) arg).getMonth(), Type.INT); - } - - @FEFunction(name = "day", argTypes = { "DATETIMEV2" }, returnType = "INT") - public static IntLiteral dayV2(LiteralExpr arg) throws AnalysisException { - return new IntLiteral(((DateLiteral) arg).getDay(), Type.INT); - } - - @FEFunction(name = "unix_timestamp", argTypes = { "DATETIMEV2" }, returnType = "INT") - public static IntLiteral unixTimestampV2(LiteralExpr arg) throws AnalysisException { - long unixTime = ((DateLiteral) arg).unixTimestamp(TimeUtils.getTimeZone()) / 1000; - // date before 1970-01-01 or after 2038-01-19 03:14:07 should return 0 for unix_timestamp() function - unixTime = unixTime < 0 ? 0 : unixTime; - unixTime = unixTime > Integer.MAX_VALUE ? 0 : unixTime; - return new IntLiteral(unixTime, Type.INT); - } - - @FEFunction(name = "unix_timestamp", argTypes = { "DATEV2" }, returnType = "INT") - public static IntLiteral unixTimestamp2V2(LiteralExpr arg) throws AnalysisException { - long unixTime = ((DateLiteral) arg).unixTimestamp(TimeUtils.getTimeZone()) / 1000; - // date before 1970-01-01 or after 2038-01-19 03:14:07 should return 0 for unix_timestamp() function - unixTime = unixTime < 0 ? 0 : unixTime; - unixTime = unixTime > Integer.MAX_VALUE ? 0 : unixTime; - return new IntLiteral(unixTime, Type.INT); - } - @FEFunction(name = "from_unixtime", argTypes = { "INT" }, returnType = "VARCHAR") public static StringLiteral fromUnixTime(LiteralExpr unixTime) throws AnalysisException { // if unixTime < 0, we should return null, throw a exception and let BE process @@ -362,7 +223,7 @@ public class FEFunctions { throw new AnalysisException("unixtime should larger than zero"); } DateLiteral dl = new DateLiteral(unixTime.getLongValue() * 1000, TimeUtils.getTimeZone(), - DateLiteral.getDefaultDateType(Type.DATETIME)); + ScalarType.getDefaultDateType(Type.DATETIME)); return new StringLiteral(dl.getStringValue()); } @@ -373,14 +234,14 @@ public class FEFunctions { throw new AnalysisException("unixtime should larger than zero"); } DateLiteral dl = new DateLiteral(unixTime.getLongValue() * 1000, TimeUtils.getTimeZone(), - DateLiteral.getDefaultDateType(Type.DATETIME)); + ScalarType.getDefaultDateType(Type.DATETIME)); return new StringLiteral(dl.dateFormat(fmtLiteral.getStringValue())); } @FEFunction(name = "now", argTypes = {}, returnType = "DATETIME") public static DateLiteral now() throws AnalysisException { return new DateLiteral(LocalDateTime.now(TimeUtils.getTimeZone().toZoneId()), - DateLiteral.getDefaultDateType(Type.DATETIME)); + ScalarType.getDefaultDateType(Type.DATETIME)); } @FEFunction(name = "current_timestamp", argTypes = {}, returnType = "DATETIME") @@ -391,7 +252,7 @@ public class FEFunctions { @FEFunction(name = "curdate", argTypes = {}, returnType = "DATE") public static DateLiteral curDate() { return new DateLiteral(LocalDateTime.now(TimeUtils.getTimeZone().toZoneId()), - DateLiteral.getDefaultDateType(Type.DATE)); + ScalarType.getDefaultDateType(Type.DATE)); } @FEFunction(name = "curtime", argTypes = {}, returnType = "TIME") @@ -409,7 +270,7 @@ public class FEFunctions { @FEFunction(name = "utc_timestamp", argTypes = {}, returnType = "DATETIME") public static DateLiteral utcTimestamp() { return new DateLiteral(LocalDateTime.now(TimeUtils.getOrSystemTimeZone("+00:00").toZoneId()), - DateLiteral.getDefaultDateType(Type.DATETIME)); + ScalarType.getDefaultDateType(Type.DATETIME)); } @FEFunction(name = "yearweek", argTypes = { "DATE" }, returnType = "INT") @@ -476,70 +337,6 @@ public class FEFunctions { return null; } - @FEFunction(name = "yearweek", argTypes = { "DATEV2" }, returnType = "INT") - public static IntLiteral yearWeekV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof IntLiteral) { - return (IntLiteral) arg; - } - return null; - } - - @FEFunction(name = "yearweek", argTypes = { "DATEV2", "INT" }, returnType = "INT") - public static IntLiteral yearWeekModV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof IntLiteral) { - return (IntLiteral) arg; - } - return null; - } - - @FEFunction(name = "week", argTypes = { "DATEV2" }, returnType = "INT") - public static IntLiteral weekV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof IntLiteral) { - return (IntLiteral) arg; - } - return null; - } - - @FEFunction(name = "week", argTypes = { "DATEV2", "INT" }, returnType = "INT") - public static IntLiteral weekModeV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof IntLiteral) { - return (IntLiteral) arg; - } - return null; - } - - @FEFunction(name = "hour", argTypes = {"DATETIMEV2"}, returnType = "INT") - public static IntLiteral hourV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof DateLiteral) { - return new IntLiteral(((DateLiteral) arg).getHour()); - } - return null; - } - - @FEFunction(name = "minute", argTypes = {"DATETIMEV2"}, returnType = "INT") - public static IntLiteral minuteV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof DateLiteral) { - return new IntLiteral(((DateLiteral) arg).getMinute()); - } - return null; - } - - @FEFunction(name = "second", argTypes = {"DATETIMEV2"}, returnType = "INT") - public static IntLiteral secondV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof DateLiteral) { - return new IntLiteral(((DateLiteral) arg).getSecond()); - } - return null; - } - - @FEFunction(name = "timestamp", argTypes = {"DATETIMEV2"}, returnType = "DATETIME") - public static DateLiteral timestampV2(LiteralExpr arg) throws AnalysisException { - if (arg instanceof DateLiteral) { - return (DateLiteral) arg; - } - return null; - } - /** ------------------------------------------------------------------------------ */ @@ -778,10 +575,7 @@ public class FEFunctions { @FEFunction(name = "ifnull", argTypes = {"BIGINT", "BIGINT"}, returnType = "BIGINT"), @FEFunction(name = "ifnull", argTypes = {"DATETIME", "DATETIME"}, returnType = "DATETIME"), @FEFunction(name = "ifnull", argTypes = { "DATE", "DATETIME" }, returnType = "DATETIME"), - @FEFunction(name = "ifnull", argTypes = { "DATETIME", "DATE" }, returnType = "DATETIME"), - @FEFunction(name = "ifnull", argTypes = {"DATETIMEV2", "DATETIMEV2"}, returnType = "DATETIME"), - @FEFunction(name = "ifnull", argTypes = { "DATEV2", "DATETIMEV2" }, returnType = "DATETIME"), - @FEFunction(name = "ifnull", argTypes = { "DATETIMEV2", "DATEV2" }, returnType = "DATETIME") + @FEFunction(name = "ifnull", argTypes = { "DATETIME", "DATE" }, returnType = "DATETIME") }) public static LiteralExpr ifNull(LiteralExpr first, LiteralExpr second) throws AnalysisException { return first instanceof NullLiteral ? second : first; @@ -795,10 +589,7 @@ public class FEFunctions { @FEFunction(name = "nvl", argTypes = {"BIGINT", "BIGINT"}, returnType = "BIGINT"), @FEFunction(name = "nvl", argTypes = {"DATETIME", "DATETIME"}, returnType = "DATETIME"), @FEFunction(name = "nvl", argTypes = { "DATE", "DATETIME" }, returnType = "DATETIME"), - @FEFunction(name = "nvl", argTypes = { "DATETIME", "DATE" }, returnType = "DATETIME"), - @FEFunction(name = "nvl", argTypes = {"DATETIMEV2", "DATETIMEV2"}, returnType = "DATETIME"), - @FEFunction(name = "nvl", argTypes = { "DATEV2", "DATETIMEV2" }, returnType = "DATETIME"), - @FEFunction(name = "nvl", argTypes = { "DATETIMEV2", "DATEV2" }, returnType = "DATETIME") + @FEFunction(name = "nvl", argTypes = { "DATETIME", "DATE" }, returnType = "DATETIME") }) public static LiteralExpr nvl(LiteralExpr first, LiteralExpr second) throws AnalysisException { return first instanceof NullLiteral ? second : first; @@ -813,8 +604,6 @@ public class FEFunctions { @FEFunction(name = "array", argTypes = {"LARGEINT"}, returnType = "ARRAY"), @FEFunction(name = "array", argTypes = {"DATETIME"}, returnType = "ARRAY"), @FEFunction(name = "array", argTypes = {"DATE"}, returnType = "ARRAY"), - @FEFunction(name = "array", argTypes = {"DATETIMEV2"}, returnType = "ARRAY"), - @FEFunction(name = "array", argTypes = {"DATEV2"}, returnType = "ARRAY"), @FEFunction(name = "array", argTypes = {"FLOAT"}, returnType = "ARRAY"), @FEFunction(name = "array", argTypes = {"DOUBLE"}, returnType = "ARRAY"), @FEFunction(name = "array", argTypes = {"DECIMALV2"}, returnType = "ARRAY"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteDateLiteralRule.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteDateLiteralRule.java index cd6ff37872..5c78c3358c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteDateLiteralRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/RewriteDateLiteralRule.java @@ -24,6 +24,7 @@ import org.apache.doris.analysis.DateLiteral; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.LiteralExpr; import org.apache.doris.analysis.NullLiteral; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.AnalysisException; /** @@ -63,7 +64,7 @@ public class RewriteDateLiteralRule implements ExprRewriteRule { String dateStr = childExpr.getStringValue(); DateLiteral dateLiteral = new DateLiteral(); dateLiteral.fromDateStr(dateStr); - dateLiteral.setType(DateLiteral.getDefaultDateType(dateLiteral.getType())); + dateLiteral.setType(ScalarType.getDefaultDateType(dateLiteral.getType())); expr.setChild(1, dateLiteral); } catch (AnalysisException e) { if (clauseType == ExprRewriter.ClauseType.OTHER_CLAUSE) { diff --git a/fe/fe-core/src/main/jflex/sql_scanner.flex b/fe/fe-core/src/main/jflex/sql_scanner.flex index 40c2a59622..9b80841ef9 100644 --- a/fe/fe-core/src/main/jflex/sql_scanner.flex +++ b/fe/fe-core/src/main/jflex/sql_scanner.flex @@ -160,6 +160,8 @@ import org.apache.doris.qe.SqlModeHelper; keywordMap.put("databases", new Integer(SqlParserSymbols.KW_DATABASES)); keywordMap.put("date", new Integer(SqlParserSymbols.KW_DATE)); keywordMap.put("datetime", new Integer(SqlParserSymbols.KW_DATETIME)); + keywordMap.put("datev2", new Integer(SqlParserSymbols.KW_DATEV2)); + keywordMap.put("datetimev2", new Integer(SqlParserSymbols.KW_DATETIMEV2)); keywordMap.put("time", new Integer(SqlParserSymbols.KW_TIME)); keywordMap.put("day", new Integer(SqlParserSymbols.KW_DAY)); keywordMap.put("decimal", new Integer(SqlParserSymbols.KW_DECIMAL)); diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java index 35276dc858..e91a956ac1 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java @@ -96,7 +96,7 @@ public class ExprTest { // uncheckedCastTo should return new object // date - DateLiteral dateLiteral = new DateLiteral(2020, 4, 5, 12, 0, 5); + DateLiteral dateLiteral = new DateLiteral(2020, 4, 5, 12, 0, 5, Type.DATETIME); Assert.assertTrue(dateLiteral.getType().equals(Type.DATETIME)); DateLiteral castLiteral = (DateLiteral) dateLiteral.uncheckedCastTo(Type.DATE); Assert.assertFalse(dateLiteral == castLiteral); @@ -111,7 +111,7 @@ public class ExprTest { Assert.assertEquals(0, dateLiteral.getMinute()); Assert.assertEquals(5, dateLiteral.getSecond()); - DateLiteral dateLiteral2 = new DateLiteral(2020, 4, 5); + DateLiteral dateLiteral2 = new DateLiteral(2020, 4, 5, Type.DATE); Assert.assertTrue(dateLiteral2.getType().equals(Type.DATE)); castLiteral = (DateLiteral) dateLiteral2.uncheckedCastTo(Type.DATETIME); Assert.assertFalse(dateLiteral2 == castLiteral); 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 925a720591..ef7a1d963d 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 @@ -34,6 +34,7 @@ import org.apache.doris.catalog.MaterializedIndex.IndexExtState; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.Replica; +import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Tablet; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; @@ -682,7 +683,7 @@ public class QueryPlanTest extends TestWithFeService { String castSql = "select * from test.baseall where k11 < cast('2020-03-26' as date)"; SelectStmt selectStmt = (SelectStmt) parseAndAnalyzeStmt(castSql); Expr rightExpr = selectStmt.getWhereClause().getChildren().get(1); - Assert.assertTrue(rightExpr.getType().equals(Type.DATETIME)); + Assert.assertTrue(rightExpr.getType().equals(ScalarType.getDefaultDateType(Type.DATETIME))); String castSql2 = "select str_to_date('11/09/2011', '%m/%d/%Y');"; String explainString = getSQLPlanOrErrorMsg("explain " + castSql2); @@ -1740,7 +1741,11 @@ public class QueryPlanTest extends TestWithFeService { //valid date contains micro second sql = "select day from tbl_int_date where day = '2020-10-30 10:00:01.111111'"; explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("PREDICATES: `day` = '2020-10-30 10:00:01'")); + if (Config.enable_date_conversion) { + Assert.assertTrue(explainString.contains("PREDICATES: `day` = '2020-10-30 10:00:01.111111'")); + } else { + Assert.assertTrue(explainString.contains("PREDICATES: `day` = '2020-10-30 10:00:01'")); + } //invalid date sql = "select day from tbl_int_date where day = '2020-10-32'"; @@ -1794,7 +1799,11 @@ public class QueryPlanTest extends TestWithFeService { //valid datetime contains micro second sql = "select day from tbl_int_date where date = '2020-10-30 10:00:01.111111'"; explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("PREDICATES: `date` = '2020-10-30 10:00:01'")); + if (Config.enable_date_conversion) { + Assert.assertTrue(explainString.contains("PREDICATES: `date` = '2020-10-30 10:00:01.111111'")); + } else { + Assert.assertTrue(explainString.contains("PREDICATES: `date` = '2020-10-30 10:00:01'")); + } //invalid datetime sql = "select day from tbl_int_date where date = '2020-10-32'"; explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql); diff --git a/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java b/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java index b9aa120d7d..eb9f18684d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java @@ -25,6 +25,7 @@ import org.apache.doris.analysis.LargeIntLiteral; import org.apache.doris.analysis.StringLiteral; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Config; import org.apache.doris.common.util.TimeUtils; import mockit.Expectations; @@ -39,6 +40,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; +import java.time.temporal.ChronoField; import java.util.Locale; import java.util.TimeZone; @@ -743,9 +745,17 @@ public class FEFunctionsTest { String currentTimestampString = FEFunctions.currentTimestamp().toSqlImpl().replace("'", ""); ZonedDateTime zonedDateTime = ZonedDateTime.now(TimeUtils.getTimeZone().toZoneId()); - DateTimeFormatter formatter = new DateTimeFormatterBuilder() - .appendPattern("uuuu-MM-dd HH:mm:ss") - .toFormatter(); + DateTimeFormatter formatter = null; + if (Config.enable_date_conversion) { + formatter = new DateTimeFormatterBuilder() + .appendPattern("uuuu-MM-dd HH:mm:ss") + .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true) + .toFormatter(); + } else { + formatter = new DateTimeFormatterBuilder() + .appendPattern("uuuu-MM-dd HH:mm:ss") + .toFormatter(); + } Assert.assertTrue(formatter.format(zonedDateTime).compareTo(currentTimestampString) >= 0); String nowTimeString = formatter.format(zonedDateTime).substring( diff --git a/fe/fe-core/src/test/java/org/apache/doris/rewrite/RewriteDateLiteralRuleTest.java b/fe/fe-core/src/test/java/org/apache/doris/rewrite/RewriteDateLiteralRuleTest.java index 40bc9bb2c3..6306073e75 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/rewrite/RewriteDateLiteralRuleTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/rewrite/RewriteDateLiteralRuleTest.java @@ -18,6 +18,7 @@ package org.apache.doris.rewrite; import org.apache.doris.common.AnalysisException; +import org.apache.doris.common.Config; import org.apache.doris.common.FeConstants; import org.apache.doris.qe.ConnectContext; import org.apache.doris.utframe.DorisAssert; @@ -76,7 +77,11 @@ public class RewriteDateLiteralRuleTest { public void testWithStringFormatDate() throws Exception { String query = "select * from " + DB_NAME + ".tb1 where k1 > '2021030112334455'"; String planString = dorisAssert.query(query).explainQuery(); - Assert.assertTrue(planString.contains("`k1` > '2021-03-01 12:33:44'")); + if (Config.enable_date_conversion) { + Assert.assertTrue(planString.contains("`k1` > '2021-03-01 12:33:44.550000'")); + } else { + Assert.assertTrue(planString.contains("`k1` > '2021-03-01 12:33:44'")); + } query = "select k1 > '20210301' from " + DB_NAME + ".tb1"; planString = dorisAssert.query(query).explainQuery(); @@ -84,7 +89,11 @@ public class RewriteDateLiteralRuleTest { query = "select k1 > '20210301233234.34' from " + DB_NAME + ".tb1"; planString = dorisAssert.query(query).explainQuery(); - Assert.assertTrue(planString.contains("`k1` > '2021-03-01 23:32:34'")); + if (Config.enable_date_conversion) { + Assert.assertTrue(planString.contains("`k1` > '2021-03-01 23:32:34.340000'")); + } else { + Assert.assertTrue(planString.contains("`k1` > '2021-03-01 23:32:34'")); + } query = "select * from " + DB_NAME + ".tb1 where k1 > '2021-03-01'"; planString = dorisAssert.query(query).explainQuery(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org