From 697213bdb35a745879145b1c9edc47552a05fe1b Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
Date: Wed, 25 Aug 2021 09:42:51 +0100
Subject: [PATCH] Add primary_key to issue_index (#16813)

Make the group_id a primary key in issue_index. This already has an unique index
and therefore is a good candidate for becoming a primary key.

This PR also changes all other uses of this table to add the group_id as the
primary key.

Fix #16802

Signed-off-by: Andrew Thornton <art27@cantab.net>
---
 models/index.go                 |  2 +-
 models/migrations/migrations.go |  2 ++
 models/migrations/v182.go       |  4 ++--
 models/migrations/v182_test.go  |  4 ++--
 models/migrations/v192.go       | 18 ++++++++++++++++++
 5 files changed, 25 insertions(+), 5 deletions(-)
 create mode 100644 models/migrations/v192.go

diff --git a/models/index.go b/models/index.go
index 18db13c490..121a149ca0 100644
--- a/models/index.go
+++ b/models/index.go
@@ -14,7 +14,7 @@ import (
 // ResourceIndex represents a resource index which could be used as issue/release and others
 // We can create different tables i.e. issue_index, release_index and etc.
 type ResourceIndex struct {
-	GroupID  int64 `xorm:"unique"`
+	GroupID  int64 `xorm:"pk"`
 	MaxIndex int64 `xorm:"index"`
 }
 
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index 89a60445bb..79b1e90ecd 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -336,6 +336,8 @@ var migrations = []Migration{
 	NewMigration("Add agit flow pull request support", addAgitFlowPullRequest),
 	// v191 -> v192
 	NewMigration("Alter issue/comment table TEXT fields to LONGTEXT", alterIssueAndCommentTextFieldsToLongText),
+	// v192 -> v193
+	NewMigration("RecreateIssueResourceIndexTable to have a primary key instead of an unique index", recreateIssueResourceIndexTable),
 }
 
 // GetCurrentDBVersion returns the current db version
diff --git a/models/migrations/v182.go b/models/migrations/v182.go
index dd9a04f27e..29c2d2654a 100644
--- a/models/migrations/v182.go
+++ b/models/migrations/v182.go
@@ -10,8 +10,8 @@ import (
 
 func addIssueResourceIndexTable(x *xorm.Engine) error {
 	type ResourceIndex struct {
-		GroupID  int64 `xorm:"index unique(s)"`
-		MaxIndex int64 `xorm:"index unique(s)"`
+		GroupID  int64 `xorm:"pk"`
+		MaxIndex int64 `xorm:"index"`
 	}
 
 	sess := x.NewSession()
diff --git a/models/migrations/v182_test.go b/models/migrations/v182_test.go
index 6f418f7794..9fb371e078 100644
--- a/models/migrations/v182_test.go
+++ b/models/migrations/v182_test.go
@@ -33,8 +33,8 @@ func Test_addIssueResourceIndexTable(t *testing.T) {
 	}
 
 	type ResourceIndex struct {
-		GroupID  int64 `xorm:"index unique(s)"`
-		MaxIndex int64 `xorm:"index unique(s)"`
+		GroupID  int64 `xorm:"pk"`
+		MaxIndex int64 `xorm:"index"`
 	}
 
 	var start = 0
diff --git a/models/migrations/v192.go b/models/migrations/v192.go
new file mode 100644
index 0000000000..f436e93d62
--- /dev/null
+++ b/models/migrations/v192.go
@@ -0,0 +1,18 @@
+// Copyright 2021 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package migrations
+
+import (
+	"xorm.io/xorm"
+)
+
+func recreateIssueResourceIndexTable(x *xorm.Engine) error {
+	type IssueIndex struct {
+		GroupID  int64 `xorm:"pk"`
+		MaxIndex int64 `xorm:"index"`
+	}
+
+	return RecreateTables(new(IssueIndex))(x)
+}