diff --git a/GRDB/QueryInterface/Schema/TableDefinition.swift b/GRDB/QueryInterface/Schema/TableDefinition.swift index 455a347352..ee038ab250 100644 --- a/GRDB/QueryInterface/Schema/TableDefinition.swift +++ b/GRDB/QueryInterface/Schema/TableDefinition.swift @@ -687,7 +687,21 @@ public final class TableAlteration { return column } - #if !os(OSX) || GRDBCUSTOMSQLITE || GRDBCIPHER + #if GRDBCUSTOMSQLITE + /// Renames a column in a table. + /// + /// try db.alter(table: "player") { t in + /// t.rename(column: "url", to: "home_url") + /// } + /// + /// See https://www.sqlite.org/lang_altertable.html + /// + /// - parameter name: the column name to rename. + /// - parameter newName: the new name of the column. + public func rename(column name: String, to newName: String) { + alterations.append(.rename(old: name, new: newName)) + } + #elseif !os(OSX) /// Renames a column in a table. /// /// try db.alter(table: "player") { t in diff --git a/Tests/GRDBTests/TableDefinitionTests.swift b/Tests/GRDBTests/TableDefinitionTests.swift index 5566f82591..94202fad0f 100644 --- a/Tests/GRDBTests/TableDefinitionTests.swift +++ b/Tests/GRDBTests/TableDefinitionTests.swift @@ -496,7 +496,27 @@ class TableDefinitionTests: GRDBTestCase { } } - #if !os(OSX) || GRDBCUSTOMSQLITE || GRDBCIPHER + #if GRDBCUSTOMSQLITE + func testAlterTableRenameColumn() throws { + let dbQueue = try makeDatabaseQueue() + try dbQueue.inDatabase { db in + try db.create(table: "test") { t in + t.column("a", .text) + } + + sqlQueries.removeAll() + try db.alter(table: "test") { t in + t.rename(column: "a", to: "b") + t.add(column: "c") + t.rename(column: "c", to: "d") + } + + assertEqualSQL(sqlQueries[sqlQueries.count - 3], "ALTER TABLE \"test\" RENAME COLUMN \"a\" TO \"b\"") + assertEqualSQL(sqlQueries[sqlQueries.count - 2], "ALTER TABLE \"test\" ADD COLUMN \"c\"") + assertEqualSQL(sqlQueries[sqlQueries.count - 1], "ALTER TABLE \"test\" RENAME COLUMN \"c\" TO \"d\"") + } + } + #elseif !os(OSX) @available(iOS 13.0, tvOS 13.0, watchOS 6.0, *) func testAlterTableRenameColumn() throws { let dbQueue = try makeDatabaseQueue()