Commit 0a566f92 authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 327344: Create sql_iposition and use it in Search.pm to fix the fact that…

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 <mkanat@bugzilla.org> r=LpSolit, a=mkanat
parent ba0b55ce
...@@ -313,6 +313,13 @@ sub sql_istring { ...@@ -313,6 +313,13 @@ sub sql_istring {
return "LOWER($string)"; 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 { sub sql_position {
my ($self, $fragment, $text) = @_; my ($self, $fragment, $text) = @_;
...@@ -1699,10 +1706,13 @@ Formatted SQL for interval function (scalar) ...@@ -1699,10 +1706,13 @@ Formatted SQL for interval function (scalar)
=item B<Description> =item B<Description>
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 (fragment) withing a string (text). Note: if the substring or
text are string constants, they must be properly quoted (e.g. "'pattern'"). 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</sql_iposition>.
=item B<Params> =item B<Params>
=over =over
...@@ -1719,6 +1729,10 @@ Formatted SQL for substring search (scalar) ...@@ -1719,6 +1729,10 @@ Formatted SQL for substring search (scalar)
=back =back
=item C<sql_iposition>
Just like L</sql_position>, but case-insensitive.
=item C<sql_group_by> =item C<sql_group_by>
=over =over
......
...@@ -183,13 +183,14 @@ sub sql_interval { ...@@ -183,13 +183,14 @@ sub sql_interval {
return "INTERVAL $interval $units"; return "INTERVAL $interval $units";
} }
sub sql_position { sub sql_iposition {
my ($self, $fragment, $text) = @_; my ($self, $fragment, $text) = @_;
return "INSTR($text, $fragment)";
}
# mysql 4.0.1 and lower do not support CAST sub sql_position {
# (checksetup has a check for unsupported versions) my ($self, $fragment, $text) = @_;
my $server_version = $self->bz_server_version;
return "INSTR(CAST($text AS BINARY), CAST($fragment AS BINARY))"; return "INSTR(CAST($text AS BINARY), CAST($fragment AS BINARY))";
} }
......
...@@ -912,8 +912,7 @@ sub GetByWordListSubstr { ...@@ -912,8 +912,7 @@ sub GetByWordListSubstr {
if ($word ne "") { if ($word ne "") {
$sql_word = $dbh->quote($word); $sql_word = $dbh->quote($word);
trick_taint($sql_word); trick_taint($sql_word);
push(@list, $dbh->sql_position(lc($sql_word), push(@list, $dbh->sql_iposition($sql_word, $field) . " > 0");
"LOWER($field)") . " > 0");
} }
} }
...@@ -1919,7 +1918,7 @@ sub _substring { ...@@ -1919,7 +1918,7 @@ sub _substring {
my ($ff, $q, $term) = @func_args{qw(ff q term)}; my ($ff, $q, $term) = @func_args{qw(ff q term)};
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
$$term = $dbh->sql_position(lc($$q), "LOWER($$ff)") . " > 0"; $$term = $dbh->sql_iposition($$q, $$ff) . " > 0";
} }
sub _notsubstring { sub _notsubstring {
...@@ -1928,7 +1927,7 @@ sub _notsubstring { ...@@ -1928,7 +1927,7 @@ sub _notsubstring {
my ($ff, $q, $term) = @func_args{qw(ff q term)}; my ($ff, $q, $term) = @func_args{qw(ff q term)};
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
$$term = $dbh->sql_position(lc($$q), "LOWER($$ff)") . " = 0"; $$term = $dbh->sql_iposition($$q, $$ff) . " = 0";
} }
sub _regexp { sub _regexp {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment