diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp new file mode 100644 index 000000000000..7470da62b424 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp @@ -0,0 +1,59 @@ +/* + * 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. + */ + +#include + +namespace DB +{ +namespace ErrorCodes +{ + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; +} +} + +namespace local_engine +{ +class FunctionParserExpm1 : public FunctionParser +{ +public: + explicit FunctionParserExpm1(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~FunctionParserExpm1() override = default; + + static constexpr auto name = "expm1"; + + String getName() const override { return name; } + + const ActionsDAG::Node * parse( + const substrait::Expression_ScalarFunction & substrait_func, + ActionsDAGPtr & actions_dag) const override + { + /// parse expm1(x) as exp(x) - 1 + auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + if (parsed_args.size() != 1) + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); + + const auto * x_node = parsed_args[0]; + const auto * exp_node = toFunctionNode(actions_dag, "exp", {x_node}); + const auto * one_const_node = addColumnToActionsDAG(actions_dag, std::make_shared(), 1.0); + const auto * result_node = toFunctionNode(actions_dag, "minus", {exp_node, one_const_node}); + + return convertNodeTypeIfNeeded(substrait_func, result_node, actions_dag); + } +}; + +static FunctionParserRegister register_expm1; +} diff --git a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala index e34ea88403d1..0f529947afdc 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala @@ -110,6 +110,7 @@ object ExpressionMappings { Sig[Ceil](CEIL), Sig[Floor](FLOOR), Sig[Exp](EXP), + Sig[Expm1](EXPM1), Sig[Pow](POWER), Sig[Pmod](PMOD), Sig[Round](ROUND), diff --git a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala index a51157e6263a..7831424ed98e 100644 --- a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala +++ b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala @@ -844,7 +844,6 @@ class ClickHouseTestSettings extends BackendTestSettings { enableSuite[GlutenMathExpressionsSuite] .exclude("tanh") .exclude("rint") - .exclude("expm1") .exclude("unhex") .exclude("atan2") .exclude("round/bround") diff --git a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala index 144d103c0d66..0025010971d1 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala @@ -849,7 +849,6 @@ class ClickHouseTestSettings extends BackendTestSettings { enableSuite[GlutenMathExpressionsSuite] .exclude("tanh") .exclude("rint") - .exclude("expm1") .exclude("unhex") .exclude("atan2") .exclude("round/bround/floor/ceil") diff --git a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala index f097d53625a2..851c81a8d826 100644 --- a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala +++ b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala @@ -137,6 +137,7 @@ object ExpressionNames { final val CEIL = "ceil" final val FLOOR = "floor" final val EXP = "exp" + final val EXPM1 = "expm1" final val POWER = "power" final val PMOD = "pmod" final val ROUND = "round"