9
9
use Magento \Framework \App \ResourceConnection ;
10
10
use Magento \Framework \DB \Adapter \ConnectionException ;
11
11
use Magento \Framework \DB \Adapter \SqlVersionProvider ;
12
+ use Magento \Framework \DB \Adapter \AdapterInterface ;
12
13
use Magento \Framework \Setup \Declaration \Schema \Db \DbSchemaWriterInterface ;
13
14
use Magento \Framework \Setup \Declaration \Schema \Db \Statement ;
14
15
use Magento \Framework \Setup \Declaration \Schema \Db \StatementAggregator ;
@@ -298,25 +299,7 @@ public function compile(StatementAggregator $statementAggregator, $dryRun)
298
299
)
299
300
);
300
301
} 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 );
320
303
//Do post update, like SQL DML operations or etc...
321
304
foreach ($ statement ->getTriggers () as $ trigger ) {
322
305
call_user_func ($ trigger );
@@ -339,12 +322,66 @@ private function isNeedToSplitSql() : bool
339
322
return str_contains ($ this ->sqlVersionProvider ->getSqlVersion (), SqlVersionProvider::MARIA_DB_10_VERSION );
340
323
}
341
324
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
+
342
378
/**
343
379
* Retrieve next value for AUTO_INCREMENT column.
344
380
*
345
381
* @param string $tableName
346
382
* @param string $resource
347
383
* @return int
384
+ * @throws \Zend_Db_Statement_Exception
348
385
*/
349
386
private function getNextAutoIncrementValue (string $ tableName , string $ resource ): int
350
387
{
@@ -359,6 +396,5 @@ private function getNextAutoIncrementValue(string $tableName, string $resource):
359
396
} else {
360
397
return 1 ;
361
398
}
362
-
363
399
}
364
400
}
0 commit comments