diff --git a/CRM/Logging/Schema.php b/CRM/Logging/Schema.php index ea6da26505b8..647edcfbf49c 100644 --- a/CRM/Logging/Schema.php +++ b/CRM/Logging/Schema.php @@ -446,6 +446,17 @@ public function fixSchemaDifferencesFor($table, $cols = []) { $cols = $this->columnsWithDiffSpecs($table, "log_$table"); } + // If a column that already exists on logging table is being added, we + // should treat it as a modification. + $this->resetSchemaCacheForTable("log_$table"); + $logTableSchema = $this->columnSpecsOf("log_$table"); + foreach ($cols['ADD'] as $colKey => $col) { + if (array_key_exists($col, $logTableSchema)) { + $cols['MODIFY'][] = $col; + unset($cols['ADD'][$colKey]); + } + } + // use the relevant lines from CREATE TABLE to add colums to the log table $create = $this->_getCreateQuery($table); foreach ((['ADD', 'MODIFY']) as $alterType) { @@ -467,9 +478,21 @@ public function fixSchemaDifferencesFor($table, $cols = []) { } } + $this->resetSchemaCacheForTable("log_$table"); + return TRUE; } + /** + * Resets schema cache for the given table. + * + * @param string $table + * Name of the table. + */ + private function resetSchemaCacheForTable($table) { + unset(\Civi::$statics[__CLASS__]['columnSpecs'][$table]); + } + /** * Get query table. *