From 806461721c897e7cb413b3a1d61e5f488126b0dd Mon Sep 17 00:00:00 2001 From: morrySnow <101034200+morrySnow@users.noreply.github.com> Date: Wed, 8 Nov 2023 10:43:37 +0800 Subject: [PATCH] [opt](Nereids) remove Nondeterministic trait from date related functions (#26444) --- .../doris/analysis/ExpressionFunctions.java | 7 +----- .../functions/Nondeterministic.java | 8 ------- .../functions/executable/DateTimeAcquire.java | 23 ++++++++++--------- .../expressions/functions/scalar/Random.java | 5 ++++ .../functions/scalar/UnixTimestamp.java | 10 +------- .../expressions/functions/scalar/Uuid.java | 5 ++++ .../functions/scalar/UuidNumeric.java | 5 ++++ .../nereids/trees/plans/PlanVisitorTest.java | 16 ++++++------- .../datatype/test_date_acquire.groovy | 2 +- 9 files changed, 38 insertions(+), 43 deletions(-) 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 a45954a9b9..ea63a8ffab 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 @@ -52,13 +52,8 @@ public enum ExpressionFunctions { private static final Logger LOG = LogManager.getLogger(ExpressionFunctions.class); private ImmutableMultimap functions; public static final Set unfixedFn = ImmutableSet.of( - "now", - "current_time", - "current_date", - "utc_timestamp", "uuid", - "random", - "unix_timestamp" + "random" ); private ExpressionFunctions() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Nondeterministic.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Nondeterministic.java index 88955c0c4d..56aa5ebb3b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Nondeterministic.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/Nondeterministic.java @@ -17,8 +17,6 @@ package org.apache.doris.nereids.trees.expressions.functions; -import org.apache.doris.qe.ConnectContext; - /** * Nondeterministic functions. * @@ -26,10 +24,4 @@ import org.apache.doris.qe.ConnectContext; * */ public interface Nondeterministic extends ExpressionTrait { - @Override - default boolean foldable() { - return ConnectContext.get() == null - || ConnectContext.get().getSessionVariable() == null - || ConnectContext.get().getSessionVariable().isEnableFoldNondeterministicFn(); - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeAcquire.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeAcquire.java index e5dca783fd..17403bd83c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeAcquire.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeAcquire.java @@ -86,18 +86,19 @@ public class DateTimeAcquire { return DateLiteral.fromJavaDateType(LocalDateTime.now(DateUtils.getTimeZone())); } - /** - * date acquire function: current_time - */ - @ExecFunction(name = "curtime", argTypes = {}, returnType = "DATETIME") - public static Expression curTime() { - return DateTimeLiteral.fromJavaDateType(LocalDateTime.now(DateUtils.getTimeZone())); - } + // comment these function temporally until we support TimeLiteral + // /** + // * date acquire function: current_time + // */ + // @ExecFunction(name = "curtime", argTypes = {}, returnType = "TIME") + // public static Expression curTime() { + // return DateTimeLiteral.fromJavaDateType(LocalDateTime.now(DateUtils.getTimeZone())); + // } - @ExecFunction(name = "current_time", argTypes = {}, returnType = "DATETIME") - public static Expression currentTime() { - return DateTimeLiteral.fromJavaDateType(LocalDateTime.now(DateUtils.getTimeZone())); - } + // @ExecFunction(name = "current_time", argTypes = {}, returnType = "TIME") + // public static Expression currentTime() { + // return DateTimeLiteral.fromJavaDateType(LocalDateTime.now(DateUtils.getTimeZone())); + // } /** * date transformation function: unix_timestamp diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java index 1ee251c305..29530adfa0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java @@ -70,6 +70,11 @@ public class Random extends ScalarFunction } } + @Override + public boolean foldable() { + return false; + } + /** * withChildren. */ diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java index 20958dd45a..bdeabb74c8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UnixTimestamp.java @@ -40,7 +40,7 @@ import java.util.List; * ScalarFunction 'unix_timestamp'. This class is generated by GenerateFunction. */ public class UnixTimestamp extends ScalarFunction - implements Nondeterministic, ExplicitlyCastableSignature, PropagateNullableOnDateLikeV2Args { + implements ExplicitlyCastableSignature, PropagateNullableOnDateLikeV2Args, Nondeterministic { private static final List SIGNATURES = ImmutableList.of( FunctionSignature.ret(IntegerType.INSTANCE).args(), @@ -101,14 +101,6 @@ public class UnixTimestamp extends ScalarFunction } } - @Override - public boolean foldable() { - if (children.size() != 0) { - return true; - } - return Nondeterministic.super.foldable(); - } - @Override public List getSignatures() { return SIGNATURES; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java index 2f0f162b5f..8949290783 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java @@ -46,6 +46,11 @@ public class Uuid extends ScalarFunction super("uuid"); } + @Override + public boolean foldable() { + return false; + } + @Override public R accept(ExpressionVisitor visitor, C context) { return visitor.visitUuid(this, context); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java index 3e2267b437..bbbd2e81a9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java @@ -46,6 +46,11 @@ public class UuidNumeric extends ScalarFunction super("uuid_numeric"); } + @Override + public boolean foldable() { + return false; + } + @Override public R accept(ExpressionVisitor visitor, C context) { return visitor.visitUuidNumeric(this, context); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java index e70470c468..c6ca20577c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java @@ -21,8 +21,8 @@ import org.apache.doris.catalog.TableIf; import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.nereids.trees.TreeNode; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentDate; -import org.apache.doris.nereids.trees.expressions.functions.scalar.Now; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Random; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Uuid; import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan; import org.apache.doris.nereids.trees.plans.visitor.NondeterministicFunctionCollector; import org.apache.doris.nereids.trees.plans.visitor.TableCollector; @@ -76,7 +76,7 @@ public class PlanVisitorTest extends TestWithFeService { + "\"replication_num\" = \"1\"\n" + ");"); - createView("CREATE VIEW `view1` AS SELECT t1.*, current_date() FROM\n" + createView("CREATE VIEW `view1` AS SELECT t1.*, random() FROM\n" + "`table1` t1 LEFT JOIN\n" + "`table2` t2 ON t1.c1 = t2.c1;"); } @@ -84,7 +84,7 @@ public class PlanVisitorTest extends TestWithFeService { @Test public void test1() { PlanChecker.from(connectContext) - .checkPlannerResult("SELECT *, now() FROM table1 " + .checkPlannerResult("SELECT *, random() FROM table1 " + "LEFT SEMI JOIN table2 ON table1.c1 = table2.c1 " + "WHERE table1.c1 IN (SELECT c1 FROM table2) OR table1.c1 < 10", nereidsPlanner -> { @@ -93,7 +93,7 @@ public class PlanVisitorTest extends TestWithFeService { // Check nondeterministic collect physicalPlan.accept(NondeterministicFunctionCollector.INSTANCE, collectResult); Assertions.assertEquals(1, collectResult.size()); - Assertions.assertTrue(collectResult.get(0) instanceof Now); + Assertions.assertTrue(collectResult.get(0) instanceof Random); // Check get tables TableCollectorContext collectorContext = new TableCollector.TableCollectorContext(Sets.newHashSet(TableType.OLAP)); @@ -114,7 +114,7 @@ public class PlanVisitorTest extends TestWithFeService { @Test public void test2() { PlanChecker.from(connectContext) - .checkPlannerResult("SELECT view1.*, now() FROM view1 " + .checkPlannerResult("SELECT view1.*, uuid() FROM view1 " + "LEFT SEMI JOIN table2 ON view1.c1 = table2.c1 " + "WHERE view1.c1 IN (SELECT c1 FROM table2) OR view1.c1 < 10", nereidsPlanner -> { @@ -123,8 +123,8 @@ public class PlanVisitorTest extends TestWithFeService { // Check nondeterministic collect physicalPlan.accept(NondeterministicFunctionCollector.INSTANCE, collectResult); Assertions.assertEquals(2, collectResult.size()); - Assertions.assertTrue(collectResult.get(0) instanceof Now); - Assertions.assertTrue(collectResult.get(1) instanceof CurrentDate); + Assertions.assertTrue(collectResult.get(0) instanceof Uuid); + Assertions.assertTrue(collectResult.get(1) instanceof Random); // Check get tables TableCollectorContext collectorContext = new TableCollector.TableCollectorContext(Sets.newHashSet(TableType.OLAP)); diff --git a/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy b/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy index b6afad759d..981b28eac4 100644 --- a/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy +++ b/regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy @@ -20,7 +20,7 @@ suite("test_date_acquire") { sql 'set enable_fallback_to_original_planner=false' sql 'set enable_fold_nondeterministic_fn=true' - String res = sql 'explain select now(), now(3), curdate(), current_date(), curtime(), current_time(), current_timestamp(), current_timestamp(3)' + String res = sql 'explain select now(), now(3), curdate(), current_date(), current_timestamp(), current_timestamp(3)' res = res.split('VUNION')[1] assertFalse(res.contains("()") || res.contains("(3)"))