Fix version comparison in Version.pm
authorAndrew Dunstan <andrew@dunslane.net>
Fri, 18 Nov 2022 13:38:26 +0000 (08:38 -0500)
committerAndrew Dunstan <andrew@dunslane.net>
Fri, 18 Nov 2022 13:45:58 +0000 (08:45 -0500)
Version strings with unequal numbers of parts were being compared
incorrectly. We cure this by treating a missing part in the shorter
version as 0.

per complaint from Jehan-Guillaume de Rorthais, but the fix is mine, not
his.

Discussion: https://postgr.es/m/20220628225325.53d97b8d@karst

Backpatch to release 14 where this code was introduced.

src/test/perl/PostgreSQL/Version.pm

index 8f704911895f348a93ceb301e5f7ebc818c00d47..8d4dbbf694880a5eec0b9caf3bc2e00ef7aea2cf 100644 (file)
@@ -123,9 +123,12 @@ sub _version_cmp
 
    for (my $idx = 0;; $idx++)
    {
-       return 0 unless (defined $an->[$idx] && defined $bn->[$idx]);
-       return $an->[$idx] <=> $bn->[$idx]
-         if ($an->[$idx] <=> $bn->[$idx]);
+       return 0
+         if ($idx >= @$an && $idx >= @$bn);
+       # treat a missing number as 0
+       my ($anum, $bnum) = ($an->[$idx] || 0, $bn->[$idx] || 0);
+       return $anum <=> $bnum
+         if ($anum <=> $bnum);
    }
 }