From a6730abac0bd96ad9d37bd5d20c4d0eaf89294d5 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 5 Aug 2021 09:39:14 +0100 Subject: [PATCH 1/3] Restore compatibility with SQLServer 2008 R2 in migrations `ALTER TABLE DROP ... IF EXISTS ...` is only supported in SQL Server >16. The `IF EXISTS` here is a belt-and-braces and does not need to be present. Therefore can be dropped. We need to figure out some way of restricting our SQL syntax against the minimum version of SQL Server we will support. My suspicion is that `ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = 100` may do that but there may be other side-effects so I am not whether to do that. Signed-off-by: Andrew Thornton --- models/migrations/migrations.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 9b04a364ca670..8323b8d0f2f03 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -858,10 +858,10 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin return fmt.Errorf("Find constraints: %v", err) } for _, constraint := range constraints { - if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT IF EXISTS `%s`", tableName, constraint)); err != nil { + if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT `%s`", tableName, constraint)); err != nil { return fmt.Errorf("Drop table `%s` index constraint `%s`: %v", tableName, constraint, err) } - if _, err := sess.Exec(fmt.Sprintf("DROP INDEX IF EXISTS `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil { + if _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil { return fmt.Errorf("Drop index `%[2]s` on `%[1]s`: %v", tableName, constraint, err) } } From 86bdaedb1d287b4d6beda6e43506823cbde0a89b Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 5 Aug 2021 13:03:55 +0100 Subject: [PATCH 2/3] try just dropping the index only Signed-off-by: Andrew Thornton --- models/migrations/migrations.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 8323b8d0f2f03..f7197e1c49270 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -858,9 +858,6 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin 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 { - return fmt.Errorf("Drop table `%s` index constraint `%s`: %v", tableName, constraint, err) - } if _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil { return fmt.Errorf("Drop index `%[2]s` on `%[1]s`: %v", tableName, constraint, err) } From faf0b21229fc3f584b8bcabde91cb18730d2e4bc Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 5 Aug 2021 17:33:38 +0100 Subject: [PATCH 3/3] use lowercase for system tables Signed-off-by: Andrew Thornton --- models/migrations/migrations.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index f7197e1c49270..6fbc0290f99db 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -840,7 +840,7 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin } cols += "`" + strings.ToLower(col) + "`" } - sql := fmt.Sprintf("SELECT Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('%[1]s') AND PARENT_COLUMN_ID IN (SELECT column_id FROM sys.columns WHERE lower(NAME) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))", + sql := fmt.Sprintf("SELECT Name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('%[1]s') AND parent_column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))", tableName, strings.ReplaceAll(cols, "`", "'")) constraints := make([]string, 0) if err := sess.SQL(sql).Find(&constraints); err != nil { @@ -851,7 +851,7 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin return fmt.Errorf("Drop table `%s` default constraint `%s`: %v", tableName, constraint, err) } } - sql = fmt.Sprintf("SELECT DISTINCT Name FROM SYS.INDEXES INNER JOIN SYS.INDEX_COLUMNS ON INDEXES.INDEX_ID = INDEX_COLUMNS.INDEX_ID AND INDEXES.OBJECT_ID = INDEX_COLUMNS.OBJECT_ID WHERE INDEXES.OBJECT_ID = OBJECT_ID('%[1]s') AND INDEX_COLUMNS.COLUMN_ID IN (SELECT column_id FROM sys.columns WHERE lower(NAME) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))", + sql = fmt.Sprintf("SELECT DISTINCT Name FROM sys.indexes INNER JOIN sys.index_columns ON indexes.index_id = index_columns.index_id AND indexes.object_id = index_columns.object_id WHERE indexes.object_id = OBJECT_ID('%[1]s') AND index_columns.column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))", tableName, strings.ReplaceAll(cols, "`", "'")) constraints = make([]string, 0) if err := sess.SQL(sql).Find(&constraints); err != nil {