You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kvrocks.apache.org by tw...@apache.org on 2026/04/10 14:35:25 UTC

(kvrocks) branch unstable updated: fix(geo): use strict weak ordering in sortGeoPointDESC comparator (#3439)

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

twice pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new 94e4c8ef7 fix(geo): use strict weak ordering in sortGeoPointDESC comparator (#3439)
94e4c8ef7 is described below

commit 94e4c8ef7e6bb5a98d892a05c4cbc6280c15f280
Author: Songqing Zhang <zh...@163.com>
AuthorDate: Fri Apr 10 22:35:19 2026 +0800

    fix(geo): use strict weak ordering in sortGeoPointDESC comparator (#3439)
    
    The GEO sort DESC comparator used >= instead of >, violating the strict
    weak
    ordering requirement of std::sort and causing undefined behavior when
        elements have equal distances.
---
 src/types/redis_geo.cc            |  2 +-
 tests/gocase/unit/geo/geo_test.go | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/types/redis_geo.cc b/src/types/redis_geo.cc
index c38824724..e9294081c 100644
--- a/src/types/redis_geo.cc
+++ b/src/types/redis_geo.cc
@@ -421,6 +421,6 @@ bool Geo::appendIfWithinShape(std::vector<GeoPoint> *geo_points, const GeoShape
 
 bool Geo::sortGeoPointASC(const GeoPoint &gp1, const GeoPoint &gp2) { return gp1.dist < gp2.dist; }
 
-bool Geo::sortGeoPointDESC(const GeoPoint &gp1, const GeoPoint &gp2) { return gp1.dist >= gp2.dist; }
+bool Geo::sortGeoPointDESC(const GeoPoint &gp1, const GeoPoint &gp2) { return gp1.dist > gp2.dist; }
 
 }  // namespace redis
diff --git a/tests/gocase/unit/geo/geo_test.go b/tests/gocase/unit/geo/geo_test.go
index bca5a7cde..d3d8f0b1b 100644
--- a/tests/gocase/unit/geo/geo_test.go
+++ b/tests/gocase/unit/geo/geo_test.go
@@ -562,4 +562,17 @@ var testGeo = func(t *testing.T, configs util.KvrocksServerConfigs) {
 		rdb.GeoRadiusStore(ctx, "points", 13.361389, 38.115556, &redis.GeoRadiusQuery{Radius: 500, Unit: "km", Store: "points2"})
 		require.EqualValues(t, rdb.ZRange(ctx, "points", 0, -1).Val(), rdb.ZRange(ctx, "points2", 0, -1).Val())
 	})
+
+	t.Run("GEORADIUS DESC with equal distances should not crash", func(t *testing.T) {
+		require.NoError(t, rdb.Del(ctx, "geokey").Err())
+		require.NoError(t, rdb.GeoAdd(ctx, "geokey",
+			&redis.GeoLocation{Name: "A", Longitude: 13.361389, Latitude: 38.115556},
+			&redis.GeoLocation{Name: "B", Longitude: 13.361389, Latitude: 38.115556},
+			&redis.GeoLocation{Name: "C", Longitude: 13.361389, Latitude: 38.115556},
+			&redis.GeoLocation{Name: "D", Longitude: 15.087269, Latitude: 37.502669},
+		).Err())
+		results := rdb.GeoRadius(ctx, "geokey", 13.361389, 38.115556,
+			&redis.GeoRadiusQuery{Radius: 500, Unit: "km", Sort: "DESC"}).Val()
+		require.Len(t, results, 4)
+	})
 }