fix(sort): avoid int64 overflow comparing large integers

The int/int comparator returned int(lhs - rhs); the int64 subtraction overflows for large-magnitude values, giving the wrong sign. Compare directly instead.
This commit is contained in:
max 2026-07-06 03:55:06 +02:00
parent e2f1d5ccf7
commit ecc87a4081
2 changed files with 15 additions and 1 deletions

View File

@ -166,7 +166,12 @@ func (a sortableNodeArray) compare(lhs *CandidateNode, rhs *CandidateNode, dateT
if err != nil {
panic(err)
}
return int(lhsNum - rhsNum)
if lhsNum < rhsNum {
return -1
} else if lhsNum > rhsNum {
return 1
}
return 0
} else if (lhsTag == "!!int" || lhsTag == "!!float") && (rhsTag == "!!int" || rhsTag == "!!float") {
lhsNum, err := strconv.ParseFloat(lhs.Value, 64)
if err != nil {

View File

@ -171,6 +171,15 @@ var sortByOperatorScenarios = []expressionScenario{
"D0, P[], (!!seq)::# abc\n- def\n# ghi\n",
},
},
{
skipDoc: true,
description: "Sort large integers (no int64 subtraction overflow)",
document: "[5000000000000000000, -5000000000000000000]",
expression: `sort`,
expected: []string{
"D0, P[], (!!seq)::[-5000000000000000000, 5000000000000000000]\n",
},
},
}
func TestSortByOperatorScenarios(t *testing.T) {