Skip to content

Commit 635536e

Browse files
JaBistDuNarrischJaBistDuNarrisch
authored andcommitted
Updated Primary Key behaviour
1 parent 8d77198 commit 635536e

File tree

6 files changed

+36
-16
lines changed

6 files changed

+36
-16
lines changed

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddColumnTests.cs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void AddColumn_HavingColumnPropertyUniqueAndIndex_RebuildSucceeds()
6060
}
6161

6262
[Test]
63-
public void AddColumn_HavingNullInPrimaryKey_Succeds()
63+
public void AddColumn_HavingNullInPrimaryKey_HasNULLAfterAddAnotherColumn()
6464
{
6565
// Arrange/Act
6666
Provider.ExecuteNonQuery("CREATE TABLE Common_Language (LanguageID TEXT PRIMARY KEY)");
@@ -71,10 +71,26 @@ public void AddColumn_HavingNullInPrimaryKey_Succeds()
7171
var script = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Language");
7272

7373
var columnProperty = tableInfo.Columns.Single(x => x.Name == "LanguageID").ColumnProperty;
74-
var hasNull = columnProperty.IsSet(ColumnProperty.Null);
7574

7675
// Assert
77-
Assert.That(hasNull, Is.False);
76+
Assert.That(script, Does.Contain("LanguageID TEXT NULL PRIMARY KEY"));
77+
}
78+
79+
[Test]
80+
public void AddColumn_HavingNullInPrimaryKey_HasNOTNULLAfterAddAnotherColumn()
81+
{
82+
// Arrange/Act
83+
Provider.ExecuteNonQuery("CREATE TABLE Common_Language (LanguageID TEXT NOT NULL PRIMARY KEY)");
84+
85+
Provider.AddColumn("Common_Language", "Enabled", DbType.Boolean);
86+
87+
var tableInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo("Common_Language");
88+
var script = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript("Common_Language");
89+
90+
var columnProperty = tableInfo.Columns.Single(x => x.Name == "LanguageID").ColumnProperty;
91+
92+
// Assert
93+
Assert.That(script, Does.Contain("LanguageID TEXT NOT NULL PRIMARY KEY"));
7894
}
7995

8096
[Test]
@@ -91,7 +107,8 @@ public void AddColumn_HavingNotNullInPrimaryKey_Succeds()
91107
var columnProperty = tableInfo.Columns.Single(x => x.Name == "LanguageID").ColumnProperty;
92108
var hasNull = columnProperty.IsSet(ColumnProperty.Null);
93109

94-
// Assert
110+
// Assert
111+
Assert.That(script, Does.Contain("LanguageID INTEGER NOT NULL PRIMARY KEY"));
95112
Assert.That(hasNull, Is.False);
96113
}
97114
}

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_AddTableTests.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,9 @@ public void AddTable_SinglePrimaryKey_ContainsNull()
8787

8888
// Assert
8989
var createScript = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(tableName);
90-
Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER NOT NULL PRIMARY KEY, Column2 INTEGER NOT NULL)"));
9190

92-
var pragmaTableInfos = ((SQLiteTransformationProvider)Provider).GetPragmaTableInfoItems(tableName);
93-
Assert.That(pragmaTableInfos.All(x => x.NotNull), Is.True);
91+
// In SQLite an INTEGER PRIMARY KEY column is NOT NULL implicitly (see insert asserts above)
92+
Assert.That(createScript, Is.EqualTo("CREATE TABLE MyTableName (Column1 INTEGER PRIMARY KEY, Column2 INTEGER NOT NULL)"));
9493

9594
var sqliteInfo = ((SQLiteTransformationProvider)Provider).GetSQLiteTableInfo(tableName);
9695
Assert.That(sqliteInfo.Columns.First().Name, Is.EqualTo(columnName1));

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_GetColumnsTests.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ public void GetColumns_Primary_ColumnPropertyOk()
6363

6464
// Assert
6565
Assert.That(columns.Single().ColumnProperty, Is.EqualTo(ColumnProperty.NotNull |
66-
ColumnProperty.Identity |
67-
ColumnProperty.PrimaryKey));
66+
ColumnProperty.PrimaryKeyWithIdentity));
6867
}
6968

7069
[Test]
@@ -82,8 +81,8 @@ public void GetColumns_PrimaryKeyOnTwoColumns_BothColumnsHavePrimaryKeyAndAreNot
8281
var columns = Provider.GetColumns(tableName);
8382

8483
// Assert
85-
Assert.That(columns[0].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.Null));
86-
Assert.That(columns[1].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.Null));
84+
Assert.That(columns[0].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.NotNull));
85+
Assert.That(columns[1].ColumnProperty, Is.EqualTo(ColumnProperty.PrimaryKey | ColumnProperty.NotNull));
8786
}
8887

8988
[Test]

src/Migrator.Tests/Providers/SQLite/SQLiteTransformationProvider_PropertyColumnIdentityTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public void AddPrimaryIdentity_Succeeds()
2525

2626
var sql = ((SQLiteTransformationProvider)Provider).GetSqlCreateTableScript(testTableName);
2727

28-
Assert.That(sql, Does.Contain("Color1 INTEGER NOT NULL PRIMARY KEY"));
28+
// NOT NULL implicitly set in SQLite
29+
Assert.That(sql, Does.Contain("Color1 INTEGER PRIMARY KEY"));
2930
}
3031
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ protected override void AddNull(Column column, List<string> vals)
2323

2424
protected override void AddNotNull(Column column, List<string> vals)
2525
{
26-
if (column.IsIdentity)
26+
if (column.ColumnProperty.HasFlag(ColumnProperty.NotNull))
2727
{
2828
AddValueIfSelected(column, ColumnProperty.NotNull, vals);
2929
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,12 +1212,16 @@ public override Column[] GetColumns(string tableName)
12121212

12131213
if (pragmaTableInfoItem.Pk > 0)
12141214
{
1215-
column.ColumnProperty |= ColumnProperty.PrimaryKey;
1216-
1217-
if (column.ColumnProperty.IsSet(ColumnProperty.Null))
1215+
if (new[] { DbType.UInt16, DbType.UInt32, DbType.UInt64, DbType.Int16, DbType.Int32, DbType.Int64 }.Contains(column.Type))
12181216
{
1217+
column.ColumnProperty |= ColumnProperty.PrimaryKey;
1218+
column.ColumnProperty |= ColumnProperty.NotNull;
12191219
column.ColumnProperty = column.ColumnProperty.Clear(ColumnProperty.Null);
12201220
}
1221+
else
1222+
{
1223+
column.ColumnProperty |= ColumnProperty.PrimaryKey;
1224+
}
12211225
}
12221226

12231227
var indexListItems = GetPragmaIndexListItems(tableName);

0 commit comments

Comments
 (0)