From: mkanat%bugzilla.org <> Date: Thu, 7 Aug 2008 04:43:54 +0000 (+0000) Subject: Bug 446645: Properly escape and understand hyphenated words in fulltext searches... X-Git-Tag: bugzilla-3.3.1~245 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=18d0e31a946e8e3d29eac2acda177d6c0af8a433;p=thirdparty%2Fbugzilla.git Bug 446645: Properly escape and understand hyphenated words in fulltext searches when using MySQL Patch By Jesse Clark r=mkanat, a=mkanat --- diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index fdb4750787..43646d8de0 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -49,6 +49,7 @@ use Bugzilla::Error; use Bugzilla::DB::Schema::Mysql; use List::Util qw(max); +use Text::ParseWords; # This module extends the DB interface via inheritance use base qw(Bugzilla::DB); @@ -141,8 +142,21 @@ sub sql_fulltext_search { my ($self, $column, $text) = @_; # Add the boolean mode modifier if the search string contains - # boolean operators. - my $mode = ($text =~ /[+-<>()~*"]/ ? "IN BOOLEAN MODE" : ""); + # boolean operators at the start or end of a word. + my $mode = ''; + if ($text =~ /(?:^|\W)[+\-<>~"()]/ || $text =~ /[()"*](?:$|\W)/) { + $mode = 'IN BOOLEAN MODE'; + + # quote un-quoted compound words + my @words = quotewords('[\s()]+', 'delimiter', $text); + foreach my $word (@words) { + # match words that have word chars, non-word chars, and no quotes + if ($word =~ /\w/ && $word =~ m/\W/ && $word !~ m/"/) { + $word = '"' . $word . '"'; + } + } + $text = join('', @words); + } # quote the text for use in the MATCH AGAINST expression $text = $self->quote($text);