dev/core#2305 Fix schema differences in MariaDB 10.2.x+
authorJohn Kingsnorth <john@johnkingsnorth.co.uk>
Mon, 18 Jan 2021 11:16:27 +0000 (11:16 +0000)
committerJohn Kingsnorth <john@johnkingsnorth.co.uk>
Mon, 18 Jan 2021 23:50:34 +0000 (23:50 +0000)
CRM/Logging/Schema.php

index 6a75405d4c9d163833fed6e74b78dcb42727be21..0329a8851a1dac126ae4516ddcae0dc763be8308 100644 (file)
@@ -704,11 +704,13 @@ WHERE  table_schema IN ('{$this->db}', '{$civiDB}')";
     $logTableSpecs = $this->columnSpecsOf($logTable);
 
     $diff = ['ADD' => [], 'MODIFY' => [], 'OBSOLETE' => []];
-    // columns to be added
+
+    // Columns to be added
     $diff['ADD'] = array_diff(array_keys($civiTableSpecs), array_keys($logTableSpecs));
-    // columns to be modified
-    // NOTE: we consider only those columns for modifications where there is a spec change, and that the column definition
-    // wasn't deliberately modified by fixTimeStampAndNotNullSQL() method.
+
+    // Columns to be modified
+    // Only pick columns where there is a spec change and the column definition was not deliberately modified by
+    // fixTimeStampAndNotNullSQL() method, also accounting for differences in db version.
     foreach ($civiTableSpecs as $col => $colSpecs) {
       if (!isset($logTableSpecs[$col]) || !is_array($logTableSpecs[$col])) {
         $logTableSpecs[$col] = [];
@@ -736,8 +738,10 @@ WHERE  table_schema IN ('{$this->db}', '{$civiDB}')";
             // if is-null property is different, and log table's column is NOT-NULL, surely consider the column
             $diff['MODIFY'][] = $col;
           }
-          elseif ($civiTableSpecs[$col]['COLUMN_DEFAULT'] != CRM_Utils_Array::value('COLUMN_DEFAULT', $logTableSpecs[$col]) &&
-            !strstr($civiTableSpecs[$col]['COLUMN_DEFAULT'], 'TIMESTAMP')
+          elseif (
+            $civiTableSpecs[$col]['COLUMN_DEFAULT'] != ($logTableSpecs[$col]['COLUMN_DEFAULT'] ?? NULL)
+            && !stristr($civiTableSpecs[$col]['COLUMN_DEFAULT'], 'timestamp')
+            && !($civiTableSpecs[$col]['COLUMN_DEFAULT'] === NULL && ($logTableSpecs[$col]['COLUMN_DEFAULT'] ?? NULL) === 'NULL')
           ) {
             // if default property is different, and its not about a timestamp column, consider it
             $diff['MODIFY'][] = $col;