summaryrefslogtreecommitdiffstats
path: root/Bugzilla
diff options
context:
space:
mode:
authorMax Kanat-Alexander <mkanat@bugzilla.org>2010-07-07 02:13:46 +0200
committerMax Kanat-Alexander <mkanat@bugzilla.org>2010-07-07 02:13:46 +0200
commit333b8fcbaad05e5e3ab01a897529560dea37dd53 (patch)
tree7082f8e981412dcf053c8d9554f56785ea7327d8 /Bugzilla
parent569c6b69a7cb3c458279efbdfed1b104cd3d9ae5 (diff)
downloadbugzilla-333b8fcbaad05e5e3ab01a897529560dea37dd53.tar.gz
bugzilla-333b8fcbaad05e5e3ab01a897529560dea37dd53.tar.xz
Bug 552919: Sort group_concat results so that they sort correctly for buglists
r=mkanat, a=mkanat (module owner)
Diffstat (limited to 'Bugzilla')
-rw-r--r--Bugzilla/DB/Mysql.pm13
-rw-r--r--Bugzilla/DB/Oracle.pm2
-rw-r--r--Bugzilla/DB/Pg.pm25
-rw-r--r--Bugzilla/Install/DB.pm4
-rw-r--r--Bugzilla/Search.pm9
5 files changed, 37 insertions, 16 deletions
diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm
index 4b90a2a34..7f3eb2ef8 100644
--- a/Bugzilla/DB/Mysql.pm
+++ b/Bugzilla/DB/Mysql.pm
@@ -126,12 +126,15 @@ sub bz_last_key {
}
sub sql_group_concat {
- my ($self, $column, $separator) = @_;
- my $sep_sql;
- if ($separator) {
- $sep_sql = " SEPARATOR $separator";
+ my ($self, $column, $separator, $sort) = @_;
+ $separator = $self->quote(', ') if !defined $separator;
+ $sort = 1 if !defined $sort;
+ if ($sort) {
+ my $sort_order = $column;
+ $sort_order =~ s/^DISTINCT\s+//i;
+ $column = "$column ORDER BY $sort_order";
}
- return "GROUP_CONCAT($column$sep_sql)";
+ return "GROUP_CONCAT($column SEPARATOR $separator)";
}
sub sql_regexp {
diff --git a/Bugzilla/DB/Oracle.pm b/Bugzilla/DB/Oracle.pm
index a671a0e68..0819bd19a 100644
--- a/Bugzilla/DB/Oracle.pm
+++ b/Bugzilla/DB/Oracle.pm
@@ -119,7 +119,7 @@ sub bz_explain {
sub sql_group_concat {
my ($self, $text, $separator) = @_;
- $separator ||= "','";
+ $separator = $self->quote(', ') if !defined $separator;
return "group_concat(T_CLOB_DELIM($text, $separator))";
}
diff --git a/Bugzilla/DB/Pg.pm b/Bugzilla/DB/Pg.pm
index c85c1d710..018900129 100644
--- a/Bugzilla/DB/Pg.pm
+++ b/Bugzilla/DB/Pg.pm
@@ -98,9 +98,14 @@ sub bz_last_key {
}
sub sql_group_concat {
- my ($self, $text, $separator) = @_;
- $separator ||= "','";
- return "array_to_string(array_accum($text), $separator)";
+ my ($self, $text, $separator, $sort) = @_;
+ $sort = 1 if !defined $sort;
+ $separator = $self->quote(', ') if !defined $separator;
+ my $sql = "array_accum($text)";
+ if ($sort) {
+ $sql = "array_sort($sql)";
+ }
+ return "array_to_string($sql, $separator)";
}
sub sql_istring {
@@ -224,6 +229,20 @@ sub bz_setup_database {
)");
}
+ $self->do(<<'END');
+CREATE OR REPLACE FUNCTION array_sort(ANYARRAY)
+RETURNS ANYARRAY LANGUAGE SQL
+IMMUTABLE STRICT
+AS $$
+SELECT ARRAY(
+ SELECT $1[s.i] AS each_item
+ FROM
+ generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
+ ORDER BY each_item
+);
+$$;
+END
+
# PostgreSQL doesn't like having *any* index on the thetext
# field, because it can't have index data longer than 2770
# characters on that field.
diff --git a/Bugzilla/Install/DB.pm b/Bugzilla/Install/DB.pm
index ada500c58..d9a36b75b 100644
--- a/Bugzilla/Install/DB.pm
+++ b/Bugzilla/Install/DB.pm
@@ -3198,8 +3198,8 @@ sub _populate_bugs_fulltext {
q{INSERT INTO bugs_fulltext (bug_id, short_desc, comments,
comments_noprivate)
SELECT bugs.bug_id, bugs.short_desc, }
- . $dbh->sql_group_concat('longdescs.thetext', $newline)
- . ', ' . $dbh->sql_group_concat('nopriv.thetext', $newline) .
+ . $dbh->sql_group_concat('longdescs.thetext', $newline, 0)
+ . ', ' . $dbh->sql_group_concat('nopriv.thetext', $newline, 0) .
qq{ FROM bugs
LEFT JOIN longdescs
ON bugs.bug_id = longdescs.bug_id
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm
index 61f5e995e..ad8ab0edb 100644
--- a/Bugzilla/Search.pm
+++ b/Bugzilla/Search.pm
@@ -308,10 +308,10 @@ sub COLUMNS {
. " * ($actual_time / ($actual_time + bugs.remaining_time))"
. " END)",
- 'flagtypes.name' => $dbh->sql_group_concat('DISTINCT '
- . $dbh->sql_string_concat('flagtypes.name', 'flags.status'), "', '"),
+ 'flagtypes.name' => $dbh->sql_group_concat('DISTINCT '
+ . $dbh->sql_string_concat('flagtypes.name', 'flags.status')),
- 'keywords' => $dbh->sql_group_concat('DISTINCT keyworddefs.name', "', '"),
+ 'keywords' => $dbh->sql_group_concat('DISTINCT keyworddefs.name'),
);
# Backward-compatibility for old field names. Goes new_name => old_name.
@@ -354,8 +354,7 @@ sub COLUMNS {
}
elsif ($field->type == FIELD_TYPE_MULTI_SELECT) {
$sql = $dbh->sql_group_concat(
- 'DISTINCT map_bug_' . $field->name . '.value',
- $dbh->quote(', '));
+ 'DISTINCT map_bug_' . $field->name . '.value');
}
else {
$sql = 'bugs.' . $field->name;