Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.470
diff -u -p -r1.470 taxonomy.module
--- modules/taxonomy/taxonomy.module	18 Apr 2009 06:32:24 -0000	1.470
+++ modules/taxonomy/taxonomy.module	20 Apr 2009 14:46:15 -0000
@@ -1088,13 +1088,7 @@ function taxonomy_term_count_nodes($tid,
  *   An array of matching term objects.
  */
 function taxonomy_get_term_by_name($name) {
-  $query = db_select('taxonomy_term_data', 't');
-  $query->addTag('term_access');
-
-  return $query
-    ->fields('t')
-    ->where("LOWER(t.name) = LOWER(:name)", array(':name' => trim($name)))
-    ->execute()->fetchAll();
+  return taxonomy_term_load_multiple(array(), array('name' => trim($name)));
 }
 
 /**
@@ -1297,9 +1291,14 @@ function taxonomy_term_load_multiple($ti
 
   // Remove any loaded terms from the array if they don't match $conditions.
   if ($conditions) {
+    // Name matching is case insensitive, note that with some collations 
+    // LOWER() and drupal_strtolower() may return different results.
     foreach ($terms as $term) {
       $term_values = (array) $term;
-      if (array_diff_assoc($conditions, $term_values)) {
+      if (isset($conditions['name']) && drupal_strtolower($conditions['name'] != drupal_strtolower($term_values['name']))) {
+        unset($terms[$term->tid]);
+      }
+      elseif (array_diff_assoc($conditions, $term_values)) {
         unset($terms[$term->tid]);
       }
     }
@@ -1319,6 +1318,11 @@ function taxonomy_term_load_multiple($ti
 
     // If the conditions array is populated, add those to the query.
     if ($conditions) {
+      // When name is passed as a condition use LIKE.
+      if (isset($conditions['name'])) {
+        $query->condition('t.name', $conditions['name'], 'LIKE');
+        unset($conditions['name']);
+      }
       foreach ($conditions as $field => $value) {
         $query->condition('t.' . $field, $value);
       }
@@ -1367,22 +1371,6 @@ function taxonomy_term_load($tid) {
   return $term ? $term[$tid] : FALSE;
 }
 
-/**
- * Return a term object from the taxonomy_term_data table.
- * @param $tid
- *   A term's ID
- * @return Object
- *  A term object. Results are statically cached.
- */
-function taxonomy_get_term_data($tid) {
-   $terms = &drupal_static(__FUNCTION__, array());
-
-  if (!isset($terms[$tid])) {
-    $terms[$tid] = db_query('SELECT * FROM {taxonomy_term_data} WHERE tid = :tid', array(':tid' => $tid))->fetch();
-  }
-  return $terms[$tid];
-}
-
 function _taxonomy_term_select($title, $value, $vocabulary_id, $description, $multiple, $blank, $exclude = array()) {
   $tree = taxonomy_get_tree($vocabulary_id);
   $options = array();
@@ -1453,10 +1441,10 @@ function taxonomy_select_nodes($tids = a
   if ($depth === 'all') {
     $depth = NULL;
   }
-  foreach ($tids as $index => $tid) {
-    $term = taxonomy_get_term_data($tid);
-    $tree = taxonomy_get_tree($term->vid, $tid, $depth);
-    $descendant_tids[] = array_merge(array($tid), array_map('_taxonomy_get_tid_from_term', $tree));
+  $terms = taxonomy_term_load_multiple($tids);
+  foreach ($terms as $term) {
+    $tree = taxonomy_get_tree($term->vid, $term->tid, $depth);
+    $descendant_tids[] = array_merge(array($term->tid), array_map('_taxonomy_get_tid_from_term', $tree));
   }
 
   $query = db_select('node', 'n');
Index: modules/taxonomy/taxonomy.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.test,v
retrieving revision 1.30
diff -u -p -r1.30 taxonomy.test
--- modules/taxonomy/taxonomy.test	13 Apr 2009 18:52:38 -0000	1.30
+++ modules/taxonomy/taxonomy.test	20 Apr 2009 14:46:15 -0000
@@ -525,7 +525,7 @@ class TaxonomyTermTestCase extends Taxon
     // Create the term to edit.
     $this->drupalPost('admin/content/taxonomy/' . $this->vocabulary->vid . '/add', $edit, t('Save'));
 
-    $term = taxonomy_get_term_by_name($edit['name']);
+    $term = reset(taxonomy_get_term_by_name($edit['name']));
     $this->assertNotNull($term, t('Term found in database'));
 
     // Submitting a term takes us to the add page; we need the List page.
@@ -546,21 +546,52 @@ class TaxonomyTermTestCase extends Taxon
     );
 
     // Edit the term.
-    $this->drupalPost('taxonomy/term/' . $term[0]->tid . '/edit', $edit, t('Save'));
+    $this->drupalPost('taxonomy/term/' . $term->tid . '/edit', $edit, t('Save'));
 
     // View the term and check that it is correct.
-    $this->drupalGet('taxonomy/term/' . $term[0]->tid);
+    $this->drupalGet('taxonomy/term/' . $term->tid);
     $this->assertText($edit['name'], t('The randomly generated term name is present.'));
     $this->assertText($edit['description'], t('The randomly generated term description is present.'));
 
     // Delete the term.
-    $this->drupalPost('taxonomy/term/' . $term[0]->tid . '/edit', array(), t('Delete'));
+    $this->drupalPost('taxonomy/term/' . $term->tid . '/edit', array(), t('Delete'));
     $this->drupalPost(NULL, NULL, t('Delete'));
 
     // Assert that the term no longer exists.
-    $this->drupalGet('taxonomy/term/' . $term[0]->tid);
+    $this->drupalGet('taxonomy/term/' . $term->tid);
     $this->assertResponse(404, t('The taxonomy term page was not found'));
   }
+
+  /**
+   * Test taxonomy_get_term_by_name().
+   */
+  function testTaxonomyGetTermByName() {
+    $term = $this->createTerm($this->vocabulary->vid);
+
+    // Load the term with the exact name.
+    $terms = taxonomy_get_term_by_name($term->name);
+    $this->assertTrue(isset($terms[$term->tid]), t('Term loaded using exact name.'));
+
+    // Load the term with space concatenated.
+    $terms  = taxonomy_get_term_by_name('  ' . $term->name . '   ');
+    $this->assertTrue(isset($terms[$term->tid]), t('Term loaded with extra whitespace.'));
+
+    // Load the term with name uppercased.
+    $terms = taxonomy_get_term_by_name(strtoupper($term->name));
+    $this->assertTrue(isset($terms[$term->tid]), t('Term loaded with uppercased name.'));
+
+    // Load the term with name lowercased.
+    $terms = taxonomy_get_term_by_name(strtolower($term->name));
+    $this->assertTrue(isset($terms[$term->tid]), t('Term loaded with lowercased name.'));
+
+    // Try to load an invalid term name.
+    $terms = taxonomy_get_term_by_name('Banana');
+    $this->assertFalse($terms);
+
+    // Try to load the term using a substring of the name.
+    $terms = taxonomy_get_term_by_name(drupal_substr($term->name, 2));
+    $this->assertFalse($terms);
+  }
 }
 
 /**
@@ -664,8 +695,7 @@ class TaxonomyHooksTestCase extends Drup
       'antonyms' => 'Long',
     );
     $this->drupalPost('admin/content/taxonomy/1/add', $edit, t('Save'));
-    $terms = taxonomy_get_term_by_name($edit['name']);
-    $term = taxonomy_term_load($terms[0]->tid);
+    $term = reset(taxonomy_get_term_by_name($edit['name']));
     $this->assertEqual($term->antonyms[0], $edit['antonyms'], t('Antonyms were loaded into the term object'));
 
     // Update the term with a different antonym.
