Batch per-table column alters and normalize schema diff comparisons
This commit is contained in:
parent
fc6b878bb3
commit
259a2cdb0a
|
|
@ -829,6 +829,7 @@ class Setup extends BaseController
|
|||
private function buildAlterSqlForTableFromSchema(array $masterTableDef, $client, string $table): array
|
||||
{
|
||||
$sql = [];
|
||||
$columnAlterClauses = [];
|
||||
|
||||
$masterCols = is_array($masterTableDef['columns'] ?? null) ? $masterTableDef['columns'] : [];
|
||||
$clientCols = $this->readColumns($client, $table);
|
||||
|
|
@ -837,17 +838,21 @@ class Setup extends BaseController
|
|||
foreach ($masterCols as $colName => $masterCol) {
|
||||
if (!isset($clientCols[$colName])) {
|
||||
$position = $prevCol === '' ? ' FIRST' : (' AFTER `' . $prevCol . '`');
|
||||
$sql[] = 'ALTER TABLE `' . $table . '` ADD COLUMN ' . $this->columnDefinition($masterCol) . $position . ';';
|
||||
$columnAlterClauses[] = 'ADD COLUMN ' . $this->columnDefinition($masterCol) . $position;
|
||||
$prevCol = $colName;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($this->columnSignature($masterCol) !== $this->columnSignature($clientCols[$colName])) {
|
||||
$sql[] = 'ALTER TABLE `' . $table . '` MODIFY COLUMN ' . $this->columnDefinition($masterCol) . ';';
|
||||
$columnAlterClauses[] = 'MODIFY COLUMN ' . $this->columnDefinition($masterCol);
|
||||
}
|
||||
$prevCol = $colName;
|
||||
}
|
||||
|
||||
if (!empty($columnAlterClauses)) {
|
||||
$sql[] = 'ALTER TABLE `' . $table . '` ' . implode(', ', $columnAlterClauses) . ';';
|
||||
}
|
||||
|
||||
$masterIdx = is_array($masterTableDef['indexes'] ?? null) ? $masterTableDef['indexes'] : [];
|
||||
$clientIdx = $this->readIndexes($client, $table);
|
||||
|
||||
|
|
@ -1114,13 +1119,7 @@ class Setup extends BaseController
|
|||
if ($default === null) {
|
||||
$defaultNormalized = '__NULL__';
|
||||
} else {
|
||||
$defaultStr = trim((string) $default);
|
||||
$upper = strtoupper($defaultStr);
|
||||
if ($upper === 'CURRENT_TIMESTAMP' || str_starts_with($upper, 'CURRENT_TIMESTAMP(')) {
|
||||
$defaultNormalized = $upper;
|
||||
} else {
|
||||
$defaultNormalized = $defaultStr;
|
||||
}
|
||||
$defaultNormalized = $this->normalizeColumnDefaultForCompare((string) $default);
|
||||
}
|
||||
|
||||
return json_encode([
|
||||
|
|
@ -1147,6 +1146,23 @@ class Setup extends BaseController
|
|||
return trim($type);
|
||||
}
|
||||
|
||||
private function normalizeColumnDefaultForCompare(string $default): string
|
||||
{
|
||||
$defaultStr = trim($default);
|
||||
if ($defaultStr === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$upper = strtoupper($defaultStr);
|
||||
|
||||
// Treat CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(), and CURRENT_TIMESTAMP(0) as equivalent.
|
||||
if (preg_match('/^CURRENT_TIMESTAMP\s*(?:\(\s*0?\s*\))?$/i', $upper) === 1) {
|
||||
return 'CURRENT_TIMESTAMP';
|
||||
}
|
||||
|
||||
return $defaultStr;
|
||||
}
|
||||
|
||||
private function ensureCreateTableIfNotExists(string $sql): string
|
||||
{
|
||||
$sql = trim($sql);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user