[enhancement](Nereids) implement to legacy literal for datetimev2 literal (#17177)
This commit is contained in:
@ -36,6 +36,7 @@ import org.apache.doris.analysis.SlotRef;
|
||||
import org.apache.doris.analysis.StringLiteral;
|
||||
import org.apache.doris.analysis.TimestampArithmeticExpr;
|
||||
import org.apache.doris.catalog.Function.NullableMode;
|
||||
import org.apache.doris.catalog.ScalarType;
|
||||
import org.apache.doris.catalog.Type;
|
||||
import org.apache.doris.nereids.exceptions.AnalysisException;
|
||||
import org.apache.doris.nereids.trees.expressions.AggregateExpression;
|
||||
@ -74,7 +75,6 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonArray;
|
||||
import org.apache.doris.nereids.trees.expressions.functions.scalar.JsonObject;
|
||||
import org.apache.doris.nereids.trees.expressions.functions.scalar.ScalarFunction;
|
||||
import org.apache.doris.nereids.trees.expressions.functions.window.WindowFunction;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.Literal;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
|
||||
@ -208,12 +208,11 @@ public class ExpressionTranslator extends DefaultExpressionVisitor<Expr, PlanTra
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expr visitDateTimeLiteral(DateTimeLiteral dateTimeLiteral, PlanTranslatorContext context) {
|
||||
public Expr visitDateTimeV2Literal(DateTimeV2Literal dateTimeV2Literal, PlanTranslatorContext context) {
|
||||
// BE not support date v2 literal and datetime v2 literal
|
||||
if (dateTimeLiteral instanceof DateTimeV2Literal) {
|
||||
return new CastExpr(Type.DATETIMEV2, new StringLiteral(dateTimeLiteral.toString()));
|
||||
}
|
||||
return super.visitDateTimeLiteral(dateTimeLiteral, context);
|
||||
int scale = dateTimeV2Literal.getDataType().getScale();
|
||||
return new CastExpr(ScalarType.createDatetimeV2Type(scale),
|
||||
new StringLiteral(dateTimeV2Literal.getStringValue()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
|
||||
import org.apache.doris.nereids.types.ArrayType;
|
||||
import org.apache.doris.nereids.types.BigIntType;
|
||||
import org.apache.doris.nereids.types.BooleanType;
|
||||
import org.apache.doris.nereids.types.DataType;
|
||||
import org.apache.doris.nereids.types.DateTimeType;
|
||||
import org.apache.doris.nereids.types.DateTimeV2Type;
|
||||
import org.apache.doris.nereids.types.DateType;
|
||||
@ -71,6 +72,11 @@ public class ArrayMax extends CompatibleTypeArrayFunction
|
||||
super("array_max", arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataType getDataType() {
|
||||
return ((ArrayType) (child().getDataType())).getItemType();
|
||||
}
|
||||
|
||||
/**
|
||||
* withChildren.
|
||||
*/
|
||||
|
||||
@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
|
||||
import org.apache.doris.nereids.types.ArrayType;
|
||||
import org.apache.doris.nereids.types.BigIntType;
|
||||
import org.apache.doris.nereids.types.BooleanType;
|
||||
import org.apache.doris.nereids.types.DataType;
|
||||
import org.apache.doris.nereids.types.DateTimeType;
|
||||
import org.apache.doris.nereids.types.DateTimeV2Type;
|
||||
import org.apache.doris.nereids.types.DateType;
|
||||
@ -71,6 +72,11 @@ public class ArrayMin extends CompatibleTypeArrayFunction
|
||||
super("array_min", arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataType getDataType() {
|
||||
return ((ArrayType) (child().getDataType())).getItemType();
|
||||
}
|
||||
|
||||
/**
|
||||
* withChildren.
|
||||
*/
|
||||
|
||||
@ -17,7 +17,9 @@
|
||||
|
||||
package org.apache.doris.nereids.trees.expressions.literal;
|
||||
|
||||
import org.apache.doris.analysis.LiteralExpr;
|
||||
import org.apache.doris.nereids.exceptions.UnboundException;
|
||||
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
|
||||
import org.apache.doris.nereids.types.DateTimeV2Type;
|
||||
import org.apache.doris.nereids.util.DateUtils;
|
||||
|
||||
@ -29,7 +31,11 @@ import java.time.LocalDateTime;
|
||||
public class DateTimeV2Literal extends DateTimeLiteral {
|
||||
|
||||
public DateTimeV2Literal(String s) {
|
||||
super(DateTimeV2Type.MAX, s);
|
||||
this(DateTimeV2Type.MAX, s);
|
||||
}
|
||||
|
||||
public DateTimeV2Literal(DateTimeV2Type dateType, String s) {
|
||||
super(dateType, s);
|
||||
}
|
||||
|
||||
public DateTimeV2Literal(long year, long month, long day, long hour, long minute, long second, long microSecond) {
|
||||
@ -46,14 +52,28 @@ public class DateTimeV2Literal extends DateTimeLiteral {
|
||||
return (DateTimeV2Type) super.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
|
||||
return visitor.visitDateTimeV2Literal(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LiteralExpr toLegacyLiteral() {
|
||||
return new org.apache.doris.analysis.DateLiteral(year, month, day, hour, minute, second, microSecond,
|
||||
getDataType().toCatalogDataType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("%04d-%02d-%02d %02d:%02d:%02d.%06d", year, month, day, hour, minute, second, microSecond);
|
||||
return getStringValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getStringValue() {
|
||||
return String.format("%04d-%02d-%02d %02d:%02d:%02d.%06d", year, month, day, hour, minute, second, microSecond);
|
||||
return String.format("%04d-%02d-%02d %02d:%02d:%02d"
|
||||
+ (getDataType().getScale() > 0 ? ".%0" + getDataType().getScale() + "d" : ""),
|
||||
year, month, day, hour, minute, second,
|
||||
(int) (microSecond / Math.pow(10, DateTimeV2Type.MAX_SCALE - getDataType().getScale())));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -20,6 +20,7 @@ package org.apache.doris.nereids.trees.expressions.literal;
|
||||
import org.apache.doris.analysis.LiteralExpr;
|
||||
import org.apache.doris.catalog.Type;
|
||||
import org.apache.doris.nereids.exceptions.AnalysisException;
|
||||
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
|
||||
import org.apache.doris.nereids.types.DateV2Type;
|
||||
import org.apache.doris.nereids.util.DateUtils;
|
||||
|
||||
@ -43,6 +44,11 @@ public class DateV2Literal extends DateLiteral {
|
||||
return new org.apache.doris.analysis.DateLiteral(year, month, day, Type.DATEV2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
|
||||
return visitor.visitDateV2Literal(this, context);
|
||||
}
|
||||
|
||||
public DateV2Literal plusDays(int days) {
|
||||
LocalDateTime dateTime = DateUtils.getTime(DATE_FORMATTER, getStringValue()).plusDays(days);
|
||||
return new DateV2Literal(dateTime.getYear(), dateTime.getMonthValue(), dateTime.getDayOfMonth());
|
||||
|
||||
@ -25,6 +25,7 @@ import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
|
||||
import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
|
||||
import org.apache.doris.nereids.types.CharType;
|
||||
import org.apache.doris.nereids.types.DataType;
|
||||
import org.apache.doris.nereids.types.DateTimeV2Type;
|
||||
import org.apache.doris.nereids.types.LargeIntType;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -253,7 +254,7 @@ public abstract class Literal extends Expression implements LeafExpression, Comp
|
||||
} else if (targetType.isDateV2Type()) {
|
||||
return new DateV2Literal(desc);
|
||||
} else if (targetType.isDateTimeV2Type()) {
|
||||
return new DateTimeV2Literal(desc);
|
||||
return new DateTimeV2Literal((DateTimeV2Type) targetType, desc);
|
||||
}
|
||||
throw new AnalysisException("no support cast!");
|
||||
}
|
||||
|
||||
@ -85,6 +85,8 @@ import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.CharLiteral;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DateV2Literal;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DecimalLiteral;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.DoubleLiteral;
|
||||
import org.apache.doris.nereids.trees.expressions.literal.FloatLiteral;
|
||||
@ -257,10 +259,18 @@ public abstract class ExpressionVisitor<R, C>
|
||||
return visitLiteral(dateLiteral, context);
|
||||
}
|
||||
|
||||
public R visitDateV2Literal(DateV2Literal dateV2Literal, C context) {
|
||||
return visitLiteral(dateV2Literal, context);
|
||||
}
|
||||
|
||||
public R visitDateTimeLiteral(DateTimeLiteral dateTimeLiteral, C context) {
|
||||
return visitLiteral(dateTimeLiteral, context);
|
||||
}
|
||||
|
||||
public R visitDateTimeV2Literal(DateTimeV2Literal dateTimeV2Literal, C context) {
|
||||
return visitLiteral(dateTimeV2Literal, context);
|
||||
}
|
||||
|
||||
public R visitArrayLiteral(ArrayLiteral arrayLiteral, C context) {
|
||||
return visitLiteral(arrayLiteral, context);
|
||||
}
|
||||
|
||||
@ -64,6 +64,11 @@ public class DateTimeV2Type extends DateLikeType {
|
||||
return t2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toSql() {
|
||||
return super.toSql() + "(" + scale + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type toCatalogDataType() {
|
||||
return ScalarType.createDatetimeV2Type(scale);
|
||||
|
||||
Reference in New Issue
Block a user