From: mkanat%bugzilla.org <> Date: Mon, 30 Jun 2008 02:24:08 +0000 (+0000) Subject: Bug 327344: Create sql_iposition and use it in Search.pm to fix the fact that se X-Git-Tag: bugzilla-3.2rc1~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1bf7e46c29de0d40274e66b422a2e71bdcaf1bc;p=thirdparty%2Fbugzilla.git Bug 327344: Create sql_iposition and use it in Search.pm to fix the fact that se arching for Turkish characters didn't do case-insensitivity properly. Patch By Max Kanat-Alexander r=LpSolit, a=mkanat --- diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 1617b7fc27..12a19d2905 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -313,6 +313,13 @@ sub sql_istring { return "LOWER($string)"; } +sub sql_iposition { + my ($self, $fragment, $text) = @_; + $fragment = $self->sql_istring($fragment); + $text = $self->sql_istring($text); + return $self->sql_position($fragment, $text); +} + sub sql_position { my ($self, $fragment, $text) = @_; @@ -1684,10 +1691,13 @@ Formatted SQL for interval function (scalar) =item B -Outputs proper SQL syntax determinig position of a substring +Outputs proper SQL syntax determining position of a substring (fragment) withing a string (text). Note: if the substring or text are string constants, they must be properly quoted (e.g. "'pattern'"). +It searches for the string in a case-sensitive manner. If you want to do +a case-insensitive search, use L. + =item B =over @@ -1704,6 +1714,10 @@ Formatted SQL for substring search (scalar) =back +=item C + +Just like L, but case-insensitive. + =item C =over diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index 8bca06f4c8..3e9d6f997f 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -179,13 +179,14 @@ sub sql_interval { return "INTERVAL $interval $units"; } -sub sql_position { +sub sql_iposition { my ($self, $fragment, $text) = @_; + return "INSTR($text, $fragment)"; +} - # mysql 4.0.1 and lower do not support CAST - # (checksetup has a check for unsupported versions) +sub sql_position { + my ($self, $fragment, $text) = @_; - my $server_version = $self->bz_server_version; return "INSTR(CAST($text AS BINARY), CAST($fragment AS BINARY))"; } diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index d74f09474f..272b411529 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -912,8 +912,7 @@ sub GetByWordListSubstr { if ($word ne "") { $sql_word = $dbh->quote($word); trick_taint($sql_word); - push(@list, $dbh->sql_position(lc($sql_word), - "LOWER($field)") . " > 0"); + push(@list, $dbh->sql_iposition($sql_word, $field) . " > 0"); } } @@ -1919,7 +1918,7 @@ sub _substring { my ($ff, $q, $term) = @func_args{qw(ff q term)}; my $dbh = Bugzilla->dbh; - $$term = $dbh->sql_position(lc($$q), "LOWER($$ff)") . " > 0"; + $$term = $dbh->sql_iposition($$q, $$ff) . " > 0"; } sub _notsubstring { @@ -1928,7 +1927,7 @@ sub _notsubstring { my ($ff, $q, $term) = @func_args{qw(ff q term)}; my $dbh = Bugzilla->dbh; - $$term = $dbh->sql_position(lc($$q), "LOWER($$ff)") . " = 0"; + $$term = $dbh->sql_iposition($$q, $$ff) . " = 0"; } sub _regexp {