From e242e9b0eed963084cff93760fcecb4e62bdee65 Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Thu, 27 Apr 2017 10:34:08 -0700 Subject: [PATCH 1/5] Fixes #14072: clear table schema cache for all methods that affect cache --- framework/CHANGELOG.md | 1 + framework/db/Command.php | 10 +++++----- tests/framework/db/CommandTest.php | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 20eb6f5356..a8563baa4b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -74,6 +74,7 @@ Yii Framework 2 Change Log - Enh #13976: Disabled IPv6 check on `\yii\validators\IpValidator` as it turns out it is not needed for inet_* methods to work (mikk150) - Enh #13981: `yii\caching\Cache::getOrSet()` now supports both `Closure` and `callable` (silverfire) - Enh #13911: Significantly enhanced MSSQL schema reading performance (paulzi, WebdevMerlion) +- Bug #14072: Fixed a bug where `\yii\db\Command::createTable()`, `addForeignKey()`, `dropForeignKey()`, `addCommentOnColumn()`, and `dropCommentFromColumn()` weren't refreshing the table cache on `yii\db\Schema` (brandonkelly) 2.0.11.2 February 08, 2017 -------------------------- diff --git a/framework/db/Command.php b/framework/db/Command.php index 3713bf5b36..a423f9ba3a 100644 --- a/framework/db/Command.php +++ b/framework/db/Command.php @@ -537,7 +537,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->createTable($table, $columns, $options); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -680,7 +680,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->addForeignKey($name, $table, $columns, $refTable, $refColumns, $delete, $update); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -693,7 +693,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->dropForeignKey($name, $table); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -771,7 +771,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->addCommentOnColumn($table, $column, $comment); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** @@ -801,7 +801,7 @@ class Command extends Component { $sql = $this->db->getQueryBuilder()->dropCommentFromColumn($table, $column); - return $this->setSql($sql); + return $this->setSql($sql)->requireTableSchemaRefresh($table); } /** diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php index 5e7b3f3802..493a28029e 100644 --- a/tests/framework/db/CommandTest.php +++ b/tests/framework/db/CommandTest.php @@ -809,17 +809,34 @@ SQL; { $db = $this->getConnection(false); $tableName = 'test'; + $fkName = 'test_fk'; + + $this->assertNull($db->getSchema()->getTableSchema($tableName)); $db->createCommand()->createTable($tableName, [ 'id' => 'pk', + 'fk' => 'int', 'name' => 'string', ])->execute(); $initialSchema = $db->getSchema()->getTableSchema($tableName); + $this->assertNotNull($initialSchema); $db->createCommand()->addColumn($tableName, 'value', 'integer')->execute(); $newSchema = $db->getSchema()->getTableSchema($tableName); $this->assertNotEquals($initialSchema, $newSchema); + $db->createCommand()->addForeignKey($fkName, $tableName, 'fk', $tableName, 'id')->execute(); + $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); + + $db->createCommand()->dropForeignKey($fkName, $tableName)->execute(); + $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); + + $db->createCommand()->addCommentOnColumn($tableName, 'id', 'Test comment')->execute(); + $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); + + $db->createCommand()->dropCommentFromColumn($tableName, 'id')->execute(); + $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); + $db->createCommand()->dropTable($tableName)->execute(); $this->assertNull($db->getSchema()->getTableSchema($tableName)); } From 60fac269cb8b0d019ea7e5fe95922c0e2bd2ab8c Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Thu, 27 Apr 2017 10:37:23 -0700 Subject: [PATCH 2/5] Reorder changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 2bc113f1de..144bfff187 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -83,8 +83,8 @@ Yii Framework 2 Change Log - Enh #13976: Disabled IPv6 check on `\yii\validators\IpValidator` as it turns out it is not needed for inet_* methods to work (mikk150) - Enh #13981: `yii\caching\Cache::getOrSet()` now supports both `Closure` and `callable` (silverfire) - Enh #13911: Significantly enhanced MSSQL schema reading performance (paulzi, WebdevMerlion) -- Bug #14072: Fixed a bug where `\yii\db\Command::createTable()`, `addForeignKey()`, `dropForeignKey()`, `addCommentOnColumn()`, and `dropCommentFromColumn()` weren't refreshing the table cache on `yii\db\Schema` (brandonkelly) - Enh #14059: Removed unused AR instantiating for calling of static methods (ElisDN) +- Bug #14072: Fixed a bug where `\yii\db\Command::createTable()`, `addForeignKey()`, `dropForeignKey()`, `addCommentOnColumn()`, and `dropCommentFromColumn()` weren't refreshing the table cache on `yii\db\Schema` (brandonkelly) 2.0.11.2 February 08, 2017 -------------------------- From 237af91e8ef3ebbdeedf1881d2820bbb320fea8b Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Fri, 28 Apr 2017 06:38:02 -0700 Subject: [PATCH 3/5] Skip testAutoRefreshTableSchema on sqllite --- tests/framework/db/CommandTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php index 493a28029e..0e683af470 100644 --- a/tests/framework/db/CommandTest.php +++ b/tests/framework/db/CommandTest.php @@ -807,6 +807,10 @@ SQL; public function testAutoRefreshTableSchema() { + if ($this->driverName === 'sqlite') { + $this->markTestSkipped('Sqlite does not support addForeignKey'); + } + $db = $this->getConnection(false); $tableName = 'test'; $fkName = 'test_fk'; From 11c0d4bf159572a9f33fdb5936a1b9fa939ece74 Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Fri, 28 Apr 2017 12:17:45 -0700 Subject: [PATCH 4/5] Skip just certain things for sqllite --- tests/framework/db/CommandTest.php | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php index 0e683af470..7001328458 100644 --- a/tests/framework/db/CommandTest.php +++ b/tests/framework/db/CommandTest.php @@ -807,10 +807,6 @@ SQL; public function testAutoRefreshTableSchema() { - if ($this->driverName === 'sqlite') { - $this->markTestSkipped('Sqlite does not support addForeignKey'); - } - $db = $this->getConnection(false); $tableName = 'test'; $fkName = 'test_fk'; @@ -829,17 +825,19 @@ SQL; $newSchema = $db->getSchema()->getTableSchema($tableName); $this->assertNotEquals($initialSchema, $newSchema); - $db->createCommand()->addForeignKey($fkName, $tableName, 'fk', $tableName, 'id')->execute(); - $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); + if ($this->driverName === 'sqlite') { + $db->createCommand()->addForeignKey($fkName, $tableName, 'fk', $tableName, 'id')->execute(); + $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); - $db->createCommand()->dropForeignKey($fkName, $tableName)->execute(); - $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); + $db->createCommand()->dropForeignKey($fkName, $tableName)->execute(); + $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys); - $db->createCommand()->addCommentOnColumn($tableName, 'id', 'Test comment')->execute(); - $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); + $db->createCommand()->addCommentOnColumn($tableName, 'id', 'Test comment')->execute(); + $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); - $db->createCommand()->dropCommentFromColumn($tableName, 'id')->execute(); - $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); + $db->createCommand()->dropCommentFromColumn($tableName, 'id')->execute(); + $this->assertEmpty($db->getSchema()->getTableSchema($tableName)->getColumn('id')->comment); + } $db->createCommand()->dropTable($tableName)->execute(); $this->assertNull($db->getSchema()->getTableSchema($tableName)); From 3456c4e0fdffe1604727c9611d110e92623fdc3c Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Fri, 28 Apr 2017 14:23:08 -0700 Subject: [PATCH 5/5] !== --- tests/framework/db/CommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php index 7001328458..5c544dca54 100644 --- a/tests/framework/db/CommandTest.php +++ b/tests/framework/db/CommandTest.php @@ -825,7 +825,7 @@ SQL; $newSchema = $db->getSchema()->getTableSchema($tableName); $this->assertNotEquals($initialSchema, $newSchema); - if ($this->driverName === 'sqlite') { + if ($this->driverName !== 'sqlite') { $db->createCommand()->addForeignKey($fkName, $tableName, 'fk', $tableName, 'id')->execute(); $this->assertNotEmpty($db->getSchema()->getTableSchema($tableName)->foreignKeys);