From ecc87a40818266254872ffa5616f6335ea7814ab Mon Sep 17 00:00:00 2001 From: max Date: Mon, 6 Jul 2026 03:55:06 +0200 Subject: [PATCH] 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. --- pkg/yqlib/operator_sort.go | 7 ++++++- pkg/yqlib/operator_sort_test.go | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pkg/yqlib/operator_sort.go b/pkg/yqlib/operator_sort.go index 2bcf2157..7f364ece 100644 --- a/pkg/yqlib/operator_sort.go +++ b/pkg/yqlib/operator_sort.go @@ -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 { diff --git a/pkg/yqlib/operator_sort_test.go b/pkg/yqlib/operator_sort_test.go index 39ba2347..33f1f5dc 100644 --- a/pkg/yqlib/operator_sort_test.go +++ b/pkg/yqlib/operator_sort_test.go @@ -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) {