diff options
Diffstat (limited to 'Bugzilla')
-rw-r--r-- | Bugzilla/Search.pm | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 0ebf1e070..aeaf7b0d1 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -980,6 +980,8 @@ sub init { # @supptables = Tables and/or table aliases used in query # %suppseen = A hash used to store all the tables in supptables to weed # out duplicates. +# @supplist = A list used to accumulate all the JOIN clauses for each +# chart to merge the ON sections of each. # $suppstring = String which is pasted into query containing all table names # get a list of field names to verify the user-submitted chart fields against @@ -1061,15 +1063,25 @@ sub init { } my %suppseen = ("bugs" => 1); my $suppstring = "bugs"; + my @supplist = (" "); foreach my $str (@supptables) { if (!$suppseen{$str}) { - if ($str !~ /^(LEFT|INNER) JOIN/i) { - $suppstring .= ","; + if ($str =~ /^(LEFT|INNER) JOIN/i) { + $str =~ /^(.*?)\s+ON\s+(.*)$/i; + my ($leftside, $rightside) = ($1, $2); + if ($suppseen{$leftside}) { + $supplist[$suppseen{$leftside}] .= " AND ($rightside)"; + } else { + $suppseen{$leftside} = scalar @supplist; + push @supplist, " $leftside ON ($rightside)"; + } + } else { + $suppstring .= ", $str"; + $suppseen{$str} = 1; } - $suppstring .= " $str"; - $suppseen{$str} = 1; } } + $suppstring .= join('', @supplist); # Make sure we create a legal SQL query. @andlist = ("1 = 1") if !@andlist; |