Commit a52f0b41 authored by gerv%gerv.net's avatar gerv%gerv.net

Bug 155584 - Opening duplicates.cgi with no frequent bugs causes SQL syntax…

Bug 155584 - Opening duplicates.cgi with no frequent bugs causes SQL syntax error. Patch by gerv; r=bbaetz.
parent df194854
...@@ -135,48 +135,50 @@ if (!tie(%before, 'AnyDBM_File', "data/duplicates/dupes$whenever", ...@@ -135,48 +135,50 @@ if (!tie(%before, 'AnyDBM_File', "data/duplicates/dupes$whenever",
$dobefore = 1; $dobefore = 1;
} }
# Don't add CLOSED, and don't add VERIFIED unless they are INVALID or
# WONTFIX. We want to see VERIFIED INVALID and WONTFIX because common
# "bugs" which aren't bugs end up in this state.
my $query = "
SELECT bugs.bug_id, component, bug_severity, op_sys, target_milestone,
short_desc, bug_status, resolution
FROM bugs
WHERE (bug_status != 'CLOSED')
AND ((bug_status = 'VERIFIED' AND resolution IN ('INVALID', 'WONTFIX'))
OR (bug_status != 'VERIFIED'))
AND bugs.bug_id IN (" . join(", ", keys %count) . ")";
# Limit to a single product if requested
$query .= (" AND product = " . SqlQuote($product)) if $product;
SendSQL(SelectVisible($query,
$userid,
$usergroupset));
my @bugs; my @bugs;
my @bug_ids; my @bug_ids;
while (MoreSQLData()) { if (scalar(%count)) {
# Note: maximum row count is dealt with in the template. # Don't add CLOSED, and don't add VERIFIED unless they are INVALID or
# WONTFIX. We want to see VERIFIED INVALID and WONTFIX because common
my ($id, $component, $bug_severity, $op_sys, $target_milestone, # "bugs" which aren't bugs end up in this state.
$short_desc, $bug_status, $resolution) = FetchSQLData(); my $query = "
SELECT bugs.bug_id, component, bug_severity, op_sys, target_milestone,
# Limit to open bugs only if requested short_desc, bug_status, resolution
next if $openonly && ($resolution ne ""); FROM bugs
WHERE (bug_status != 'CLOSED')
push (@bugs, { id => $id, AND ((bug_status = 'VERIFIED' AND resolution IN ('INVALID', 'WONTFIX'))
count => $count{$id}, OR (bug_status != 'VERIFIED'))
delta => $delta{$id}, AND bugs.bug_id IN (" . join(", ", keys %count) . ")";
component => $component,
bug_severity => $bug_severity, # Limit to a single product if requested
op_sys => $op_sys, $query .= (" AND product = " . SqlQuote($product)) if $product;
target_milestone => $target_milestone,
short_desc => $short_desc, SendSQL(SelectVisible($query,
bug_status => $bug_status, $userid,
resolution => $resolution }); $usergroupset));
push (@bug_ids, $id);
while (MoreSQLData()) {
# Note: maximum row count is dealt with in the template.
my ($id, $component, $bug_severity, $op_sys, $target_milestone,
$short_desc, $bug_status, $resolution) = FetchSQLData();
# Limit to open bugs only if requested
next if $openonly && ($resolution ne "");
push (@bugs, { id => $id,
count => $count{$id},
delta => $delta{$id},
component => $component,
bug_severity => $bug_severity,
op_sys => $op_sys,
target_milestone => $target_milestone,
short_desc => $short_desc,
bug_status => $bug_status,
resolution => $resolution });
push (@bug_ids, $id);
}
} }
$vars->{'bugs'} = \@bugs; $vars->{'bugs'} = \@bugs;
......
...@@ -44,100 +44,104 @@ ...@@ -44,100 +44,104 @@
[%# *** Column Headers *** %] [%# *** Column Headers *** %]
<table border> [% IF bug_ids.size > 0 %]
<tr bgcolor="#CCCCCC"> <table border>
[% FOREACH column = [ { name => "id", description => "Bug #" }, <tr bgcolor="#CCCCCC">
{ name => "count", description => "Dupe<br>Count" }, [% FOREACH column = [ { name => "id", description => "Bug #" },
{ name => "delta", { name => "count", description => "Dupe<br>Count" },
description => "Change in last<br>$changedsince day(s)" }, { name => "delta",
{ name => "component", description => "Component" }, description => "Change in last<br>$changedsince day(s)" },
{ name => "bug_severity", description => "Severity" }, { name => "component", description => "Component" },
{ name => "op_sys", description => "Op Sys" }, { name => "bug_severity", description => "Severity" },
{ name => "target_milestone", { name => "op_sys", description => "Op Sys" },
description => "Target<br>Milestone" }, { name => "target_milestone",
{ name => "short_desc", description => "Summary" } ] description => "Target<br>Milestone" },
%] { name => "short_desc", description => "Summary" } ]
%]
[%# Small hack to keep delta column out if we don't need it %]
[% NEXT IF column.name == "delta" AND NOT dobefore %]
<td> [%# Small hack to keep delta column out if we don't need it %]
<center> [% NEXT IF column.name == "delta" AND NOT dobefore %]
<b>
[% bug_ids_string = bug_ids.join(',') %]
<a href="duplicates.cgi?sortby=[% column.name %]
[% IF sortby == column.name %]
[% "&reverse=1" IF NOT reverse %]
[% ELSE %]
[%-# Some columns start off reversed %]
[% "&reverse=1" IF column.name.match('delta|count') %]
[% END %]
[% "&maxrows=$maxrows" IF maxrows %]
[% "&changedsince=$changedsince" IF changedsince %]
[% "&openonly=1" IF openonly %]
[% "&product=$product" IF product %]
[% "&format=$format" IF format %]
[% "&bug_id=$bug_ids_string&sortvisible=1" IF sortvisible %]">
[% column.description %]</a>
</b>
</center>
</td>
[% END %]
</tr>
[% IF NOT sortby %]
[% sortby = "count"; reverse = "1" %]
[% END %]
[% IF sortby == "id" OR sortby == "count" OR sortby == "delta" %] <td>
[%# Numeric sort %] <center>
[% sortedbugs = bugs.nsort(sortby) %] <b>
[% ELSE %] [% bug_ids_string = bug_ids.join(',') %]
[% sortedbugs = bugs.sort(sortby) %] <a href="duplicates.cgi?sortby=[% column.name %]
[% END %] [% IF sortby == column.name %]
[% "&reverse=1" IF NOT reverse %]
[% ELSE %]
[%-# Some columns start off reversed %]
[% "&reverse=1" IF column.name.match('delta|count') %]
[% END %]
[% "&maxrows=$maxrows" IF maxrows %]
[% "&changedsince=$changedsince" IF changedsince %]
[% "&openonly=1" IF openonly %]
[% "&product=$product" IF product %]
[% "&format=$format" IF format %]
[% "&bug_id=$bug_ids_string&sortvisible=1" IF sortvisible %]">
[% column.description %]</a>
</b>
</center>
</td>
[% END %]
</tr>
[% IF reverse %] [% IF NOT sortby %]
[% bugs = sortedbugs.reverse %] [% sortby = "count"; reverse = "1" %]
[% ELSE %] [% END %]
[% bugs = sortedbugs %]
[% END %]
[%# *** Buglist *** %] [% IF sortby == "id" OR sortby == "count" OR sortby == "delta" %]
[%# Numeric sort %]
[% sortedbugs = bugs.nsort(sortby) %]
[% ELSE %]
[% sortedbugs = bugs.sort(sortby) %]
[% END %]
[%# We need to keep track of the bug IDs we are actually displaying, because [% IF reverse %]
# if the user decides to sort the visible list, we need to know what that [% bugs = sortedbugs.reverse %]
# list actually is. %] [% ELSE %]
[% vis_bug_ids = [] %] [% bugs = sortedbugs %]
[% END %]
[% FOREACH bug = bugs %] [%# *** Buglist *** %]
[% LAST IF loop.index() >= maxrows %]
[% vis_bug_ids.push(bug.id) %]
<tr> [%# We need to keep track of the bug IDs we are actually displaying, because
<td> # if the user decides to sort the visible list, we need to know what that
<center> # list actually is. %]
[% "<strike>" IF bug.resolution != "" %] [% vis_bug_ids = [] %]
<a href="show_bug.cgi?id=[% bug.id %]">[% bug.id %]</a>
[% "</strike>" IF bug.resolution != "" %]
</center>
</td>
<td> [% FOREACH bug = bugs %]
<center> [% LAST IF loop.index() >= maxrows %]
[% bug.count %] [% vis_bug_ids.push(bug.id) %]
</center>
</td>
[% IF dobefore %] <tr>
<td><center>[% bug.delta %]</center></td> <td>
[% END %] <center>
[% "<strike>" IF bug.resolution != "" %]
<a href="show_bug.cgi?id=[% bug.id %]">[% bug.id %]</a>
[% "</strike>" IF bug.resolution != "" %]
</center>
</td>
<td>[% bug.component %]</td> <td>
<td><center>[% bug.bug_severity %]</center></td> <center>
<td><center>[% bug.op_sys %]</center></td> [% bug.count %]
<td><center>[% bug.target_milestone %]</center></td> </center>
<td>[% bug.short_desc FILTER html %]</td> </td>
</tr>
[% END %] [% IF dobefore %]
<td><center>[% bug.delta %]</center></td>
[% END %]
<td>[% bug.component %]</td>
<td><center>[% bug.bug_severity %]</center></td>
<td><center>[% bug.op_sys %]</center></td>
<td><center>[% bug.target_milestone %]</center></td>
<td>[% bug.short_desc FILTER html %]</td>
</tr>
[% END %]
</table> </table>
[% ELSE %]
<h3>No duplicate bugs found.</h3>
[% END %]
...@@ -49,9 +49,6 @@ ...@@ -49,9 +49,6 @@
[% PROCESS "reports/duplicates-table.html.tmpl" %] [% PROCESS "reports/duplicates-table.html.tmpl" %]
<br>
<br>
[%# *** Parameters *** %] [%# *** Parameters *** %]
[% bug_ids_string = vis_bug_ids.join(',') %] [% bug_ids_string = vis_bug_ids.join(',') %]
......
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