Skip to content

Commit e965156

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

File tree

1 file changed

+56
-20
lines changed

1 file changed

+56
-20
lines changed

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

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Magento\Framework\App\ResourceConnection;
1010
use Magento\Framework\DB\Adapter\ConnectionException;
1111
use Magento\Framework\DB\Adapter\SqlVersionProvider;
12+
use Magento\Framework\DB\Adapter\AdapterInterface;
1213
use Magento\Framework\Setup\Declaration\Schema\Db\DbSchemaWriterInterface;
1314
use Magento\Framework\Setup\Declaration\Schema\Db\Statement;
1415
use Magento\Framework\Setup\Declaration\Schema\Db\StatementAggregator;
@@ -298,25 +299,7 @@ public function compile(StatementAggregator $statementAggregator, $dryRun)
298299
)
299300
);
300301
} else {
301-
if ($this->isNeedToSplitSql()) {
302-
foreach ($statementsSql as $statementSql) {
303-
$adapter->query(
304-
sprintf(
305-
$this->statementDirectives[$statement->getType()],
306-
$adapter->quoteIdentifier($statement->getTableName()),
307-
$statementSql
308-
)
309-
);
310-
}
311-
} else {
312-
$adapter->query(
313-
sprintf(
314-
$this->statementDirectives[$statement->getType()],
315-
$adapter->quoteIdentifier($statement->getTableName()),
316-
implode(", ", $statementsSql)
317-
)
318-
);
319-
}
302+
$this->doQuery($adapter, $statementsSql, $statement);
320303
//Do post update, like SQL DML operations or etc...
321304
foreach ($statement->getTriggers() as $trigger) {
322305
call_user_func($trigger);
@@ -339,12 +322,66 @@ private function isNeedToSplitSql() : bool
339322
return str_contains($this->sqlVersionProvider->getSqlVersion(), SqlVersionProvider::MARIA_DB_10_VERSION);
340323
}
341324

325+
/**
326+
* Perform queries based on statements
327+
*
328+
* @param AdapterInterface $adapter
329+
* @param array $statementsSql
330+
* @param Statement $statement
331+
* @return void
332+
* @throws ConnectionException
333+
*/
334+
private function doQuery(
335+
AdapterInterface $adapter,
336+
array $statementsSql,
337+
Statement $statement
338+
) : void {
339+
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)) {
350+
$adapter->query(
351+
sprintf(
352+
$this->statementDirectives[$statement->getType()],
353+
$adapter->quoteIdentifier($statement->getTableName()),
354+
implode(", ", $canBeCombinedStatements)
355+
)
356+
);
357+
}
358+
foreach ($separatedStatements as $separatedStatement) {
359+
$adapter->query(
360+
sprintf(
361+
$this->statementDirectives[$statement->getType()],
362+
$adapter->quoteIdentifier($statement->getTableName()),
363+
$separatedStatement
364+
)
365+
);
366+
}
367+
} else {
368+
$adapter->query(
369+
sprintf(
370+
$this->statementDirectives[$statement->getType()],
371+
$adapter->quoteIdentifier($statement->getTableName()),
372+
implode(", ", $statementsSql)
373+
)
374+
);
375+
}
376+
}
377+
342378
/**
343379
* Retrieve next value for AUTO_INCREMENT column.
344380
*
345381
* @param string $tableName
346382
* @param string $resource
347383
* @return int
384+
* @throws \Zend_Db_Statement_Exception
348385
*/
349386
private function getNextAutoIncrementValue(string $tableName, string $resource): int
350387
{
@@ -359,6 +396,5 @@ private function getNextAutoIncrementValue(string $tableName, string $resource):
359396
} else {
360397
return 1;
361398
}
362-
363399
}
364400
}

0 commit comments

Comments
 (0)