From e17e3f71f4e7d2b5e0eac3a55f1b143f2d5a667e Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
Date: Thu, 6 Aug 2020 19:16:49 +0100
Subject: [PATCH] Use transaction in V102 migration (#12395)

The code for dropTableColumns has a slightly confusing portion whereby the session is committed for MSSQL but not for other variants.

The v102 migration doesn't actually start a transaction so this weirdness does not affect it. However it probably should attempt to run this in a transaction.

Signed-off-by: Andrew Thornton art27@cantab.net
---
 models/migrations/migrations.go | 4 ----
 models/migrations/v102.go       | 8 +++++++-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index 119b508bfdd..834ac3bd687 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -453,20 +453,16 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
 			tableName, strings.Replace(cols, "`", "'", -1))
 		constraints := make([]string, 0)
 		if err := sess.SQL(sql).Find(&constraints); err != nil {
-			sess.Rollback()
 			return fmt.Errorf("Find constraints: %v", err)
 		}
 		for _, constraint := range constraints {
 			if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT `%s`", tableName, constraint)); err != nil {
-				sess.Rollback()
 				return fmt.Errorf("Drop table `%s` constraint `%s`: %v", tableName, constraint, err)
 			}
 		}
 		if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN %s", tableName, cols)); err != nil {
-			sess.Rollback()
 			return fmt.Errorf("Drop table `%s` columns %v: %v", tableName, columnNames, err)
 		}
-		return sess.Commit()
 	default:
 		log.Fatal("Unrecognized DB")
 	}
diff --git a/models/migrations/v102.go b/models/migrations/v102.go
index 74e8574ec32..03079d0bb44 100644
--- a/models/migrations/v102.go
+++ b/models/migrations/v102.go
@@ -11,5 +11,11 @@ import (
 func dropColumnHeadUserNameOnPullRequest(x *xorm.Engine) error {
 	sess := x.NewSession()
 	defer sess.Close()
-	return dropTableColumns(sess, "pull_request", "head_user_name")
+	if err := sess.Begin(); err != nil {
+		return err
+	}
+	if err := dropTableColumns(sess, "pull_request", "head_user_name"); err != nil {
+		return err
+	}
+	return sess.Commit()
 }