Skip to content

Commit 1a6e553

Browse files
committed
ACP2E-3230: Modifying column length via db_schema.xml doesn't work in case of foreign keys
1 parent e965156 commit 1a6e553

File tree

1 file changed

+76
-27
lines changed

1 file changed

+76
-27
lines changed

lib/internal/Magento/Framework/Setup/Declaration/Schema/Db/MySQL/DbSchemaWriter.php

Lines changed: 76 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -282,15 +282,14 @@ public function compile(StatementAggregator $statementAggregator, $dryRun)
282282
$statementsSql = [];
283283
$statement = null;
284284

285-
/**
286-
* @var Statement $statement
287-
*/
288-
foreach ($statementBank as $statement) {
289-
$statementsSql[] = $statement->getStatement();
290-
}
291-
$adapter = $this->resourceConnection->getConnection($statement->getResource());
292-
293285
if ($dryRun) {
286+
/**
287+
* @var Statement $statement
288+
*/
289+
foreach ($statementBank as $statement) {
290+
$statementsSql[] = $statement->getStatement();
291+
}
292+
294293
$this->dryRunLogger->log(
295294
sprintf(
296295
$this->statementDirectives[$statement->getType()],
@@ -299,7 +298,8 @@ public function compile(StatementAggregator $statementAggregator, $dryRun)
299298
)
300299
);
301300
} else {
302-
$this->doQuery($adapter, $statementsSql, $statement);
301+
$this->doQuery($statementBank);
302+
$statement = end($statementBank);
303303
//Do post update, like SQL DML operations or etc...
304304
foreach ($statement->getTriggers() as $trigger) {
305305
call_user_func($trigger);
@@ -325,37 +325,32 @@ private function isNeedToSplitSql() : bool
325325
/**
326326
* Perform queries based on statements
327327
*
328-
* @param AdapterInterface $adapter
329-
* @param array $statementsSql
330-
* @param Statement $statement
328+
* @param Statement[] $statementBank
331329
* @return void
332330
* @throws ConnectionException
333331
*/
334332
private function doQuery(
335-
AdapterInterface $adapter,
336-
array $statementsSql,
337-
Statement $statement
333+
array $statementBank
338334
) : void {
335+
$statementsSql = [];
336+
foreach ($statementBank as $statement) {
337+
$statementsSql[] = $statement->getStatement();
338+
}
339+
$adapter = $this->resourceConnection->getConnection($statement->getResource());
340+
339341
if ($this->isNeedToSplitSql()) {
340-
$canBeCombinedStatements = [];
341-
$separatedStatements = [];
342-
foreach ($statementsSql as $statementSql) {
343-
if (str_contains($statementSql, 'FOREIGN KEY')) {
344-
$separatedStatements[] = $statementSql;
345-
} else {
346-
$canBeCombinedStatements[] = $statementSql;
347-
}
348-
}
349-
if (!empty($canBeCombinedStatements)) {
342+
$preparedStatements = $this->getPreparedStatements($statementBank);
343+
344+
if (!empty($preparedStatements['canBeCombinedStatements'])) {
350345
$adapter->query(
351346
sprintf(
352347
$this->statementDirectives[$statement->getType()],
353348
$adapter->quoteIdentifier($statement->getTableName()),
354-
implode(", ", $canBeCombinedStatements)
349+
implode(", ", $preparedStatements['canBeCombinedStatements'])
355350
)
356351
);
357352
}
358-
foreach ($separatedStatements as $separatedStatement) {
353+
foreach ($preparedStatements['separatedStatements'] as $separatedStatement) {
359354
$adapter->query(
360355
sprintf(
361356
$this->statementDirectives[$statement->getType()],
@@ -397,4 +392,58 @@ private function getNextAutoIncrementValue(string $tableName, string $resource):
397392
return 1;
398393
}
399394
}
395+
396+
/**
397+
* Prepare list of modified columns from statement
398+
*
399+
* @param array $statementBank
400+
* @return array
401+
*/
402+
private function getModifiedColumns(array $statementBank) : array
403+
{
404+
$columns = [];
405+
foreach ($statementBank as $statement) {
406+
if ($statement->getType() === 'alter'
407+
&& str_contains($statement->getStatement(), 'MODIFY COLUMN')) {
408+
$columns[] = $statement->getName();
409+
}
410+
}
411+
return $columns;
412+
}
413+
414+
/**
415+
* Separate statements that can't be executed as one statement
416+
*
417+
* @param array $statementBank
418+
* @return array
419+
*/
420+
private function getPreparedStatements(array $statementBank) : array
421+
{
422+
$statementsSql = [];
423+
foreach ($statementBank as $statement) {
424+
$statementsSql[] = $statement->getStatement();
425+
}
426+
$result = ['separatedStatements' => [], 'canBeCombinedStatements' => []];
427+
$modifiedColumns = $this->getModifiedColumns($statementBank);
428+
429+
foreach ($statementsSql as $statementSql) {
430+
if (str_contains($statementSql, 'FOREIGN KEY')) {
431+
$isThisColumnModified = false;
432+
foreach ($modifiedColumns as $modifiedColumn) {
433+
if (str_contains($statementSql, '`' . $modifiedColumn . '`')) {
434+
$isThisColumnModified = true;
435+
break;
436+
}
437+
}
438+
if ($isThisColumnModified) {
439+
$result['separatedStatements'][] = $statementSql;
440+
} else {
441+
$result['canBeCombinedStatements'][] = $statementSql;
442+
}
443+
} else {
444+
$result['canBeCombinedStatements'][] = $statementSql;
445+
}
446+
}
447+
return $result;
448+
}
400449
}

0 commit comments

Comments
 (0)