diff --git modules/node/node.module modules/node/node.module
index 93bbd97..4bbbb31 100644
--- modules/node/node.module
+++ modules/node/node.module
@@ -946,36 +946,42 @@ function node_save($node) {
     module_invoke_all('node_presave', $node);
     global $user;
 
+    // Determine if we are inserting a new node.
     if (!isset($node->is_new)) {
       $node->is_new = empty($node->nid);
     }
 
-    // Apply filters to some default node fields:
-    if ($node->is_new) {
-      // Insert a new node.
-      $node->is_new = TRUE;
-
-      // When inserting a node, $node->log must be set because
-      // {node_revision}.log does not (and cannot) have a default
-      // value. If the user does not have permission to create
-      // revisions, however, the form will not contain an element for
-      // log so $node->log will be unset at this point.
+    if ($node->is_new || !empty($node->revision)) {
+      // When inserting a node revision, $node->log must be set because
+      // {node_revision}.log cannot have a default value because it is a text
+      // column. However, $node->log may not be set at this point, such as if the
+      // user submitting a node form does not have permission to create revisions.
       if (!isset($node->log)) {
         $node->log = '';
       }
     }
-    elseif (!empty($node->revision)) {
+    elseif (empty($node->log)) {
+      // When updating, avoid clobbering an existing log entry with an empty one.
+      unset($node->log);
+    }
+    // $node->teaser and $node->body are also text columns and have no default,
+    // but are not allowed to be NULL.
+    // @todo: make these columns nullable since node types are not required to
+    // use them.
+    if (!isset($node->teaser)) {
+      $node->teaser = '';
+    }
+    if (!isset($node->body)) {
+      $node->body = '';
+    }
+  
+    // Save the old revision ID for use by node hook implementations.
+    if (!$node->is_new && !empty($node->revision) && $node->vid) {
       $node->old_vid = $node->vid;
       unset($node->vid);
     }
-    else {
-      // When updating a node, avoid clobbering an existing log entry with an empty one.
-      if (empty($node->log)) {
-        unset($node->log);
-      }
-    }
 
-    // Set some required fields:
+    // Set the timestamp fields.
     if (empty($node->created)) {
       $node->created = REQUEST_TIME;
     }
diff --git modules/node/node.test modules/node/node.test
index 8413375..3a53596 100644
--- modules/node/node.test
+++ modules/node/node.test
@@ -79,6 +79,7 @@ class NodeLoadMultipleUnitTest extends DrupalWebTestCase {
     $this->assertTrue($count == 1, t('@count node loaded', array('@count' => $count)));
     $this->assertEqual($nodes[$node3->nid]->title[FIELD_LANGUAGE_NONE][0]['value'], $node3->title[FIELD_LANGUAGE_NONE][0]['value'], t('Node successfully loaded.'));
   }
+
 }
 
 class NodeRevisionsTestCase extends DrupalWebTestCase {
@@ -88,7 +89,7 @@ class NodeRevisionsTestCase extends DrupalWebTestCase {
   public static function getInfo() {
     return array(
       'name' => 'Node revisions',
-      'description' => 'Create a node with revisions and test viewing, reverting, and deleting revisions.',
+      'description' => 'Create a node with revisions and test viewing, saving, reverting, and deleting revisions.',
       'group' => 'Node',
     );
   }
@@ -164,6 +165,34 @@ class NodeRevisionsTestCase extends DrupalWebTestCase {
                               '@type' => 'Page', '%title' => $nodes[1]->title[FIELD_LANGUAGE_NONE][0]['value'])), t('Revision deleted.'));
     $this->assertTrue(db_query('SELECT COUNT(vid) FROM {node_revision} WHERE nid = :nid and vid = :vid', array(':nid' => $node->nid, ':vid' => $nodes[1]->vid))->fetchField() == 0, t('Revision not found.'));
   }
+
+  /**
+   * Regression test for #261258.
+   *
+   * Checks that it is possible to create a revision without all fields being set.
+   */
+  function testPartialNodeRevision() {
+    $log = $this->randomName(10);
+    $node = $this->drupalCreateNode(array('log' => $log));
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title[FIELD_LANGUAGE_NONE][0]['value'], 'Found old title');
+
+    $new_title = $this->randomName(10) . 'testPartialNodeRevision';
+    $updated_node = (object) array(
+      'nid' => $node->nid,
+      'vid' => $node->vid,
+      'uid' => $node->uid,
+      'type' => $node->type,
+      'title' => array(FIELD_LANGUAGE_NONE => array(array('value' => $new_title))),
+      'revision' => 1
+    );
+    node_save($updated_node);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($new_title, 'Found new revision title');
+    $node_revision = node_load($node->nid, NULL, TRUE);
+    $this->assertTrue(empty($node_revision->body), 'Node body empty after revision with no body');
+    $this->assertTrue(empty($node_revision->log), 'Node log empty after revision with no log');
+  }
 }
 
 class PageEditTestCase extends DrupalWebTestCase {
