From: lpsolit%gmail.com <> Date: Fri, 17 Oct 2008 18:36:01 +0000 (+0000) Subject: Bug 455857: [Oracle] 'Find a Specific Bug' doesn't work - Patch by Xiaoou r/a=mkanat --- diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 12a19d2905..d68c5dc4b9 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -52,6 +52,7 @@ use Storable qw(dclone); use constant BLOB_TYPE => DBI::SQL_BLOB; use constant ISOLATION_LEVEL => 'REPEATABLE READ'; +use constant GROUPBY_REGEXP => '(?:.*\s+AS\s+)?(\w+(\.\w+)?)(?:\s+(ASC|DESC))?$'; # Set default values for what used to be the enum types. These values # are no longer stored in localconfig. If we are upgrading from a diff --git a/Bugzilla/DB/Oracle.pm b/Bugzilla/DB/Oracle.pm index b785b08d7d..b5fd48b289 100644 --- a/Bugzilla/DB/Oracle.pm +++ b/Bugzilla/DB/Oracle.pm @@ -52,6 +52,7 @@ use base qw(Bugzilla::DB); use constant EMPTY_STRING => '__BZ_EMPTY_STR__'; use constant ISOLATION_LEVEL => 'READ COMMITTED'; use constant BLOB_TYPE => { ora_type => ORA_BLOB }; +use constant GROUPBY_REGEXP => '((CASE\s+WHEN.+END)|(TO_CHAR\(.+\))|(\(SCORE.+\))|(\(MATCH.+\))|(\w+(\.\w+)?))(\s+AS\s+)?(.*)?$'; sub new { my ($class, $user, $pass, $host, $dbname, $port) = @_; @@ -80,7 +81,7 @@ sub new { $self->do("ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR'") if Bugzilla->params->{'utf8'}; # To allow case insensitive query. - $self->do("ALTER SESSION SET NLS_COMP='LINGUISTIC'"); + $self->do("ALTER SESSION SET NLS_COMP='ANSI'"); $self->do("ALTER SESSION SET NLS_SORT='BINARY_AI'"); return $self; } diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 83c8e91a30..fb4ab05738 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -801,8 +801,10 @@ sub init { $field =~ /^(relevance|actual_time|percentage_complete)/); # The structure of fields is of the form: # [foo AS] {bar | bar.baz} [ASC | DESC] - # Only the mandatory part bar OR bar.baz is of interest - if ($field =~ /(?:.*\s+AS\s+)?(\w+(\.\w+)?)(?:\s+(ASC|DESC))?$/i) { + # Only the mandatory part bar OR bar.baz is of interest. + # But for Oracle, it needs the real name part instead. + my $regexp = $dbh->GROUPBY_REGEXP; + if ($field =~ /$regexp/i) { push(@groupby, $1) if !grep($_ eq $1, @groupby); } }