You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/29 02:22:30 UTC
[doris] branch master updated: [refactor] (datetimev2) refactor FEFunctions for datev2/datetimev2 (#11296)
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 <ga...@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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org