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

csringhofer pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git

commit a2a11dec62ef2f696021cf194add756d703aa4d5
Author: Arnab Karmakar <[email protected]>
AuthorDate: Mon Oct 27 15:30:20 2025 +0530

    IMPALA-13263: Add single-argument overload for ST_ConvexHull()
    
    Implemented a single-argument version of ST_ConvexHull() to align with
    PostGIS behavior and simplify usage across geometry types.
    
    Testing:
    Added new tests in test_geospatial_functions.py for ST_ConvexHull(),
    which previously had no test coverage, to verify correctness across
    supported geometry types.
    
    Change-Id: Idb17d98f5e75929ec0143aa16195a84dd6e50796
    Reviewed-on: http://gerrit.cloudera.org:8080/23604
    Tested-by: Impala Public Jenkins <[email protected]>
    Reviewed-by: Csaba Ringhofer <[email protected]>
---
 .../gen_geospatial_udf_wrappers.py                 |   2 +-
 .../queries/QueryTest/geospatial-esri.test         | 124 ++++++++++++++++++++-
 2 files changed, 124 insertions(+), 2 deletions(-)

diff --git a/common/function-registry/gen_geospatial_udf_wrappers.py 
b/common/function-registry/gen_geospatial_udf_wrappers.py
index a0d9d000f..113881e7b 100755
--- a/common/function-registry/gen_geospatial_udf_wrappers.py
+++ b/common/function-registry/gen_geospatial_udf_wrappers.py
@@ -142,7 +142,7 @@ package {package};
     return "%s.java" % self.generate_wrapper_name()
 
 
-WRAPPERS = [Wrapper("%s.ST_ConvexHull" % UDF_PACKAGE, BYTE_TYPE, list(range(2, 
9, 1))),
+WRAPPERS = [Wrapper("%s.ST_ConvexHull" % UDF_PACKAGE, BYTE_TYPE, list(range(1, 
9, 1))),
             Wrapper("%s.ST_LineString" % UDF_PACKAGE, DOUBLE_TYPE, 
list(range(2, 15, 2)),
               ARGUMENT_EXCEPTION),
             Wrapper("%s.ST_MultiPoint" % UDF_PACKAGE, DOUBLE_TYPE, 
list(range(2, 15, 2)),
diff --git 
a/testdata/workloads/functional-query/queries/QueryTest/geospatial-esri.test 
b/testdata/workloads/functional-query/queries/QueryTest/geospatial-esri.test
index 75357d021..6a2abb4f3 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/geospatial-esri.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/geospatial-esri.test
@@ -2715,4 +2715,126 @@ DOUBLE
 select ST_AsText(ST_SetSRID(ST_GeomFromText('MultiLineString((0 80, 0.03 
80.04))'), 4326));
 ---- RESULTS
 'MULTILINESTRING ((0 80, 0.03 80.04))'
-====
\ No newline at end of file
+====
+---- QUERY
+# NOTE: Due to HIVE-29323 ESRI returns MULTIPOLYGON EMPTY for single point
+# PostGIS would return: POINT (1 2)
+select ST_AsText(ST_ConvexHull(ST_Point(1, 2)));
+---- RESULTS
+'MULTIPOLYGON EMPTY'
+====
+---- QUERY
+# Collinear points - ESRI returns NULL instead of LINESTRING
+# ESRI behavior: Returns NULL for degenerate convex hulls
+# PostGIS would return: LINESTRING (0 0, 3 3)
+select ST_AsText(ST_ConvexHull(ST_GeomFromText('multipoint ((0 0), (1 1), (2 
2), (3 3))')));
+---- RESULTS
+'NULL'
+====
+---- QUERY
+# ESRI wraps result in MULTIPOLYGON even for simple polygons
+select ST_AsText(ST_ConvexHull(ST_GeomFromText('multipoint ((0 0), (1 0), (1 
1), (0 1))')));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)))'
+====
+---- QUERY
+# Interior point (1,1) does not affect the convex hull boundary
+select ST_AsText(ST_ConvexHull(ST_GeomFromText('multipoint ((0 0), (2 0), (2 
2), (0 2), (1 1))')));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 2 0, 2 2, 0 2, 0 0)))'
+====
+---- QUERY
+# Convex hull "wraps" around the concave parts to form smallest convex shape
+select ST_AsText(ST_ConvexHull(ST_GeomFromText('polygon ((0 0, 3 0, 3 2, 5 2, 
5 5, 2 5, 2 3, 0 3, 0 0))')));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 3 0, 5 2, 5 5, 2 5, 0 3, 0 0)))'
+====
+---- QUERY
+# Convex hull forms polygon encompassing all line vertices
+select ST_AsText(ST_ConvexHull(ST_GeomFromText('linestring (0 0, 1 1, 2 0, 3 
1, 4 0)')));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 4 0, 3 1, 1 1, 0 0)))'
+====
+---- QUERY
+# ESRI returns MULTIPOLYGON EMPTY for empty input
+select ST_AsText(ST_ConvexHull(ST_GeomFromText('point empty')));
+---- RESULTS
+'MULTIPOLYGON EMPTY'
+====
+---- QUERY
+# Two points - ESRI returns NULL instead of LINESTRING
+# PostGIS would return: LINESTRING (0 0, 3 4)
+select ST_AsText(ST_ConvexHull(ST_Point(0, 0), ST_Point(3, 4)));
+---- RESULTS
+'NULL'
+====
+---- QUERY
+# Three non-collinear points (forms a triangle)
+select ST_AsText(ST_ConvexHull(ST_Point(0, 0), ST_Point(4, 0), ST_Point(2, 
3)));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 4 0, 2 3, 0 0)))'
+====
+---- QUERY
+# Four points (forms a square)
+select ST_AsText(ST_ConvexHull(ST_Point(0, 0), ST_Point(2, 0), ST_Point(2, 2), 
ST_Point(0, 2)));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 2 0, 2 2, 0 2, 0 0)))'
+====
+---- QUERY
+# Five points with one interior point
+# Point (2,2) is inside the square formed by the other four points
+select ST_AsText(ST_ConvexHull(ST_Point(0, 0), ST_Point(4, 0), ST_Point(4, 4), 
ST_Point(0, 4), ST_Point(2, 2)));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0)))'
+====
+---- QUERY
+# Six arguments with mixed geometry types
+# Combines points and linestring, then computes convex hull of all vertices
+# Note: Point (6,3) creates an additional vertex in the convex hull
+select ST_AsText(ST_ConvexHull(ST_Point(0, 0), ST_Point(5, 0), ST_Point(5, 5), 
ST_Point(0, 5), ST_LineString(1, 1, 4, 4), ST_Point(6, 3)));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 5 0, 6 3, 5 5, 0 5, 0 0)))'
+====
+---- QUERY
+# Seven points with one interior point
+select ST_AsText(ST_ConvexHull(ST_Point(0, 0), ST_Point(1, 0), ST_Point(2, 1), 
ST_Point(3, 0), ST_Point(3, 3), ST_Point(0, 3), ST_Point(1.5, 1.5)));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 3 0, 3 3, 0 3, 0 0)))'
+====
+---- QUERY
+# Eight arguments (maximum supported by wrapper)
+# Tests upper bound of generated wrapper methods
+select ST_AsText(ST_ConvexHull(ST_Point(0, 0), ST_Point(2, 0), ST_Point(4, 0), 
ST_Point(4, 2), ST_Point(4, 4), ST_Point(2, 4), ST_Point(0, 4), ST_Point(0, 
2)));
+---- RESULTS
+'MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0)))'
+====
+---- QUERY
+# No arguments provided (should fail)
+select ST_ConvexHull();
+---- CATCH
+AnalysisException: No matching function with signature: st_convexhull()
+====
+---- QUERY
+# Wrong type - STRING instead of BINARY
+select ST_ConvexHull('invalid geometry');
+---- CATCH
+AnalysisException: No matching function with signature: st_convexhull(STRING)
+====
+---- QUERY
+# Wrong type - INTEGER instead of BINARY
+select ST_ConvexHull(123);
+---- CATCH
+AnalysisException: No matching function with signature: st_convexhull(TINYINT)
+====
+---- QUERY
+# Wrapper only generates overloads for 1-8 arguments
+select ST_ConvexHull(ST_Point(0,0), ST_Point(1,1), ST_Point(2,2), 
ST_Point(3,3), ST_Point(4,4), ST_Point(5,5), ST_Point(6,6), ST_Point(7,7), 
ST_Point(8,8));
+---- CATCH
+AnalysisException: No matching function with signature: st_convexhull(BINARY, 
BINARY, BINARY, BINARY, BINARY, BINARY, BINARY, BINARY, BINARY)
+====
+---- QUERY
+# NULL Handling
+select ST_ConvexHull(NULL);
+---- RESULTS
+'NULL'
+====

Reply via email to