diff --git a/modules/simpletest/tests/upgrade/drupal-6.upload.database.php b/modules/simpletest/tests/upgrade/drupal-6.upload.database.php index c7f032e..46ebe2c 100644 --- a/modules/simpletest/tests/upgrade/drupal-6.upload.database.php +++ b/modules/simpletest/tests/upgrade/drupal-6.upload.database.php @@ -416,3 +416,34 @@ db_insert('upload')->fields(array( 'weight' => '0', )) ->execute(); + +// Add series of entries for invalid node vids to the {upload} table. +for ($i = 30; $i < 250; $i += 2) { + db_insert('upload')->fields(array( + 'fid', + 'nid', + 'vid', + 'description', + 'list', + 'weight', + )) + // Invalid fid, invalid vid. + ->values(array( + 'fid' => $i, + 'nid' => '40', + 'vid' => 24 + $i, + 'description' => 'crazy-basename.png', + 'list' => '1', + 'weight' => '0', + )) + // Valid fid, invalid vid. + ->values(array( + 'fid' => 2, + 'nid' => '40', + 'vid' => 24 + $i + 1, + 'description' => 'crazy-basename.png', + 'list' => '1', + 'weight' => '0', + )) + ->execute(); +} diff --git a/modules/system/system.install b/modules/system/system.install index df0db71..b70d64f 100644 --- a/modules/system/system.install +++ b/modules/system/system.install @@ -2729,6 +2729,26 @@ function system_update_7061(&$sandbox) { } if (!isset($sandbox['progress'])) { + // Delete stale rows from {upload} where the fid is not in the {files} table. + db_delete('upload') + ->notExists( + db_select('files', 'f') + ->fields('f', array('fid')) + ->where('f.fid = {upload}.fid') + ) + ->execute(); + + // Delete stale rows from {upload} where the vid is not in the + // {node_revision} table. The table has already been renamed in + // node_update_7001(). + db_delete('upload') + ->notExists( + db_select('node_revision', 'nr') + ->fields('nr', array('vid')) + ->where('nr.vid = {upload}.vid') + ) + ->execute(); + // Retrieve a list of node revisions that have uploaded files attached. // DISTINCT queries are expensive, especially when paged, so we store the // data in its own table for the duration of the update.