Code

Ticket #18014: 18014.diff

File 18014.diff, 3.2 KB (added by akaariai, 2 years ago)
Line 
1diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
2index ce11716..911872f 100644
3--- a/django/db/models/sql/query.py
4+++ b/django/db/models/sql/query.py
5@@ -104,7 +104,6 @@ class Query(object):
6         self.alias_map = {}     # Maps alias to join information
7         self.table_map = {}     # Maps table names to list of aliases.
8         self.join_map = {}
9-        self.rev_join_map = {}  # Reverse of join_map.
10         self.quote_cache = {}
11         self.default_cols = True
12         self.default_ordering = True
13@@ -244,7 +243,6 @@ class Query(object):
14         obj.alias_map = self.alias_map.copy()
15         obj.table_map = self.table_map.copy()
16         obj.join_map = self.join_map.copy()
17-        obj.rev_join_map = self.rev_join_map.copy()
18         obj.quote_cache = {}
19         obj.default_cols = self.default_cols
20         obj.default_ordering = self.default_ordering
21@@ -463,18 +461,19 @@ class Query(object):
22         change_map = {}
23         used = set()
24         conjunction = (connector == AND)
25+        # Add the joins in the rhs query into the new query.
26         first = True
27         for alias in rhs.tables:
28             if not rhs.alias_refcount[alias]:
29                 # An unused alias.
30                 continue
31-            promote = (rhs.alias_map[alias][JOIN_TYPE] == self.LOUTER)
32-            lhs, table, lhs_col, col = rhs.rev_join_map[alias]
33+            table, _, join_type, lhs, lhs_col, col, _ = rhs.alias_map[alias]
34+            promote = join_type == self.LOUTER
35             # If the left side of the join was already relabeled, use the
36             # updated alias.
37             lhs = change_map.get(lhs, lhs)
38             new_alias = self.join((lhs, table, lhs_col, col),
39-                    (conjunction and not first), used, promote, not conjunction)
40+                    conjunction and not first, used, promote, not conjunction)
41             used.add(new_alias)
42             change_map[alias] = new_alias
43             first = False
44@@ -766,16 +765,13 @@ class Query(object):
45                     col.relabel_aliases(change_map)
46 
47         # 2. Rename the alias in the internal table/alias datastructures.
48+        for k, aliases in self.join_map.items():
49+            aliases = tuple([change_map.get(a, a) for a in aliases])
50+            self.join_map[k] = aliases
51         for old_alias, new_alias in change_map.iteritems():
52             alias_data = list(self.alias_map[old_alias])
53             alias_data[RHS_ALIAS] = new_alias
54-
55-            t = self.rev_join_map[old_alias]
56-            data = list(self.join_map[t])
57-            data[data.index(old_alias)] = new_alias
58-            self.join_map[t] = tuple(data)
59-            self.rev_join_map[new_alias] = t
60-            del self.rev_join_map[old_alias]
61+           
62             self.alias_refcount[new_alias] = self.alias_refcount[old_alias]
63             del self.alias_refcount[old_alias]
64             self.alias_map[new_alias] = tuple(alias_data)
65@@ -923,7 +919,6 @@ class Query(object):
66             self.join_map[t_ident] += (alias,)
67         else:
68             self.join_map[t_ident] = (alias,)
69-        self.rev_join_map[alias] = t_ident
70         return alias
71 
72     def setup_inherited_models(self):