Skip to content

Commit fcec803

Browse files
authored
GetIndexesQuery: Exclude expression indexes at the database level. Fix #1188. (#1262)
1 parent 73e62c7 commit fcec803

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

src/FirebirdSql.EntityFrameworkCore.Firebird.Tests/Scaffolding/ScaffoldingTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,54 @@ public async Task ReadsCorrectFieldType(string dataType)
107107
Assert.That(column.StoreType, Is.EqualTo(dataType));
108108
}
109109

110+
[Test]
111+
public async Task ExpressionIndexDoesNotBreakScaffolding()
112+
{
113+
var tableName = "TEST_EXPR_IDX";
114+
115+
using var commandTable = Connection.CreateCommand();
116+
commandTable.CommandText = $"recreate table {tableName} (ID INTEGER NOT NULL, DATA VARCHAR(100))";
117+
await commandTable.ExecuteNonQueryAsync();
118+
119+
using var commandIndex = Connection.CreateCommand();
120+
commandIndex.CommandText = $"create index IDX_EXPR on {tableName} computed by (upper(DATA))";
121+
await commandIndex.ExecuteNonQueryAsync();
122+
123+
var modelFactory = GetModelFactory();
124+
var model = modelFactory.Create(Connection.ConnectionString, new DatabaseModelFactoryOptions(new string[] { tableName }));
125+
var table = model.Tables.Single(x => x.Name == tableName);
126+
127+
Assert.That(table.Indexes, Has.None.Matches<Microsoft.EntityFrameworkCore.Scaffolding.Metadata.DatabaseIndex>(x => x.Name == "IDX_EXPR"));
128+
}
129+
130+
[Test]
131+
public async Task RegularIndexScaffoldedAlongsideExpressionIndex()
132+
{
133+
var tableName = "TEST_MIX_IDX";
134+
135+
using var commandTable = Connection.CreateCommand();
136+
commandTable.CommandText = $"recreate table {tableName} (ID INTEGER NOT NULL, DATA VARCHAR(100))";
137+
await commandTable.ExecuteNonQueryAsync();
138+
139+
using var commandRegularIndex = Connection.CreateCommand();
140+
commandRegularIndex.CommandText = $"create index IDX_REGULAR on {tableName} (DATA)";
141+
await commandRegularIndex.ExecuteNonQueryAsync();
142+
143+
using var commandExprIndex = Connection.CreateCommand();
144+
commandExprIndex.CommandText = $"create index IDX_EXPR_MIX on {tableName} computed by (upper(DATA))";
145+
await commandExprIndex.ExecuteNonQueryAsync();
146+
147+
var modelFactory = GetModelFactory();
148+
var model = modelFactory.Create(Connection.ConnectionString, new DatabaseModelFactoryOptions(new string[] { tableName }));
149+
var table = model.Tables.Single(x => x.Name == tableName);
150+
151+
Assert.Multiple(() =>
152+
{
153+
Assert.That(table.Indexes, Has.Some.Matches<Microsoft.EntityFrameworkCore.Scaffolding.Metadata.DatabaseIndex>(x => x.Name == "IDX_REGULAR"));
154+
Assert.That(table.Indexes, Has.None.Matches<Microsoft.EntityFrameworkCore.Scaffolding.Metadata.DatabaseIndex>(x => x.Name == "IDX_EXPR_MIX"));
155+
});
156+
}
157+
110158
static IDatabaseModelFactory GetModelFactory()
111159
{
112160
return new FbDatabaseModelFactory();

src/FirebirdSql.EntityFrameworkCore.Firebird/Scaffolding/Internal/FbDatabaseModelFactory.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ private void GetPrimaryKeys(DbConnection connection, IReadOnlyList<DatabaseTable
319319
LEFT JOIN rdb$relation_constraints rc on rc.rdb$index_name = I.rdb$index_name and rc.rdb$constraint_type = null
320320
WHERE
321321
trim(i.rdb$relation_name) = '{0}'
322+
AND i.RDB$EXPRESSION_SOURCE IS NULL
322323
GROUP BY
323324
INDEX_NAME, IS_UNIQUE, IS_DESC ;";
324325

@@ -337,14 +338,20 @@ private void GetIndexes(DbConnection connection, IReadOnlyList<DatabaseTable> ta
337338
{
338339
while (reader.Read())
339340
{
341+
var columns = reader.IsDBNull(3) ? string.Empty : reader.GetString(3);
342+
if (string.IsNullOrEmpty(columns))
343+
{
344+
continue;
345+
}
346+
340347
var index = new DatabaseIndex
341348
{
342349
Table = table,
343350
Name = reader.GetString(0).Trim(),
344351
IsUnique = reader.GetBoolean(1),
345352
};
346353

347-
foreach (var column in reader.GetString(3).Split(','))
354+
foreach (var column in columns.Split(','))
348355
{
349356
index.Columns.Add(table.Columns.Single(y => y.Name == column.Trim()));
350357
}

0 commit comments

Comments
 (0)