@@ -282,15 +282,14 @@ public function compile(StatementAggregator $statementAggregator, $dryRun)
282
282
$ statementsSql = [];
283
283
$ statement = null ;
284
284
285
- /**
286
- * @var Statement $statement
287
- */
288
- foreach ($ statementBank as $ statement ) {
289
- $ statementsSql [] = $ statement ->getStatement ();
290
- }
291
- $ adapter = $ this ->resourceConnection ->getConnection ($ statement ->getResource ());
292
-
293
285
if ($ dryRun ) {
286
+ /**
287
+ * @var Statement $statement
288
+ */
289
+ foreach ($ statementBank as $ statement ) {
290
+ $ statementsSql [] = $ statement ->getStatement ();
291
+ }
292
+
294
293
$ this ->dryRunLogger ->log (
295
294
sprintf (
296
295
$ this ->statementDirectives [$ statement ->getType ()],
@@ -299,7 +298,8 @@ public function compile(StatementAggregator $statementAggregator, $dryRun)
299
298
)
300
299
);
301
300
} else {
302
- $ this ->doQuery ($ adapter , $ statementsSql , $ statement );
301
+ $ this ->doQuery ($ statementBank );
302
+ $ statement = end ($ statementBank );
303
303
//Do post update, like SQL DML operations or etc...
304
304
foreach ($ statement ->getTriggers () as $ trigger ) {
305
305
call_user_func ($ trigger );
@@ -325,37 +325,32 @@ private function isNeedToSplitSql() : bool
325
325
/**
326
326
* Perform queries based on statements
327
327
*
328
- * @param AdapterInterface $adapter
329
- * @param array $statementsSql
330
- * @param Statement $statement
328
+ * @param Statement[] $statementBank
331
329
* @return void
332
330
* @throws ConnectionException
333
331
*/
334
332
private function doQuery (
335
- AdapterInterface $ adapter ,
336
- array $ statementsSql ,
337
- Statement $ statement
333
+ array $ statementBank
338
334
) : void {
335
+ $ statementsSql = [];
336
+ foreach ($ statementBank as $ statement ) {
337
+ $ statementsSql [] = $ statement ->getStatement ();
338
+ }
339
+ $ adapter = $ this ->resourceConnection ->getConnection ($ statement ->getResource ());
340
+
339
341
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 ' ])) {
350
345
$ adapter ->query (
351
346
sprintf (
352
347
$ this ->statementDirectives [$ statement ->getType ()],
353
348
$ adapter ->quoteIdentifier ($ statement ->getTableName ()),
354
- implode (", " , $ canBeCombinedStatements )
349
+ implode (", " , $ preparedStatements [ ' canBeCombinedStatements ' ] )
355
350
)
356
351
);
357
352
}
358
- foreach ($ separatedStatements as $ separatedStatement ) {
353
+ foreach ($ preparedStatements [ ' separatedStatements ' ] as $ separatedStatement ) {
359
354
$ adapter ->query (
360
355
sprintf (
361
356
$ this ->statementDirectives [$ statement ->getType ()],
@@ -397,4 +392,58 @@ private function getNextAutoIncrementValue(string $tableName, string $resource):
397
392
return 1 ;
398
393
}
399
394
}
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
+ }
400
449
}
0 commit comments