1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
<?php
declare(strict_types=1);
namespace Doctrine\DBAL\Tests\Functional\Platform;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Schema\Column;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Schema\TableDiff;
use Doctrine\DBAL\Tests\FunctionalTestCase;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\Types;
use PHPUnit\Framework\Attributes\DataProvider;
class RenameColumnTest extends FunctionalTestCase
{
#[DataProvider('columnNameProvider')]
public function testColumnPositionRetainedAfterImplicitRenaming(string $columnName, string $newColumnName): void
{
$table = new Table('test_rename');
$table->addColumn($columnName, Types::STRING, ['length' => 16]);
$table->addColumn('c2', Types::INTEGER);
$this->dropAndCreateTable($table);
$table->dropColumn($columnName)
->addColumn($newColumnName, Types::STRING, ['length' => 16]);
$sm = $this->connection->createSchemaManager();
$diff = $sm->createComparator()
->compareTables($sm->introspectTable('test_rename'), $table);
$sm->alterTable($diff);
$table = $sm->introspectTable('test_rename');
$columns = $table->getColumns();
self::assertCount(2, $columns);
self::assertEqualsIgnoringCase($newColumnName, $columns[0]->getName());
self::assertEqualsIgnoringCase('c2', $columns[1]->getName());
self::assertCount(1, self::getRenamedColumns($diff));
self::assertCount(1, $diff->getRenamedColumns());
}
/** @return array<string,Column> */
public static function getRenamedColumns(TableDiff $tableDiff): array
{
$renamed = [];
foreach ($tableDiff->getChangedColumns() as $diff) {
if (! $diff->hasNameChanged()) {
continue;
}
$oldColumnName = $diff->getOldColumn()->getName();
$renamed[$oldColumnName] = $diff->getNewColumn();
}
return $renamed;
}
#[DataProvider('columnNameProvider')]
public function testColumnPositionRetainedAfterExplicitRenaming(string $columnName, string $newColumnName): void
{
$table = new Table('test_rename');
$table->addColumn($columnName, Types::INTEGER, ['length' => 16]);
$table->addColumn('c2', Types::INTEGER);
$this->dropAndCreateTable($table);
// Force a different type to make sure it's not being caught implicitly
$table->renameColumn($columnName, $newColumnName)->setType(Type::getType(Types::BIGINT))->setLength(32);
$sm = $this->connection->createSchemaManager();
$diff = $sm->createComparator()
->compareTables($sm->introspectTable('test_rename'), $table);
$sm->alterTable($diff);
$table = $sm->introspectTable('test_rename');
$columns = $table->getColumns();
self::assertCount(1, $diff->getChangedColumns());
self::assertCount(1, $diff->getRenamedColumns());
self::assertCount(1, $diff->getModifiedColumns());
self::assertCount(2, $columns);
self::assertEqualsIgnoringCase($newColumnName, $columns[0]->getName());
self::assertEqualsIgnoringCase('c2', $columns[1]->getName());
}
/** @return iterable<array{string,string}> */
public static function columnNameProvider(): iterable
{
yield ['c1', 'c1_x'];
yield ['C1', 'c1_x'];
yield ['importantColumn', 'veryImportantColumn'];
}
/** @throws Exception */
public function testRenameColumToQuoted(): void
{
$table = new Table('test_rename');
$table->addColumn('c1', Types::INTEGER);
$this->dropAndCreateTable($table);
$table->dropColumn('c1')
->addColumn('"c2"', Types::INTEGER);
$schemaManager = $this->connection->createSchemaManager();
$comparator = $schemaManager->createComparator();
$diff = $comparator->compareTables($schemaManager->introspectTable('test_rename'), $table);
self::assertFalse($diff->isEmpty());
$schemaManager->alterTable($diff);
$platform = $this->connection->getDatabasePlatform();
self::assertEquals(1, $this->connection->insert(
'test_rename',
[$platform->quoteSingleIdentifier('c2') => 1],
));
}
}
|