99use Magento \Framework \App \ResourceConnection ;
1010use Magento \Framework \DB \Adapter \ConnectionException ;
1111use Magento \Framework \DB \Adapter \SqlVersionProvider ;
12+ use Magento \Framework \DB \Adapter \AdapterInterface ;
1213use Magento \Framework \Setup \Declaration \Schema \Db \DbSchemaWriterInterface ;
1314use Magento \Framework \Setup \Declaration \Schema \Db \Statement ;
1415use 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