From 18d0e31a946e8e3d29eac2acda177d6c0af8a433 Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Thu, 7 Aug 2008 04:43:54 +0000 Subject: Bug 446645: Properly escape and understand hyphenated words in fulltext searches when using MySQL Patch By Jesse Clark r=mkanat, a=mkanat --- Bugzilla/DB/Mysql.pm | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'Bugzilla/DB') 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); -- cgit v1.2.3-24-g4f1b