From 0a566f92417aa741828413b00585f48f72b5c639 Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Mon, 30 Jun 2008 02:23:10 +0000 Subject: Bug 327344: Create sql_iposition and use it in Search.pm to fix the fact that searching for Turkish characters didn't do case-insensitivity properly. Patch By Max Kanat-Alexander r=LpSolit, a=mkanat --- Bugzilla/DB.pm | 16 +++++++++++++++- Bugzilla/DB/Mysql.pm | 9 +++++---- Bugzilla/Search.pm | 7 +++---- 3 files changed, 23 insertions(+), 9 deletions(-) (limited to 'Bugzilla') diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 9d4f41546..07b2c5fe9 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) = @_; @@ -1699,10 +1706,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 @@ -1719,6 +1729,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 80f1cd793..8a64d3646 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -183,13 +183,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 d74f09474..272b41152 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 { -- cgit v1.2.3-24-g4f1b