Skip to content

Commit 9390604

Browse files
Ja bist du narrischJa bist du narrisch
authored andcommitted
Updated AddColumn
1 parent 34461d1 commit 9390604

File tree

2 files changed

+81
-3
lines changed

2 files changed

+81
-3
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using System.Data;
2+
using System.Linq;
3+
using DotNetProjects.Migrator.Framework;
4+
using DotNetProjects.Migrator.Providers.Impl.SQLite;
5+
using Migrator.Framework;
6+
using Migrator.Tests.Providers.SQLite.Base;
7+
using NUnit.Framework;
8+
using NUnit.Framework.Legacy;
9+
10+
namespace Migrator.Tests.Providers.SQLite;
11+
12+
[TestFixture]
13+
[Category("SQLite")]
14+
public class SQLiteTransformationProvider_AddColumnTests : SQLiteTransformationProviderTestBase
15+
{
16+
17+
/// <summary>
18+
/// We use a NULL column as new column here. NOT NULL will fail as expected. The user should handle that on his own.
19+
/// </summary>
20+
[Test]
21+
public void RemovePrimaryKey_HavingColumnPropertyUniqueAndIndex_RebuildSucceeds()
22+
{
23+
// Arrange
24+
var testTableName = "MyDefaultTestTable";
25+
var propertyName1 = "Color1";
26+
var propertyName2 = "Color2";
27+
var newColumn = "NewColumn";
28+
var indexName = "MyIndexName";
29+
30+
_provider.AddTable(testTableName,
31+
new Column(propertyName1, DbType.Int32, ColumnProperty.PrimaryKey),
32+
new Column(propertyName2, DbType.Int32, ColumnProperty.Unique)
33+
);
34+
35+
_provider.AddIndex(indexName, testTableName, [propertyName1, propertyName2]);
36+
var tableInfoBefore = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
37+
38+
_provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}) VALUES (1, 2)");
39+
40+
// Act
41+
((SQLiteTransformationProvider)_provider).AddColumn(table: testTableName, new Column(newColumn, DbType.String, ColumnProperty.Null));
42+
_provider.ExecuteNonQuery($"INSERT INTO {testTableName} ({propertyName1}, {propertyName2}, {newColumn}) VALUES (2, 3, 'Hello')");
43+
44+
// Assert
45+
using var command = _provider.GetCommand();
46+
using var reader = _provider.ExecuteQuery(command, $"SELECT COUNT(*) as Count from {testTableName}");
47+
reader.Read();
48+
var count = reader.GetInt32(reader.GetOrdinal("Count"));
49+
Assert.That(count, Is.EqualTo(2));
50+
51+
var tableInfoAfter = ((SQLiteTransformationProvider)_provider).GetSQLiteTableInfo(testTableName);
52+
53+
Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True);
54+
Assert.That(tableInfoBefore.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True);
55+
56+
Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName1).ColumnProperty.HasFlag(ColumnProperty.PrimaryKey), Is.True);
57+
Assert.That(tableInfoAfter.Columns.Single(x => x.Name == propertyName2).ColumnProperty.HasFlag(ColumnProperty.Unique), Is.True);
58+
59+
var indexAfter = tableInfoAfter.Indexes.Single();
60+
Assert.That(indexAfter.Name, Is.EqualTo(indexName));
61+
CollectionAssert.AreEquivalent(indexAfter.KeyColumns, new string[] { propertyName1, propertyName2 });
62+
}
63+
}
64+
65+
66+
67+
68+
69+
70+
71+
72+
73+
74+
75+

src/Migrator/Providers/Impl/SQLite/SQLiteTransformationProvider.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ private void RecreateTable(SQLiteTableInfo sqliteTableInfo)
486486
AddTable(targetIntermediateTableQuoted, null, dbFields);
487487

488488
var columnMappings = sqliteTableInfo.ColumnMappings
489+
.Where(x => x.OldName != null)
489490
.OrderBy(x => x.OldName)
490491
.ToList();
491492

@@ -525,9 +526,10 @@ public override void AddColumn(string table, Column column)
525526
throw new Exception("Column already exists.");
526527
}
527528

528-
sqliteInfo.ColumnMappings.Add(new MappingInfo { OldName = column.Name, NewName = column.Name });
529-
529+
sqliteInfo.ColumnMappings.Add(new MappingInfo { OldName = null, NewName = column.Name });
530530
sqliteInfo.Columns.Add(column);
531+
532+
RecreateTable(sqliteInfo);
531533
}
532534

533535
public override void ChangeColumn(string table, Column column)
@@ -544,8 +546,9 @@ public override void ChangeColumn(string table, Column column)
544546
}
545547

546548
sqliteInfo.Columns.Where(x => !x.Name.Equals(column.Name, StringComparison.InvariantCultureIgnoreCase));
547-
548549
sqliteInfo.Columns.Add(column);
550+
551+
RecreateTable(sqliteInfo);
549552
}
550553

551554
public override int TruncateTable(string table)

0 commit comments

Comments
 (0)