You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2025/12/17 02:41:45 UTC

(doris) branch master updated: [chore](parser) remove useless class TimestampArithmetic (#59049)

This is an automated email from the ASF dual-hosted git repository.

morrysnow 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 d80976a6efe [chore](parser) remove useless class TimestampArithmetic (#59049)
d80976a6efe is described below

commit d80976a6efe6892e9e227b0b1b274a94cb6c27eb
Author: morrySnow <zh...@selectdb.com>
AuthorDate: Wed Dec 17 10:41:38 2025 +0800

    [chore](parser) remove useless class TimestampArithmetic (#59049)
    
    This pull request removes the `TimestampArithmetic` expression node from
    the Nereids planner in favor of using unbound function calls for
    timestamp arithmetic operations. The changes simplify the codebase by
    eliminating the custom handling and pattern matching for
    `TimestampArithmetic`, and instead treating timestamp arithmetic as
    regular function calls. This affects parsing, analysis, expression
    rewriting, statistics estimation, and evaluation.
    
    Key changes include:
    
    **Removal of `TimestampArithmetic` Expression:**
    - Deleted the `TimestampArithmetic` class and all related code,
    including its visitor methods and pattern matchers.
    
    **Parser and Expression Construction Updates:**
    - Updated the parser (`LogicalPlanBuilder`) to construct unbound
    function calls (e.g., `YEARS_ADD`, `DAYS_SUB`) instead of
    `TimestampArithmetic` nodes for timestamp arithmetic expressions.
    
    **Refactoring and Cleanup:**
    - Removed all imports, references, and usages of `TimestampArithmetic`
    across the codebase, including in translators, analyzers, statistics,
    and expression evaluation.
    
    These changes make timestamp arithmetic handling more uniform and
    maintainable by leveraging the function call mechanism already present
    in the planner.
---
 .../glue/translator/ExpressionTranslator.java      |  15 --
 .../doris/nereids/parser/LogicalPlanBuilder.java   |  13 +-
 .../nereids/rules/analysis/ExpressionAnalyzer.java |  28 ----
 .../expression/rules/FoldConstantRuleOnFE.java     |  12 --
 .../doris/nereids/stats/ExpressionEstimation.java  |  15 --
 .../trees/expressions/ExpressionEvaluator.java     |   3 -
 .../trees/expressions/TimestampArithmetic.java     | 174 ---------------------
 .../expressions/visitor/ExpressionVisitor.java     |   5 -
 .../doris/nereids/util/TypeCoercionUtils.java      |  30 ----
 .../nereids/rules/expression/FoldConstantTest.java |  82 ----------
 .../shape_check/tpcds_sf100/rf_prune/query72.out   |   2 +-
 .../data/shape_check/tpcds_sf100/shape/query72.out |   2 +-
 .../data/shape_check/tpcds_sf1000/hint/query72.out |   2 +-
 .../shape_check/tpcds_sf1000/shape/query72.out     |   2 +-
 .../test_timestamp_arithmetic.groovy               |   4 +-
 15 files changed, 13 insertions(+), 376 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
index dc62966f6b8..6a5c5703c61 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
@@ -38,7 +38,6 @@ import org.apache.doris.analysis.MatchPredicate;
 import org.apache.doris.analysis.OrderByElement;
 import org.apache.doris.analysis.SearchPredicate;
 import org.apache.doris.analysis.SlotRef;
-import org.apache.doris.analysis.TimestampArithmeticExpr;
 import org.apache.doris.analysis.TryCastExpr;
 import org.apache.doris.catalog.ArrayType;
 import org.apache.doris.catalog.Column;
@@ -78,7 +77,6 @@ import org.apache.doris.nereids.trees.expressions.OrderExpression;
 import org.apache.doris.nereids.trees.expressions.SearchExpression;
 import org.apache.doris.nereids.trees.expressions.SessionVarGuardExpr;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.TryCast;
 import org.apache.doris.nereids.trees.expressions.UnaryArithmetic;
 import org.apache.doris.nereids.trees.expressions.WhenClause;
@@ -111,7 +109,6 @@ import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.thrift.TDictFunction;
 import org.apache.doris.thrift.TFunctionBinaryType;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
@@ -757,18 +754,6 @@ public class ExpressionTranslator extends DefaultExpressionVisitor<Expr, PlanTra
         return arithmeticExpr;
     }
 
-    @Override
-    public Expr visitTimestampArithmetic(TimestampArithmetic arithmetic, PlanTranslatorContext context) {
-        Preconditions.checkNotNull(arithmetic.getFuncName(),
-                "funcName in TimestampArithmetic should not be null");
-        TimestampArithmeticExpr timestampArithmeticExpr = new TimestampArithmeticExpr(
-                arithmetic.getFuncName(), arithmetic.getOp(),
-                arithmetic.left().accept(this, context), arithmetic.right().accept(this, context),
-                arithmetic.getTimeUnit().toString(), arithmetic.getDataType().toCatalogDataType(),
-                arithmetic.nullable());
-        return timestampArithmeticExpr;
-    }
-
     @Override
     public Expr visitIsNull(IsNull isNull, PlanTranslatorContext context) {
         IsNullPredicate isNullPredicate = new IsNullPredicate(isNull.child().accept(this, context), false);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index f045d79250f..864dea25a4e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -555,7 +555,6 @@ import org.apache.doris.nereids.trees.expressions.ScalarSubquery;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator;
 import org.apache.doris.nereids.trees.expressions.Subtract;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.TryCast;
 import org.apache.doris.nereids.trees.expressions.WhenClause;
 import org.apache.doris.nereids.trees.expressions.WindowExpression;
@@ -2983,20 +2982,22 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
                     throw new ParseException("Only supported: " + Operator.ADD, ctx);
                 }
                 Interval interval = (Interval) left;
-                return new TimestampArithmetic(Operator.ADD, right, interval.value(), interval.timeUnit());
+                String funcOpName = String.format("%sS_ADD", interval.timeUnit());
+                return new UnboundFunction(funcOpName, ImmutableList.of(right, interval.value()));
             }
 
             if (right instanceof Interval) {
-                Operator op;
+                String op;
                 if (type == DorisParser.PLUS) {
-                    op = Operator.ADD;
+                    op = "ADD";
                 } else if (type == DorisParser.SUBTRACT) {
-                    op = Operator.SUBTRACT;
+                    op = "SUB";
                 } else {
                     throw new ParseException("Only supported: " + Operator.ADD + " and " + Operator.SUBTRACT, ctx);
                 }
                 Interval interval = (Interval) right;
-                return new TimestampArithmetic(op, left, interval.value(), interval.timeUnit());
+                String funcOpName = String.format("%sS_%s", interval.timeUnit(), op);
+                return new UnboundFunction(funcOpName, ImmutableList.of(left, interval.value()));
             }
 
             return ParserUtils.withOrigin(ctx, () -> {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
index 5dbd43801fb..a4fb7f3ae76 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.nereids.rules.analysis;
 
-import org.apache.doris.analysis.ArithmeticExpr.Operator;
 import org.apache.doris.analysis.SetType;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.FunctionRegistry;
@@ -66,7 +65,6 @@ import org.apache.doris.nereids.trees.expressions.Or;
 import org.apache.doris.nereids.trees.expressions.Placeholder;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.Variable;
 import org.apache.doris.nereids.trees.expressions.WhenClause;
 import org.apache.doris.nereids.trees.expressions.WindowExpression;
@@ -121,7 +119,6 @@ import org.apache.commons.lang3.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
@@ -603,31 +600,6 @@ public class ExpressionAnalyzer extends SubExprAnalyzer<ExpressionRewriteContext
         return windowExpression;
     }
 
-    /**
-     * gets the method for calculating the time.
-     * e.g. YEARS_ADD、YEARS_SUB、DAYS_ADD 、DAYS_SUB
-     */
-    @Override
-    public Expression visitTimestampArithmetic(TimestampArithmetic arithmetic, ExpressionRewriteContext context) {
-        Expression left = arithmetic.left().accept(this, context);
-        Expression right = arithmetic.right().accept(this, context);
-
-        arithmetic = (TimestampArithmetic) arithmetic.withChildren(left, right);
-        // bind function
-        String funcOpName;
-        if (arithmetic.getFuncName() == null) {
-            // e.g. YEARS_ADD, MONTHS_SUB
-            funcOpName = String.format("%sS_%s", arithmetic.getTimeUnit(),
-                    (arithmetic.getOp() == Operator.ADD) ? "ADD" : "SUB");
-        } else {
-            funcOpName = arithmetic.getFuncName();
-        }
-        arithmetic = (TimestampArithmetic) arithmetic.withFuncName(funcOpName.toLowerCase(Locale.ROOT));
-
-        // type coercion
-        return TypeCoercionUtils.processTimestampArithmetic(arithmetic);
-    }
-
     /* ********************************************************************************************
      * type coercion
      * ******************************************************************************************** */
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
index 1560ab55370..14ba60b9d64 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
@@ -56,7 +56,6 @@ import org.apache.doris.nereids.trees.expressions.Not;
 import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
 import org.apache.doris.nereids.trees.expressions.Or;
 import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.TryCast;
 import org.apache.doris.nereids.trees.expressions.Variable;
 import org.apache.doris.nereids.trees.expressions.WhenClause;
@@ -178,7 +177,6 @@ public class FoldConstantRuleOnFE extends AbstractExpressionRewriteRule
                 matches(If.class, this::visitIf),
                 matches(InPredicate.class, this::visitInPredicate),
                 matches(IsNull.class, this::visitIsNull),
-                matches(TimestampArithmetic.class, this::visitTimestampArithmetic),
                 matches(Password.class, this::visitPassword),
                 matches(Array.class, this::visitArray),
                 matches(Date.class, this::visitDate),
@@ -671,16 +669,6 @@ public class FoldConstantRuleOnFE extends AbstractExpressionRewriteRule
         return Literal.of(isNull.child().nullable());
     }
 
-    @Override
-    public Expression visitTimestampArithmetic(TimestampArithmetic arithmetic, ExpressionRewriteContext context) {
-        arithmetic = rewriteChildren(arithmetic, context);
-        Optional<Expression> checkedExpr = preProcess(arithmetic);
-        if (checkedExpr.isPresent()) {
-            return checkedExpr.get();
-        }
-        return ExpressionEvaluator.INSTANCE.eval(arithmetic);
-    }
-
     @Override
     public Expression visitPassword(Password password, ExpressionRewriteContext context) {
         Preconditions.checkArgument(password.child(0) instanceof StringLikeLiteral,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
index cb3234461b3..a6e620b8efc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.nereids.stats;
 
-import org.apache.doris.analysis.ArithmeticExpr.Operator;
 import org.apache.doris.analysis.NumericLiteralExpr;
 import org.apache.doris.analysis.StringLiteral;
 import org.apache.doris.nereids.exceptions.AnalysisException;
@@ -38,7 +37,6 @@ import org.apache.doris.nereids.trees.expressions.Multiply;
 import org.apache.doris.nereids.trees.expressions.Or;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.Subtract;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.WhenClause;
 import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Avg;
@@ -534,19 +532,6 @@ public class ExpressionEstimation extends ExpressionVisitor<ColumnStatistic, Sta
         return new ColumnStatisticBuilder(firstChild).setNumNulls(maxNull).setNdv(2).build();
     }
 
-    @Override
-    public ColumnStatistic visitTimestampArithmetic(TimestampArithmetic arithmetic, Statistics context) {
-        Operator operator = arithmetic.getOp();
-        switch (operator) {
-            case ADD:
-                return dateAdd(arithmetic, context);
-            case SUBTRACT:
-                return dateSub(arithmetic, context);
-            default:
-                return arithmetic.left().accept(this, context);
-        }
-    }
-
     @Override
     public ColumnStatistic visitMarkJoinReference(
             MarkJoinSlotReference markJoinSlotReference, Statistics context) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
index 96bdb3ba257..17504ceb8e2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionEvaluator.java
@@ -63,9 +63,6 @@ public enum ExpressionEvaluator {
         if (expression instanceof BinaryArithmetic) {
             BinaryArithmetic arithmetic = (BinaryArithmetic) expression;
             fnName = arithmetic.getLegacyOperator().getName();
-        } else if (expression instanceof TimestampArithmetic) {
-            TimestampArithmetic arithmetic = (TimestampArithmetic) expression;
-            fnName = arithmetic.getFuncName();
         } else if (expression instanceof BoundFunction) {
             BoundFunction function = ((BoundFunction) expression);
             fnName = function.getName();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TimestampArithmetic.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TimestampArithmetic.java
deleted file mode 100644
index c7789b968c6..00000000000
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/TimestampArithmetic.java
+++ /dev/null
@@ -1,174 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package org.apache.doris.nereids.trees.expressions;
-
-import org.apache.doris.analysis.ArithmeticExpr.Operator;
-import org.apache.doris.nereids.exceptions.AnalysisException;
-import org.apache.doris.nereids.exceptions.UnboundException;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
-import org.apache.doris.nereids.trees.expressions.literal.Interval.TimeUnit;
-import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
-import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
-import org.apache.doris.nereids.types.DataType;
-import org.apache.doris.nereids.types.DateTimeV2Type;
-import org.apache.doris.nereids.types.DateV2Type;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Describes the addition and subtraction of time units from timestamps.
- * Arithmetic expressions on timestamps are syntactic sugar.
- * They are executed as function call exprs in the BE.
- * Example: '1996-01-01' + INTERVAL '3' month;
- * TODO: we need to rethink this, and maybe need to add a new type of Interval then implement IntervalLiteral as others
- */
-public class TimestampArithmetic extends Expression
-        implements BinaryExpression, PropagateNullable {
-
-    private final String funcName;
-    private final Operator op;
-    private final TimeUnit timeUnit;
-
-    public TimestampArithmetic(Operator op, Expression e1, Expression e2, TimeUnit timeUnit) {
-        this(null, op, e1, e2, timeUnit);
-    }
-
-    /**
-     * Full parameter constructor.
-     */
-    public TimestampArithmetic(String funcName, Operator op, Expression e1, Expression e2, TimeUnit timeUnit) {
-        super(ImmutableList.of(e1, e2));
-        Preconditions.checkState(op == Operator.ADD || op == Operator.SUBTRACT);
-        this.funcName = funcName;
-        this.op = op;
-        this.timeUnit = timeUnit;
-    }
-
-    @Override
-    public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
-        return visitor.visitTimestampArithmetic(this, context);
-    }
-
-    @Override
-    public TimestampArithmetic withChildren(List<Expression> children) {
-        Preconditions.checkArgument(children.size() == 2);
-        return new TimestampArithmetic(this.funcName, this.op, children.get(0), children.get(1),
-                this.timeUnit);
-    }
-
-    public Expression withFuncName(String funcName) {
-        return new TimestampArithmetic(funcName, this.op, children.get(0), children.get(1), this.timeUnit);
-    }
-
-    @Override
-    public DataType getDataType() throws UnboundException {
-        DataType childType = child(0).getDataType();
-        if (childType instanceof DateTimeV2Type) {
-            return childType;
-        }
-        // datev2
-        if (timeUnit.isDateTimeUnit()) {
-            return DateTimeV2Type.SYSTEM_DEFAULT;
-        }
-        return DateV2Type.INSTANCE;
-    }
-
-    public String getFuncName() {
-        return funcName;
-    }
-
-    public Operator getOp() {
-        return op;
-    }
-
-    public TimeUnit getTimeUnit() {
-        return timeUnit;
-    }
-
-    @Override
-    public void checkLegalityBeforeTypeCoercion() {
-        children().forEach(c -> {
-            if (c.getDataType().isObjectType()) {
-                throw new AnalysisException("timestamp arithmetic could not contains object type: " + this.toSql());
-            }
-            if (c.getDataType().isComplexType()) {
-                throw new AnalysisException("timestamp arithmetic could not contains complex type: " + this.toSql());
-            }
-        });
-    }
-
-    @Override
-    public String toString() {
-        return toSql();
-    }
-
-    @Override
-    public String toDigest() {
-        StringBuilder sb = new StringBuilder();
-        if (funcName != null) {
-            sb.append(funcName.toUpperCase()).append("(");
-            sb.append(child(0).toDigest()).append(", ");
-            sb.append(child(1).toDigest()).append(")");
-        } else {
-            sb.append(child(0).toDigest());
-            sb.append(" ").append(op.toString()).append(" ");
-            sb.append(child(1).toDigest());
-        }
-        return sb.toString();
-    }
-
-    @Override
-    public String computeToSql() {
-        StringBuilder strBuilder = new StringBuilder();
-        if (funcName != null) {
-            // Function-call like version.
-            strBuilder.append(funcName).append("(");
-            strBuilder.append(child(0).toSql()).append(", ");
-            strBuilder.append("INTERVAL ");
-            strBuilder.append(child(1).toSql());
-            strBuilder.append(" ").append(timeUnit);
-            strBuilder.append(")");
-            return strBuilder.toString();
-        }
-        // Non-function-call like version with interval as second operand.
-        strBuilder.append(child(0).toSql());
-        strBuilder.append(" ").append(op.toString()).append(" ");
-        strBuilder.append("INTERVAL ");
-        strBuilder.append(child(1).toSql()).append(" ");
-        strBuilder.append(timeUnit);
-        return strBuilder.toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        TimestampArithmetic other = (TimestampArithmetic) o;
-        return Objects.equals(funcName, other.funcName) && Objects.equals(timeUnit, other.timeUnit)
-                && op.equals(other.op)
-                && Objects.equals(left(), other.left()) && Objects.equals(right(), other.right());
-    }
-}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
index 420c61d6c9c..0b0c85d34c5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
@@ -78,7 +78,6 @@ import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.SubqueryExpr;
 import org.apache.doris.nereids.trees.expressions.Subtract;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.TryCast;
 import org.apache.doris.nereids.trees.expressions.UnaryArithmetic;
 import org.apache.doris.nereids.trees.expressions.UnaryOperator;
@@ -456,10 +455,6 @@ public abstract class ExpressionVisitor<R, C>
         return visit(subqueryExpr, context);
     }
 
-    public R visitTimestampArithmetic(TimestampArithmetic arithmetic, C context) {
-        return visit(arithmetic, context);
-    }
-
     public R visitScalarSubquery(ScalarSubquery scalar, C context) {
         return visitSubqueryExpr(scalar, context);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
index 0e1689caf72..641dd4f76dc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
@@ -17,8 +17,6 @@
 
 package org.apache.doris.nereids.util;
 
-import org.apache.doris.catalog.Env;
-import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.common.Pair;
 import org.apache.doris.nereids.annotation.Developing;
 import org.apache.doris.nereids.exceptions.AnalysisException;
@@ -43,9 +41,7 @@ import org.apache.doris.nereids.trees.expressions.Mod;
 import org.apache.doris.nereids.trees.expressions.Multiply;
 import org.apache.doris.nereids.trees.expressions.SubqueryExpr;
 import org.apache.doris.nereids.trees.expressions.Subtract;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
-import org.apache.doris.nereids.trees.expressions.functions.FunctionBuilder;
 import org.apache.doris.nereids.trees.expressions.functions.executable.DateTimeExtractAndTransform;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Array;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.CreateMap;
@@ -941,32 +937,6 @@ public class TypeCoercionUtils {
         return castChildren(binaryArithmetic, left, right, commonType.promotion());
     }
 
-    /**
-     * process timestamp arithmetic type coercion.
-     */
-    public static Expression processTimestampArithmetic(TimestampArithmetic timestampArithmetic) {
-        timestampArithmetic.checkLegalityBeforeTypeCoercion();
-
-        String name = timestampArithmetic.getFuncName().toLowerCase();
-        List<Expression> children = timestampArithmetic.children();
-        Expression left = timestampArithmetic.left();
-        Expression right = timestampArithmetic.right();
-
-        // get right signature by normal function resolution
-        FunctionBuilder functionBuilder = Env.getCurrentEnv().getFunctionRegistry().findFunctionBuilder(name,
-                children);
-        Pair<? extends Expression, ? extends BoundFunction> targetExpressionPair = functionBuilder.build(name,
-                children);
-        FunctionSignature signature = targetExpressionPair.second.getSignature();
-        DataType leftType = signature.getArgType(0);
-        DataType rightType = signature.getArgType(1);
-
-        left = castIfNotSameType(left, leftType);
-        right = castIfNotSameType(right, rightType);
-
-        return timestampArithmetic.withChildren(left, right);
-    }
-
     /**
      * left type must be DateType or DateV2Type.
      */
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
index e35312aa1f3..0cd32e91710 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/FoldConstantTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.nereids.rules.expression;
 
-import org.apache.doris.analysis.ArithmeticExpr.Operator;
 import org.apache.doris.nereids.analyzer.UnboundRelation;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.exceptions.NotSupportedException;
@@ -36,7 +35,6 @@ import org.apache.doris.nereids.trees.expressions.Multiply;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.Subtract;
-import org.apache.doris.nereids.trees.expressions.TimestampArithmetic;
 import org.apache.doris.nereids.trees.expressions.functions.executable.DateTimeArithmetic;
 import org.apache.doris.nereids.trees.expressions.functions.executable.DateTimeExtractAndTransform;
 import org.apache.doris.nereids.trees.expressions.functions.executable.TimeRoundSeries;
@@ -114,7 +112,6 @@ import org.apache.doris.nereids.trees.expressions.literal.DecimalV3Literal;
 import org.apache.doris.nereids.trees.expressions.literal.DoubleLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.FloatLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
-import org.apache.doris.nereids.trees.expressions.literal.Interval.TimeUnit;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
@@ -137,7 +134,6 @@ import org.junit.jupiter.api.Test;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.Locale;
 
 class FoldConstantTest extends ExpressionRewriteTestHelper {
 
@@ -1163,84 +1159,6 @@ class FoldConstantTest extends ExpressionRewriteTestHelper {
         assertRewrite(one, one);
     }
 
-    @Test
-    void testTimestampFold() {
-        executor = new ExpressionRuleExecutor(ImmutableList.of(
-                bottomUp(FoldConstantRuleOnFE.VISITOR_INSTANCE)
-        ));
-        String interval = "'1991-05-01' - interval 1 day";
-        Expression e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        Expression e8 = new DateV2Literal(1991, 4, 30);
-        assertRewrite(e7, e8);
-
-        interval = "'1991-05-01' + interval '1' day";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateV2Literal(1991, 5, 2);
-        assertRewrite(e7, e8);
-
-        interval = "'1991-05-01' + interval 1+1 day";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateV2Literal(1991, 5, 3);
-        assertRewrite(e7, e8);
-
-        interval = "date '1991-05-01' + interval 10 / 2 + 1 day";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateV2Literal(1991, 5, 7);
-        assertRewrite(e7, e8);
-
-        interval = "interval '1' day + '1991-05-01'";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateV2Literal(1991, 5, 2);
-        assertRewrite(e7, e8);
-
-        interval = "interval '3' month + '1991-05-01'";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateV2Literal(1991, 8, 1);
-        assertRewrite(e7, e8);
-
-        interval = "interval 3 + 1 month + '1991-05-01'";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateV2Literal(1991, 9, 1);
-        assertRewrite(e7, e8);
-
-        interval = "interval 3 + 1 year + '1991-05-01'";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateV2Literal(1995, 5, 1);
-        assertRewrite(e7, e8);
-
-        interval = "interval 3 + 3 / 3 hour + '1991-05-01 10:00:00'";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateTimeV2Literal(1991, 5, 1, 14, 0, 0);
-        assertRewrite(e7, e8);
-
-        interval = "interval 3 * 2 / 3 minute + '1991-05-01 10:00:00'";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateTimeV2Literal(1991, 5, 1, 10, 2, 0);
-        assertRewrite(e7, e8);
-
-        interval = "interval 3 / 3 + 1 second + '1991-05-01 10:00:00'";
-        e7 = process((TimestampArithmetic) PARSER.parseExpression(interval));
-        e8 = new DateTimeV2Literal(1991, 5, 1, 10, 0, 2);
-        assertRewrite(e7, e8);
-
-        // a + interval 1 day
-        Slot a = SlotReference.of("a", DateTimeV2Type.SYSTEM_DEFAULT);
-        TimestampArithmetic arithmetic = new TimestampArithmetic(Operator.ADD, a, Literal.of(1), TimeUnit.DAY);
-        Expression process = process(arithmetic);
-        assertRewrite(process, process);
-    }
-
-    Expression process(TimestampArithmetic arithmetic) {
-        String funcOpName;
-        if (arithmetic.getFuncName() == null) {
-            funcOpName = String.format("%sS_%s", arithmetic.getTimeUnit(),
-                    (arithmetic.getOp() == Operator.ADD) ? "ADD" : "SUB");
-        } else {
-            funcOpName = arithmetic.getFuncName();
-        }
-        return arithmetic.withFuncName(funcOpName.toLowerCase(Locale.ROOT));
-    }
-
     @Test
     void testDateV2TypeDateTimeArithmeticFunctions() {
         DateV2Literal dateLiteral = new DateV2Literal("1999-12-31");
diff --git a/regression-test/data/shape_check/tpcds_sf100/rf_prune/query72.out b/regression-test/data/shape_check/tpcds_sf100/rf_prune/query72.out
index 6b1d29b746c..972612d05e0 100644
--- a/regression-test/data/shape_check/tpcds_sf100/rf_prune/query72.out
+++ b/regression-test/data/shape_check/tpcds_sf100/rf_prune/query72.out
@@ -21,7 +21,7 @@ PhysicalResultSink
 ----------------------------------PhysicalProject
 ------------------------------------hashJoin[INNER_JOIN shuffle] hashCondition=((item.i_item_sk = catalog_sales.cs_item_sk)) otherCondition=()
 --------------------------------------PhysicalProject
-----------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_ship_date_sk = d3.d_date_sk)) otherCondition=((d3.d_date > days_add(d_date, INTERVAL 5 DAY)))
+----------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_ship_date_sk = d3.d_date_sk)) otherCondition=((d3.d_date > days_add(d_date, 5)))
 ------------------------------------------PhysicalProject
 --------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_bill_cdemo_sk = customer_demographics.cd_demo_sk)) otherCondition=() build RFs:RF2 cd_demo_sk->[cs_bill_cdemo_sk]
 ----------------------------------------------PhysicalProject
diff --git a/regression-test/data/shape_check/tpcds_sf100/shape/query72.out b/regression-test/data/shape_check/tpcds_sf100/shape/query72.out
index a1148117340..de210e70c05 100644
--- a/regression-test/data/shape_check/tpcds_sf100/shape/query72.out
+++ b/regression-test/data/shape_check/tpcds_sf100/shape/query72.out
@@ -21,7 +21,7 @@ PhysicalResultSink
 ----------------------------------PhysicalProject
 ------------------------------------hashJoin[INNER_JOIN shuffle] hashCondition=((item.i_item_sk = catalog_sales.cs_item_sk)) otherCondition=() build RFs:RF4 i_item_sk->[cs_item_sk]
 --------------------------------------PhysicalProject
-----------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_ship_date_sk = d3.d_date_sk)) otherCondition=((d3.d_date > days_add(d_date, INTERVAL 5 DAY))) build RFs:RF3 d_date_sk->[cs_ship_date_sk]
+----------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_ship_date_sk = d3.d_date_sk)) otherCondition=((d3.d_date > days_add(d_date, 5))) build RFs:RF3 d_date_sk->[cs_ship_date_sk]
 ------------------------------------------PhysicalProject
 --------------------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((catalog_sales.cs_bill_cdemo_sk = customer_demographics.cd_demo_sk)) otherCondition=() build RFs:RF2 cd_demo_sk->[cs_bill_cdemo_sk]
 ----------------------------------------------PhysicalProject
diff --git a/regression-test/data/shape_check/tpcds_sf1000/hint/query72.out b/regression-test/data/shape_check/tpcds_sf1000/hint/query72.out
index 33094a1fc42..0ce74757cb9 100644
--- a/regression-test/data/shape_check/tpcds_sf1000/hint/query72.out
+++ b/regression-test/data/shape_check/tpcds_sf1000/hint/query72.out
@@ -31,7 +31,7 @@ PhysicalResultSink
 --------------------------------------------------PhysicalProject
 ----------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2 RF3 RF4
 --------------------------------------------------PhysicalProject
-----------------------------------------------------NestedLoopJoin[INNER_JOIN](d3.d_date > days_add(d_date, INTERVAL 5 DAY))
+----------------------------------------------------NestedLoopJoin[INNER_JOIN](d3.d_date > days_add(d_date, 5))
 ------------------------------------------------------PhysicalProject
 --------------------------------------------------------PhysicalOlapScan[date_dim(d3)]
 ------------------------------------------------------PhysicalProject
diff --git a/regression-test/data/shape_check/tpcds_sf1000/shape/query72.out b/regression-test/data/shape_check/tpcds_sf1000/shape/query72.out
index 316fa087d86..92fd2650882 100644
--- a/regression-test/data/shape_check/tpcds_sf1000/shape/query72.out
+++ b/regression-test/data/shape_check/tpcds_sf1000/shape/query72.out
@@ -30,7 +30,7 @@ PhysicalResultSink
 --------------------------------------------------PhysicalProject
 ----------------------------------------------------PhysicalOlapScan[catalog_sales] apply RFs: RF0 RF1 RF2 RF3 RF7 RF9
 --------------------------------------------------PhysicalProject
-----------------------------------------------------NestedLoopJoin[INNER_JOIN](d3.d_date > days_add(d_date, INTERVAL 5 DAY))
+----------------------------------------------------NestedLoopJoin[INNER_JOIN](d3.d_date > days_add(d_date, 5))
 ------------------------------------------------------PhysicalProject
 --------------------------------------------------------PhysicalOlapScan[date_dim(d3)]
 ------------------------------------------------------PhysicalProject
diff --git a/regression-test/suites/nereids_syntax_p0/test_timestamp_arithmetic.groovy b/regression-test/suites/nereids_syntax_p0/test_timestamp_arithmetic.groovy
index fed30af473a..aafbf160743 100644
--- a/regression-test/suites/nereids_syntax_p0/test_timestamp_arithmetic.groovy
+++ b/regression-test/suites/nereids_syntax_p0/test_timestamp_arithmetic.groovy
@@ -22,12 +22,12 @@ suite("nereids_timestamp_arithmetic") {
 
     test {
         sql = "select bitmap_empty() + interval 1 year;"
-        exception = "timestamp arithmetic could not contains object type"
+        exception = " Can not find the compatibility function signature: years_add(BITMAP, TINYINT)"
     }
 
     test {
         sql = "select date '20200808' + interval array() day;"
-        exception = "timestamp arithmetic could not contains complex type"
+        exception = "Can not find the compatibility function signature: days_add(DATEV2, ARRAY<NULL>)"
     }
 
     sql """


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org