diff --git a/psalm.xml.dist b/psalm.xml.dist index 2ae40a21558..31e4a8b6638 100644 --- a/psalm.xml.dist +++ b/psalm.xml.dist @@ -517,13 +517,6 @@ - - - - diff --git a/src/Platforms/AbstractMySQLPlatform.php b/src/Platforms/AbstractMySQLPlatform.php index 8e17c47aba1..8651b82783d 100644 --- a/src/Platforms/AbstractMySQLPlatform.php +++ b/src/Platforms/AbstractMySQLPlatform.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Exception; use Doctrine\DBAL\Schema\AbstractAsset; use Doctrine\DBAL\Schema\ForeignKeyConstraint; +use Doctrine\DBAL\Schema\Identifier; use Doctrine\DBAL\Schema\Index; use Doctrine\DBAL\Schema\MySQLSchemaManager; use Doctrine\DBAL\Schema\Table; @@ -683,26 +684,36 @@ public function getAlterTableSQL(TableDiff $diff) $queryParts[] = 'DROP ' . $column->getQuotedName($this); } - foreach ($diff->getChangedColumns() as $columnDiff) { + foreach ($diff->getModifiedColumns() as $columnDiff) { + if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { + continue; + } + $newColumn = $columnDiff->getNewColumn(); $newColumnProperties = array_merge($newColumn->toArray(), [ 'comment' => $this->getColumnComment($newColumn), ]); - $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); - $oldColumnName = $oldColumn->getName(); + $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); - if ($columnDiff->hasNameChanged()) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $newColumn, $diff, $columnSql)) { - continue; - } - } elseif ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { + $queryParts[] = 'CHANGE ' . $oldColumn->getQuotedName($this) . ' ' + . $this->getColumnDeclarationSQL($newColumn->getQuotedName($this), $newColumnProperties); + } + + foreach ($diff->getRenamedColumns() as $oldColumnName => $column) { + if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { continue; } - $queryParts[] = 'CHANGE ' . $oldColumn->getQuotedName($this) . ' ' - . $this->getColumnDeclarationSQL($newColumn->getQuotedName($this), $newColumnProperties); + $oldColumnName = new Identifier($oldColumnName); + + $columnProperties = array_merge($column->toArray(), [ + 'comment' => $this->getColumnComment($column), + ]); + + $queryParts[] = 'CHANGE ' . $oldColumnName->getQuotedName($this) . ' ' + . $this->getColumnDeclarationSQL($column->getQuotedName($this), $columnProperties); } $addedIndexes = $this->indexAssetsByLowerCaseName($diff->getAddedIndexes()); @@ -734,7 +745,7 @@ public function getAlterTableSQL(TableDiff $diff) $diff = new TableDiff( $diff->name, $diff->getAddedColumns(), - $diff->getChangedColumns(), + $diff->getModifiedColumns(), $diff->getDroppedColumns(), array_values($addedIndexes), array_values($modifiedIndexes), @@ -743,6 +754,7 @@ public function getAlterTableSQL(TableDiff $diff) $diff->getAddedForeignKeys(), $diff->getModifiedForeignKeys(), $diff->getDroppedForeignKeys(), + $diff->getRenamedColumns(), $diff->getRenamedIndexes(), ); } diff --git a/src/Platforms/AbstractPlatform.php b/src/Platforms/AbstractPlatform.php index 9b99c10d2ae..c77882a1a53 100644 --- a/src/Platforms/AbstractPlatform.php +++ b/src/Platforms/AbstractPlatform.php @@ -2940,20 +2940,6 @@ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) ]; } - /** - * Returns the SQL for renaming a column - * - * @param string $tableName The table to rename the column on. - * @param string $oldColumnName The name of the column we want to rename. - * @param string $newColumnName The name we should rename it to. - * - * @return string[] The sequence of SQL statements for renaming the given column. - */ - protected function getRenameColumnSQL(string $tableName, string $oldColumnName, string $newColumnName): array - { - return [sprintf('ALTER TABLE %s RENAME COLUMN %s TO %s', $tableName, $oldColumnName, $newColumnName)]; - } - /** * Gets declaration of a number of columns in bulk. * diff --git a/src/Platforms/DB2Platform.php b/src/Platforms/DB2Platform.php index 3b35fe36aa5..64fabc32d0a 100644 --- a/src/Platforms/DB2Platform.php +++ b/src/Platforms/DB2Platform.php @@ -591,8 +591,6 @@ public function getAlterTableSQL(TableDiff $diff) $tableNameSQL = ($diff->getOldTable() ?? $diff->getName($this))->getQuotedName($this); $queryParts = []; - $needsReorg = false; - foreach ($diff->getAddedColumns() as $column) { if ($this->onSchemaAlterTableAddColumn($column, $diff, $columnSql)) { continue; @@ -612,8 +610,7 @@ public function getAlterTableSQL(TableDiff $diff) $queryParts[] = $queryPart; - $comment = $this->getColumnComment($column); - $needsReorg = true; + $comment = $this->getColumnComment($column); if ($comment === null || $comment === '') { continue; @@ -632,20 +629,10 @@ public function getAlterTableSQL(TableDiff $diff) } $queryParts[] = 'DROP COLUMN ' . $column->getQuotedName($this); - $needsReorg = true; } - foreach ($diff->getChangedColumns() as $columnDiff) { - $newColumn = $columnDiff->getNewColumn(); - $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); - - $oldColumnName = $oldColumn->getQuotedName($this); - - if ($columnDiff->hasNameChanged()) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $newColumn, $diff, $columnSql)) { - continue; - } - } elseif ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { + foreach ($diff->getModifiedColumns() as $columnDiff) { + if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { continue; } @@ -662,10 +649,20 @@ public function getAlterTableSQL(TableDiff $diff) $columnDiff, $sql, $queryParts, - $needsReorg, ); } + foreach ($diff->getRenamedColumns() as $oldColumnName => $column) { + if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { + continue; + } + + $oldColumnName = new Identifier($oldColumnName); + + $queryParts[] = 'RENAME COLUMN ' . $oldColumnName->getQuotedName($this) . + ' TO ' . $column->getQuotedName($this); + } + $tableSql = []; if (! $this->onSchemaAlterTable($diff, $tableSql)) { @@ -674,7 +671,7 @@ public function getAlterTableSQL(TableDiff $diff) } // Some table alteration operations require a table reorganization. - if ($needsReorg) { + if (count($diff->getDroppedColumns()) > 0 || count($diff->getModifiedColumns()) > 0) { $sql[] = "CALL SYSPROC.ADMIN_CMD ('REORG TABLE " . $tableNameSQL . "')"; } @@ -729,12 +726,11 @@ private function gatherAlterColumnSQL( string $table, ColumnDiff $columnDiff, array &$sql, - array &$queryParts, - bool &$needsReorg + array &$queryParts ): void { - $alterColumnClauses = $this->getAlterColumnClausesSQL($columnDiff, $needsReorg); + $alterColumnClauses = $this->getAlterColumnClausesSQL($columnDiff); - if (count($alterColumnClauses) < 1) { + if (empty($alterColumnClauses)) { return; } @@ -758,27 +754,18 @@ private function gatherAlterColumnSQL( * * @return string[] */ - private function getAlterColumnClausesSQL(ColumnDiff $columnDiff, bool &$needsReorg): array + private function getAlterColumnClausesSQL(ColumnDiff $columnDiff): array { $newColumn = $columnDiff->getNewColumn()->toArray(); - $newName = $columnDiff->getNewColumn()->getQuotedName($this); - $oldName = ($columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName())->getQuotedName($this); - - $alterClause = 'ALTER COLUMN ' . $newName; + $alterClause = 'ALTER COLUMN ' . $columnDiff->getNewColumn()->getQuotedName($this); if ($newColumn['columnDefinition'] !== null) { - $needsReorg = true; - return [$alterClause . ' ' . $newColumn['columnDefinition']]; } $clauses = []; - if ($columnDiff->hasNameChanged()) { - $clauses[] = 'RENAME COLUMN ' . $oldName . ' TO ' . $newName; - } - if ( $columnDiff->hasTypeChanged() || $columnDiff->hasLengthChanged() || @@ -786,13 +773,11 @@ private function getAlterColumnClausesSQL(ColumnDiff $columnDiff, bool &$needsRe $columnDiff->hasScaleChanged() || $columnDiff->hasFixedChanged() ) { - $needsReorg = true; - $clauses[] = $alterClause . ' SET DATA TYPE ' . $newColumn['type']->getSQLDeclaration($newColumn, $this); + $clauses[] = $alterClause . ' SET DATA TYPE ' . $newColumn['type']->getSQLDeclaration($newColumn, $this); } if ($columnDiff->hasNotNullChanged()) { - $needsReorg = true; - $clauses[] = $newColumn['notnull'] ? $alterClause . ' SET NOT NULL' : $alterClause . ' DROP NOT NULL'; + $clauses[] = $newColumn['notnull'] ? $alterClause . ' SET NOT NULL' : $alterClause . ' DROP NOT NULL'; } if ($columnDiff->hasDefaultChanged()) { @@ -800,12 +785,10 @@ private function getAlterColumnClausesSQL(ColumnDiff $columnDiff, bool &$needsRe $defaultClause = $this->getDefaultValueDeclarationSQL($newColumn); if ($defaultClause !== '') { - $needsReorg = true; - $clauses[] = $alterClause . ' SET' . $defaultClause; + $clauses[] = $alterClause . ' SET' . $defaultClause; } } else { - $needsReorg = true; - $clauses[] = $alterClause . ' DROP DEFAULT'; + $clauses[] = $alterClause . ' DROP DEFAULT'; } } diff --git a/src/Platforms/OraclePlatform.php b/src/Platforms/OraclePlatform.php index eb9b2b36b76..1d4578979a1 100644 --- a/src/Platforms/OraclePlatform.php +++ b/src/Platforms/OraclePlatform.php @@ -897,27 +897,13 @@ public function getAlterTableSQL(TableDiff $diff) } $fields = []; - foreach ($diff->getChangedColumns() as $columnDiff) { - $newColumn = $columnDiff->getNewColumn(); - $newColumnName = $newColumn->getQuotedName($this); - $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); - - $oldColumnName = $oldColumn->getQuotedName($this); - - // Column names in Oracle are case insensitive and automatically uppercased on the server. - if ($columnDiff->hasNameChanged()) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $newColumn, $diff, $columnSql)) { - continue; - } - - $sql = array_merge( - $sql, - $this->getRenameColumnSQL($tableNameSQL, $oldColumnName, $newColumnName), - ); - } elseif ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { + foreach ($diff->getModifiedColumns() as $columnDiff) { + if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { continue; } + $newColumn = $columnDiff->getNewColumn(); + // Do not generate column alteration clause if type is binary and only fixed property has changed. // Oracle only supports binary type columns with variable length. // Avoids unnecessary table alteration statements. @@ -934,7 +920,7 @@ public function getAlterTableSQL(TableDiff $diff) /** * Do not add query part if only comment has changed */ - if (count($columnDiff->changedProperties) > ($columnHasChangedComment ? 1 : 0)) { + if (! ($columnHasChangedComment && count($columnDiff->changedProperties) === 1)) { $newColumnProperties = $newColumn->toArray(); if (! $columnDiff->hasNotNullChanged()) { @@ -959,6 +945,17 @@ public function getAlterTableSQL(TableDiff $diff) $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' MODIFY (' . implode(', ', $fields) . ')'; } + foreach ($diff->getRenamedColumns() as $oldColumnName => $column) { + if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { + continue; + } + + $oldColumnName = new Identifier($oldColumnName); + + $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' RENAME COLUMN ' . $oldColumnName->getQuotedName($this) + . ' TO ' . $column->getQuotedName($this); + } + $fields = []; foreach ($diff->getDroppedColumns() as $column) { if ($this->onSchemaAlterTableRemoveColumn($column, $diff, $columnSql)) { diff --git a/src/Platforms/PostgreSQLPlatform.php b/src/Platforms/PostgreSQLPlatform.php index 510c922b586..cb27ee007b7 100644 --- a/src/Platforms/PostgreSQLPlatform.php +++ b/src/Platforms/PostgreSQLPlatform.php @@ -569,7 +569,11 @@ public function getAlterTableSQL(TableDiff $diff) $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' ' . $query; } - foreach ($diff->getChangedColumns() as $columnDiff) { + foreach ($diff->getModifiedColumns() as $columnDiff) { + if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { + continue; + } + if ($this->isUnchangedBinaryColumn($columnDiff)) { continue; } @@ -578,20 +582,6 @@ public function getAlterTableSQL(TableDiff $diff) $newColumn = $columnDiff->getNewColumn(); $oldColumnName = $oldColumn->getQuotedName($this); - $newColumnName = $newColumn->getQuotedName($this); - - if ($columnDiff->hasNameChanged()) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $newColumn, $diff, $columnSql)) { - continue; - } - - $sql = array_merge( - $sql, - $this->getRenameColumnSQL($tableNameSQL, $oldColumnName, $newColumnName), - ); - } elseif ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { - continue; - } if ( $columnDiff->hasTypeChanged() @@ -606,7 +596,7 @@ public function getAlterTableSQL(TableDiff $diff) $columnDefinition['autoincrement'] = false; // here was a server version check before, but DBAL API does not support this anymore. - $query = 'ALTER ' . $newColumnName . ' TYPE ' . $type->getSQLDeclaration($columnDefinition, $this); + $query = 'ALTER ' . $oldColumnName . ' TYPE ' . $type->getSQLDeclaration($columnDefinition, $this); $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' ' . $query; } @@ -615,12 +605,12 @@ public function getAlterTableSQL(TableDiff $diff) ? ' DROP DEFAULT' : ' SET' . $this->getDefaultValueDeclarationSQL($newColumn->toArray()); - $query = 'ALTER ' . $newColumnName . $defaultClause; + $query = 'ALTER ' . $oldColumnName . $defaultClause; $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' ' . $query; } if ($columnDiff->hasNotNullChanged()) { - $query = 'ALTER ' . $newColumnName . ' ' . ($newColumn->getNotnull() ? 'SET' : 'DROP') . ' NOT NULL'; + $query = 'ALTER ' . $oldColumnName . ' ' . ($newColumn->getNotnull() ? 'SET' : 'DROP') . ' NOT NULL'; $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' ' . $query; } @@ -629,16 +619,16 @@ public function getAlterTableSQL(TableDiff $diff) // add autoincrement $seqName = $this->getIdentitySequenceName( $table->getName(), - $newColumnName, + $oldColumnName, ); $sql[] = 'CREATE SEQUENCE ' . $seqName; - $sql[] = "SELECT setval('" . $seqName . "', (SELECT MAX(" . $newColumnName . ') FROM ' + $sql[] = "SELECT setval('" . $seqName . "', (SELECT MAX(" . $oldColumnName . ') FROM ' . $tableNameSQL . '))'; - $query = 'ALTER ' . $newColumnName . " SET DEFAULT nextval('" . $seqName . "')"; + $query = 'ALTER ' . $oldColumnName . " SET DEFAULT nextval('" . $seqName . "')"; } else { // Drop autoincrement, but do NOT drop the sequence. It might be re-used by other tables or have - $query = 'ALTER ' . $newColumnName . ' DROP DEFAULT'; + $query = 'ALTER ' . $oldColumnName . ' DROP DEFAULT'; } $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' ' . $query; @@ -667,6 +657,17 @@ public function getAlterTableSQL(TableDiff $diff) $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' ' . $query; } + foreach ($diff->getRenamedColumns() as $oldColumnName => $column) { + if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { + continue; + } + + $oldColumnName = new Identifier($oldColumnName); + + $sql[] = 'ALTER TABLE ' . $tableNameSQL . ' RENAME COLUMN ' . $oldColumnName->getQuotedName($this) + . ' TO ' . $column->getQuotedName($this); + } + $tableSql = []; if (! $this->onSchemaAlterTable($diff, $tableSql)) { diff --git a/src/Platforms/SQLServerPlatform.php b/src/Platforms/SQLServerPlatform.php index 48789b84acd..c8cd20b561c 100644 --- a/src/Platforms/SQLServerPlatform.php +++ b/src/Platforms/SQLServerPlatform.php @@ -567,38 +567,17 @@ public function getAlterTableSQL(TableDiff $diff) $queryParts[] = 'DROP COLUMN ' . $column->getQuotedName($this); } - $tableNameSQL = $table->getQuotedName($this); - - foreach ($diff->getChangedColumns() as $columnDiff) { - $newColumn = $columnDiff->getNewColumn(); - $newColumnName = $newColumn->getQuotedName($this); - - $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); - $oldColumnName = $oldColumn->getQuotedName($this); - $nameChanged = $columnDiff->hasNameChanged(); - - // Column names in SQL server are case insensitive and automatically uppercased on the server. - if ($nameChanged) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $newColumn, $diff, $columnSql)) { - continue; - } - - $sql = array_merge( - $sql, - $this->getRenameColumnSQL($tableNameSQL, $oldColumnName, $newColumnName), - ); - - // Recreate default constraint with new column name if necessary (for future reference). - if ($newColumn->getDefault() === null) { - continue; - } - } elseif ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { + foreach ($diff->getModifiedColumns() as $columnDiff) { + if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { continue; } + $newColumn = $columnDiff->getNewColumn(); $newComment = $this->getColumnComment($newColumn); $hasNewComment = ! empty($newComment) || is_numeric($newComment); + $oldColumn = $columnDiff->getOldColumn(); + if ($oldColumn instanceof Column) { $oldComment = $this->getColumnComment($oldColumn); $hasOldComment = ! empty($oldComment) || is_numeric($oldComment); @@ -623,36 +602,33 @@ public function getAlterTableSQL(TableDiff $diff) } } - $columnNameSQL = $newColumn->getQuotedName($this); - - $newDeclarationSQL = $this->getColumnDeclarationSQL($columnNameSQL, $newColumn->toArray()); - if ($oldColumn instanceof Column) { - $oldDeclarationSQL = $this->getColumnDeclarationSQL($columnNameSQL, $oldColumn->toArray()); - $declarationSQLChanged = $newDeclarationSQL !== $oldDeclarationSQL; - } else { - $maxChanged = $columnDiff->hasCommentChanged() ? 1 : 0; - $declarationSQLChanged = count($columnDiff->changedProperties) > $maxChanged; - } - - $defaultChanged = $columnDiff->hasDefaultChanged(); - - if (! $declarationSQLChanged && ! $defaultChanged && ! $nameChanged) { + // Do not add query part if only comment has changed. + if ($columnDiff->hasCommentChanged() && count($columnDiff->changedProperties) === 1) { continue; } $requireDropDefaultConstraint = $this->alterColumnRequiresDropDefaultConstraint($columnDiff); if ($requireDropDefaultConstraint) { + $oldColumn = $columnDiff->getOldColumn(); + + if ($oldColumn !== null) { + $oldColumnName = $oldColumn->getName(); + } else { + $oldColumnName = $columnDiff->oldColumnName; + } + $queryParts[] = $this->getAlterTableDropDefaultConstraintClause($tableName, $oldColumnName); } - if ($declarationSQLChanged) { - $queryParts[] = 'ALTER COLUMN ' . $newDeclarationSQL; - } + $columnProperties = $newColumn->toArray(); + + $queryParts[] = 'ALTER COLUMN ' . + $this->getColumnDeclarationSQL($newColumn->getQuotedName($this), $columnProperties); if ( - $newColumn->getDefault() === null - || (! $requireDropDefaultConstraint && ! $defaultChanged) + ! isset($columnProperties['default']) + || (! $requireDropDefaultConstraint && ! $columnDiff->hasDefaultChanged()) ) { continue; } @@ -660,6 +636,30 @@ public function getAlterTableSQL(TableDiff $diff) $queryParts[] = $this->getAlterTableAddDefaultConstraintClause($tableName, $newColumn); } + $tableNameSQL = $table->getQuotedName($this); + + foreach ($diff->getRenamedColumns() as $oldColumnName => $newColumn) { + if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $newColumn, $diff, $columnSql)) { + continue; + } + + $oldColumnName = new Identifier($oldColumnName); + + $sql[] = "sp_rename '" . $tableNameSQL . '.' . $oldColumnName->getQuotedName($this) . + "', '" . $newColumn->getQuotedName($this) . "', 'COLUMN'"; + + // Recreate default constraint with new column name if necessary (for future reference). + if ($newColumn->getDefault() === null) { + continue; + } + + $queryParts[] = $this->getAlterTableDropDefaultConstraintClause( + $tableName, + $oldColumnName->getQuotedName($this), + ); + $queryParts[] = $this->getAlterTableAddDefaultConstraintClause($tableName, $newColumn); + } + $tableSql = []; if ($this->onSchemaAlterTable($diff, $tableSql)) { @@ -700,7 +700,7 @@ public function getAlterTableSQL(TableDiff $diff) public function getRenameTableSQL(string $oldName, string $newName): array { return [ - sprintf('EXEC sp_rename %s, %s', $this->quoteStringLiteral($oldName), $this->quoteStringLiteral($newName)), + sprintf('sp_rename %s, %s', $this->quoteStringLiteral($oldName), $this->quoteStringLiteral($newName)), /* Rename table's default constraints names * to match the new table name. @@ -783,7 +783,7 @@ private function alterColumnRequiresDropDefaultConstraint(ColumnDiff $columnDiff // We need to drop an existing default constraint if the column was // defined with a default value before and the native column type has changed. - return $columnDiff->hasTypeChanged() || $columnDiff->hasFixedChanged() || $columnDiff->hasNameChanged(); + return $columnDiff->hasTypeChanged() || $columnDiff->hasFixedChanged(); } /** @@ -878,25 +878,6 @@ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) ]; } - /** - * Returns the SQL for renaming a column - * - * @param string $tableName The table to rename the column on. - * @param string $oldColumnName The name of the column we want to rename. - * @param string $newColumnName The name we should rename it to. - * - * @return string[] The sequence of SQL statements for renaming the given column. - */ - protected function getRenameColumnSQL(string $tableName, string $oldColumnName, string $newColumnName): array - { - return [sprintf( - "EXEC sp_rename %s, %s, 'COLUMN'", - $this->quoteStringLiteral($tableName . '.' . $oldColumnName), - $this->quoteStringLiteral($newColumnName), - ), - ]; - } - /** * Returns the SQL statement for adding an extended property to a database object. * diff --git a/src/Platforms/SqlitePlatform.php b/src/Platforms/SqlitePlatform.php index 5d3f8c27f6d..e35580c70cb 100644 --- a/src/Platforms/SqlitePlatform.php +++ b/src/Platforms/SqlitePlatform.php @@ -1095,20 +1095,36 @@ public function getAlterTableSQL(TableDiff $diff) ); } - foreach ($diff->getChangedColumns() as $columnDiff) { - $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); - $newColumn = $columnDiff->getNewColumn(); + foreach ($diff->getRenamedColumns() as $oldColumnName => $column) { + if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $column, $diff, $columnSql)) { + continue; + } - $oldColumnName = strtolower($oldColumn->getName()); + $oldColumnName = strtolower($oldColumnName); - if ($columnDiff->hasNameChanged()) { - if ($this->onSchemaAlterTableRenameColumn($oldColumnName, $newColumn, $diff, $columnSql)) { - continue; - } - } elseif ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { + $columns = $this->replaceColumn( + $table->getName(), + $columns, + $oldColumnName, + $column, + ); + + if (! isset($newColumnNames[$oldColumnName])) { + continue; + } + + $newColumnNames[$oldColumnName] = $column->getQuotedName($this); + } + + foreach ($diff->getModifiedColumns() as $columnDiff) { + if ($this->onSchemaAlterTableChangeColumn($columnDiff, $diff, $columnSql)) { continue; } + $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); + + $oldColumnName = strtolower($oldColumn->getName()); + $columns = $this->replaceColumn( $table->getName(), $columns, @@ -1225,7 +1241,7 @@ private function replaceColumn($tableName, array $columns, $columnName, Column $ private function getSimpleAlterTableSQL(TableDiff $diff) { // Suppress changes on integer type autoincrement columns. - foreach ($diff->getChangedColumns() as $columnDiff) { + foreach ($diff->getModifiedColumns() as $columnDiff) { $oldColumn = $columnDiff->getOldColumn(); if ($oldColumn === null) { @@ -1256,8 +1272,9 @@ private function getSimpleAlterTableSQL(TableDiff $diff) } if ( - count($diff->getChangedColumns()) > 0 + count($diff->getModifiedColumns()) > 0 || count($diff->getDroppedColumns()) > 0 + || count($diff->getRenamedColumns()) > 0 || count($diff->getAddedIndexes()) > 0 || count($diff->getModifiedIndexes()) > 0 || count($diff->getDroppedIndexes()) > 0 @@ -1343,7 +1360,13 @@ private function getColumnNamesInAlteredTable(TableDiff $diff, Table $fromTable) unset($columns[$columnName]); } - foreach ($diff->getChangedColumns() as $columnDiff) { + foreach ($diff->getRenamedColumns() as $oldColumnName => $column) { + $columnName = $column->getName(); + $columns[strtolower($oldColumnName)] = $columnName; + $columns[strtolower($columnName)] = $columnName; + } + + foreach ($diff->getModifiedColumns() as $columnDiff) { $oldColumn = $columnDiff->getOldColumn() ?? $columnDiff->getOldColumnName(); $oldColumnName = $oldColumn->getName(); diff --git a/src/Schema/Column.php b/src/Schema/Column.php index 95801176903..e1580178656 100644 --- a/src/Schema/Column.php +++ b/src/Schema/Column.php @@ -463,13 +463,4 @@ public function toArray() 'comment' => $this->_comment, ], $this->_platformOptions, $this->_customSchemaOptions); } - - /** @internal To be removed in 4.0 */ - public function cloneWithName(string $name): Column - { - $clone = clone $this; - $clone->_setName($name); - - return $clone; - } } diff --git a/src/Schema/ColumnDiff.php b/src/Schema/ColumnDiff.php index 2ac4c9eb2b2..bd1b0eee05f 100644 --- a/src/Schema/ColumnDiff.php +++ b/src/Schema/ColumnDiff.php @@ -5,7 +5,6 @@ use Doctrine\Deprecations\Deprecation; use function in_array; -use function strcasecmp; /** * Represents the change of a column. @@ -79,14 +78,6 @@ public function getNewColumn(): Column return $this->column; } - public function hasNameChanged(): bool - { - $oldColumn = $this->getOldColumn() ?? $this->getOldColumnName(); - - // Column names are case insensitive - return strcasecmp($oldColumn->getName(), $this->getNewColumn()->getName()) !== 0; - } - public function hasTypeChanged(): bool { return $this->hasChanged('type'); diff --git a/src/Schema/Comparator.php b/src/Schema/Comparator.php index 04c58b80d38..28e7f2f73b2 100644 --- a/src/Schema/Comparator.php +++ b/src/Schema/Comparator.php @@ -363,29 +363,7 @@ public function compareTables(Table $fromTable, Table $toTable): TableDiff ); } - $renamedColumnNames = $toTable->getRenamedColumns(); - - foreach ($addedColumns as $addedColumnName => $addedColumn) { - if (! isset($renamedColumnNames[$addedColumn->getName()])) { - continue; - } - - $removedColumnName = $renamedColumnNames[$addedColumn->getName()]; - // Explicitly renamed columns need to be diffed, because their types can also have changed - $modifiedColumns[$removedColumnName] = new ColumnDiff( - $removedColumnName, - $addedColumn, - $this->diffColumn($droppedColumns[$removedColumnName], $addedColumn), - $droppedColumns[$removedColumnName], - ); - - unset( - $addedColumns[$addedColumnName], - $droppedColumns[$removedColumnName], - ); - } - - $this->detectRenamedColumns($modifiedColumns, $addedColumns, $droppedColumns); + $renamedColumns = $this->detectRenamedColumns($addedColumns, $droppedColumns); $fromTableIndexes = $fromTable->getIndexes(); $toTableIndexes = $toTable->getIndexes(); @@ -461,6 +439,7 @@ public function compareTables(Table $fromTable, Table $toTable): TableDiff $addedForeignKeys, $modifiedForeignKeys, $droppedForeignKeys, + $renamedColumns, $renamedIndexes, ); } @@ -469,13 +448,14 @@ public function compareTables(Table $fromTable, Table $toTable): TableDiff * Try to find columns that only changed their name, rename operations maybe cheaper than add/drop * however ambiguities between different possibilities should not lead to renaming at all. * - * @param array $modifiedColumns - * @param array $addedColumns - * @param array $removedColumns + * @param array $addedColumns + * @param array $removedColumns + * + * @return array * * @throws Exception */ - private function detectRenamedColumns(array &$modifiedColumns, array &$addedColumns, array &$removedColumns): void + private function detectRenamedColumns(array &$addedColumns, array &$removedColumns): array { $candidatesByName = []; @@ -489,6 +469,8 @@ private function detectRenamedColumns(array &$modifiedColumns, array &$addedColu } } + $renamedColumns = []; + foreach ($candidatesByName as $candidates) { if (count($candidates) !== 1) { continue; @@ -498,22 +480,18 @@ private function detectRenamedColumns(array &$modifiedColumns, array &$addedColu $removedColumnName = $removedColumn->getName(); $addedColumnName = strtolower($addedColumn->getName()); - if (isset($modifiedColumns[$removedColumnName])) { + if (isset($renamedColumns[$removedColumnName])) { continue; } - $modifiedColumns[$removedColumnName] = new ColumnDiff( - $removedColumnName, - $addedColumn, - $this->diffColumn($addedColumn, $removedColumn), - $removedColumn, - ); - + $renamedColumns[$removedColumnName] = $addedColumn; unset( $addedColumns[$addedColumnName], $removedColumns[strtolower($removedColumnName)], ); } + + return $renamedColumns; } /** diff --git a/src/Schema/Table.php b/src/Schema/Table.php index d2680cfceb8..ce4cc3260f1 100644 --- a/src/Schema/Table.php +++ b/src/Schema/Table.php @@ -7,14 +7,12 @@ use Doctrine\DBAL\Schema\Visitor\Visitor; use Doctrine\DBAL\Types\Type; use Doctrine\Deprecations\Deprecation; -use LogicException; use function array_filter; use function array_keys; use function array_merge; use function in_array; use function preg_match; -use function sprintf; use function strlen; use function strtolower; @@ -28,9 +26,6 @@ class Table extends AbstractAsset /** @var Column[] */ protected $_columns = []; - /** @var array keys are new names, values are old names */ - protected array $renamedColumns = []; - /** @var Index[] */ protected $_indexes = []; @@ -351,48 +346,6 @@ public function addColumn($name, $typeName, array $options = []) return $column; } - /** @return array */ - final public function getRenamedColumns(): array - { - return $this->renamedColumns; - } - - /** - * @throws LogicException - * @throws SchemaException - */ - final public function renameColumn(string $oldName, string $newName): Column - { - $oldName = $this->normalizeIdentifier($oldName); - $newName = $this->normalizeIdentifier($newName); - - if ($oldName === $newName) { - throw new LogicException(sprintf( - 'Attempt to rename column "%s.%s" to the same name.', - $this->getName(), - $oldName, - )); - } - - $column = $this->getColumn($oldName); - $column->_setName($newName); - unset($this->_columns[$oldName]); - $this->_addColumn($column); - - // If a column is renamed multiple times, we only want to know the original and last new name - if (isset($this->renamedColumns[$oldName])) { - $toRemove = $oldName; - $oldName = $this->renamedColumns[$oldName]; - unset($this->renamedColumns[$toRemove]); - } - - if ($newName !== $oldName) { - $this->renamedColumns[$newName] = $oldName; - } - - return $column; - } - /** * Change Column Details. * diff --git a/src/Schema/TableDiff.php b/src/Schema/TableDiff.php index a02b68ec1c0..9aaf9e7702f 100644 --- a/src/Schema/TableDiff.php +++ b/src/Schema/TableDiff.php @@ -8,9 +8,6 @@ use function array_filter; use function array_values; use function count; -use function current; -use function func_get_arg; -use function func_num_args; /** * Table Diff. @@ -43,7 +40,7 @@ class TableDiff /** * All modified columns * - * @internal Use {@see getChangedColumns()} instead. + * @internal Use {@see getModifiedColumns()} instead. * * @var ColumnDiff[] */ @@ -58,6 +55,15 @@ class TableDiff */ public $removedColumns = []; + /** + * Columns that are only renamed from key to column instance name. + * + * @internal Use {@see getRenamedColumns()} instead. + * + * @var Column[] + */ + public $renamedColumns = []; + /** * All added indexes. * @@ -133,6 +139,7 @@ class TableDiff * * @internal The diff can be only instantiated by a {@see Comparator}. * + * @param string $tableName * @param array $addedColumns * @param array $modifiedColumns * @param array $droppedColumns @@ -142,25 +149,28 @@ class TableDiff * @param list $addedForeignKeys * @param list $changedForeignKeys * @param list $removedForeignKeys + * @param array $renamedColumns * @param array $renamedIndexes */ public function __construct( - string $tableName, - array $addedColumns = [], - array $modifiedColumns = [], - array $droppedColumns = [], - array $addedIndexes = [], - array $changedIndexes = [], - array $removedIndexes = [], + $tableName, + $addedColumns = [], + $modifiedColumns = [], + $droppedColumns = [], + $addedIndexes = [], + $changedIndexes = [], + $removedIndexes = [], ?Table $fromTable = null, - array $addedForeignKeys = [], - array $changedForeignKeys = [], - array $removedForeignKeys = [], - array $renamedIndexes = [] + $addedForeignKeys = [], + $changedForeignKeys = [], + $removedForeignKeys = [], + $renamedColumns = [], + $renamedIndexes = [] ) { $this->name = $tableName; $this->addedColumns = $addedColumns; $this->changedColumns = $modifiedColumns; + $this->renamedColumns = $renamedColumns; $this->removedColumns = $droppedColumns; $this->addedIndexes = $addedIndexes; $this->changedIndexes = $changedIndexes; @@ -179,50 +189,9 @@ public function __construct( ); } - if (func_num_args() > 12 || (count($renamedIndexes) > 0 && current($renamedIndexes) instanceof Column)) { - Deprecation::trigger( - 'doctrine/dbal', - 'https://github.com/doctrine/dbal/pull/6080', - 'Passing $renamedColumns to %s is deprecated and will no longer be possible in the next major.', - __METHOD__, - ); - /** @var array $renamedColumns */ - $renamedColumns = $renamedIndexes; - $this->convertLegacyRenamedColumn($renamedColumns); - $this->renamedIndexes = func_num_args() > 12 ? func_get_arg(12) : []; - } - $this->fromTable = $fromTable; } - /** @param array $renamedColumns */ - private function convertLegacyRenamedColumn(array $renamedColumns): void - { - $changedColumns = []; - foreach ($this->changedColumns as $key => $column) { - $oldName = isset($column->fromColumn) - ? $column->fromColumn->getName() - : $column->oldColumnName; - $changedColumns[$oldName] = $key; - } - - foreach ($renamedColumns as $oldName => $column) { - if (isset($changedColumns[$oldName])) { - $i = $changedColumns[$oldName]; - $existingCol = $this->changedColumns[$changedColumns[$oldName]]; - $column = $existingCol->getNewColumn()->cloneWithName($column->getName()); - $this->changedColumns[$i] = new ColumnDiff( - $oldName, - $column, - $existingCol->changedProperties, - $existingCol->getOldColumn(), - ); - } else { - $this->changedColumns[] = new ColumnDiff($oldName, $column, []); - } - } - } - /** * @deprecated Use {@see getOldTable()} instead. * @@ -269,27 +238,8 @@ public function getAddedColumns(): array return array_values($this->addedColumns); } - /** - * @deprecated Use {@see getChangedColumns()} instead. - * - * @return list - */ + /** @return list */ public function getModifiedColumns(): array - { - Deprecation::triggerIfCalledFromOutside( - 'doctrine/dbal', - 'https://github.com/doctrine/dbal/pull/6080', - '%s is deprecated, use `getChangedColumns()` instead.', - __METHOD__, - ); - - return array_values(array_filter($this->getChangedColumns(), static function (ColumnDiff $diff) { - return count($diff->changedProperties) > 0; - })); - } - - /** @return array */ - public function getChangedColumns(): array { return array_values($this->changedColumns); } @@ -300,30 +250,10 @@ public function getDroppedColumns(): array return array_values($this->removedColumns); } - /** - * @deprecated Use {@see getChangedColumns()} instead. - * - * @return array - */ + /** @return array */ public function getRenamedColumns(): array { - Deprecation::triggerIfCalledFromOutside( - 'doctrine/dbal', - 'https://github.com/doctrine/dbal/pull/6080', - '%s is deprecated, you should use `getChangedColumns()` instead.', - __METHOD__, - ); - $renamed = []; - foreach ($this->getChangedColumns() as $diff) { - if (! $diff->hasNameChanged()) { - continue; - } - - $oldColumnName = ($diff->getOldColumn() ?? $diff->getOldColumnName())->getName(); - $renamed[$oldColumnName] = $diff->getNewColumn(); - } - - return $renamed; + return $this->renamedColumns; } /** @return list */ @@ -419,6 +349,7 @@ public function isEmpty(): bool return count($this->addedColumns) === 0 && count($this->changedColumns) === 0 && count($this->removedColumns) === 0 + && count($this->renamedColumns) === 0 && count($this->addedIndexes) === 0 && count($this->changedIndexes) === 0 && count($this->removedIndexes) === 0 @@ -427,46 +358,4 @@ public function isEmpty(): bool && count($this->changedForeignKeys) === 0 && count($this->removedForeignKeys) === 0; } - - /** Deprecation layer, to be removed in 4.0 */ - public function __isset(string $name): bool - { - return $name === 'renamedColumns'; - } - - /** @param mixed $val */ - public function __set(string $name, $val): void - { - if ($name === 'renamedColumns') { - Deprecation::trigger( - 'doctrine/dbal', - 'https://github.com/doctrine/dbal/pull/6080', - 'Modifying $renamedColumns is deprecated, this property will be removed in the next major. ' . - 'Set $modifiedColumns in the constructor instead', - __METHOD__, - ); - $this->convertLegacyRenamedColumn($val); - } else { - /** @phpstan-ignore-next-line */ - $this->$name = $val; - } - } - - /** @return mixed */ - public function __get(string $name) - { - if ($name === 'renamedColumns') { - Deprecation::trigger( - 'doctrine/dbal', - 'https://github.com/doctrine/dbal/pull/6080', - 'Property %s is deprecated, you should use `getModifiedColumns()` instead.', - $name, - ); - - return $this->getRenamedColumns(); - } - - /** @phpstan-ignore-next-line */ - return $this->$name; - } } diff --git a/tests/Functional/Platform/RenameColumnTest.php b/tests/Functional/Platform/RenameColumnTest.php index cf1158006ea..9ec0c0a1394 100644 --- a/tests/Functional/Platform/RenameColumnTest.php +++ b/tests/Functional/Platform/RenameColumnTest.php @@ -5,17 +5,15 @@ use Doctrine\DBAL\Schema\Comparator; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Tests\FunctionalTestCase; -use Doctrine\DBAL\Types\Type; use Doctrine\DBAL\Types\Types; use function array_keys; -use function array_values; use function strtolower; class RenameColumnTest extends FunctionalTestCase { /** @dataProvider columnNameProvider */ - public function testColumnPositionRetainedAfterImplicitRenaming(string $columnName, string $newColumnName): void + public function testColumnPositionRetainedAfterRenaming(string $columnName, string $newColumnName): void { $table = new Table('test_rename'); $table->addColumn($columnName, Types::STRING); @@ -35,34 +33,6 @@ public function testColumnPositionRetainedAfterImplicitRenaming(string $columnNa $table = $sm->introspectTable('test_rename'); self::assertSame([strtolower($newColumnName), 'c2'], array_keys($table->getColumns())); - self::assertCount(1, $diff->getRenamedColumns()); - } - - /** @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 = array_values($table->getColumns()); - - self::assertCount(1, $diff->getChangedColumns()); - self::assertCount(2, $columns); - self::assertEqualsIgnoringCase($newColumnName, $columns[0]->getName()); - self::assertEqualsIgnoringCase('c2', $columns[1]->getName()); } /** @return iterable */ diff --git a/tests/Functional/Schema/ComparatorTest.php b/tests/Functional/Schema/ComparatorTest.php index 7dc9f8fe124..9cf71c48376 100644 --- a/tests/Functional/Schema/ComparatorTest.php +++ b/tests/Functional/Schema/ComparatorTest.php @@ -10,7 +10,6 @@ use Doctrine\DBAL\Schema\Comparator; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Tests\FunctionalTestCase; -use Doctrine\DBAL\Types\Type; use Doctrine\DBAL\Types\Types; use function array_merge; @@ -53,57 +52,6 @@ public function testDefaultValueComparison(callable $comparatorFactory, string $ self::assertFalse($comparatorFactory($this->schemaManager)->diffTable($table, $onlineTable)); } - public function testRenameColumnComparison(): void - { - $comparator = new Comparator(); - - $table = new Table('rename_table'); - $table->addColumn('test', Types::STRING, ['default' => 'baz', 'length' => 20]); - $table->addColumn('test2', Types::STRING, ['default' => 'baz', 'length' => 20]); - $table->addColumn('test3', Types::STRING, ['default' => 'foo', 'length' => 10]); - - $onlineTable = clone $table; - $table->renameColumn('test', 'baz') - ->setLength(40) - ->setComment('Comment'); - - $table->renameColumn('test2', 'foo'); - - $table->getColumn('test3') - ->setAutoincrement(true) - ->setNotnull(false) - ->setType(Type::getType(Types::BIGINT)); - - $compareResult = $comparator->compareTables($onlineTable, $table); - self::assertCount(3, $compareResult->getChangedColumns()); - self::assertCount(2, $compareResult->getRenamedColumns()); - self::assertCount(2, $compareResult->getModifiedColumns()); - self::assertArrayHasKey('test2', $compareResult->getRenamedColumns()); - - $renamedOnly = $compareResult->changedColumns['test2']; - $renamedAndModified = $compareResult->changedColumns['test']; - $modifiedOnly = $compareResult->changedColumns['test3']; - - self::assertEquals('foo', $renamedOnly->getNewColumn()->getName()); - self::assertTrue($renamedOnly->hasNameChanged()); - self::assertCount(0, $renamedOnly->changedProperties); - - self::assertEquals('baz', $renamedAndModified->getNewColumn()->getName()); - self::assertTrue($renamedAndModified->hasNameChanged()); - self::assertTrue($renamedAndModified->hasLengthChanged()); - self::assertTrue($renamedAndModified->hasCommentChanged()); - self::assertFalse($renamedAndModified->hasTypeChanged()); - self::assertCount(2, $renamedAndModified->changedProperties); - - self::assertTrue($modifiedOnly->hasAutoIncrementChanged()); - self::assertTrue($modifiedOnly->hasNotNullChanged()); - self::assertTrue($modifiedOnly->hasTypeChanged()); - self::assertFalse($modifiedOnly->hasLengthChanged()); - self::assertFalse($modifiedOnly->hasCommentChanged()); - self::assertFalse($modifiedOnly->hasNameChanged()); - self::assertCount(3, $modifiedOnly->changedProperties); - } - /** @return iterable */ public static function defaultValueProvider(): iterable { diff --git a/tests/Platforms/AbstractMySQLPlatformTestCase.php b/tests/Platforms/AbstractMySQLPlatformTestCase.php index 84c24b95037..8228b73ccb5 100644 --- a/tests/Platforms/AbstractMySQLPlatformTestCase.php +++ b/tests/Platforms/AbstractMySQLPlatformTestCase.php @@ -756,9 +756,9 @@ protected function getQuotedAlterTableRenameColumnSQL(): array "CHANGE `create` reserved_keyword INT NOT NULL COMMENT 'Reserved keyword 1', " . "CHANGE `table` `from` INT NOT NULL COMMENT 'Reserved keyword 2', " . "CHANGE `select` `bar` INT NOT NULL COMMENT 'Reserved keyword 3', " . - "CHANGE `quoted1` quoted INT NOT NULL COMMENT 'Quoted 1', " . - "CHANGE `quoted2` `and` INT NOT NULL COMMENT 'Quoted 2', " . - "CHANGE `quoted3` `baz` INT NOT NULL COMMENT 'Quoted 3'", + "CHANGE quoted1 quoted INT NOT NULL COMMENT 'Quoted 1', " . + "CHANGE quoted2 `and` INT NOT NULL COMMENT 'Quoted 2', " . + "CHANGE quoted3 `baz` INT NOT NULL COMMENT 'Quoted 3'", ]; } diff --git a/tests/Platforms/AbstractPlatformTestCase.php b/tests/Platforms/AbstractPlatformTestCase.php index ac6927965d4..cf7dc522894 100644 --- a/tests/Platforms/AbstractPlatformTestCase.php +++ b/tests/Platforms/AbstractPlatformTestCase.php @@ -3,12 +3,6 @@ namespace Doctrine\DBAL\Tests\Platforms; use Doctrine\Common\EventManager; -use Doctrine\DBAL\Event\SchemaAlterTableAddColumnEventArgs; -use Doctrine\DBAL\Event\SchemaAlterTableChangeColumnEventArgs; -use Doctrine\DBAL\Event\SchemaAlterTableEventArgs; -use Doctrine\DBAL\Event\SchemaAlterTableRemoveColumnEventArgs; -use Doctrine\DBAL\Event\SchemaAlterTableRenameColumnEventArgs; -use Doctrine\DBAL\Event\SchemaEventArgs; use Doctrine\DBAL\Events; use Doctrine\DBAL\Exception; use Doctrine\DBAL\Exception\InvalidLockMode; @@ -361,24 +355,19 @@ public function testGetAlterTableSqlDispatchEvent(): void $listenerMock = $this->createMock(GetAlterTableSqlDispatchEventListener::class); $listenerMock ->expects(self::once()) - ->method('onSchemaAlterTable') - ->willReturnCallback(static fn (SchemaEventArgs $args) => $args->preventDefault()); + ->method('onSchemaAlterTable'); $listenerMock ->expects(self::once()) - ->method('onSchemaAlterTableAddColumn') - ->willReturnCallback(static fn (SchemaEventArgs $args) => $args->preventDefault()); + ->method('onSchemaAlterTableAddColumn'); $listenerMock ->expects(self::once()) - ->method('onSchemaAlterTableRemoveColumn') - ->willReturnCallback(static fn (SchemaEventArgs $args) => $args->preventDefault()); + ->method('onSchemaAlterTableRemoveColumn'); $listenerMock ->expects(self::once()) - ->method('onSchemaAlterTableChangeColumn') - ->willReturnCallback(static fn (SchemaEventArgs $args) => $args->preventDefault()); + ->method('onSchemaAlterTableChangeColumn'); $listenerMock ->expects(self::once()) - ->method('onSchemaAlterTableRenameColumn') - ->willReturnCallback(static fn (SchemaEventArgs $args) => $args->preventDefault()); + ->method('onSchemaAlterTableRenameColumn'); $eventManager = new EventManager(); $events = [ @@ -404,16 +393,13 @@ public function testGetAlterTableSqlDispatchEvent(): void $tableDiff->changedColumns['changed'] = new ColumnDiff( 'changed', new Column( - 'changed', + 'changed2', Type::getType(Types::STRING), [], ), [], ); - $tableDiff->changedColumns['renamed'] = new ColumnDiff( - 'renamed', - new Column('renamed2', Type::getType(Types::INTEGER), []), - ); + $tableDiff->renamedColumns['renamed'] = new Column('renamed2', Type::getType(Types::INTEGER), []); $this->platform->getAlterTableSQL($tableDiff); } @@ -1210,8 +1196,8 @@ public function testReturnsGuidTypeDeclarationSQL(): void public function testGeneratesAlterTableRenameColumnSQL(): void { - $table = new Table('foo'); - $oldColumn = $table->addColumn( + $table = new Table('foo'); + $table->addColumn( 'bar', Types::INTEGER, ['notnull' => true, 'default' => 666, 'comment' => 'rename test'], @@ -1219,12 +1205,11 @@ public function testGeneratesAlterTableRenameColumnSQL(): void $tableDiff = new TableDiff('foo'); $tableDiff->fromTable = $table; - $newColumn = new Column( + $tableDiff->renamedColumns['bar'] = new Column( 'baz', Type::getType(Types::INTEGER), ['notnull' => true, 'default' => 666, 'comment' => 'rename test'], ); - $tableDiff->changedColumns['bar'] = new ColumnDiff('bar', $newColumn, [], $oldColumn); self::assertSame($this->getAlterTableRenameColumnSQL(), $this->platform->getAlterTableSQL($tableDiff)); } @@ -1446,15 +1431,15 @@ public function onSchemaCreateTableColumn(): void; interface GetAlterTableSqlDispatchEventListener { - public function onSchemaAlterTable(SchemaAlterTableEventArgs $args): void; + public function onSchemaAlterTable(): void; - public function onSchemaAlterTableAddColumn(SchemaAlterTableAddColumnEventArgs $args): void; + public function onSchemaAlterTableAddColumn(): void; - public function onSchemaAlterTableRemoveColumn(SchemaAlterTableRemoveColumnEventArgs $args): void; + public function onSchemaAlterTableRemoveColumn(): void; - public function onSchemaAlterTableChangeColumn(SchemaAlterTableChangeColumnEventArgs $args): void; + public function onSchemaAlterTableChangeColumn(): void; - public function onSchemaAlterTableRenameColumn(SchemaAlterTableRenameColumnEventArgs $args): void; + public function onSchemaAlterTableRenameColumn(): void; } interface GetDropTableSqlDispatchEventListener diff --git a/tests/Platforms/DB2PlatformTest.php b/tests/Platforms/DB2PlatformTest.php index 9505ff5eb48..1faa038ffe0 100644 --- a/tests/Platforms/DB2PlatformTest.php +++ b/tests/Platforms/DB2PlatformTest.php @@ -128,8 +128,7 @@ public function getAlterTableColumnCommentsSQL(): array { return [ 'ALTER TABLE mytable ' . - 'ADD COLUMN quota INTEGER NOT NULL WITH DEFAULT ' . - 'RENAME COLUMN bar TO baz', + 'ADD COLUMN quota INTEGER NOT NULL WITH DEFAULT', "CALL SYSPROC.ADMIN_CMD ('REORG TABLE mytable')", "COMMENT ON COLUMN mytable.quota IS 'A comment'", "COMMENT ON COLUMN mytable.foo IS ''", @@ -480,9 +479,9 @@ protected function getQuotedAlterTableRenameColumnSQL(): array 'RENAME COLUMN "create" TO reserved_keyword ' . 'RENAME COLUMN "table" TO "from" ' . 'RENAME COLUMN "select" TO "bar" ' . - 'RENAME COLUMN "quoted1" TO quoted ' . - 'RENAME COLUMN "quoted2" TO "and" ' . - 'RENAME COLUMN "quoted3" TO "baz"', + 'RENAME COLUMN quoted1 TO quoted ' . + 'RENAME COLUMN quoted2 TO "and" ' . + 'RENAME COLUMN quoted3 TO "baz"', ]; } @@ -542,8 +541,7 @@ protected function getCommentOnColumnSQL(): array public function testGeneratesAlterColumnSQL( string $changedProperty, Column $column, - ?string $expectedSQLClause = null, - bool $shouldReorg = true + ?string $expectedSQLClause = null ): void { $tableDiff = new TableDiff('foo'); $tableDiff->fromTable = new Table('foo'); @@ -555,9 +553,7 @@ public function testGeneratesAlterColumnSQL( $expectedSQL[] = 'ALTER TABLE foo ALTER COLUMN bar ' . $expectedSQLClause; } - if ($shouldReorg) { - $expectedSQL[] = "CALL SYSPROC.ADMIN_CMD ('REORG TABLE foo')"; - } + $expectedSQL[] = "CALL SYSPROC.ADMIN_CMD ('REORG TABLE foo')"; self::assertSame($expectedSQL, $this->platform->getAlterTableSQL($tableDiff)); } @@ -615,7 +611,6 @@ public static function getGeneratesAlterColumnSQL(): iterable 'default', new Column('bar', Type::getType(Types::INTEGER), ['autoincrement' => true, 'default' => 666]), null, - false, ], [ 'default', diff --git a/tests/Platforms/OraclePlatformTest.php b/tests/Platforms/OraclePlatformTest.php index f582b8ff27f..9593612d55c 100644 --- a/tests/Platforms/OraclePlatformTest.php +++ b/tests/Platforms/OraclePlatformTest.php @@ -398,7 +398,6 @@ public function getAlterTableColumnCommentsSQL(): array { return [ 'ALTER TABLE mytable ADD (quota NUMBER(10) NOT NULL)', - 'ALTER TABLE mytable RENAME COLUMN bar TO baz', "COMMENT ON COLUMN mytable.quota IS 'A comment'", "COMMENT ON COLUMN mytable.foo IS ''", "COMMENT ON COLUMN mytable.baz IS 'B comment'", @@ -497,7 +496,6 @@ public function testAlterTableNotNULL(): void ); $expectedSql = [ - 'ALTER TABLE mytable RENAME COLUMN bar TO baz', "ALTER TABLE mytable MODIFY (foo VARCHAR2(255) DEFAULT 'bla', baz VARCHAR2(255) DEFAULT 'bla' NOT NULL, " . 'metar VARCHAR2(2000) DEFAULT NULL NULL)', ]; @@ -617,9 +615,9 @@ protected function getQuotedAlterTableRenameColumnSQL(): array 'ALTER TABLE mytable RENAME COLUMN "create" TO reserved_keyword', 'ALTER TABLE mytable RENAME COLUMN "table" TO "from"', 'ALTER TABLE mytable RENAME COLUMN "select" TO "bar"', - 'ALTER TABLE mytable RENAME COLUMN "quoted1" TO quoted', - 'ALTER TABLE mytable RENAME COLUMN "quoted2" TO "and"', - 'ALTER TABLE mytable RENAME COLUMN "quoted3" TO "baz"', + 'ALTER TABLE mytable RENAME COLUMN quoted1 TO quoted', + 'ALTER TABLE mytable RENAME COLUMN quoted2 TO "and"', + 'ALTER TABLE mytable RENAME COLUMN quoted3 TO "baz"', ]; } diff --git a/tests/Platforms/PostgreSQLPlatformTest.php b/tests/Platforms/PostgreSQLPlatformTest.php index d9687f0182f..614eb45f8f7 100644 --- a/tests/Platforms/PostgreSQLPlatformTest.php +++ b/tests/Platforms/PostgreSQLPlatformTest.php @@ -361,7 +361,6 @@ public function getAlterTableColumnCommentsSQL(): array { return [ 'ALTER TABLE mytable ADD quota INT NOT NULL', - 'ALTER TABLE mytable RENAME COLUMN bar TO baz', "COMMENT ON COLUMN mytable.quota IS 'A comment'", 'COMMENT ON COLUMN mytable.foo IS NULL', "COMMENT ON COLUMN mytable.baz IS 'B comment'", @@ -784,9 +783,9 @@ protected function getQuotedAlterTableRenameColumnSQL(): array 'ALTER TABLE mytable RENAME COLUMN "create" TO reserved_keyword', 'ALTER TABLE mytable RENAME COLUMN "table" TO "from"', 'ALTER TABLE mytable RENAME COLUMN "select" TO "bar"', - 'ALTER TABLE mytable RENAME COLUMN "quoted1" TO quoted', - 'ALTER TABLE mytable RENAME COLUMN "quoted2" TO "and"', - 'ALTER TABLE mytable RENAME COLUMN "quoted3" TO "baz"', + 'ALTER TABLE mytable RENAME COLUMN quoted1 TO quoted', + 'ALTER TABLE mytable RENAME COLUMN quoted2 TO "and"', + 'ALTER TABLE mytable RENAME COLUMN quoted3 TO "baz"', ]; } diff --git a/tests/Platforms/SQLServerPlatformTest.php b/tests/Platforms/SQLServerPlatformTest.php index 230b6d55e64..2a38f0e7310 100644 --- a/tests/Platforms/SQLServerPlatformTest.php +++ b/tests/Platforms/SQLServerPlatformTest.php @@ -740,7 +740,6 @@ public function getCreateTableColumnCommentsSQL(): array public function getAlterTableColumnCommentsSQL(): array { return [ - "EXEC sp_rename 'mytable.bar', 'baz', 'COLUMN'", 'ALTER TABLE mytable ADD quota INT NOT NULL', "EXEC sp_addextendedproperty N'MS_Description', N'A comment', " . "N'SCHEMA', 'dbo', N'TABLE', 'mytable', N'COLUMN', quota", @@ -896,10 +895,8 @@ public function testGeneratesAlterTableSQLWithColumnComments(): void $tableDiff->addedColumns['added_comment_with_string_literal_char'] = new Column('added_comment_with_string_literal_char', Type::getType(Types::STRING), ['comment' => "''"]); - $tableDiff->changedColumns['comment_float_0'] = new ColumnDiff( - 'comment_float_0', - new Column('comment_double_0', Type::getType(Types::DECIMAL), ['comment' => 'Double for real!']), - ); + $tableDiff->renamedColumns['comment_float_0'] + = new Column('comment_double_0', Type::getType(Types::DECIMAL), ['comment' => 'Double for real!']); // Add comment to non-commented column. $tableDiff->changedColumns['id'] = new ColumnDiff( @@ -993,7 +990,7 @@ public function testGeneratesAlterTableSQLWithColumnComments(): void $tableDiff->changedColumns['comment_with_string_literal_char'] = new ColumnDiff( 'comment_with_string_literal_char', new Column('comment_with_string_literal_char', Type::getType(Types::STRING), ['comment' => "'"]), - ['comment', 'type'], + ['comment'], new Column('comment_with_string_literal_char', Type::getType(Types::ARRAY), ['comment' => "O'Reilly"]), ); @@ -1003,7 +1000,7 @@ public function testGeneratesAlterTableSQLWithColumnComments(): void self::assertEquals( [ // Renamed columns. - "EXEC sp_rename 'mytable.comment_float_0', 'comment_double_0', 'COLUMN'", + "sp_rename 'mytable.comment_float_0', 'comment_double_0', 'COLUMN'", // Added columns. 'ALTER TABLE mytable ADD added_comment_none INT NOT NULL', @@ -1025,7 +1022,7 @@ public function testGeneratesAlterTableSQLWithColumnComments(): void 'ALTER TABLE mytable ALTER COLUMN [comment_quoted] VARCHAR(MAX) NOT NULL', 'ALTER TABLE mytable ALTER COLUMN [create] VARCHAR(MAX) NOT NULL', 'ALTER TABLE mytable ALTER COLUMN commented_type INT NOT NULL', - 'ALTER TABLE mytable ALTER COLUMN comment_with_string_literal_char NVARCHAR(255) NOT NULL', + // Added columns. "EXEC sp_addextendedproperty N'MS_Description', N'0', " . "N'SCHEMA', 'dbo', N'TABLE', 'mytable', N'COLUMN', added_comment_integer_0", @@ -1242,15 +1239,15 @@ public function testChangeColumnsTypeWithDefaultValue(): void protected function getQuotedAlterTableRenameColumnSQL(): array { return [ - "EXEC sp_rename 'mytable.unquoted1', 'unquoted', 'COLUMN'", - "EXEC sp_rename 'mytable.unquoted2', '[where]', 'COLUMN'", - "EXEC sp_rename 'mytable.unquoted3', '[foo]', 'COLUMN'", - "EXEC sp_rename 'mytable.[create]', 'reserved_keyword', 'COLUMN'", - "EXEC sp_rename 'mytable.[table]', '[from]', 'COLUMN'", - "EXEC sp_rename 'mytable.[select]', '[bar]', 'COLUMN'", - "EXEC sp_rename 'mytable.[quoted1]', 'quoted', 'COLUMN'", - "EXEC sp_rename 'mytable.[quoted2]', '[and]', 'COLUMN'", - "EXEC sp_rename 'mytable.[quoted3]', '[baz]', 'COLUMN'", + "sp_rename 'mytable.unquoted1', 'unquoted', 'COLUMN'", + "sp_rename 'mytable.unquoted2', '[where]', 'COLUMN'", + "sp_rename 'mytable.unquoted3', '[foo]', 'COLUMN'", + "sp_rename 'mytable.[create]', 'reserved_keyword', 'COLUMN'", + "sp_rename 'mytable.[table]', '[from]', 'COLUMN'", + "sp_rename 'mytable.[select]', '[bar]', 'COLUMN'", + "sp_rename 'mytable.quoted1', 'quoted', 'COLUMN'", + "sp_rename 'mytable.quoted2', '[and]', 'COLUMN'", + "sp_rename 'mytable.quoted3', '[baz]', 'COLUMN'", ]; } @@ -1430,6 +1427,7 @@ public static function getGeneratesIdentifierNamesInAlterTableSQL(): iterable "CONSTRAINT DF_6B2BD609_4AD86123 DEFAULT 'foo'", 'ALTER TABLE mytable DROP COLUMN removecolumn', 'ALTER TABLE mytable DROP CONSTRAINT DF_6B2BD609_9BADD926', + 'ALTER TABLE mytable ALTER COLUMN mycolumn NVARCHAR(255) NOT NULL', "ALTER TABLE mytable ADD CONSTRAINT DF_6B2BD609_9BADD926 DEFAULT 'bar' FOR mycolumn", ], ], @@ -1453,6 +1451,7 @@ public static function getGeneratesIdentifierNamesInAlterTableSQL(): iterable "CONSTRAINT DF_6B2BD609_4AD86123 DEFAULT 'foo'", 'ALTER TABLE [mytable] DROP COLUMN [removecolumn]', 'ALTER TABLE [mytable] DROP CONSTRAINT DF_6B2BD609_9BADD926', + 'ALTER TABLE [mytable] ALTER COLUMN [mycolumn] NVARCHAR(255) NOT NULL', "ALTER TABLE [mytable] ADD CONSTRAINT DF_6B2BD609_9BADD926 DEFAULT 'bar' FOR [mycolumn]", ], ], @@ -1476,6 +1475,7 @@ public static function getGeneratesIdentifierNamesInAlterTableSQL(): iterable "CONSTRAINT DF_F6298F46_FD1A73E7 DEFAULT 'foo'", 'ALTER TABLE [table] DROP COLUMN [drop]', 'ALTER TABLE [table] DROP CONSTRAINT DF_F6298F46_4BF2EAC0', + 'ALTER TABLE [table] ALTER COLUMN [select] NVARCHAR(255) NOT NULL', "ALTER TABLE [table] ADD CONSTRAINT DF_F6298F46_4BF2EAC0 DEFAULT 'bar' FOR [select]", ], ], @@ -1499,6 +1499,7 @@ public static function getGeneratesIdentifierNamesInAlterTableSQL(): iterable "CONSTRAINT DF_F6298F46_FD1A73E7 DEFAULT 'foo'", 'ALTER TABLE [table] DROP COLUMN [drop]', 'ALTER TABLE [table] DROP CONSTRAINT DF_F6298F46_4BF2EAC0', + 'ALTER TABLE [table] ALTER COLUMN [select] NVARCHAR(255) NOT NULL', "ALTER TABLE [table] ADD CONSTRAINT DF_F6298F46_4BF2EAC0 DEFAULT 'bar' FOR [select]", ], ], @@ -1516,7 +1517,7 @@ public function testReturnsGuidTypeDeclarationSQL(): void public function getAlterTableRenameColumnSQL(): array { return [ - "EXEC sp_rename 'foo.bar', 'baz', 'COLUMN'", + "sp_rename 'foo.bar', 'baz', 'COLUMN'", 'ALTER TABLE foo DROP CONSTRAINT DF_8C736521_76FF8CAA', 'ALTER TABLE foo ADD CONSTRAINT DF_8C736521_78240498 DEFAULT 666 FOR baz', ]; diff --git a/tests/Platforms/SqlitePlatformTest.php b/tests/Platforms/SqlitePlatformTest.php index e6c7220af2e..94de2f0db73 100644 --- a/tests/Platforms/SqlitePlatformTest.php +++ b/tests/Platforms/SqlitePlatformTest.php @@ -6,7 +6,6 @@ use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Platforms\SqlitePlatform; use Doctrine\DBAL\Schema\Column; -use Doctrine\DBAL\Schema\ColumnDiff; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; use Doctrine\DBAL\TransactionIsolationLevel; @@ -334,8 +333,7 @@ public function testRenameNonExistingColumn(): void $tableDiff = new TableDiff('test'); $tableDiff->fromTable = $table; - $newCol = new Column('data', Type::getType(Types::STRING)); - $tableDiff->changedColumns['value'] = new ColumnDiff('value', $newCol); + $tableDiff->renamedColumns['value'] = new Column('data', Type::getType(Types::STRING)); $this->expectException(Exception::class); $this->platform->getAlterTableSQL($tableDiff); @@ -407,14 +405,8 @@ public function testAlterTable(): void $diff = new TableDiff('user'); $diff->fromTable = $table; $diff->newName = 'client'; - $diff->changedColumns['id'] = new ColumnDiff( - 'id', - new Column('key', Type::getType(Types::INTEGER), []), - ); - $diff->changedColumns['post'] = new ColumnDiff( - 'post', - new Column('comment', Type::getType(Types::INTEGER), []), - ); + $diff->renamedColumns['id'] = new Column('key', Type::getType(Types::INTEGER), []); + $diff->renamedColumns['post'] = new Column('comment', Type::getType(Types::INTEGER), []); $diff->removedColumns['parent'] = new Column('parent', Type::getType(Types::INTEGER), []); $diff->removedIndexes['index1'] = $table->getIndex('index1'); diff --git a/tests/Schema/AbstractComparatorTestCase.php b/tests/Schema/AbstractComparatorTestCase.php index 569b28a5419..a087202628f 100644 --- a/tests/Schema/AbstractComparatorTestCase.php +++ b/tests/Schema/AbstractComparatorTestCase.php @@ -261,12 +261,12 @@ public function testCompareChangeColumnsMultipleNewColumnsRename(): void $tableDiff = $this->comparator->diffTable($tableA, $tableB); self::assertNotFalse($tableDiff); - self::assertCount(1, $tableDiff->getRenamedColumns()); - self::assertArrayHasKey('datecolumn1', $tableDiff->getRenamedColumns()); - self::assertCount(1, $tableDiff->getAddedColumns()); + self::assertCount(1, $tableDiff->renamedColumns); + self::assertArrayHasKey('datecolumn1', $tableDiff->renamedColumns); + self::assertCount(1, $tableDiff->addedColumns); self::assertArrayHasKey('new_datecolumn2', $tableDiff->addedColumns); - self::assertCount(0, $tableDiff->getDroppedColumns()); - self::assertCount(0, $tableDiff->getModifiedColumns()); + self::assertCount(0, $tableDiff->removedColumns); + self::assertCount(0, $tableDiff->changedColumns); } public function testCompareRemovedIndex(): void @@ -714,10 +714,10 @@ public function testDetectRenameColumn(): void $tableDiff = $this->comparator->diffTable($tableA, $tableB); self::assertNotFalse($tableDiff); - self::assertCount(0, $tableDiff->getAddedColumns()); - self::assertCount(0, $tableDiff->getDroppedColumns()); - self::assertArrayHasKey('foo', $tableDiff->changedColumns); - self::assertEquals('bar', $tableDiff->changedColumns['foo']->getNewColumn()->getName()); + self::assertCount(0, $tableDiff->addedColumns); + self::assertCount(0, $tableDiff->removedColumns); + self::assertArrayHasKey('foo', $tableDiff->renamedColumns); + self::assertEquals('bar', $tableDiff->renamedColumns['foo']->getName()); } /** @@ -742,7 +742,7 @@ public function testDetectRenameColumnAmbiguous(): void self::assertCount(2, $tableDiff->removedColumns); self::assertArrayHasKey('foo', $tableDiff->removedColumns); self::assertArrayHasKey('bar', $tableDiff->removedColumns); - self::assertCount(0, $tableDiff->getRenamedColumns()); + self::assertCount(0, $tableDiff->renamedColumns); } public function testDetectRenameIndex(): void @@ -825,7 +825,7 @@ public function testDiff(): void $tableDiff = $this->comparator->diffTable($table, $newtable); self::assertInstanceOf(TableDiff::class, $tableDiff); - self::assertEquals(['twitterId', 'displayName'], array_keys($tableDiff->getRenamedColumns())); + self::assertEquals(['twitterId', 'displayName'], array_keys($tableDiff->renamedColumns)); self::assertEquals(['logged_in_at'], array_keys($tableDiff->addedColumns)); self::assertCount(0, $tableDiff->removedColumns); } diff --git a/tests/Schema/TableDiffTest.php b/tests/Schema/TableDiffTest.php index 6bdbff7f765..b3349b293b1 100644 --- a/tests/Schema/TableDiffTest.php +++ b/tests/Schema/TableDiffTest.php @@ -3,13 +3,9 @@ namespace Doctrine\DBAL\Tests\Schema; use Doctrine\DBAL\Platforms\AbstractPlatform; -use Doctrine\DBAL\Schema\Column; -use Doctrine\DBAL\Schema\ColumnDiff; use Doctrine\DBAL\Schema\Identifier; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; -use Doctrine\DBAL\Types\Type; -use Doctrine\DBAL\Types\Types; use Doctrine\Deprecations\PHPUnit\VerifyDeprecations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -33,65 +29,6 @@ public function testReturnsName(): void self::assertEquals(new Identifier('foo'), $tableDiff->getName($this->platform)); } - public function testRenamedColumnDeprecationLayer(): void - { - $this->expectDeprecationWithIdentifier('https://github.com/doctrine/dbal/pull/6080'); - - /** @psalm-suppress InvalidArgument */ - $diff = new TableDiff( - 'foo', - [], - [ - new ColumnDiff( - 'foo', - new Column('foo', Type::getType(Types::INTEGER)), - ['type'], - new Column('foo', Type::getType(Types::BIGINT)), - ), - new ColumnDiff( - 'ba', - new Column('ba', Type::getType(Types::INTEGER)), - ['type'], - new Column('ba', Type::getType(Types::BIGINT)), - ), - ], - [], - [], - [], - [], - new Table('foo'), - [], - [], - [], - [ - 'foo' => new Column('baz', Type::getType(Types::INTEGER)), - 'bar' => new Column('renamed', Type::getType(Types::INTEGER)), - ], - [], - ); - - self::assertCount(3, $diff->getChangedColumns()); - self::assertCount(2, $diff->getModifiedColumns()); - self::assertEquals('foo', $diff->getChangedColumns()[0]->getOldColumnName()->getName()); - self::assertEquals('baz', $diff->getChangedColumns()[0]->getNewColumn()->getName()); - self::assertTrue($diff->getChangedColumns()[0]->hasTypeChanged()); - self::assertEquals(Type::getType(Types::INTEGER), $diff->getChangedColumns()[0]->getNewColumn()->getType()); - self::assertEquals('bar', $diff->getChangedColumns()[2]->getOldColumnName()->getName()); - self::assertEquals('renamed', $diff->getChangedColumns()[2]->getNewColumn()->getName()); - - self::assertCount(2, $diff->renamedColumns); - - $diff->renamedColumns = ['old_name' => new Column('new_name', Type::getType(Types::INTEGER))]; - self::assertCount(4, $diff->getChangedColumns()); - self::assertCount(3, $diff->renamedColumns); - - // Test that __isset __set and __get have the default php behavior - @$diff->foo = 'baz'; - self::assertTrue(isset($diff->renamedColumns)); - self::assertTrue(isset($diff->foo)); - self::assertEquals('baz', $diff->foo); - } - public function testPrefersNameFromTableObject(): void { $tableMock = $this->getMockBuilder(Table::class) diff --git a/tests/Schema/TableTest.php b/tests/Schema/TableTest.php index f1594af0989..58b39afa9a3 100644 --- a/tests/Schema/TableTest.php +++ b/tests/Schema/TableTest.php @@ -12,7 +12,6 @@ use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Types\Type; use Doctrine\DBAL\Types\Types; -use LogicException; use PHPUnit\Framework\TestCase; use function array_shift; @@ -51,52 +50,6 @@ public function testColumns(): void self::assertCount(2, $table->getColumns()); } - public function testRenameColumn(): void - { - $typeStr = Type::getType(Types::STRING); - $typeTxt = Type::getType(Types::TEXT); - $columns = []; - $columns[] = new Column('foo', $typeStr); - $table = new Table('foo', $columns, [], []); - - self::assertFalse($table->hasColumn('bar')); - self::assertTrue($table->hasColumn('foo')); - - $column = $table->renameColumn('foo', 'bar'); - $column->setType($typeTxt); - self::assertTrue($table->hasColumn('bar'), 'Should now have bar column'); - self::assertFalse($table->hasColumn('foo'), 'Should not have foo column anymore'); - self::assertCount(1, $table->getColumns()); - - self::assertEquals(['bar' => 'foo'], $table->getRenamedColumns()); - $table->renameColumn('bar', 'baz'); - - self::assertTrue($table->hasColumn('baz'), 'Should now have baz column'); - self::assertFalse($table->hasColumn('bar'), 'Should not have bar column anymore'); - self::assertEquals(['baz' => 'foo'], $table->getRenamedColumns()); - self::assertCount(1, $table->getColumns()); - } - - public function testRenameColumnException(): void - { - $this->expectException(LogicException::class); - $this->expectExceptionMessage('Attempt to rename column "foo.baz" to the same name.'); - - $table = new Table('foo'); - $table->renameColumn('baz', '`BaZ`'); - } - - public function testRenameColumnLoop(): void - { - $table = new Table('foo'); - $table->addColumn('baz', Types::INTEGER); - $table->renameColumn('baz', '`foo`'); - self::assertCount(1, $table->getRenamedColumns()); - $table->renameColumn('foo', 'Baz'); - self::assertCount(1, $table->getColumns()); - self::assertCount(0, $table->getRenamedColumns()); - } - public function testColumnsCaseInsensitive(): void { $table = new Table('foo');