From a2a79a70eb150b42df6210581527e6e88c41e65e Mon Sep 17 00:00:00 2001 From: Chris Harris Date: Sun, 21 Jan 2018 13:27:58 -0800 Subject: [PATCH] Fixes #13814: MySQL unique index names can now contain spaces --- framework/CHANGELOG.md | 1 + framework/db/mysql/Schema.php | 6 +++--- tests/framework/db/SchemaTest.php | 10 ++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3246b43c61..5444f47e0b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.14 under development ------------------------ +- Enh #13814: MySQL unique index names can now contain spaces (df2) - Bug #15300: Fixed "Cannot read property 'style' of undefined" error at the error screen (vitorarantes) - Enh #15426: Added abilitiy to create and drop database views (igravity, vladis84) - Enh #10186: Use native `hash_equals` in `yii\base\Security::compareString()` if available, throw exception if non-strings are compared (aotd1, samdark) diff --git a/framework/db/mysql/Schema.php b/framework/db/mysql/Schema.php index af75c26a6f..5953229c93 100644 --- a/framework/db/mysql/Schema.php +++ b/framework/db/mysql/Schema.php @@ -447,11 +447,11 @@ SQL; $sql = $this->getCreateTableSql($table); $uniqueIndexes = []; - $regexp = '/UNIQUE KEY\s+([^\(\s]+)\s*\(([^\(\)]+)\)/mi'; + $regexp = '/UNIQUE KEY\s+\`(.+)\`\s*\((\`.+\`)+\)/mi'; if (preg_match_all($regexp, $sql, $matches, PREG_SET_ORDER)) { foreach ($matches as $match) { - $indexName = str_replace('`', '', $match[1]); - $indexColumns = array_map('trim', explode(',', str_replace('`', '', $match[2]))); + $indexName = $match[1]; + $indexColumns = array_map('trim', explode('`,`', trim($match[2], '`'))); $uniqueIndexes[$indexName] = $indexColumns; } } diff --git a/tests/framework/db/SchemaTest.php b/tests/framework/db/SchemaTest.php index f095520526..4bb5abbb6a 100644 --- a/tests/framework/db/SchemaTest.php +++ b/tests/framework/db/SchemaTest.php @@ -531,6 +531,16 @@ abstract class SchemaTest extends DatabaseTestCase 'somecolUnique' => ['somecol'], 'someCol2Unique' => ['someCol2'], ], $uniqueIndexes); + + // see https://github.com/yiisoft/yii2/issues/13814 + $db->createCommand()->createIndex('another unique index', 'uniqueIndex', 'someCol2', true)->execute(); + + $uniqueIndexes = $schema->findUniqueIndexes($schema->getTableSchema('uniqueIndex', true)); + $this->assertEquals([ + 'somecolUnique' => ['somecol'], + 'someCol2Unique' => ['someCol2'], + 'another unique index' => ['someCol2'], + ], $uniqueIndexes); } public function testContraintTablesExistance()