Skip to content

Commit

Permalink
[issue/30675] - Fix two index creation instead of one when using chan…
Browse files Browse the repository at this point in the history
…ge() (#30843)
  • Loading branch information
nsaliu authored and taylorotwell committed Dec 16, 2019
1 parent 8abab5c commit 1414946
Show file tree
Hide file tree
Showing 2 changed files with 152 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/Illuminate/Database/Schema/Blueprint.php
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ protected function addFluentIndexes()
// index method can be called without a name and it will generate one.
if ($column->{$index} === true) {
$this->{$index}($column->name);
$column->{$index} = false;

continue 2;
}
Expand All @@ -211,6 +212,7 @@ protected function addFluentIndexes()
// the index since the developer specified the explicit name for this.
elseif (isset($column->{$index})) {
$this->{$index}($column->name, $column->{$index});
$column->{$index} = false;

continue 2;
}
Expand Down
150 changes: 150 additions & 0 deletions tests/Database/DatabaseSchemaBlueprintIntegrationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -158,4 +158,154 @@ public function testRenameIndexWorks()

$this->assertEquals($expected, $queries);
}

public function testAddUniqueIndexWithoutNameWorks()
{
$this->db->connection()->getSchemaBuilder()->create('users', function ($table) {
$table->string('name')->nullable();
});

$blueprintMySql = new Blueprint('users', function ($table) {
$table->string('name')->nullable()->unique()->change();
});

$queries = $blueprintMySql->toSql($this->db->connection(), new MySqlGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name VARCHAR(255) DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'alter table `users` add unique `users_name_unique`(`name`)',
];

$this->assertEquals($expected, $queries);

$blueprintPostgres = new Blueprint('users', function ($table) {
$table->string('name')->nullable()->unique()->change();
});

$queries = $blueprintPostgres->toSql($this->db->connection(), new PostgresGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name VARCHAR(255) DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'alter table "users" add constraint "users_name_unique" unique ("name")',
];

$this->assertEquals($expected, $queries);

$blueprintSQLite = new Blueprint('users', function ($table) {
$table->string('name')->nullable()->unique()->change();
});

$queries = $blueprintSQLite->toSql($this->db->connection(), new SQLiteGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name VARCHAR(255) DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'create unique index "users_name_unique" on "users" ("name")',
];

$this->assertEquals($expected, $queries);

$blueprintSqlServer = new Blueprint('users', function ($table) {
$table->string('name')->nullable()->unique()->change();
});

$queries = $blueprintSqlServer->toSql($this->db->connection(), new SqlServerGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name VARCHAR(255) DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'create unique index "users_name_unique" on "users" ("name")',
];

$this->assertEquals($expected, $queries);
}

public function testAddUniqueIndexWithNameWorks()
{
$this->db->connection()->getSchemaBuilder()->create('users', function ($table) {
$table->string('name')->nullable();
});

$blueprintMySql = new Blueprint('users', function ($table) {
$table->string('name')->nullable()->unique('index1')->change();
});

$queries = $blueprintMySql->toSql($this->db->connection(), new MySqlGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name VARCHAR(255) DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'alter table `users` add unique `index1`(`name`)',
];

$this->assertEquals($expected, $queries);

$blueprintPostgres = new Blueprint('users', function ($table) {
$table->unsignedInteger('name')->nullable()->unique('index1')->change();
});

$queries = $blueprintPostgres->toSql($this->db->connection(), new PostgresGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name INTEGER UNSIGNED DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'alter table "users" add constraint "index1" unique ("name")',
];

$this->assertEquals($expected, $queries);

$blueprintSQLite = new Blueprint('users', function ($table) {
$table->unsignedInteger('name')->nullable()->unique('index1')->change();
});

$queries = $blueprintSQLite->toSql($this->db->connection(), new SQLiteGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name INTEGER UNSIGNED DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'create unique index "index1" on "users" ("name")',
];

$this->assertEquals($expected, $queries);

$blueprintSqlServer = new Blueprint('users', function ($table) {
$table->unsignedInteger('name')->nullable()->unique('index1')->change();
});

$queries = $blueprintSqlServer->toSql($this->db->connection(), new SqlServerGrammar());

$expected = [
'CREATE TEMPORARY TABLE __temp__users AS SELECT name FROM users',
'DROP TABLE users',
'CREATE TABLE users (name INTEGER UNSIGNED DEFAULT NULL COLLATE BINARY)',
'INSERT INTO users (name) SELECT name FROM __temp__users',
'DROP TABLE __temp__users',
'create unique index "index1" on "users" ("name")',
];

$this->assertEquals($expected, $queries);
}
}

0 comments on commit 1414946

Please sign in to comment.