From 2d2a6857de55d005dbc4836e558e611ce7f52bb8 Mon Sep 17 00:00:00 2001 From: acognet Date: Fri, 4 Jun 2021 09:10:28 +0200 Subject: [PATCH] =?UTF-8?q?N=C2=B03797=20-=20[MariaDB]=20crash=20while=20c?= =?UTF-8?q?onverting=20utf8mb4=20+=20add=20index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/metamodel.class.php | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 2dbeed108..1e93c7151 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -5366,7 +5366,7 @@ abstract class MetaModel $aSugFix[$sClass]['id'][] = "ALTER TABLE `$sTable` ADD $sKeyFieldDefinition"; if (!$bTableToCreate) { - $aAlterTableItems[$sTable][$sKeyField] = "ADD $sKeyFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sKeyField] = "ADD $sKeyFieldDefinition"; } } else @@ -5379,7 +5379,7 @@ abstract class MetaModel $aSugFix[$sClass]['id'][] = "ALTER TABLE `$sTable`, DROP PRIMARY KEY, ADD PRIMARY key(`$sKeyField`)"; if (!$bTableToCreate) { - $aAlterTableItems[$sTable][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; } } if (self::IsAutoIncrementKey($sClass) && !CMDBSource::IsAutoIncrement($sTable, $sKeyField)) @@ -5388,7 +5388,7 @@ abstract class MetaModel $aSugFix[$sClass]['id'][] = "ALTER TABLE `$sTable` CHANGE `$sKeyField` $sKeyFieldDefinition"; if (!$bTableToCreate) { - $aAlterTableItems[$sTable][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; } } } @@ -5451,7 +5451,7 @@ abstract class MetaModel } else { - $aAlterTableItems[$sTable][$sField] = "ADD $sFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sField] = "ADD $sFieldDefinition"; $aAdditionalRequests = self::GetAdditionalRequestAfterAlter($sClass, $sTable, $sField); if (!empty($aAdditionalRequests)) { @@ -5495,7 +5495,7 @@ abstract class MetaModel } else { - $aAlterTableItems[$sTable][] = "ADD $sIndexType `$sIndexName` ($sColumns)"; + $aAlterTableItems[$sTable]['index'][] = "ADD $sIndexType `$sIndexName` ($sColumns)"; } } @@ -5536,7 +5536,7 @@ abstract class MetaModel if (CMDBSource::HasIndex($sTable, $sField)) { $aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` DROP INDEX `$sIndexName`"; - $aAlterTableItems[$sTable][] = "DROP INDEX `$sIndexName`"; + $aAlterTableItems[$sTable]['index'][] = "DROP INDEX `$sIndexName`"; } $sSugFixAfterChange = "ALTER TABLE `$sTable` ADD $sIndexType `$sIndexName` ($sColumns)"; $sAlterTableItemsAfterChange = "ADD $sIndexType `$sIndexName` ($sColumns)"; @@ -5550,7 +5550,7 @@ abstract class MetaModel { $aErrors[$sClass][$sAttCode][] = "field '$sField' in table '$sTable' has a wrong type: found $sActualFieldSpec while expecting $sDBFieldSpec"; $aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` CHANGE `$sField` $sFieldDefinition"; - $aAlterTableItems[$sTable][$sField] = "CHANGE `$sField` $sFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sField] = "CHANGE `$sField` $sFieldDefinition"; } // Create indexes (external keys only... so far) @@ -5565,7 +5565,7 @@ abstract class MetaModel } else { - $aAlterTableItems[$sTable][] = $sAlterTableItemsAfterChange; + $aAlterTableItems[$sTable]['index'][] = $sAlterTableItemsAfterChange; } } } @@ -5625,9 +5625,12 @@ abstract class MetaModel { $aAlterTableItems[$sTable] = array(); } - array_unshift($aAlterTableItems[$sTable], "DROP INDEX `$sIndexId`"); + if (isset($aAlterTableItems[$sTable]['index'])) + { + array_unshift($aAlterTableItems[$sTable]['index'], "DROP INDEX `$sIndexId`"); + } } - $aAlterTableItems[$sTable][] = "ADD INDEX `$sIndexId` ($sColumns)"; + $aAlterTableItems[$sTable]['index'][] = "ADD INDEX `$sIndexId` ($sColumns)"; } } } @@ -5645,7 +5648,7 @@ abstract class MetaModel // without specifying the value of this unknown column $sFieldDefinition = "`$sField` ".CMDBSource::GetFieldType($sTable, $sField).' NULL'; $aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` CHANGE `$sField` $sFieldDefinition"; - $aAlterTableItems[$sTable][$sField] = "CHANGE `$sField` $sFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sField] = "CHANGE `$sField` $sFieldDefinition"; } $aSugFix[$sClass][$sAttCode][] = "-- Recommended action: ALTER TABLE `$sTable` DROP `$sField`"; } @@ -5664,7 +5667,10 @@ abstract class MetaModel { $aAlterTableItems[$sTable] = array(); } - array_unshift($aAlterTableItems[$sTable], "DROP INDEX `$sIndexId`"); + if (isset($aAlterTableItems[$sTable]['index'])) + { + array_unshift($aAlterTableItems[$sTable]['index'], "DROP INDEX `$sIndexId`"); + } } } @@ -5696,8 +5702,16 @@ abstract class MetaModel } foreach ($aAlterTableItems as $sTable => $aChangeList) { - $sChangeList = implode(', ', $aChangeList); - $aCondensedQueries[] = "ALTER TABLE `$sTable` $sChangeList"; + if (isset($aAlterTableItems[$sTable]['field'])) + { + $sChangeList = implode(', ', $aChangeList['field']); + $aCondensedQueries[] = "ALTER TABLE `$sTable` $sChangeList"; + } + if (isset($aAlterTableItems[$sTable]['index'])) + { + $sChangeList = implode(', ', $aChangeList['index']); + $aCondensedQueries[] = "ALTER TABLE `$sTable` $sChangeList"; + } // Add request right after the ALTER TABLE if (isset($aPostTableAlteration[$sTable])) {