]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 578494: We can't use "shellwords" to split words for sql_fulltext on Pg,
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 2 Aug 2010 01:17:21 +0000 (18:17 -0700)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 2 Aug 2010 01:17:21 +0000 (18:17 -0700)
because it doesn't work with unbalanced single quotes. So we just do a hack
to make Quicksearch work right, for Pg.
r=LpSolit, a=mkanat

Bugzilla/DB.pm

index b04de792bc8feae542dddfb89913e76ab94797f6..d899866efee8f6f01f7553282c1ed7bb014e1bdd 100644 (file)
@@ -45,7 +45,6 @@ use Bugzilla::DB::Schema;
 
 use List::Util qw(max);
 use Storable qw(dclone);
-use Text::ParseWords qw(shellwords);
 
 #####################################################################
 # Constants
@@ -363,16 +362,28 @@ sub sql_fulltext_search {
     # make the string lowercase to do case insensitive search
     my $lower_text = lc($text);
 
-    # split the text we're searching for into separate words, understanding
-    # quotes.
-    my @words = shellwords($lower_text);
+    # split the text we're searching for into separate words. As a hack
+    # to allow quicksearch to work, if the field starts and ends with
+    # a double-quote, then we don't split it into words. We can't use
+    # Text::ParseWords here because it gets very confused by unbalanced
+    # quotes, which breaks searches like "don't try this" (because of the
+    # unbalanced single-quote in "don't").
+    my @words;
+    if ($lower_text =~ /^"/ and $lower_text =~ /"$/) {
+        $lower_text =~ s/^"//;
+        $lower_text =~ s/"$//;
+        @words = ($lower_text);
+    }
+    else {
+        @words = split(/\s+/, $lower_text);
+    }
 
     # surround the words with wildcards and SQL quotes so we can use them
     # in LIKE search clauses
-    @words = map($self->quote("%$_%"), @words);
+    @words = map($self->quote("\%$_\%"), @words);
 
     # untaint words, since they are safe to use now that we've quoted them
-    map(trick_taint($_), @words);
+    trick_taint($_) foreach @words;
 
     # turn the words into a set of LIKE search clauses
     @words = map("LOWER($column) LIKE $_", @words);