diff --git a/grate.unittests/Generic/Running_MigrationScripts/Versioning_The_Database.cs b/grate.unittests/Generic/Running_MigrationScripts/Versioning_The_Database.cs index fc4a4dda..e5a53018 100644 --- a/grate.unittests/Generic/Running_MigrationScripts/Versioning_The_Database.cs +++ b/grate.unittests/Generic/Running_MigrationScripts/Versioning_The_Database.cs @@ -76,7 +76,6 @@ public async Task Uses_Server_Casing_Rules_For_Schema() await using (var migrator = Context.GetMigrator(grateConfig)) { await migrator.Migrate(); - Assert.True(await migrator.DbMigrator.Database.VersionTableExists()); // we migrated into the `grate` schema. } // Now we'll run again with the same name but different cased schema @@ -88,7 +87,7 @@ public async Task Uses_Server_Casing_Rules_For_Schema() await using (var migrator = Context.GetMigrator(grateConfig)) { await migrator.Migrate(); // should either reuse the existing schema if a case-insensitive server, or create a new second schema for use if case-sensitive. - Assert.True(await migrator.DbMigrator.Database.VersionTableExists()); // we migrated into the `grate` schema. + Assert.True(await migrator.DbMigrator.Database.VersionTableExists()); // we migrated into the `GRATE` schema, which may be the same as 'grate' depending on server settings. } } } diff --git a/grate/Migration/AnsiSqlDatabase.cs b/grate/Migration/AnsiSqlDatabase.cs index 55091e51..2161d748 100644 --- a/grate/Migration/AnsiSqlDatabase.cs +++ b/grate/Migration/AnsiSqlDatabase.cs @@ -84,7 +84,7 @@ public async Task CloseAdminConnection() await Close(_adminConnection); _adminConnection = null; } - + protected async Task OpenNewConnection() { var conn = GetSqlConnection(ConnectionString); @@ -180,10 +180,10 @@ protected async Task WaitUntilDatabaseIsReady() public async Task RunSupportTasks() { - await CreateRunSchema(); - await CreateScriptsRunTable(); - await CreateScriptsRunErrorsTable(); - await CreateVersionTable(); + await CreateRunSchema(); + await CreateScriptsRunTable(); + await CreateScriptsRunErrorsTable(); + await CreateVersionTable(); } private async Task CreateRunSchema() @@ -198,7 +198,7 @@ private async Task RunSchemaExists() { string sql = $"SELECT s.schema_name FROM information_schema.schemata s WHERE s.schema_name = '{SchemaName}'"; var res = await ExecuteScalarAsync(Connection, sql); - return res == SchemaName; + return res != null; // if the server found a row matching by name, that's good enough for us } // TODO: Change MySQL/MariaDB from using schemas to using grate_ prefix diff --git a/grate/Migration/PostgreSqlDatabase.cs b/grate/Migration/PostgreSqlDatabase.cs index 2d7e7377..0593eb1c 100644 --- a/grate/Migration/PostgreSqlDatabase.cs +++ b/grate/Migration/PostgreSqlDatabase.cs @@ -8,7 +8,7 @@ namespace grate.Migration; public class PostgreSqlDatabase : AnsiSqlDatabase { - public PostgreSqlDatabase(ILogger logger) + public PostgreSqlDatabase(ILogger logger) : base(logger, new PostgreSqlSyntax()) { } @@ -20,4 +20,11 @@ public override Task RestoreDatabase(string backupPath) { throw new System.NotImplementedException("Restoring a database from file is not currently supported for Postgresql."); } -} \ No newline at end of file + + protected override string ExistsSql(string tableSchema, string fullTableName) + { + // For #230. Postgres tables are lowercase by default unless you quote them when created, which we do. We _don't_ quote the schema though, so it will always be lowercase + // Ensure the table check uses the lowercase version of anything we're passed, as that's what we would have created. + return base.ExistsSql(tableSchema.ToLower(), fullTableName); + } +} diff --git a/grate/Migration/SqLiteDatabase.cs b/grate/Migration/SqLiteDatabase.cs index 5405aa66..aadadf56 100644 --- a/grate/Migration/SqLiteDatabase.cs +++ b/grate/Migration/SqLiteDatabase.cs @@ -10,9 +10,9 @@ namespace grate.Migration; public class SqliteDatabase : AnsiSqlDatabase { private static readonly SqliteSyntax Syntax = new(); - - - public SqliteDatabase(ILogger logger) + + + public SqliteDatabase(ILogger logger) : base(logger, Syntax) { } @@ -24,9 +24,9 @@ protected override string ExistsSql(string tableSchema, string fullTableName) => $@" SELECT name FROM sqlite_master WHERE type ='table' AND -name = '{fullTableName}'; -"; - +name = '{fullTableName}' COLLATE NOCASE; +"; // #230: Correct mismatched schema casing, sqllite is case-insensitive but the string comparisons in queries _are_ case sensitive by default + public override string DatabaseName => GetDatabaseName(Connection); /// @@ -43,7 +43,7 @@ public override Task DropDatabase() { File.Delete(db); } - + return Task.CompletedTask; }