From 6442663735d3d6ef8c5e4b65eb6f2d1d4aa40559 Mon Sep 17 00:00:00 2001 From: Rohit Satardekar Date: Sun, 4 Feb 2024 08:30:36 +0530 Subject: [PATCH] [Function](exec) upport atan2 math function (#30672) Co-authored-by: Rohit Satardekar --- be/src/vec/functions/math.cpp | 16 +++++ .../sql-functions/numeric-functions/atan2.md | 52 ++++++++++++++ docs/sidebars.json | 1 + .../sql-functions/numeric-functions/atan2.md | 52 ++++++++++++++ .../doris/catalog/BuiltinScalarFunctions.java | 2 + .../expressions/functions/scalar/Atan2.java | 68 +++++++++++++++++++ .../visitor/ScalarFunctionVisitor.java | 5 ++ gensrc/script/doris_builtins_functions.py | 1 + .../nereids_function_p0/scalar_function/A.out | 29 ++++++++ .../scalar_function/A.groovy | 4 +- 10 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 docs/en/docs/sql-manual/sql-functions/numeric-functions/atan2.md create mode 100644 docs/zh-CN/docs/sql-manual/sql-functions/numeric-functions/atan2.md create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Atan2.java diff --git a/be/src/vec/functions/math.cpp b/be/src/vec/functions/math.cpp index 1ebecd16a4..dc815cf74e 100644 --- a/be/src/vec/functions/math.cpp +++ b/be/src/vec/functions/math.cpp @@ -74,6 +74,21 @@ struct AtanName { }; using FunctionAtan = FunctionMathUnary>; +template +struct Atan2Impl { + using ResultType = double; + static const constexpr bool allow_decimal = false; + + template + static inline double apply(A a, B b) { + return std::atan2((double)a, (double)b); + } +}; +struct Atan2Name { + static constexpr auto name = "atan2"; +}; +using FunctionAtan2 = FunctionBinaryArithmetic; + struct CosName { static constexpr auto name = "cos"; }; @@ -397,6 +412,7 @@ void register_function_math(SimpleFunctionFactory& factory) { factory.register_function(); factory.register_function(); factory.register_function(); + factory.register_function(); factory.register_function(); factory.register_function(); factory.register_alias("ceil", "dceil"); diff --git a/docs/en/docs/sql-manual/sql-functions/numeric-functions/atan2.md b/docs/en/docs/sql-manual/sql-functions/numeric-functions/atan2.md new file mode 100644 index 0000000000..e842b3ad4b --- /dev/null +++ b/docs/en/docs/sql-manual/sql-functions/numeric-functions/atan2.md @@ -0,0 +1,52 @@ +--- +{ + "title": "ATAN2", + "language": "en" +} +--- + + + +## atan2 + +### description +#### Syntax + +`DOUBLE atan2(DOUBLE y, DOUBLE x)` +Returns the arc tangent of 'y' / 'x'. + +### example + +``` +mysql> select atan2(0.1, 0.2); ++---------------------+ +| atan2(0.1, 0.2) | ++---------------------+ +| 0.46364760900080609 | ++---------------------+ + +mysql> select atan2(1.0, 1.0); ++---------------------+ +| atan2(1.0, 1.0) | ++---------------------+ +| 0.78539816339744828 | ++---------------------+ +``` + +### keywords + ATAN2 diff --git a/docs/sidebars.json b/docs/sidebars.json index a366e32d0d..ea74a7a24f 100644 --- a/docs/sidebars.json +++ b/docs/sidebars.json @@ -718,6 +718,7 @@ "sql-manual/sql-functions/numeric-functions/asin", "sql-manual/sql-functions/numeric-functions/acos", "sql-manual/sql-functions/numeric-functions/atan", + "sql-manual/sql-functions/numeric-functions/atan2", "sql-manual/sql-functions/numeric-functions/e", "sql-manual/sql-functions/numeric-functions/pi", "sql-manual/sql-functions/numeric-functions/exp", diff --git a/docs/zh-CN/docs/sql-manual/sql-functions/numeric-functions/atan2.md b/docs/zh-CN/docs/sql-manual/sql-functions/numeric-functions/atan2.md new file mode 100644 index 0000000000..7b1c8f5c53 --- /dev/null +++ b/docs/zh-CN/docs/sql-manual/sql-functions/numeric-functions/atan2.md @@ -0,0 +1,52 @@ +--- +{ + "title": "ATAN2", + "language": "zh-CN" +} +--- + + + +## atan2 + +### description +#### Syntax + +`DOUBLE atan2(DOUBLE y, DOUBLE x)` +返回 'y' / 'x' 的反正切. + +### example + +``` +mysql> select atan2(0.1, 0.2); ++---------------------+ +| atan2(0.1, 0.2) | ++---------------------+ +| 0.46364760900080609 | ++---------------------+ + +mysql> select atan2(1.0, 1.0); ++---------------------+ +| atan2(1.0, 1.0) | ++---------------------+ +| 0.78539816339744828 | ++---------------------+ +``` + +### keywords + ATAN2 diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java index a650b4791d..1ca81a11c1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java @@ -72,6 +72,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.ArraysOverlap import org.apache.doris.nereids.trees.expressions.functions.scalar.Ascii; import org.apache.doris.nereids.trees.expressions.functions.scalar.Asin; import org.apache.doris.nereids.trees.expressions.functions.scalar.Atan; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Atan2; import org.apache.doris.nereids.trees.expressions.functions.scalar.Bin; import org.apache.doris.nereids.trees.expressions.functions.scalar.BitCount; import org.apache.doris.nereids.trees.expressions.functions.scalar.BitLength; @@ -497,6 +498,7 @@ public class BuiltinScalarFunctions implements FunctionHelper { scalar(Ascii.class, "ascii"), scalar(Asin.class, "asin"), scalar(Atan.class, "atan"), + scalar(Atan2.class, "atan2"), scalar(Bin.class, "bin"), scalar(BitCount.class, "bit_count"), scalar(BitLength.class, "bit_length"), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Atan2.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Atan2.java new file mode 100644 index 0000000000..4a6a21e476 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Atan2.java @@ -0,0 +1,68 @@ +// 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.functions.scalar; + +import org.apache.doris.catalog.FunctionSignature; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; +import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression; +import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; +import org.apache.doris.nereids.types.DoubleType; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * ScalarFunction 'atan2'. This class is generated by GenerateFunction. + */ +public class Atan2 extends ScalarFunction + implements UnaryExpression, ExplicitlyCastableSignature, PropagateNullable { + + public static final List SIGNATURES = ImmutableList.of( + FunctionSignature.ret(DoubleType.INSTANCE).args(DoubleType.INSTANCE, DoubleType.INSTANCE) + ); + + /** + * constructor with 2 argument. + */ + public Atan2(Expression arg0, Expression arg1) { + super("atan2", arg0, arg1); + } + + /** + * withChildren. + */ + @Override + public Atan2 withChildren(List children) { + Preconditions.checkArgument(children.size() == 2); + return new Atan2(children.get(0), children.get(1)); + } + + @Override + public List getSignatures() { + return SIGNATURES; + } + + @Override + public R accept(ExpressionVisitor visitor, C context) { + return visitor.visitAtan2(this, context); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java index 1e2538c025..0d5b63477c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ScalarFunctionVisitor.java @@ -72,6 +72,7 @@ import org.apache.doris.nereids.trees.expressions.functions.scalar.ArraysOverlap import org.apache.doris.nereids.trees.expressions.functions.scalar.Ascii; import org.apache.doris.nereids.trees.expressions.functions.scalar.Asin; import org.apache.doris.nereids.trees.expressions.functions.scalar.Atan; +import org.apache.doris.nereids.trees.expressions.functions.scalar.Atan2; import org.apache.doris.nereids.trees.expressions.functions.scalar.Bin; import org.apache.doris.nereids.trees.expressions.functions.scalar.BitCount; import org.apache.doris.nereids.trees.expressions.functions.scalar.BitLength; @@ -633,6 +634,10 @@ public interface ScalarFunctionVisitor { return visitScalarFunction(atan, context); } + default R visitAtan2(Atan2 atan2, C context) { + return visitScalarFunction(atan2, context); + } + default R visitBin(Bin bin, C context) { return visitScalarFunction(bin, context); } diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 9cce3c3824..722715da2c 100644 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -1263,6 +1263,7 @@ visible_functions = { [['abs'], 'DECIMAL128', ['DECIMAL128'], ''], [['acos'], 'DOUBLE', ['DOUBLE'], ''], [['atan'], 'DOUBLE', ['DOUBLE'], ''], + [['atan2'], 'DOUBLE', ['DOUBLE', 'DOUBLE'], ''], [['asin'], 'DOUBLE', ['DOUBLE'], ''], [['bin'], 'VARCHAR', ['BIGINT'], ''], diff --git a/regression-test/data/nereids_function_p0/scalar_function/A.out b/regression-test/data/nereids_function_p0/scalar_function/A.out index 13d9bcccb6..565ff210ad 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/A.out +++ b/regression-test/data/nereids_function_p0/scalar_function/A.out @@ -434,3 +434,32 @@ nan 0.8329812666744317 0.8760580505981934 +-- !sql_atan2_Double -- +\N +1.4711276743037345 +1.3734007669450159 +1.2793395323170296 +1.1902899496825317 +1.1071487177940904 +1.0303768265243125 +0.960070362405688 +0.89605538457134393 +0.83798122500839 +0.78539816339744828 +0.73781506012046483 +0.69473827619670314 + +-- !sql_atan2_Double_notnull -- +1.4711276743037345 +1.3734007669450159 +1.2793395323170296 +1.1902899496825317 +1.1071487177940904 +1.0303768265243125 +0.960070362405688 +0.89605538457134393 +0.83798122500839 +0.78539816339744828 +0.73781506012046483 +0.69473827619670314 + diff --git a/regression-test/suites/nereids_function_p0/scalar_function/A.groovy b/regression-test/suites/nereids_function_p0/scalar_function/A.groovy index c7751844e1..6938f916e0 100644 --- a/regression-test/suites/nereids_function_p0/scalar_function/A.groovy +++ b/regression-test/suites/nereids_function_p0/scalar_function/A.groovy @@ -73,4 +73,6 @@ suite("nereids_scalar_fn_A") { qt_sql_asin_Double_notnull "select asin(kdbl) from fn_test_not_nullable order by kdbl" qt_sql_atan_Double "select atan(kdbl) from fn_test order by kdbl" qt_sql_atan_Double_notnull "select atan(kdbl) from fn_test_not_nullable order by kdbl" -} \ No newline at end of file + qt_sql_atan2_Double "select atan2(kdbl, kdbl*kdbl) from fn_test order by kdbl" + qt_sql_atan2_Double_notnull "select atan2(kdbl, kdbl*kdbl) from fn_test_not_nullable order by kdbl" +}