Fix parent link detection.

From: Damien Tournoud <damien@tournoud.net>


---
 menu.inc                          |   10 ++++++----
 simpletest/tests/menu.test        |   12 ++++++++++++
 simpletest/tests/menu_test.module |   14 ++++++++++++++
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git includes/menu.inc includes/menu.inc
index ddcb805..0bfac31 100644
--- includes/menu.inc
+++ includes/menu.inc
@@ -2062,16 +2062,18 @@ function menu_link_save(&$item) {
       // If not derived from a router item, we respect the specified menu name.
       $query->condition('menu_name', $item['menu_name']);
     }
+    $query->fields('menu_links');
+
     // Find the parent - it must be unique.
     $parent_path = $item['link_path'];
     do {
       $parent = FALSE;
       $parent_path = substr($parent_path, 0, strrpos($parent_path, '/'));
-      $query->condition('link_path', $parent_path);
-      $query_cnt = $query;
+      $new_query = clone $query;
+      $new_query->condition('link_path', $parent_path);
       // Only valid if we get a unique result.
-      if ($query_cnt->countQuery()->execute()->fetchField() == 1) {
-        $parent = $query->fields('menu_links')->execute()->fetchAssoc();
+      if ($new_query->countQuery()->execute()->fetchField() == 1) {
+        $parent = $new_query->execute()->fetchAssoc();
       }
     } while ($parent === FALSE && $parent_path);
   }
diff --git modules/simpletest/tests/menu.test modules/simpletest/tests/menu.test
index bd6a71f..74284e2 100644
--- modules/simpletest/tests/menu.test
+++ modules/simpletest/tests/menu.test
@@ -47,6 +47,18 @@ class MenuIncTestCase extends DrupalWebTestCase {
     $name = db_result(db_query($sql));
     $this->assertEqual($name, 'changed', t('Menu name was successfully changed after rebuild.'));
   }
+
+  /**
+   * Tests for menu hiearchy.
+   */
+  function testMenuHiearchy() {
+    $parent_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => 'menu-test/hierarchy/parent'))->fetchAssoc();
+    $child_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => 'menu-test/hierarchy/parent/child'))->fetchAssoc();
+    $unattached_child_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => 'menu-test/hierarchy/parent/child2/child'))->fetchAssoc();
+
+    $this->assertEqual($child_link['plid'], $parent_link['mlid'], t('The parent of a directly attached child is correct.'));
+    $this->assertEqual($unattached_child_link['plid'], $parent_link['mlid'], t('The parent of a non-directly attached child is correct.'));
+  }
 }
 
 /**
diff --git modules/simpletest/tests/menu_test.module modules/simpletest/tests/menu_test.module
index c067fb7..f044dfd 100644
--- modules/simpletest/tests/menu_test.module
+++ modules/simpletest/tests/menu_test.module
@@ -24,6 +24,20 @@ function menu_test_menu() {
     'page callback' => 'menu_test_callback',
     'access arguments' => array('access content'),
   );
+
+  // Hierarchical tests.
+  $items['menu-test/hierarchy/parent'] = array(
+    'title' => 'Parent menu router',
+    'page callback' => 'node_page_default',
+  );
+  $items['menu-test/hierarchy/parent/child'] = array(
+    'title' => 'Child menu router',
+    'page callback' => 'node_page_default',
+  );
+  $items['menu-test/hierarchy/parent/child2/child'] = array(
+    'title' => 'Unattached subchild router',
+    'page callback' => 'node_page_default',
+  );
   return $items;
 }
 
