summaryrefslogtreecommitdiffstats
path: root/Bugzilla
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla')
-rw-r--r--Bugzilla/DB/Mysql.pm18
1 files changed, 16 insertions, 2 deletions
diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm
index fdb475078..43646d8de 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);