diff --git a/code/PostgreSQLSchemaManager.php b/code/PostgreSQLSchemaManager.php index dfbb16b..9c5b678 100644 --- a/code/PostgreSQLSchemaManager.php +++ b/code/PostgreSQLSchemaManager.php @@ -543,8 +543,8 @@ class PostgreSQLSchemaManager extends DBSchemaManager if ($this->hasTable("{$tableName}_Live")) { $updateConstraint .= "UPDATE \"{$tableName}_Live\" SET \"$colName\"='$default' WHERE \"$colName\" NOT IN ($constraint_values);"; } - if ($this->hasTable("{$tableName}_versions")) { - $updateConstraint .= "UPDATE \"{$tableName}_versions\" SET \"$colName\"='$default' WHERE \"$colName\" NOT IN ($constraint_values);"; + if ($this->hasTable("{$tableName}_Versions")) { + $updateConstraint .= "UPDATE \"{$tableName}_Versions\" SET \"$colName\"='$default' WHERE \"$colName\" NOT IN ($constraint_values);"; } $this->query($updateConstraint); diff --git a/tests/PostgreSQLSchemaManagerTest.php b/tests/PostgreSQLSchemaManagerTest.php new file mode 100644 index 0000000..4fd0ebe --- /dev/null +++ b/tests/PostgreSQLSchemaManagerTest.php @@ -0,0 +1,138 @@ +quiet(); + + $this->createSS3Table(); + + try { + DB::query('INSERT INTO "ClassNamesUpgrade" ("ClassName") VALUES (\'App\MySite\FooBar\')'); + $this->assertFalse(true, 'SS3 Constaint should have blocked the previous insert.'); + } catch (DatabaseException $ex) { } + + $dbSchema->schemaUpdate(function () use ($dbSchema) { + $dbSchema->requireTable( + 'ClassNamesUpgrade', + [ + 'ID' => 'PrimaryKey', + 'ClassName' => 'Enum(array("App\\\\MySite\\\\FooBar"))', + ] + ); + }); + + DB::query('INSERT INTO "ClassNamesUpgrade" ("ClassName") VALUES (\'App\MySite\FooBar\')'); + $count = DB::query('SELECT count(*) FROM "ClassNamesUpgrade" WHERE "ClassName" = \'App\MySite\FooBar\'') + ->value(); + + $this->assertEquals(1, $count); + } finally { + DB::query('DROP TABLE IF EXISTS "ClassNamesUpgrade"'); + DB::query('DROP SEQUENCE IF EXISTS "ClassNamesUpgrade_ID_seq"'); + } + + } + + private function createSS3Table() + { + DB::query(<<quiet(); + + $this->createSS3VersionedTable(); + + $this->assertConstraintCount(1, 'ClassNamesUpgrade_versioned_ClassName_check'); + + $dbSchema->schemaUpdate(function () use ($dbSchema) { + $dbSchema->renameTable( + 'ClassNamesUpgrade_versioned', + 'ClassNamesUpgrade_Versioned' + ); + }); + + $this->assertTableCount(0, 'ClassNamesUpgrade_versioned'); + $this->assertTableCount(1, 'ClassNamesUpgrade_Versioned'); + $this->assertConstraintCount(0, 'ClassNamesUpgrade_versioned_ClassName_check'); + $this->assertConstraintCount(1, 'ClassNamesUpgrade_Versioned_ClassName_check'); + + } finally { + DB::query('DROP TABLE IF EXISTS "ClassNamesUpgrade_Versioned"'); + DB::query('DROP TABLE IF EXISTS "ClassNamesUpgrade_versioned"'); + DB::query('DROP SEQUENCE IF EXISTS "ClassNamesUpgrade_versioned_ID_seq"'); + } + + } + + private function assertConstraintCount($expected, $constraintName) { + $count = DB::prepared_query( + 'SELECT count(*) FROM pg_catalog.pg_constraint WHERE conname like ?', + [$constraintName] + )->value(); + + $this->assertEquals($expected, $count); + } + + private function assertTableCount($expected, $tableName) { + $count = DB::prepared_query( + 'SELECT count(*) FROM pg_catalog.pg_tables WHERE "tablename" like ?', + [$tableName] + )->value(); + + $this->assertEquals($expected, $count); + } + + private function createSS3VersionedTable() + { + DB::query(<<