From 23c4976fa202bf04175d5054e10e483a7c18c62e Mon Sep 17 00:00:00 2001 From: sakirr Date: Wed, 25 Feb 2026 09:57:42 +0000 Subject: [PATCH 1/2] fix: validate negative distance in pgr_drivingDistance --- .../edge_cases/negative_distance.pg | 45 +++++++++++++++++++ src/spanningTree/spanningTree_process.cpp | 8 ++-- 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg diff --git a/pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg b/pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg new file mode 100644 index 0000000000..bded0716d3 --- /dev/null +++ b/pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg @@ -0,0 +1,45 @@ +/* :file: This file is part of the pgRouting project. +:copyright: Copyright (c) 2025-2026 pgRouting developers +:license: Creative Commons Attribution-Share Alike 3.0 https://creativecommons.org/licenses/by-sa/3.0 */ + +BEGIN; + +UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); +SELECT CASE WHEN min_version('3.6.0') THEN plan(3) ELSE plan(1) END; + +CREATE OR REPLACE FUNCTION test_function() +RETURNS SETOF TEXT AS +$BODY$ +BEGIN + IF min_version('3.6.0') THEN + -- Test negative distance throws error + SELECT throws_ok( + $$SELECT * FROM pgr_drivingDistance('SELECT id, source, target, cost FROM edges', 1, -1.0)$$, + 'XX000', + 'Invalid value of ''distance''', + 'SHOULD THROW because distance is negative' + ); + + -- Test zero distance throws error + SELECT throws_ok( + $$SELECT * FROM pgr_drivingDistance('SELECT id, source, target, cost FROM edges', 1, 0.0)$$, + 'XX000', + 'Invalid value of ''distance''', + 'SHOULD THROW because distance is zero' + ); + + -- Test positive distance works (regression test) + SELECT lives_ok( + $$SELECT * FROM pgr_drivingDistance('SELECT id, source, target, cost FROM edges', 1, 1.0)$$, + 'SHOULD NOT THROW because distance is positive' + ); + ELSE + SELECT skip(1, 'Function standardized on 3.6.0'); + END IF; +END; +$BODY$ +LANGUAGE plpgsql; + +SELECT * FROM test_function(); +SELECT * FROM finish(); +ROLLBACK; \ No newline at end of file diff --git a/src/spanningTree/spanningTree_process.cpp b/src/spanningTree/spanningTree_process.cpp index b085966950..1ede547883 100644 --- a/src/spanningTree/spanningTree_process.cpp +++ b/src/spanningTree/spanningTree_process.cpp @@ -79,8 +79,8 @@ void pgr_process_spanningTree( switch (val) { case 1: - if (distance < 0) { - pgr_throw_error("Negative value found on 'distance'", "Must be non negative"); + if (distance <= 0) { + pgr_throw_error("Invalid value of 'distance'", "Valid values are greater than 0"); } break; case 2: @@ -102,8 +102,8 @@ void pgr_process_spanningTree( break; case DIJKSTRADD: - if (distance < 0) { - pgr_throw_error("Negative value found on 'distance'", "Must be positive"); + if (distance <= 0) { + pgr_throw_error("Invalid value of 'distance'", "Valid values are greater than 0"); } break; From f4a89ef24d2b0723376d814be2e688e31824c900 Mon Sep 17 00:00:00 2001 From: sakirr Date: Wed, 25 Feb 2026 19:59:21 +0000 Subject: [PATCH 2/2] fix: gate negative_distance pgTap test on min_lib_version 5.0.0 --- .../driving_distance/edge_cases/negative_distance.pg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg b/pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg index bded0716d3..60897704e6 100644 --- a/pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg +++ b/pgtap/dijkstra/driving_distance/edge_cases/negative_distance.pg @@ -5,13 +5,13 @@ BEGIN; UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost); -SELECT CASE WHEN min_version('3.6.0') THEN plan(3) ELSE plan(1) END; +SELECT CASE WHEN min_version('3.6.0') AND min_lib_version('5.0.0') THEN plan(3) ELSE plan(1) END; CREATE OR REPLACE FUNCTION test_function() RETURNS SETOF TEXT AS $BODY$ BEGIN - IF min_version('3.6.0') THEN + IF min_version('3.6.0') AND min_lib_version('5.0.0') THEN -- Test negative distance throws error SELECT throws_ok( $$SELECT * FROM pgr_drivingDistance('SELECT id, source, target, cost FROM edges', 1, -1.0)$$, @@ -34,7 +34,7 @@ BEGIN 'SHOULD NOT THROW because distance is positive' ); ELSE - SELECT skip(1, 'Function standardized on 3.6.0'); + SELECT skip(1, 'Distance validation standardized on pgRouting 5.0.0'); END IF; END; $BODY$