diff --git a/src/Db/Adapter/SqlserverAdapter.php b/src/Db/Adapter/SqlserverAdapter.php index c5862b09..7f6115be 100644 --- a/src/Db/Adapter/SqlserverAdapter.php +++ b/src/Db/Adapter/SqlserverAdapter.php @@ -313,7 +313,7 @@ public function getColumns(string $tableName): array $column->setIdentity($columnInfo['autoIncrement']); } - $columns[$columnInfo['name']] = $column; + $columns[] = $column; } return $columns; @@ -435,13 +435,20 @@ protected function getChangeDefault(string $tableName, Column $newColumn): Alter protected function getChangeColumnInstructions(string $tableName, string $columnName, Column $newColumn): AlterInstructions { $columns = $this->getColumns($tableName); - if (!isset($columns[$columnName])) { + $oldColumn = null; + foreach ($columns as $column) { + if ($column->getName() === $columnName) { + $oldColumn = $column; + break; + } + } + if ($oldColumn === null) { throw new InvalidArgumentException("Unknown column {$columnName} cannot be changed."); } $changeDefault = - $newColumn->getDefault() !== $columns[$columnName]->getDefault() || - $newColumn->getType() !== $columns[$columnName]->getType(); + $newColumn->getDefault() !== $oldColumn->getDefault() || + $newColumn->getType() !== $oldColumn->getType(); $instructions = new AlterInstructions(); $dialect = $this->getSchemaDialect(); diff --git a/tests/TestCase/Db/Adapter/SqlserverAdapterTest.php b/tests/TestCase/Db/Adapter/SqlserverAdapterTest.php index 396665dc..f494d45d 100644 --- a/tests/TestCase/Db/Adapter/SqlserverAdapterTest.php +++ b/tests/TestCase/Db/Adapter/SqlserverAdapterTest.php @@ -474,10 +474,10 @@ public function testAddColumnWithNotNullableNoDefault() $columns = $this->adapter->getColumns('table1'); $this->assertCount(2, $columns); - $this->assertArrayHasKey('id', $columns); - $this->assertArrayHasKey('col', $columns); - $this->assertFalse($columns['col']->isNull()); - $this->assertNull($columns['col']->getDefault()); + $this->assertEquals('id', $columns[0]->getName()); + $this->assertEquals('col', $columns[1]->getName()); + $this->assertFalse($columns[1]->isNull()); + $this->assertNull($columns[1]->getDefault()); } public function testAddColumnWithDefaultBool() @@ -577,7 +577,7 @@ public function testChangeColumnDefaults() $this->assertTrue($this->adapter->hasColumn('t', 'column1')); $columns = $this->adapter->getColumns('t'); - $this->assertSame('test', $columns['column1']->getDefault()); + $this->assertSame('test', $columns[1]->getDefault()); $newColumn1 = new Column(); $newColumn1 @@ -588,7 +588,7 @@ public function testChangeColumnDefaults() $this->assertTrue($this->adapter->hasColumn('t', 'column1')); $columns = $this->adapter->getColumns('t'); - $this->assertSame('another test', $columns['column1']->getDefault()); + $this->assertSame('another test', $columns[1]->getDefault()); } public function testChangeColumnDefaultToNull() @@ -603,7 +603,7 @@ public function testChangeColumnDefaultToNull() ->setDefault(null); $table->changeColumn('column1', $newColumn1)->save(); $columns = $this->adapter->getColumns('t'); - $this->assertNull($columns['column1']->getDefault()); + $this->assertNull($columns[1]->getDefault()); } public function testChangeColumnDefaultToZero() @@ -618,7 +618,7 @@ public function testChangeColumnDefaultToZero() ->setDefault(0); $table->changeColumn('column1', $newColumn1)->save(); $columns = $this->adapter->getColumns('t'); - $this->assertSame(0, $columns['column1']->getDefault()); + $this->assertSame(0, $columns[1]->getDefault()); } public function testDropColumn() @@ -664,11 +664,11 @@ public function testGetColumns($colName, $type, $options, $actualType = null) $columns = $this->adapter->getColumns('t'); $this->assertCount(2, $columns); - $this->assertEquals('id', $columns['id']->getName()); - $this->assertTrue($columns['id']->getIdentity()); + $this->assertEquals('id', $columns[0]->getName()); + $this->assertTrue($columns[0]->getIdentity()); - $this->assertEquals($colName, $columns[$colName]->getName()); - $this->assertEquals($actualType ?? $type, $columns[$colName]->getType()); + $this->assertEquals($colName, $columns[1]->getName()); + $this->assertEquals($actualType ?? $type, $columns[1]->getType()); } public function testAddIndex()