diff --git a/search_api_db.test b/search_api_db.test index f169a4e..87a9c5a 100644 --- a/search_api_db.test +++ b/search_api_db.test @@ -932,6 +932,7 @@ class SearchApiDbTest extends DrupalWebTestCase { $this->drupalGet('search_api_test/insert'); $this->insertItem(array( 'id' => 6, + 'body' => 'คุณพูดภาษาอังกฤษหรือเปล่า', 'prices' => '3.5,3.25,3.75,3.5', )); @@ -946,6 +947,20 @@ class SearchApiDbTest extends DrupalWebTestCase { $this->assertEqual($results['result count'], 1, 'Filter on decimal field returned correct number of results.'); $this->assertEqual(array_keys($results['results']), array(6), 'Filter on decimal field returned correct result.'); $this->assertEqual($results['warnings'], array(), 'No warnings were displayed.'); + + // Regression test for #2616804. + // The word has 25 Unicode characters but 75 bytes. Verify that it was still + // indexed correctly. + $query = $this->buildSearch('คุณพูดภาษาอังกฤษหรือเปล่า'); + $results = $query->execute(); + $this->assertEqual($results['result count'], 1, 'Search for word with 25 multi-byte characters returned correct number of results.'); + $this->assertEqual(array_keys($results['results']), array(6), 'Search for word with 25 multi-byte characters returned correct result.'); + $this->assertEqual($results['warnings'], array(), 'No warnings were displayed.'); + + $query = $this->buildSearch('คุณพูดภาษาอังกฤษหรือเปล่าษ'); + $results = $query->execute(); + $this->assertEqual($results['result count'], 0, 'Search for unknown word with 26 multi-byte characters returned no results.'); + $this->assertEqual($results['warnings'], array(), 'No warnings were displayed.'); } /** diff --git a/service.inc b/service.inc index d305448..65d10a8 100644 --- a/service.inc +++ b/service.inc @@ -1080,8 +1080,8 @@ class SearchApiDbService extends SearchApiAbstractService { if ($original_type == 'date') { return date('c', $value); } - if (strlen($value) > 255) { - $value = self::mbStrcut($value, 0, 255); + if (drupal_strlen($value) > 255) { + $value = drupal_substr($value, 0, 255); watchdog('search_api_db', 'An overlong value (more than 255 characters) was encountered while indexing: %value.
' . 'Database search servers currently cannot index such values correctly – the value was therefore trimmed to the allowed length.', array('%value' => $value), WATCHDOG_WARNING);