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

yiguolei 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 961f5d1bb7 [feature](function)Add St_Angle/St_Azimuth function (#18293)
961f5d1bb7 is described below

commit 961f5d1bb75f5137739b0fcde96a630b0fa40a0e
Author: Liqf <[email protected]>
AuthorDate: Mon Apr 3 13:01:59 2023 +0800

    [feature](function)Add St_Angle/St_Azimuth function (#18293)
    
    Add St_Angle/St_azimuth function:
    St_Angle:
    Enter three point, which represent two intersecting lines. Returns the 
angle between these lines. Point 2 and point 1 represent the first line and 
point 2 and point 3 represent the second line. The angle between these lines is 
in radians, in the range [0, 2pi). The angle is measured clockwise from the 
first line to the second line.
    
    `
    
    mysql> SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 1));
    +----------------------------------------------------------------------+
    | st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(0.0, 1.0)) |
    +----------------------------------------------------------------------+
    | 4.71238898038469 |
    +----------------------------------------------------------------------+
    1 row in set (0.04 sec)
    `
    
    St_azimuth:
    Enter two point, and returns the azimuth of the line segment formed by 
points 1 and 2. The azimuth is the angle in radians measured between the line 
from point 1 facing true North to the line segment from point 1 to point 2.
    `
    
    mysql> SELECT st_azimuth(ST_Point(0, 0),ST_Point(1, 0));
    +----------------------------------------------------+
    | st_azimuth(st_point(0.0, 0.0), st_point(1.0, 0.0)) |
    +----------------------------------------------------+
    | 1.5707963267948966 |
    +----------------------------------------------------+
    1 row in set (0.04 sec)
---
 be/src/geo/geo_types.cpp                           |  51 +++++++++-
 be/src/geo/geo_types.h                             |   5 +-
 be/src/vec/functions/functions_geo.cpp             | 104 ++++++++++++++++++++-
 be/test/vec/function/function_geo_test.cpp         |  55 +++++++++++
 .../sql-functions/spatial-functions/st_angle.md    |  89 ++++++++++++++++++
 .../spatial-functions/st_angle_sphere.md           |   4 +-
 .../sql-functions/spatial-functions/st_area.md     |  26 +++++-
 .../sql-functions/spatial-functions/st_azimuth.md  |  95 +++++++++++++++++++
 docs/sidebars.json                                 |   2 +
 .../sql-functions/spatial-functions/st_angle.md    |  89 ++++++++++++++++++
 .../spatial-functions/st_angle_sphere.md           |   4 +-
 .../sql-functions/spatial-functions/st_area.md     |  26 +++++-
 .../sql-functions/spatial-functions/st_azimuth.md  |  87 +++++++++++++++++
 .../doris/catalog/BuiltinScalarFunctions.java      |   4 +
 .../expressions/functions/scalar/StAngle.java      |  70 ++++++++++++++
 .../expressions/functions/scalar/StAzimuth.java    |  69 ++++++++++++++
 .../expressions/visitor/ScalarFunctionVisitor.java |  10 ++
 gensrc/script/doris_builtins_functions.py          |   5 +
 .../data/nereids_function_p0/fn_test.dat           |  26 +++---
 .../data/nereids_function_p0/scalar_function/S.out |  60 ++++++++++++
 .../spatial_functions/test_gis_function.out        |  24 +++++
 .../spatial_functions/test_gis_function.out        |  24 +++++
 .../suites/nereids_function_p0/load.groovy         |   6 +-
 .../nereids_function_p0/scalar_function/S.groovy   |   4 +
 .../spatial_functions/test_gis_function.groovy     |  10 ++
 .../spatial_functions/test_gis_function.groovy     |  10 ++
 26 files changed, 928 insertions(+), 31 deletions(-)

diff --git a/be/src/geo/geo_types.cpp b/be/src/geo/geo_types.cpp
index b201c3739b..8949e33855 100644
--- a/be/src/geo/geo_types.cpp
+++ b/be/src/geo/geo_types.cpp
@@ -302,11 +302,12 @@ bool GeoPoint::ComputeDistance(double x_lng, double 
x_lat, double y_lng, double
     if (!y.is_valid()) {
         return false;
     }
-    *distance = S2Earth::ToMeters(x.GetDistance(y));
+    *distance = S2Earth::GetDistanceMeters(x, y);
     return true;
 }
 
-bool GeoPoint::ComputeAngle(double x_lng, double x_lat, double y_lng, double 
y_lat, double* angle) {
+bool GeoPoint::ComputeAngleSphere(double x_lng, double x_lat, double y_lng, 
double y_lat,
+                                  double* angle) {
     S2LatLng x = S2LatLng::FromDegrees(x_lat, x_lng);
     if (!x.is_valid()) {
         return false;
@@ -319,6 +320,44 @@ bool GeoPoint::ComputeAngle(double x_lng, double x_lat, 
double y_lng, double y_l
     return true;
 }
 
+bool GeoPoint::ComputeAngle(GeoPoint* point1, GeoPoint* point2, GeoPoint* 
point3, double* angle) {
+    S2LatLng latLng1 = S2LatLng::FromDegrees(point1->x(), point1->y());
+    S2LatLng latLng2 = S2LatLng::FromDegrees(point2->x(), point2->y());
+    S2LatLng latLng3 = S2LatLng::FromDegrees(point3->x(), point3->y());
+
+    //If points 2 and 3 are the same or points 2 and 1 are the same, returns 
NULL.
+    if (latLng2.operator==(latLng1) || latLng2.operator==(latLng3)) {
+        return false;
+    }
+    double x = 0;
+    double y = 0;
+    //If points 2 and 3 are exactly antipodal or points 2 and 1 are exactly 
antipodal, returns NULL.
+    if (GeoPoint::ComputeAngleSphere(point1->x(), point1->y(), point2->x(), 
point2->y(), &x) &&
+        GeoPoint::ComputeAngleSphere(point3->x(), point3->y(), point2->x(), 
point2->y(), &y)) {
+        if (x == 180 || y == 180) {
+            return false;
+        }
+    } else {
+        return false;
+    }
+    //Computes the initial bearing (radians) from latLng2 to latLng3
+    double a = S2Earth::GetInitialBearing(latLng2, latLng3).radians();
+    //Computes the initial bearing (radians) from latLng2 to latLng1
+    double b = S2Earth::GetInitialBearing(latLng2, latLng1).radians();
+    //range [0, 2pi)
+    if (b - a < 0) {
+        *angle = b - a + 2 * M_PI;
+    } else {
+        *angle = b - a;
+    }
+    return true;
+}
+bool GeoPoint::ComputeAzimuth(GeoPoint* p1, GeoPoint* p2, double* angle) {
+    GeoPoint north;
+    north.from_coord(0, 90);
+    return GeoPoint::ComputeAngle(&north, p1, p2, angle);
+}
+
 GeoParseStatus GeoLine::from_coords(const GeoCoordinateList& list) {
     return to_s2polyline(list, &_polyline);
 }
@@ -473,6 +512,14 @@ bool GeoShape::ComputeArea(GeoShape* rhs, double* area, 
std::string square_unit)
         steradians = polygon->getArea();
         break;
     }
+    case GEO_SHAPE_POINT: {
+        *area = 0;
+        return true;
+    }
+    case GEO_SHAPE_LINE_STRING: {
+        *area = 0;
+        return true;
+    }
     default:
         return false;
     }
diff --git a/be/src/geo/geo_types.h b/be/src/geo/geo_types.h
index aabd5fd059..bb7e65fbdd 100644
--- a/be/src/geo/geo_types.h
+++ b/be/src/geo/geo_types.h
@@ -78,7 +78,10 @@ public:
     static bool ComputeDistance(double x_lng, double x_lat, double y_lng, 
double y_lat,
                                 double* distance);
 
-    static bool ComputeAngle(double x_lng, double x_lat, double y_lng, double 
y_lat, double* angle);
+    static bool ComputeAngleSphere(double x_lng, double x_lat, double y_lng, 
double y_lat,
+                                   double* angle);
+    static bool ComputeAngle(GeoPoint* p1, GeoPoint* p2, GeoPoint* p3, double* 
angle);
+    static bool ComputeAzimuth(GeoPoint* p1, GeoPoint* p2, double* angle);
 
     std::string to_string() const override;
     std::string as_wkt() const override;
diff --git a/be/src/vec/functions/functions_geo.cpp 
b/be/src/vec/functions/functions_geo.cpp
index 7c81daa48c..b3b0809877 100644
--- a/be/src/vec/functions/functions_geo.cpp
+++ b/be/src/vec/functions/functions_geo.cpp
@@ -218,10 +218,10 @@ struct StAngleSphere {
 
         for (int row = 0; row < size; ++row) {
             double angle = 0;
-            if (!GeoPoint::ComputeAngle(x_lng->operator[](row).get<Float64>(),
-                                        x_lat->operator[](row).get<Float64>(),
-                                        y_lng->operator[](row).get<Float64>(),
-                                        y_lat->operator[](row).get<Float64>(), 
&angle)) {
+            if 
(!GeoPoint::ComputeAngleSphere(x_lng->operator[](row).get<Float64>(),
+                                              
x_lat->operator[](row).get<Float64>(),
+                                              
y_lng->operator[](row).get<Float64>(),
+                                              
y_lat->operator[](row).get<Float64>(), &angle)) {
                 res->insert_data(nullptr, 0);
                 continue;
             }
@@ -233,6 +233,100 @@ struct StAngleSphere {
     }
 };
 
+struct StAngle {
+    static constexpr auto NEED_CONTEXT = false;
+    static constexpr auto NAME = "st_angle";
+    static const size_t NUM_ARGS = 3;
+    static Status execute(Block& block, const ColumnNumbers& arguments, size_t 
result) {
+        DCHECK_EQ(arguments.size(), 3);
+        auto return_type = block.get_data_type(result);
+        MutableColumnPtr res = return_type->create_column();
+
+        auto p1 = 
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
+        auto p2 = 
block.get_by_position(arguments[1]).column->convert_to_full_column_if_const();
+        auto p3 = 
block.get_by_position(arguments[2]).column->convert_to_full_column_if_const();
+        const auto size = p1->size();
+
+        GeoPoint point1;
+        GeoPoint point2;
+        GeoPoint point3;
+
+        for (int row = 0; row < size; ++row) {
+            auto shape_value1 = p1->get_data_at(row);
+            auto pt1 = point1.decode_from(shape_value1.data, 
shape_value1.size);
+            if (!pt1) {
+                res->insert_data(nullptr, 0);
+                continue;
+            }
+
+            auto shape_value2 = p2->get_data_at(row);
+            auto pt2 = point2.decode_from(shape_value2.data, 
shape_value2.size);
+            if (!pt2) {
+                res->insert_data(nullptr, 0);
+                continue;
+            }
+            auto shape_value3 = p3->get_data_at(row);
+            auto pt3 = point3.decode_from(shape_value3.data, 
shape_value3.size);
+            if (!pt3) {
+                res->insert_data(nullptr, 0);
+                continue;
+            }
+
+            double angle = 0;
+            if (!GeoPoint::ComputeAngle(&point1, &point2, &point3, &angle)) {
+                res->insert_data(nullptr, 0);
+                continue;
+            }
+            res->insert_data(const_cast<const char*>((char*)&angle), 0);
+        }
+        block.replace_by_position(result, std::move(res));
+        return Status::OK();
+    }
+};
+
+struct StAzimuth {
+    static constexpr auto NEED_CONTEXT = false;
+    static constexpr auto NAME = "st_azimuth";
+    static const size_t NUM_ARGS = 2;
+    static Status execute(Block& block, const ColumnNumbers& arguments, size_t 
result) {
+        DCHECK_EQ(arguments.size(), 2);
+        auto return_type = block.get_data_type(result);
+        MutableColumnPtr res = return_type->create_column();
+
+        auto p1 = 
block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
+        auto p2 = 
block.get_by_position(arguments[1]).column->convert_to_full_column_if_const();
+        const auto size = p1->size();
+
+        GeoPoint point1;
+        GeoPoint point2;
+
+        for (int row = 0; row < size; ++row) {
+            auto shape_value1 = p1->get_data_at(row);
+            auto pt1 = point1.decode_from(shape_value1.data, 
shape_value1.size);
+            if (!pt1) {
+                res->insert_data(nullptr, 0);
+                continue;
+            }
+
+            auto shape_value2 = p2->get_data_at(row);
+            auto pt2 = point2.decode_from(shape_value2.data, 
shape_value2.size);
+            if (!pt2) {
+                res->insert_data(nullptr, 0);
+                continue;
+            }
+
+            double angle = 0;
+            if (!GeoPoint::ComputeAzimuth(&point1, &point2, &angle)) {
+                res->insert_data(nullptr, 0);
+                continue;
+            }
+            res->insert_data(const_cast<const char*>((char*)&angle), 0);
+        }
+        block.replace_by_position(result, std::move(res));
+        return Status::OK();
+    }
+};
+
 struct StAreaSquareMeters {
     static constexpr auto NEED_CONTEXT = false;
     static constexpr auto NAME = "st_area_square_meters";
@@ -481,6 +575,8 @@ void register_function_geo(SimpleFunctionFactory& factory) {
     factory.register_function<GeoFunction<StY, DataTypeFloat64>>();
     factory.register_function<GeoFunction<StDistanceSphere, 
DataTypeFloat64>>();
     factory.register_function<GeoFunction<StAngleSphere, DataTypeFloat64>>();
+    factory.register_function<GeoFunction<StAngle, DataTypeFloat64>>();
+    factory.register_function<GeoFunction<StAzimuth, DataTypeFloat64>>();
     factory.register_function<GeoFunction<StContains, DataTypeUInt8>>();
     factory.register_function<GeoFunction<StCircle>>();
     
factory.register_function<GeoFunction<StGeoFromText<StGeometryFromText>>>();
diff --git a/be/test/vec/function/function_geo_test.cpp 
b/be/test/vec/function/function_geo_test.cpp
index 580b681e5e..de0b27e6ff 100644
--- a/be/test/vec/function/function_geo_test.cpp
+++ b/be/test/vec/function/function_geo_test.cpp
@@ -157,6 +157,61 @@ TEST(VGeoFunctionsTest, function_geo_st_angle_sphere) {
     }
 }
 
+TEST(VGeoFunctionsTest, function_geo_st_angle) {
+    std::string func_name = "st_angle";
+    {
+        InputTypeSet input_types = {TypeIndex::String, TypeIndex::String, 
TypeIndex::String};
+
+        GeoPoint point1;
+        auto cur_res1 = point1.from_coord(1, 0);
+        EXPECT_TRUE(cur_res1 == GEO_PARSE_OK);
+        GeoPoint point2;
+        auto cur_res2 = point2.from_coord(0, 0);
+        EXPECT_TRUE(cur_res2 == GEO_PARSE_OK);
+        GeoPoint point3;
+        auto cur_res3 = point3.from_coord(0, 1);
+        EXPECT_TRUE(cur_res3 == GEO_PARSE_OK);
+        std::string buf1;
+        point1.encode_to(&buf1);
+        std::string buf2;
+        point2.encode_to(&buf2);
+        std::string buf3;
+        point3.encode_to(&buf3);
+
+        DataSet data_set = {{{buf1, buf2, buf3}, (double)4.71238898038469},
+                            {{buf1, buf2, Null()}, Null()},
+                            {{buf1, Null(), buf3}, Null()},
+                            {{Null(), buf2, buf3}, Null()}};
+
+        check_function<DataTypeFloat64, true>(func_name, input_types, 
data_set);
+    }
+}
+
+TEST(VGeoFunctionsTest, function_geo_st_azimuth) {
+    std::string func_name = "st_azimuth";
+    {
+        InputTypeSet input_types = {TypeIndex::String, TypeIndex::String};
+
+        GeoPoint point1;
+        auto cur_res1 = point1.from_coord(0, 0);
+        EXPECT_TRUE(cur_res1 == GEO_PARSE_OK);
+        GeoPoint point2;
+        auto cur_res2 = point2.from_coord(1, 0);
+        EXPECT_TRUE(cur_res2 == GEO_PARSE_OK);
+
+        std::string buf1;
+        point1.encode_to(&buf1);
+        std::string buf2;
+        point2.encode_to(&buf2);
+
+        DataSet data_set = {{{buf1, buf2}, (double)1.5707963267948966},
+                            {{buf1, Null()}, Null()},
+                            {{Null(), buf2}, Null()}};
+
+        check_function<DataTypeFloat64, true>(func_name, input_types, 
data_set);
+    }
+}
+
 TEST(VGeoFunctionsTest, function_geo_st_contains) {
     std::string func_name = "st_contains";
     {
diff --git 
a/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_angle.md 
b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_angle.md
new file mode 100644
index 0000000000..61cd1a9d76
--- /dev/null
+++ b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_angle.md
@@ -0,0 +1,89 @@
+---
+{
+    "title": "ST_Angle",
+    "language": "en"
+}
+---
+
+<!-- 
+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.
+-->
+
+## ST_Angle
+
+### Syntax
+
+`DOUBLE ST_Angle(GEOPOINT point1, GEOPOINT point2, GEOPOINT point3)`
+
+### description
+
+Enter three point, which represent two intersecting lines. Returns the angle 
between these lines. Point 2 and point 1 represent the first line and point 2 
and point 3 represent the second line. The angle between these lines is in 
radians, in the range [0, 2pi). The angle is measured clockwise from the first 
line to the second line.
+
+ST_ANGLE has the following edge cases:
+
+* If points 2 and 3 are the same, returns NULL.
+* If points 2 and 1 are the same, returns NULL.
+* If points 2 and 3 are exactly antipodal, returns NULL.
+* If points 2 and 1 are exactly antipodal, returns NULL.
+* If any of the input geographies are not single points or are the empty 
geography, then throws an error.
+
+### example
+
+```
+mysql> SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 1));
++----------------------------------------------------------------------+
+| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(0.0, 1.0)) |
++----------------------------------------------------------------------+
+|                                                     4.71238898038469 |
++----------------------------------------------------------------------+
+1 row in set (0.04 sec)
+
+mysql> SELECT ST_Angle(ST_Point(0, 0),ST_Point(1, 0),ST_Point(0, 1));
++----------------------------------------------------------------------+
+| st_angle(st_point(0.0, 0.0), st_point(1.0, 0.0), st_point(0.0, 1.0)) |
++----------------------------------------------------------------------+
+|                                                  0.78547432161873854 |
++----------------------------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(1, 0));
++----------------------------------------------------------------------+
+| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(1.0, 0.0)) |
++----------------------------------------------------------------------+
+|                                                                    0 |
++----------------------------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 0));
++----------------------------------------------------------------------+
+| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(0.0, 0.0)) |
++----------------------------------------------------------------------+
+|                                                                 NULL |
++----------------------------------------------------------------------+
+1 row in set (0.03 sec)
+
+mysql> SELECT ST_Angle(ST_Point(0, 0),ST_Point(-30, 0),ST_Point(150, 0));
++--------------------------------------------------------------------------+
+| st_angle(st_point(0.0, 0.0), st_point(-30.0, 0.0), st_point(150.0, 0.0)) |
++--------------------------------------------------------------------------+
+|                                                                     NULL |
++--------------------------------------------------------------------------+
+1 row in set (0.02 sec)
+```
+### keywords
+ST_ANGLE,ST,ANGLE
diff --git 
a/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md 
b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md
index 7c82c6d3ce..5a9856465d 100644
--- a/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md
+++ b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md
@@ -1,7 +1,7 @@
 ---
 {
-"title": "ST_Angle_Sphere",
-"language": "en"
+    "title": "ST_Angle_Sphere",
+    "language": "en"
 }
 ---
 
diff --git a/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_area.md 
b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_area.md
index 7831f65c3e..beb2d5a72d 100644
--- a/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_area.md
+++ b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_area.md
@@ -1,7 +1,7 @@
 ---
 {
-"title": "ST_Area",
-"language": "en"
+    "title": "ST_Area",
+    "language": "en"
 }
 ---
 
@@ -34,7 +34,11 @@ under the License.
 
 ### description
 
-Calculate the area of the area on the earth's sphere. Currently, the parameter 
geo supports ST_Circle and ST_Polygon. Among them, the unit returned by 
ST_Area_Square_Meters (GEOMETRY geo) is square meters, and the unit returned by 
ST_Area_Square_Km (GEOMETRY geo) is square kilometers.
+Calculate the area of the area on the earth's sphere. Currently, the parameter 
geo supports St_Point, St_LineString, St_Circle and St_Polygon. 
+
+Returns zero if the input is St_Point, St_LineString.
+
+Among them, the unit returned by ST_Area_Square_Meters (GEOMETRY geo) is 
square meters, and the unit returned by ST_Area_Square_Km (GEOMETRY geo) is 
square kilometers.
 
 ### example
 
@@ -54,6 +58,22 @@ mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 1 
0, 1 1, 0 1, 0 0))"
 |                                                   12364.036567076409 |
 +----------------------------------------------------------------------+
 1 row in set (0.01 sec)
+
+mysql> SELECT ST_Area_Square_Meters(ST_Point(0, 1));
++-------------------------------------------+
+| st_area_square_meters(st_point(0.0, 1.0)) |
++-------------------------------------------+
+|                                         0 |
++-------------------------------------------+
+1 row in set (0.05 sec)
+
+mysql> SELECT ST_Area_Square_Meters(ST_LineFromText("LINESTRING (1 1, 2 2)"));
++-----------------------------------------------------------------+
+| st_area_square_meters(st_linefromtext('LINESTRING (1 1, 2 2)')) |
++-----------------------------------------------------------------+
+|                                                               0 |
++-----------------------------------------------------------------+
+1 row in set (0.03 sec)
 ```
 ### keywords
 ST_Area_Square_Meters,ST_Area_Square_Km,ST_Area,ST,Area
diff --git 
a/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_azimuth.md 
b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_azimuth.md
new file mode 100644
index 0000000000..4aa1b06b23
--- /dev/null
+++ b/docs/en/docs/sql-manual/sql-functions/spatial-functions/st_azimuth.md
@@ -0,0 +1,95 @@
+---
+{
+    "title": "ST_Azimuth",
+    "language": "en"
+}
+---
+
+<!-- 
+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.
+-->
+
+## ST_Azimuth
+
+### Syntax
+
+`DOUBLE ST_Azimuth(GEOPOINT point1, GEOPOINT point2)`
+
+### description
+
+Enter two point, and returns the azimuth of the line segment formed by points 
1 and 2. The azimuth is the angle in radians measured between the line from 
point 1 facing true North to the line segment from point 1 to point 2.
+
+The positive angle is measured clockwise on the surface of a sphere. For 
example, the azimuth for a line segment:
+
+* Pointing North is 0
+* Pointing East is PI/2
+* Pointing South is PI
+* Pointing West is 3PI/2
+
+ST_Azimuth has the following edge cases:
+
+* If the two input points are the same, returns NULL.
+* If the two input points are exactly antipodal, returns NULL.
+* If either of the input geographies are not single points or are the empty 
geography, throws an error.
+
+### example
+
+```
+mysql> SELECT st_azimuth(ST_Point(1, 0),ST_Point(0, 0));
++----------------------------------------------------+
+| st_azimuth(st_point(1.0, 0.0), st_point(0.0, 0.0)) |
++----------------------------------------------------+
+|                                   4.71238898038469 |
++----------------------------------------------------+
+1 row in set (0.03 sec)
+
+mysql> SELECT st_azimuth(ST_Point(0, 0),ST_Point(1, 0));
++----------------------------------------------------+
+| st_azimuth(st_point(0.0, 0.0), st_point(1.0, 0.0)) |
++----------------------------------------------------+
+|                                 1.5707963267948966 |
++----------------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> SELECT st_azimuth(ST_Point(0, 0),ST_Point(0, 1));
++----------------------------------------------------+
+| st_azimuth(st_point(0.0, 0.0), st_point(0.0, 1.0)) |
++----------------------------------------------------+
+|                                                  0 |
++----------------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> SELECT st_azimuth(ST_Point(0, 1),ST_Point(0, 1));
++----------------------------------------------------+
+| st_azimuth(st_point(0.0, 1.0), st_point(0.0, 1.0)) |
++----------------------------------------------------+
+|                                               NULL |
++----------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> SELECT st_azimuth(ST_Point(-30, 0),ST_Point(150, 0));
++--------------------------------------------------------+
+| st_azimuth(st_point(-30.0, 0.0), st_point(150.0, 0.0)) |
++--------------------------------------------------------+
+|                                                   NULL |
++--------------------------------------------------------+
+1 row in set (0.02 sec)
+
+```
+### keywords
+ST_AZIMUTH,ST,AZIMUTH
diff --git a/docs/sidebars.json b/docs/sidebars.json
index d64e226e96..3283ac15c3 100644
--- a/docs/sidebars.json
+++ b/docs/sidebars.json
@@ -389,6 +389,8 @@
                                 
"sql-manual/sql-functions/spatial-functions/st_y",
                                 
"sql-manual/sql-functions/spatial-functions/st_circle",
                                 
"sql-manual/sql-functions/spatial-functions/st_distance_sphere",
+                                
"sql-manual/sql-functions/spatial-functions/st_angle",
+                                
"sql-manual/sql-functions/spatial-functions/st_azimuth",
                                 
"sql-manual/sql-functions/spatial-functions/st_angle_sphere",
                                 
"sql-manual/sql-functions/spatial-functions/st_area",
                                 
"sql-manual/sql-functions/spatial-functions/st_point",
diff --git 
a/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_angle.md 
b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_angle.md
new file mode 100644
index 0000000000..3f383aa182
--- /dev/null
+++ b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_angle.md
@@ -0,0 +1,89 @@
+---
+{
+    "title": "ST_Angle",
+    "language": "zh-CN"
+}
+---
+
+<!-- 
+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.
+-->
+
+## ST_Angle
+
+### Syntax
+
+`DOUBLE ST_Angle(GEOPOINT point1, GEOPOINT point2, GEOPOINT point3)`
+
+### description
+
+输入三个点,它们表示两条相交的线。返回这些线之间的夹角。点 2 和点 1 表示第一条线,点 2 和点 3 表示第二条线。这些线之间的夹角以弧度表示,范围为 
[0, 2pi)。夹角按顺时针方向从第一条线开始测量,直至第二条线。
+
+ST_ANGLE 存在以下边缘情况:
+
+* 如果点 2 和点 3 相同,则返回 NULL。
+* 如果点 2 和点 1 相同,则返回 NULL。
+* 如果点 2 和点 3 是完全对映点,则返回 NULL。
+* 如果点 2 和点 1 是完全对映点,则返回 NULL。
+* 如果任何输入地理位置不是单点或为空地理位置,则会抛出错误。
+
+### example
+
+```
+mysql> SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 1));
++----------------------------------------------------------------------+
+| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(0.0, 1.0)) |
++----------------------------------------------------------------------+
+|                                                     4.71238898038469 |
++----------------------------------------------------------------------+
+1 row in set (0.04 sec)
+
+mysql> SELECT ST_Angle(ST_Point(0, 0),ST_Point(1, 0),ST_Point(0, 1));
++----------------------------------------------------------------------+
+| st_angle(st_point(0.0, 0.0), st_point(1.0, 0.0), st_point(0.0, 1.0)) |
++----------------------------------------------------------------------+
+|                                                  0.78547432161873854 |
++----------------------------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(1, 0));
++----------------------------------------------------------------------+
+| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(1.0, 0.0)) |
++----------------------------------------------------------------------+
+|                                                                    0 |
++----------------------------------------------------------------------+
+1 row in set (0.02 sec)
+
+mysql> SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 0));
++----------------------------------------------------------------------+
+| st_angle(st_point(1.0, 0.0), st_point(0.0, 0.0), st_point(0.0, 0.0)) |
++----------------------------------------------------------------------+
+|                                                                 NULL |
++----------------------------------------------------------------------+
+1 row in set (0.03 sec)
+
+mysql> SELECT ST_Angle(ST_Point(0, 0),ST_Point(-30, 0),ST_Point(150, 0));
++--------------------------------------------------------------------------+
+| st_angle(st_point(0.0, 0.0), st_point(-30.0, 0.0), st_point(150.0, 0.0)) |
++--------------------------------------------------------------------------+
+|                                                                     NULL |
++--------------------------------------------------------------------------+
+1 row in set (0.02 sec)
+```
+### keywords
+ST_ANGLE,ST,ANGLE
diff --git 
a/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md 
b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md
index 96e8bb96a1..61acdd5e37 100644
--- 
a/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md
+++ 
b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_angle_sphere.md
@@ -1,7 +1,7 @@
 ---
 {
-"title": "ST_Angle_Sphere",
-"language": "zh-CN"
+    "title": "ST_Angle_Sphere",
+    "language": "zh-CN"
 }
 ---
 
diff --git 
a/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_area.md 
b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_area.md
index 4c514ba607..dda26bde35 100644
--- a/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_area.md
+++ b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_area.md
@@ -1,7 +1,7 @@
 ---
 {
-"title": "ST_Area",
-"language": "zh-CN"
+    "title": "ST_Area",
+    "language": "zh-CN"
 }
 ---
 
@@ -34,7 +34,11 @@ under the License.
 
 ### description
 
-计算地球球面上区域的面积,目前参数geo支持st_circle和st_polygon。其中,ST_Area_Square_Meters(GEOMETRY 
geo)返回的单位是平方米,ST_Area_Square_Km(GEOMETRY geo)返回的单位是平方千米。
+计算地球球面上区域的面积,目前参数geo支持St_Point,St_LineString,St_Circle和St_Polygon。
+
+如果输入的是St_Point,St_LineString,则返回零。
+
+其中,ST_Area_Square_Meters(GEOMETRY geo)返回的单位是平方米,ST_Area_Square_Km(GEOMETRY 
geo)返回的单位是平方千米。
 
 ### example
 
@@ -54,6 +58,22 @@ mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 1 
0, 1 1, 0 1, 0 0))"
 |                                                   12364.036567076409 |
 +----------------------------------------------------------------------+
 1 row in set (0.01 sec)
+
+mysql> SELECT ST_Area_Square_Meters(ST_Point(0, 1));
++-------------------------------------------+
+| st_area_square_meters(st_point(0.0, 1.0)) |
++-------------------------------------------+
+|                                         0 |
++-------------------------------------------+
+1 row in set (0.05 sec)
+
+mysql> SELECT ST_Area_Square_Meters(ST_LineFromText("LINESTRING (1 1, 2 2)"));
++-----------------------------------------------------------------+
+| st_area_square_meters(st_linefromtext('LINESTRING (1 1, 2 2)')) |
++-----------------------------------------------------------------+
+|                                                               0 |
++-----------------------------------------------------------------+
+1 row in set (0.03 sec)
 ```
 ### keywords
 ST_Area_Square_Meters,ST_Area_Square_Km,ST_Area,ST,Area
diff --git 
a/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_azimuth.md 
b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_azimuth.md
new file mode 100644
index 0000000000..50ea080f34
--- /dev/null
+++ b/docs/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_azimuth.md
@@ -0,0 +1,87 @@
+---
+{
+    "title": "ST_Azimuth",
+    "language": "zh-CN"
+}
+---
+
+<!-- 
+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.
+-->
+
+## ST_Azimuth
+
+### Syntax
+
+`DOUBLE ST_Azimuth(GEOPOINT point1, GEOPOINT point2)`
+
+### description
+
+输入两个点,并返回由点 1 和点 2 形成的线段的方位角。方位角是点 1 的真北方向线与点 1 和点 2 形成的线段之间的角的弧度。
+
+正角在球面上按顺时针方向测量。 例如,线段的方位角:
+
+* 指北是 0
+* 指东是 PI/2
+* 指南是 PI
+* 指西是 3PI/2
+
+ST_Azimuth 存在以下边缘情况:
+
+* 如果两个输入点相同,则返回 NULL。
+* 如果两个输入点是完全对映点,则返回 NULL。
+* 如果任一输入地理位置不是单点或为空地理位置,则会抛出错误。
+
+### example
+
+```
+mysql> SELECT st_azimuth(ST_Point(1, 0),ST_Point(0, 0));
++----------------------------------------------------+
+| st_azimuth(st_point(1.0, 0.0), st_point(0.0, 0.0)) |
++----------------------------------------------------+
+|                                   4.71238898038469 |
++----------------------------------------------------+
+1 row in set (0.03 sec)
+
+mysql> SELECT st_azimuth(ST_Point(0, 0),ST_Point(1, 0));
++----------------------------------------------------+
+| st_azimuth(st_point(0.0, 0.0), st_point(1.0, 0.0)) |
++----------------------------------------------------+
+|                                 1.5707963267948966 |
++----------------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> SELECT st_azimuth(ST_Point(0, 0),ST_Point(0, 1));
++----------------------------------------------------+
+| st_azimuth(st_point(0.0, 0.0), st_point(0.0, 1.0)) |
++----------------------------------------------------+
+|                                                  0 |
++----------------------------------------------------+
+1 row in set (0.01 sec)
+
+mysql> SELECT st_azimuth(ST_Point(-30, 0),ST_Point(150, 0));
++--------------------------------------------------------+
+| st_azimuth(st_point(-30.0, 0.0), st_point(150.0, 0.0)) |
++--------------------------------------------------------+
+|                                                   NULL |
++--------------------------------------------------------+
+1 row in set (0.02 sec)
+
+```
+### keywords
+ST_AZIMUTH,ST,AZIMUTH
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 e72a730aae..e952be58a1 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
@@ -267,11 +267,13 @@ import 
org.apache.doris.nereids.trees.expressions.functions.scalar.SplitByChar;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.SplitByString;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.SplitPart;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Sqrt;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.StAngle;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StAngleSphere;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StAreaSquareKm;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StAreaSquareMeters;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StAstext;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StAswkt;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.StAzimuth;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StCircle;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StContains;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StDistanceSphere;
@@ -598,6 +600,8 @@ public class BuiltinScalarFunctions implements 
FunctionHelper {
             scalar(StContains.class, "st_contains"),
             scalar(StDistanceSphere.class, "st_distance_sphere"),
             scalar(StAngleSphere.class, "st_angle_sphere"),
+            scalar(StAngle.class, "st_angle"),
+            scalar(StAzimuth.class, "st_azimuth"),
             scalar(StAreaSquareMeters.class, "st_area_square_meters"),
             scalar(StAreaSquareKm.class, "st_area_square_km"),
             scalar(StGeometryfromtext.class, "st_geometryfromtext"),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StAngle.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StAngle.java
new file mode 100644
index 0000000000..ee2bc588c2
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StAngle.java
@@ -0,0 +1,70 @@
+// 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.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.shape.TernaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.VarcharType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'st_angle'. This class is generated by GenerateFunction.
+ */
+
+public class StAngle extends ScalarFunction
+        implements TernaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+    public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+            FunctionSignature.ret(DoubleType.INSTANCE)
+                    .args(VarcharType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT)
+    );
+
+    /**
+     * constructor with 3 argument.
+     */
+    public StAngle(Expression arg0, Expression arg1, Expression arg2) {
+        super("st_angle", arg0, arg1, arg2);
+    }
+
+    /**
+     * withChildren.
+     */
+    @Override
+    public StAngle withChildren(List<Expression> children) {
+        Preconditions.checkArgument(children.size() == 3);
+        return new StAngle(children.get(0), children.get(1), children.get(2));
+    }
+
+    @Override
+    public List<FunctionSignature> getSignatures() {
+        return SIGNATURES;
+    }
+
+    @Override
+    public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+        return visitor.visitStAngle(this, context);
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StAzimuth.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StAzimuth.java
new file mode 100644
index 0000000000..ba23d33b54
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/StAzimuth.java
@@ -0,0 +1,69 @@
+// 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.AlwaysNullable;
+import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
+import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+import org.apache.doris.nereids.types.DoubleType;
+import org.apache.doris.nereids.types.VarcharType;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/**
+ * ScalarFunction 'st_azimuth'. This class is generated by GenerateFunction.
+ */
+
+public class StAzimuth extends ScalarFunction
+        implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
+    public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
+            
FunctionSignature.ret(DoubleType.INSTANCE).args(VarcharType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT)
+    );
+
+    /**
+     * constructor with 2 argument.
+     */
+    public StAzimuth(Expression arg0, Expression arg1) {
+        super("st_azimuth", arg0, arg1);
+    }
+
+    /**
+     * withChildren.
+     */
+    @Override
+    public StAzimuth withChildren(List<Expression> children) {
+        Preconditions.checkArgument(children.size() == 2);
+        return new StAzimuth(children.get(0), children.get(1));
+    }
+
+    @Override
+    public List<FunctionSignature> getSignatures() {
+        return SIGNATURES;
+    }
+
+    @Override
+    public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+        return visitor.visitStAzimuth(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 21811c40d9..e4ed308994 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
@@ -269,11 +269,13 @@ import 
org.apache.doris.nereids.trees.expressions.functions.scalar.SplitByChar;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.SplitByString;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.SplitPart;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Sqrt;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.StAngle;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StAngleSphere;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StAreaSquareKm;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StAreaSquareMeters;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StAstext;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StAswkt;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.StAzimuth;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StCircle;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.StContains;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.StDistanceSphere;
@@ -1373,6 +1375,14 @@ public interface ScalarFunctionVisitor<R, C> {
         return visitScalarFunction(stAngleSphere, context);
     }
 
+    default R visitStAngle(StAngle stAngle, C context) {
+        return visitScalarFunction(stAngle, context);
+    }
+
+    default R visitStAzimuth(StAzimuth stAzimuth, C context) {
+        return visitScalarFunction(stAzimuth, context);
+    }
+
     default R visitStAreaSquareMeters(StAreaSquareMeters stAreaSquareMeters, C 
context) {
         return visitScalarFunction(stAreaSquareMeters, context);
     }
diff --git a/gensrc/script/doris_builtins_functions.py 
b/gensrc/script/doris_builtins_functions.py
index b1063f77d1..23365a03a7 100644
--- a/gensrc/script/doris_builtins_functions.py
+++ b/gensrc/script/doris_builtins_functions.py
@@ -1698,6 +1698,11 @@ visible_functions = [
     [['ST_Distance_Sphere'], 'DOUBLE', ['DOUBLE', 'DOUBLE', 'DOUBLE', 
'DOUBLE'], 'ALWAYS_NULLABLE'],
     [['ST_Angle_Sphere'], 'DOUBLE', ['DOUBLE', 'DOUBLE', 'DOUBLE', 'DOUBLE'], 
'ALWAYS_NULLABLE'],
 
+    [['ST_Angle'], 'DOUBLE', ['VARCHAR','VARCHAR','VARCHAR'], 
'ALWAYS_NULLABLE'],
+    [['ST_Angle'], 'DOUBLE', ['STRING','STRING','STRING'], 'ALWAYS_NULLABLE'],
+    [['ST_Azimuth'], 'DOUBLE', ['VARCHAR','VARCHAR'], 'ALWAYS_NULLABLE'],
+    [['ST_Azimuth'], 'DOUBLE', ['STRING','STRING'], 'ALWAYS_NULLABLE'],
+
     [['ST_Area_Square_Meters'], 'DOUBLE', ['VARCHAR'], 'ALWAYS_NULLABLE'],
     [['ST_Area_Square_Meters'], 'DOUBLE', ['STRING'], 'ALWAYS_NULLABLE'],
     [['ST_Area_Square_Km'], 'DOUBLE', ['VARCHAR'], 'ALWAYS_NULLABLE'],
diff --git a/regression-test/data/nereids_function_p0/fn_test.dat 
b/regression-test/data/nereids_function_p0/fn_test.dat
index 8ca5495729..54877f74b5 100644
--- a/regression-test/data/nereids_function_p0/fn_test.dat
+++ b/regression-test/data/nereids_function_p0/fn_test.dat
@@ -1,13 +1,13 @@
-0;0;1;1;1;1;1;0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-01;2012-03-01;2012-03-01
 01:00:01;2012-03-01 01:00:01;2012-03-01 01:00:01;2012-03-01 
01:00:01;[0];[0];[1];[1];[1];[1];[1];[0.1];[2012-03-01,2012-03-01];[2012-03-01 
01:00:01];[2012-03-01,2012-03-01];[2012-03-01 01:00:01,2012-03-01 
01:00:01,2012-03-01 01:00:01,2012-03-01 
01:00:01];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar1
 [...]
-1;0;2;2;2;2;2;0.2;0.2;0.2;0.2;0.2;0.2;0.2;0.2;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-02;2012-03-02;2012-03-02
 02:01:02;2012-03-02 02:01:02;2012-03-02 02:01:02;2012-03-02 
02:01:02;[0];[0];[2];[2];[2];[2];[2];[0.2];[2012-03-02,2012-03-02];[2012-03-02 
02:01:02];[2012-03-02,2012-03-02];[2012-03-02 02:01:02,2012-03-02 
02:01:02,2012-03-02 02:01:02,2012-03-02 
02:01:02];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char32,varchar1
 [...]
-2;0;3;3;3;3;3;0.3;0.3;0.3;0.3;0.3;0.3;0.3;0.3;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-03;2012-03-03;2012-03-03
 03:02:03;2012-03-03 03:02:03;2012-03-03 03:02:03;2012-03-03 
03:02:03;[0];[0];[3];[3];[3];[3];[3];[0.3];[2012-03-03,2012-03-03];[2012-03-03 
03:02:03];[2012-03-03,2012-03-03];[2012-03-03 03:02:03,2012-03-03 
03:02:03,2012-03-03 03:02:03,2012-03-03 
03:02:03];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char33,varchar1
 [...]
-3;0;4;4;4;4;4;0.4;0.4;0.4;0.4;0.4;0.4;0.4;0.4;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-04;2012-03-04;2012-03-04
 04:03:04;2012-03-04 04:03:04;2012-03-04 04:03:04;2012-03-04 
04:03:04;[0];[0];[4];[4];[4];[4];[4];[0.4];[2012-03-04,2012-03-04];[2012-03-04 
04:03:04];[2012-03-04,2012-03-04];[2012-03-04 04:03:04,2012-03-04 
04:03:04,2012-03-04 04:03:04,2012-03-04 
04:03:04];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar1
 [...]
-4;0;5;5;5;5;5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-05;2012-03-05;2012-03-05
 05:04:05;2012-03-05 05:04:05;2012-03-05 05:04:05;2012-03-05 
05:04:05;[0];[0];[5];[5];[5];[5];[5];[0.5];[2012-03-05,2012-03-05];[2012-03-05 
05:04:05];[2012-03-05,2012-03-05];[2012-03-05 05:04:05,2012-03-05 
05:04:05,2012-03-05 05:04:05,2012-03-05 
05:04:05];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char32,varchar1
 [...]
-5;0;6;6;6;6;6;0.6;0.6;0.6;0.6;0.6;0.6;0.6;0.6;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-06;2012-03-06;2012-03-06
 06:05:06;2012-03-06 06:05:06;2012-03-06 06:05:06;2012-03-06 
06:05:06;[0];[0];[6];[6];[6];[6];[6];[0.6];[2012-03-06,2012-03-06];[2012-03-06 
06:05:06];[2012-03-06,2012-03-06];[2012-03-06 06:05:06,2012-03-06 
06:05:06,2012-03-06 06:05:06,2012-03-06 
06:05:06];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char33,varchar1
 [...]
-6;0;7;7;7;7;7;0.7;0.7;0.7;0.7;0.7;0.7;0.7;0.7;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-07;2012-03-07;2012-03-07
 07:06:07;2012-03-07 07:06:07;2012-03-07 07:06:07;2012-03-07 
07:06:07;[0];[0];[7];[7];[7];[7];[7];[0.7];[2012-03-07,2012-03-07];[2012-03-07 
07:06:07];[2012-03-07,2012-03-07];[2012-03-07 07:06:07,2012-03-07 
07:06:07,2012-03-07 07:06:07,2012-03-07 
07:06:07];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar1
 [...]
-7;1;8;8;8;8;8;0.8;0.8;0.8;0.8;0.8;0.8;0.8;0.8;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-08;2012-03-08;2012-03-08
 08:07:08;2012-03-08 08:07:08;2012-03-08 08:07:08;2012-03-08 
08:07:08;[1];[1];[8];[8];[8];[8];[8];[0.8];[2012-03-08,2012-03-08];[2012-03-08 
08:07:08];[2012-03-08,2012-03-08];[2012-03-08 08:07:08,2012-03-08 
08:07:08,2012-03-08 08:07:08,2012-03-08 
08:07:08];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char32,varchar1
 [...]
-8;1;9;9;9;9;9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-09;2012-03-09;2012-03-09
 09:08:09;2012-03-09 09:08:09;2012-03-09 09:08:09;2012-03-09 
09:08:09;[1];[1];[9];[9];[9];[9];[9];[0.9];[2012-03-09,2012-03-09];[2012-03-09 
09:08:09];[2012-03-09,2012-03-09];[2012-03-09 09:08:09,2012-03-09 
09:08:09,2012-03-09 09:08:09,2012-03-09 
09:08:09];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char33,varchar1
 [...]
-9;1;10;10;10;10;10;1;1;1;1;1;1;1;1;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-10;2012-03-10;2012-03-10
 10:09:10;2012-03-10 10:09:10;2012-03-10 10:09:10;2012-03-10 
10:09:10;[1];[1];[10];[10];[10];[10];[10];[1];[2012-03-10,2012-03-10];[2012-03-10
 10:09:10];[2012-03-10,2012-03-10];[2012-03-10 10:09:10,2012-03-10 
10:09:10,2012-03-10 10:09:10,2012-03-10 
10:09:10];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar11,varcha
 [...]
-10;1;11;11;11;11;11;1.1;1.1;1.1;1.1;1.1;1.1;1.1;1.1;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-11;2012-03-11;2012-03-11
 11:10:11;2012-03-11 11:10:11;2012-03-11 11:10:11;2012-03-11 
11:10:11;[1];[1];[11];[11];[11];[11];[11];[1.1];[2012-03-11,2012-03-11];[2012-03-11
 11:10:11];[2012-03-11,2012-03-11];[2012-03-11 11:10:11,2012-03-11 
11:10:11,2012-03-11 11:10:11,2012-03-11 
11:10:11];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char
 [...]
-11;1;12;12;12;12;12;1.2;1.2;1.2;1.2;1.2;1.2;1.2;1.2;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-12;2012-03-12;2012-03-12
 12:11:12;2012-03-12 12:11:12;2012-03-12 12:11:12;2012-03-12 
12:11:12;[1];[1];[12];[12];[12];[12];[12];[1.2];[2012-03-12,2012-03-12];[2012-03-12
 12:11:12];[2012-03-12,2012-03-12];[2012-03-12 12:11:12,2012-03-12 
12:11:12,2012-03-12 12:11:12,2012-03-12 
12:11:12];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char
 [...]
-null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null
\ No newline at end of file
+0;0;1;1;1;1;1;0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-01;2012-03-01;2012-03-01
 01:00:01;2012-03-01 01:00:01;2012-03-01 01:00:01;2012-03-01 
01:00:01;[0];[0];[1];[1];[1];[1];[1];[0.1];[2012-03-01,2012-03-01];[2012-03-01 
01:00:01];[2012-03-01,2012-03-01];[2012-03-01 01:00:01,2012-03-01 
01:00:01,2012-03-01 01:00:01,2012-03-01 
01:00:01];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar1
 [...]
+1;0;2;2;2;2;2;0.2;0.2;0.2;0.2;0.2;0.2;0.2;0.2;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-02;2012-03-02;2012-03-02
 02:01:02;2012-03-02 02:01:02;2012-03-02 02:01:02;2012-03-02 
02:01:02;[0];[0];[2];[2];[2];[2];[2];[0.2];[2012-03-02,2012-03-02];[2012-03-02 
02:01:02];[2012-03-02,2012-03-02];[2012-03-02 02:01:02,2012-03-02 
02:01:02,2012-03-02 02:01:02,2012-03-02 
02:01:02];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char32,varchar1
 [...]
+2;0;3;3;3;3;3;0.3;0.3;0.3;0.3;0.3;0.3;0.3;0.3;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-03;2012-03-03;2012-03-03
 03:02:03;2012-03-03 03:02:03;2012-03-03 03:02:03;2012-03-03 
03:02:03;[0];[0];[3];[3];[3];[3];[3];[0.3];[2012-03-03,2012-03-03];[2012-03-03 
03:02:03];[2012-03-03,2012-03-03];[2012-03-03 03:02:03,2012-03-03 
03:02:03,2012-03-03 03:02:03,2012-03-03 
03:02:03];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char33,varchar1
 [...]
+3;0;4;4;4;4;4;0.4;0.4;0.4;0.4;0.4;0.4;0.4;0.4;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-04;2012-03-04;2012-03-04
 04:03:04;2012-03-04 04:03:04;2012-03-04 04:03:04;2012-03-04 
04:03:04;[0];[0];[4];[4];[4];[4];[4];[0.4];[2012-03-04,2012-03-04];[2012-03-04 
04:03:04];[2012-03-04,2012-03-04];[2012-03-04 04:03:04,2012-03-04 
04:03:04,2012-03-04 04:03:04,2012-03-04 
04:03:04];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar1
 [...]
+4;0;5;5;5;5;5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-05;2012-03-05;2012-03-05
 05:04:05;2012-03-05 05:04:05;2012-03-05 05:04:05;2012-03-05 
05:04:05;[0];[0];[5];[5];[5];[5];[5];[0.5];[2012-03-05,2012-03-05];[2012-03-05 
05:04:05];[2012-03-05,2012-03-05];[2012-03-05 05:04:05,2012-03-05 
05:04:05,2012-03-05 05:04:05,2012-03-05 
05:04:05];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char32,varchar1
 [...]
+5;0;6;6;6;6;6;0.6;0.6;0.6;0.6;0.6;0.6;0.6;0.6;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-06;2012-03-06;2012-03-06
 06:05:06;2012-03-06 06:05:06;2012-03-06 06:05:06;2012-03-06 
06:05:06;[0];[0];[6];[6];[6];[6];[6];[0.6];[2012-03-06,2012-03-06];[2012-03-06 
06:05:06];[2012-03-06,2012-03-06];[2012-03-06 06:05:06,2012-03-06 
06:05:06,2012-03-06 06:05:06,2012-03-06 
06:05:06];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char33,varchar1
 [...]
+6;0;7;7;7;7;7;0.7;0.7;0.7;0.7;0.7;0.7;0.7;0.7;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-07;2012-03-07;2012-03-07
 07:06:07;2012-03-07 07:06:07;2012-03-07 07:06:07;2012-03-07 
07:06:07;[0];[0];[7];[7];[7];[7];[7];[0.7];[2012-03-07,2012-03-07];[2012-03-07 
07:06:07];[2012-03-07,2012-03-07];[2012-03-07 07:06:07,2012-03-07 
07:06:07,2012-03-07 07:06:07,2012-03-07 
07:06:07];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar1
 [...]
+7;1;8;8;8;8;8;0.8;0.8;0.8;0.8;0.8;0.8;0.8;0.8;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-08;2012-03-08;2012-03-08
 08:07:08;2012-03-08 08:07:08;2012-03-08 08:07:08;2012-03-08 
08:07:08;[1];[1];[8];[8];[8];[8];[8];[0.8];[2012-03-08,2012-03-08];[2012-03-08 
08:07:08];[2012-03-08,2012-03-08];[2012-03-08 08:07:08,2012-03-08 
08:07:08,2012-03-08 08:07:08,2012-03-08 
08:07:08];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char32,varchar1
 [...]
+8;1;9;9;9;9;9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;0.9;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-09;2012-03-09;2012-03-09
 09:08:09;2012-03-09 09:08:09;2012-03-09 09:08:09;2012-03-09 
09:08:09;[1];[1];[9];[9];[9];[9];[9];[0.9];[2012-03-09,2012-03-09];[2012-03-09 
09:08:09];[2012-03-09,2012-03-09];[2012-03-09 09:08:09,2012-03-09 
09:08:09,2012-03-09 09:08:09,2012-03-09 
09:08:09];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char33,varchar1
 [...]
+9;1;10;10;10;10;10;1;1;1;1;1;1;1;1;char11;char21;char31;varchar11;varchar21;varchar31;string1;2012-03-10;2012-03-10;2012-03-10
 10:09:10;2012-03-10 10:09:10;2012-03-10 10:09:10;2012-03-10 
10:09:10;[1];[1];[10];[10];[10];[10];[10];[1];[2012-03-10,2012-03-10];[2012-03-10
 10:09:10];[2012-03-10,2012-03-10];[2012-03-10 10:09:10,2012-03-10 
10:09:10,2012-03-10 10:09:10,2012-03-10 
10:09:10];[char11,char21,char31];[char11,char21,char31,varchar11,varchar21,varchar31];[char21,char31,varchar11,varcha
 [...]
+10;1;11;11;11;11;11;1.1;1.1;1.1;1.1;1.1;1.1;1.1;1.1;char12;char22;char32;varchar12;varchar22;varchar32;string2;2012-03-11;2012-03-11;2012-03-11
 11:10:11;2012-03-11 11:10:11;2012-03-11 11:10:11;2012-03-11 
11:10:11;[1];[1];[11];[11];[11];[11];[11];[1.1];[2012-03-11,2012-03-11];[2012-03-11
 11:10:11];[2012-03-11,2012-03-11];[2012-03-11 11:10:11,2012-03-11 
11:10:11,2012-03-11 11:10:11,2012-03-11 
11:10:11];[char12,char22,char32];[char12,char22,char32,varchar12,varchar22,varchar32];[char22,char
 [...]
+11;1;12;12;12;12;12;1.2;1.2;1.2;1.2;1.2;1.2;1.2;1.2;char13;char23;char33;varchar13;varchar23;varchar33;string3;2012-03-12;2012-03-12;2012-03-12
 12:11:12;2012-03-12 12:11:12;2012-03-12 12:11:12;2012-03-12 
12:11:12;[1];[1];[12];[12];[12];[12];[12];[1.2];[2012-03-12,2012-03-12];[2012-03-12
 12:11:12];[2012-03-12,2012-03-12];[2012-03-12 12:11:12,2012-03-12 
12:11:12,2012-03-12 12:11:12,2012-03-12 
12:11:12];[char13,char23,char33];[char13,char23,char33,varchar13,varchar23,varchar33];[char23,char
 [...]
+null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null;null
\ No newline at end of file
diff --git a/regression-test/data/nereids_function_p0/scalar_function/S.out 
b/regression-test/data/nereids_function_p0/scalar_function/S.out
index a523755733..7d0e6c9607 100644
--- a/regression-test/data/nereids_function_p0/scalar_function/S.out
+++ b/regression-test/data/nereids_function_p0/scalar_function/S.out
@@ -1449,6 +1449,66 @@ true
 102.90171567394134
 119.16210498681423
 
+-- !sql_st_angle_Varchar_Varchar --
+\N
+0.29640805436890805
+0.5845576630671012
+2.2514343365321805
+2.2985768978250287
+2.3435868570715472
+2.343933856604365
+2.34802834220062
+2.449573624637989
+3.0241913973486003
+4.933732381376881
+6.0197433678512455
+6.186722861065897
+
+-- !sql_st_angle_Varchar_Varchar_notnull --
+\N
+0.29640805436890805
+0.5845576630671012
+2.2514343365321805
+2.2985768978250287
+2.3435868570715472
+2.343933856604365
+2.34802834220062
+2.449573624637989
+3.0241913973486003
+4.933732381376881
+6.0197433678512455
+6.186722861065897
+
+-- !sql_st_azimuth_Varchar_Varchar --
+\N
+0.10887770754803192
+0.6831103181292284
+1.5514282110255961
+1.8473724820763877
+2.0312260636745996
+5.086326478855965
+5.170365116267284
+5.613823191254337
+5.653248008913474
+5.6670991049658905
+5.680456803008166
+5.74735717583794
+
+-- !sql_st_azimuth_Varchar_Varchar_notnull --
+\N
+0.10887770754803192
+0.6831103181292284
+1.5514282110255961
+1.8473724820763877
+2.0312260636745996
+5.086326478855965
+5.170365116267284
+5.613823191254337
+5.653248008913474
+5.6670991049658905
+5.680456803008166
+5.74735717583794
+
 -- !sql_st_area_square_meters_circle --
 \N
 16.92388987658693
diff --git 
a/regression-test/data/nereids_p0/sql_functions/spatial_functions/test_gis_function.out
 
b/regression-test/data/nereids_p0/sql_functions/spatial_functions/test_gis_function.out
index edaee3be9b..8b4b03431a 100644
--- 
a/regression-test/data/nereids_p0/sql_functions/spatial_functions/test_gis_function.out
+++ 
b/regression-test/data/nereids_p0/sql_functions/spatial_functions/test_gis_function.out
@@ -65,3 +65,27 @@ POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))
 -- !sql --
 12364.03656707641
 
+-- !sql --
+4.71238898038469
+
+-- !sql --
+0.7854743216187385
+
+-- !sql --
+0.0
+
+-- !sql --
+\N
+
+-- !sql --
+4.71238898038469
+
+-- !sql --
+1.5707963267948966
+
+-- !sql --
+0.0
+
+-- !sql --
+\N
+
diff --git 
a/regression-test/data/query_p0/sql_functions/spatial_functions/test_gis_function.out
 
b/regression-test/data/query_p0/sql_functions/spatial_functions/test_gis_function.out
index edaee3be9b..8b4b03431a 100644
--- 
a/regression-test/data/query_p0/sql_functions/spatial_functions/test_gis_function.out
+++ 
b/regression-test/data/query_p0/sql_functions/spatial_functions/test_gis_function.out
@@ -65,3 +65,27 @@ POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))
 -- !sql --
 12364.03656707641
 
+-- !sql --
+4.71238898038469
+
+-- !sql --
+0.7854743216187385
+
+-- !sql --
+0.0
+
+-- !sql --
+\N
+
+-- !sql --
+4.71238898038469
+
+-- !sql --
+1.5707963267948966
+
+-- !sql --
+0.0
+
+-- !sql --
+\N
+
diff --git a/regression-test/suites/nereids_function_p0/load.groovy 
b/regression-test/suites/nereids_function_p0/load.groovy
index 112fc91903..33ea1dd9f9 100644
--- a/regression-test/suites/nereids_function_p0/load.groovy
+++ b/regression-test/suites/nereids_function_p0/load.groovy
@@ -73,6 +73,8 @@ suite("load") {
             `x_lat` double null,
             `y_lng` double null,
             `y_lat` double null,
+            `z_lng` double null,
+            `z_lat` double null,
             `radius` double null,
             `linestring_wkt` varchar(50) null,
             `polygon_wkt` varchar(50) null
@@ -133,6 +135,8 @@ suite("load") {
             `x_lat` double null,
             `y_lng` double null,
             `y_lat` double null,
+            `z_lng` double null,
+            `z_lat` double null,
             `radius` double null,
             `linestring_wkt` varchar(50) null,
             `polygon_wkt` varchar(50) null
@@ -151,7 +155,7 @@ suite("load") {
             kdcmlv3s1, kdcmlv3s2, kdcmlv3s3, kchrs1, kchrs2, kchrs3, kvchrs1, 
kvchrs2, kvchrs3, kstr,
             kdt, kdtv2, kdtm, kdtmv2s1, kdtmv2s2, kdtmv2s3, kabool, katint, 
kasint, kaint,
             kabint, kalint, kafloat, kadbl, kadt, kadtm, kadtv2, kadtmv2, 
kachr, kavchr, kastr, kadcml,
-            st_point_str, st_point_vc, x_lng, x_lat, y_lng, y_lat, radius, 
linestring_wkt, polygon_wkt
+            st_point_str, st_point_vc, x_lng, x_lat, y_lng, y_lat, z_lng, 
z_lat, radius, linestring_wkt, polygon_wkt
             '''
         file "fn_test.dat"
     }
diff --git 
a/regression-test/suites/nereids_function_p0/scalar_function/S.groovy 
b/regression-test/suites/nereids_function_p0/scalar_function/S.groovy
index be1a19b85e..c0f7317b67 100644
--- a/regression-test/suites/nereids_function_p0/scalar_function/S.groovy
+++ b/regression-test/suites/nereids_function_p0/scalar_function/S.groovy
@@ -194,6 +194,10 @@ suite("nereids_scalar_fn_S") {
        qt_sql_st_distance_sphere_Double_Double_Double_Double_notnull "select 
st_distance_sphere(x_lng, x_lat, y_lng, y_lat) from fn_test_not_nullable order 
by 1"
        qt_sql_st_angle_sphere_Double_Double_Double_Double "select 
st_angle_sphere(x_lng, x_lat, y_lng, y_lat) from fn_test order by 1"
     qt_sql_st_angle_sphere_Double_Double_Double_Double_notnull "select 
st_angle_sphere(x_lng, x_lat, y_lng, y_lat) from fn_test_not_nullable order by 
1"
+    qt_sql_st_angle_Varchar_Varchar "select st_angle(st_point(x_lng, x_lat), 
st_point(y_lng, y_lat), st_point(z_lng, z_lat)) from fn_test order by 1"
+    qt_sql_st_angle_Varchar_Varchar_notnull "select st_angle(st_point(x_lng, 
x_lat), st_point(y_lng, y_lat), st_point(z_lng, z_lat)) from fn_test order by 1"
+    qt_sql_st_azimuth_Varchar_Varchar "select st_azimuth(st_point(x_lng, 
x_lat), st_point(y_lng, y_lat)) from fn_test order by 1"
+    qt_sql_st_azimuth_Varchar_Varchar_notnull "select 
st_azimuth(st_point(x_lng, x_lat), st_point(y_lng, y_lat)) from fn_test order 
by 1"
     qt_sql_st_area_square_meters_circle "select 
ST_Area_Square_Meters(ST_Circle(x_lng, x_lat, radius)) from fn_test order by 1"
     qt_sql_st_area_square_meters_circle_notnull "select 
ST_Area_Square_Meters(ST_Circle(x_lng, x_lat, radius)) from 
fn_test_not_nullable order by 1"
     qt_sql_st_area_square_meters_polygon "select 
ST_Area_Square_Meters(st_polygon(polygon_wkt)) from fn_test order by 1"
diff --git 
a/regression-test/suites/nereids_p0/sql_functions/spatial_functions/test_gis_function.groovy
 
b/regression-test/suites/nereids_p0/sql_functions/spatial_functions/test_gis_function.groovy
index 3a9f602609..3f42a14ca2 100644
--- 
a/regression-test/suites/nereids_p0/sql_functions/spatial_functions/test_gis_function.groovy
+++ 
b/regression-test/suites/nereids_p0/sql_functions/spatial_functions/test_gis_function.groovy
@@ -50,4 +50,14 @@ suite("test_gis_function") {
     qt_sql "SELECT ST_Area_Square_Km(ST_Circle(0, 0, 1));"
     qt_sql "SELECT ST_Area_Square_Meters(ST_Polygon(\"POLYGON ((0 0, 1 0, 1 1, 
0 1, 0 0))\"));"
     qt_sql "SELECT ST_Area_Square_Km(ST_Polygon(\"POLYGON ((0 0, 1 0, 1 1, 0 
1, 0 0))\"));"
+
+    qt_sql "SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 1));"
+    qt_sql "SELECT ST_Angle(ST_Point(0, 0),ST_Point(1, 0),ST_Point(0, 1));"
+    qt_sql "SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(1, 0));"
+    qt_sql "SELECT ST_Angle(ST_Point(1, 0),ST_Point(-30, 0),ST_Point(150, 0));"
+
+    qt_sql "SELECT St_Azimuth(ST_Point(1, 0),ST_Point(0, 0));"
+    qt_sql "SELECT St_Azimuth(ST_Point(0, 0),ST_Point(1, 0));"
+    qt_sql "SELECT St_Azimuth(ST_Point(0, 0),ST_Point(0, 1));"
+    qt_sql "SELECT St_Azimuth(ST_Point(-30, 0),ST_Point(150, 0));"
 }
diff --git 
a/regression-test/suites/query_p0/sql_functions/spatial_functions/test_gis_function.groovy
 
b/regression-test/suites/query_p0/sql_functions/spatial_functions/test_gis_function.groovy
index a831b89597..7ac3aa0c67 100644
--- 
a/regression-test/suites/query_p0/sql_functions/spatial_functions/test_gis_function.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/spatial_functions/test_gis_function.groovy
@@ -49,4 +49,14 @@ suite("test_gis_function") {
     qt_sql "SELECT ST_Area_Square_Km(ST_Circle(0, 0, 1));"
     qt_sql "SELECT ST_Area_Square_Meters(ST_Polygon(\"POLYGON ((0 0, 1 0, 1 1, 
0 1, 0 0))\"));"
     qt_sql "SELECT ST_Area_Square_Km(ST_Polygon(\"POLYGON ((0 0, 1 0, 1 1, 0 
1, 0 0))\"));"
+
+    qt_sql "SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(0, 1));"
+    qt_sql "SELECT ST_Angle(ST_Point(0, 0),ST_Point(1, 0),ST_Point(0, 1));"
+    qt_sql "SELECT ST_Angle(ST_Point(1, 0),ST_Point(0, 0),ST_Point(1, 0));"
+    qt_sql "SELECT ST_Angle(ST_Point(1, 0),ST_Point(-30, 0),ST_Point(150, 0));"
+
+    qt_sql "SELECT St_Azimuth(ST_Point(1, 0),ST_Point(0, 0));"
+    qt_sql "SELECT St_Azimuth(ST_Point(0, 0),ST_Point(1, 0));"
+    qt_sql "SELECT St_Azimuth(ST_Point(0, 0),ST_Point(0, 1));"
+    qt_sql "SELECT St_Azimuth(ST_Point(-30, 0),ST_Point(150, 0));"
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to