Skip to content

Commit 72f9050

Browse files
Fix: unstable sort skips/duplicates issues across pages (#18094)
When viewing issues in sorted order, some issues are duplicated across pages and some are missing. This is caused by the lack of tie-breakers in database queries, making pagination inconsistent.
1 parent e4e3df6 commit 72f9050

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

models/issue.go

+19-11
Original file line numberDiff line numberDiff line change
@@ -1193,37 +1193,45 @@ type IssuesOptions struct {
11931193
func sortIssuesSession(sess *xorm.Session, sortType string, priorityRepoID int64) {
11941194
switch sortType {
11951195
case "oldest":
1196-
sess.Asc("issue.created_unix")
1196+
sess.Asc("issue.created_unix").Asc("issue.id")
11971197
case "recentupdate":
1198-
sess.Desc("issue.updated_unix")
1198+
sess.Desc("issue.updated_unix").Desc("issue.created_unix").Desc("issue.id")
11991199
case "leastupdate":
1200-
sess.Asc("issue.updated_unix")
1200+
sess.Asc("issue.updated_unix").Asc("issue.created_unix").Asc("issue.id")
12011201
case "mostcomment":
1202-
sess.Desc("issue.num_comments")
1202+
sess.Desc("issue.num_comments").Desc("issue.created_unix").Desc("issue.id")
12031203
case "leastcomment":
1204-
sess.Asc("issue.num_comments")
1204+
sess.Asc("issue.num_comments").Desc("issue.created_unix").Desc("issue.id")
12051205
case "priority":
1206-
sess.Desc("issue.priority")
1206+
sess.Desc("issue.priority").Desc("issue.created_unix").Desc("issue.id")
12071207
case "nearduedate":
12081208
// 253370764800 is 01/01/9999 @ 12:00am (UTC)
12091209
sess.Join("LEFT", "milestone", "issue.milestone_id = milestone.id").
12101210
OrderBy("CASE " +
12111211
"WHEN issue.deadline_unix = 0 AND (milestone.deadline_unix = 0 OR milestone.deadline_unix IS NULL) THEN 253370764800 " +
12121212
"WHEN milestone.deadline_unix = 0 OR milestone.deadline_unix IS NULL THEN issue.deadline_unix " +
12131213
"WHEN milestone.deadline_unix < issue.deadline_unix OR issue.deadline_unix = 0 THEN milestone.deadline_unix " +
1214-
"ELSE issue.deadline_unix END ASC")
1214+
"ELSE issue.deadline_unix END ASC").
1215+
Desc("issue.created_unix").
1216+
Desc("issue.id")
12151217
case "farduedate":
12161218
sess.Join("LEFT", "milestone", "issue.milestone_id = milestone.id").
12171219
OrderBy("CASE " +
12181220
"WHEN milestone.deadline_unix IS NULL THEN issue.deadline_unix " +
12191221
"WHEN milestone.deadline_unix < issue.deadline_unix OR issue.deadline_unix = 0 THEN milestone.deadline_unix " +
1220-
"ELSE issue.deadline_unix END DESC")
1222+
"ELSE issue.deadline_unix END DESC").
1223+
Desc("issue.created_unix").
1224+
Desc("issue.id")
12211225
case "priorityrepo":
1222-
sess.OrderBy("CASE WHEN issue.repo_id = " + strconv.FormatInt(priorityRepoID, 10) + " THEN 1 ELSE 2 END, issue.created_unix DESC")
1226+
sess.OrderBy("CASE " +
1227+
"WHEN issue.repo_id = " + strconv.FormatInt(priorityRepoID, 10) + " THEN 1 " +
1228+
"ELSE 2 END ASC").
1229+
Desc("issue.created_unix").
1230+
Desc("issue.id")
12231231
case "project-column-sorting":
1224-
sess.Asc("project_issue.sorting")
1232+
sess.Asc("project_issue.sorting").Desc("issue.created_unix").Desc("issue.id")
12251233
default:
1226-
sess.Desc("issue.created_unix")
1234+
sess.Desc("issue.created_unix").Desc("issue.id")
12271235
}
12281236
}
12291237

0 commit comments

Comments
 (0)