diff options
-rw-r--r-- | Bugzilla/DB.pm | 1 | ||||
-rw-r--r-- | Bugzilla/DB/Oracle.pm | 3 | ||||
-rw-r--r-- | Bugzilla/Search.pm | 6 |
3 files changed, 7 insertions, 3 deletions
diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 399f3c643..e264dc443 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 cddb23da1..9399bf225 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 6dc2703fc..ac0099ea5 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -802,8 +802,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); } } |