@@ -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