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 35873a251c0dba..d43178d4146d5e 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 @@ -334,10 +334,13 @@ private void analyzeBuiltinAggFunction(Analyzer analyzer) throws AnalysisExcepti throw new AnalysisException(fnName.getFunction() + " only used in analytic function"); } else { if (children.size() > 2) { - if (!getChild(2).isConstant()) { + if (!getChild(1).isConstant() || !getChild(2).isConstant()) { throw new AnalysisException( - "The default parameter (parameter 3) of LAG must be a constant: " - + this.toSql()); + "The default parameter (parameter 2 or parameter 3) of LEAD/LAG must be a constant: " + this.toSql()); + } + uncheckedCastChild(Type.BIGINT, 1); + if (!getChild(2).type.matchesType(getChild(0).type) && !getChild(2).type.matchesType(Type.NULL)) { + uncheckedCastChild(getChild(0).type, 2); } } return; 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 f2b93fba6934dd..ba3e24ce9572f9 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 @@ -1310,6 +1310,27 @@ public void testAggregateSatisfyOlapTableDistribution() throws Exception { System.out.println(explainString); Assert.assertTrue(explainString.contains("AGGREGATE (update finalize)")); } + + @Test + public void testLeadAndLagFunction() throws Exception { + connectContext.setDatabase("default_cluster:test"); + + String queryStr = "explain select time, lead(query_time, 1, NULL) over () as time2 from test.test1"; + String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); + Assert.assertTrue(explainString.contains("lead(`query_time`, 1, NULL)")); + + queryStr = "explain select time, lead(query_time, 1, 2) over () as time2 from test.test1"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); + Assert.assertTrue(explainString.contains("lead(`query_time`, 1, 2)")); + + queryStr = "explain select time, lead(time, 1, '2020-01-01 00:00:00') over () as time2 from test.test1"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); + Assert.assertTrue(explainString.contains("lead(`time`, 1, '2020-01-01 00:00:00')")); + + queryStr = "explain select time, lag(query_time, 1, 2) over () as time2 from test.test1"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); + Assert.assertTrue(explainString.contains("lag(`query_time`, 1, 2)")); + } }