summaryrefslogtreecommitdiffstats
path: root/docs/sqlglot/optimizer/qualify_columns.html
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-02-16 05:45:52 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-02-16 05:45:52 +0000
commit3d48060515ba25b4c49d975a520ee0682327d1b7 (patch)
treee8730f509026e866d77c459f74a384505425363a /docs/sqlglot/optimizer/qualify_columns.html
parentReleasing debian version 21.0.2-1. (diff)
downloadsqlglot-3d48060515ba25b4c49d975a520ee0682327d1b7.tar.xz
sqlglot-3d48060515ba25b4c49d975a520ee0682327d1b7.zip
Merging upstream version 21.1.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'docs/sqlglot/optimizer/qualify_columns.html')
-rw-r--r--docs/sqlglot/optimizer/qualify_columns.html251
1 files changed, 133 insertions, 118 deletions
diff --git a/docs/sqlglot/optimizer/qualify_columns.html b/docs/sqlglot/optimizer/qualify_columns.html
index e44681a..c2c2b80 100644
--- a/docs/sqlglot/optimizer/qualify_columns.html
+++ b/docs/sqlglot/optimizer/qualify_columns.html
@@ -756,67 +756,72 @@
</span><span id="L-662"><a href="#L-662"><span class="linenos">662</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-663"><a href="#L-663"><span class="linenos">663</span></a> <span class="n">column_aliases</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-664"><a href="#L-664"><span class="linenos">664</span></a>
-</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a> <span class="c1"># If the source&#39;s columns are aliased, their aliases shadow the corresponding column names</span>
-</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">alias</span> <span class="ow">or</span> <span class="n">name</span> <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">zip_longest</span><span class="p">(</span><span class="n">columns</span><span class="p">,</span> <span class="n">column_aliases</span><span class="p">)]</span>
-</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a>
-</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a> <span class="k">def</span> <span class="nf">_get_all_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
-</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
-</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
-</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
-</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a> <span class="k">for</span> <span class="n">source_name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span>
-</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">lateral_sources</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
-</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="p">)</span>
-</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="p">}</span>
-</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
-</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a>
-</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
-</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
-</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
-</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
-</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a>
-</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a><span class="sd"> Args:</span>
-</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a><span class="sd"> source_columns: Mapping of names to source columns.</span>
-</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a>
-</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a><span class="sd"> Returns:</span>
-</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a><span class="sd"> Mapping of column name to source name.</span>
-</span><span id="L-689"><a href="#L-689"><span class="linenos">689</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">source_columns</span><span class="p">:</span>
-</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a> <span class="k">return</span> <span class="p">{}</span>
-</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a>
-</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
-</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a>
-</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
-</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">first_columns</span><span class="p">)}</span>
-</span><span id="L-697"><a href="#L-697"><span class="linenos">697</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
-</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a>
-</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
-</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
-</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_columns</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
-</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
+</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a> <span class="k">if</span> <span class="n">column_aliases</span><span class="p">:</span>
+</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a> <span class="c1"># If the source&#39;s columns are aliased, their aliases shadow the corresponding column names.</span>
+</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a> <span class="c1"># This can be expensive if there are lots of columns, so only do this if column_aliases exist.</span>
+</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a> <span class="k">return</span> <span class="p">[</span>
+</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="n">alias</span> <span class="ow">or</span> <span class="n">name</span> <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">zip_longest</span><span class="p">(</span><span class="n">columns</span><span class="p">,</span> <span class="n">column_aliases</span><span class="p">)</span>
+</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="p">]</span>
+</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="k">return</span> <span class="n">columns</span>
+</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a>
+</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="k">def</span> <span class="nf">_get_all_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
+</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
+</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
+</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a> <span class="k">for</span> <span class="n">source_name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span>
+</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">lateral_sources</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
+</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="p">)</span>
+</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a> <span class="p">}</span>
+</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
+</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a>
+</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
+</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
+</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
+</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
+</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a>
+</span><span id="L-689"><a href="#L-689"><span class="linenos">689</span></a><span class="sd"> Args:</span>
+</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a><span class="sd"> source_columns: Mapping of names to source columns.</span>
+</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a>
+</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a><span class="sd"> Returns:</span>
+</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a><span class="sd"> Mapping of column name to source name.</span>
+</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">source_columns</span><span class="p">:</span>
+</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a> <span class="k">return</span> <span class="p">{}</span>
+</span><span id="L-697"><a href="#L-697"><span class="linenos">697</span></a>
+</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
+</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a>
+</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">first_columns</span><span class="p">)}</span>
+</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a>
-</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
-</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
-</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
-</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
+</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
+</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
+</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_columns</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
+</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a>
-</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
-</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a>
-</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="nd">@staticmethod</span>
-</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="k">def</span> <span class="nf">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
-</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a><span class="sd"> Find the unique columns in a list of columns.</span>
+</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
+</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
+</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
+</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a>
+</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a>
-</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a><span class="sd"> Example:</span>
-</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a><span class="sd"> &gt;&gt;&gt; sorted(Resolver._find_unique_columns([&quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot;]))</span>
-</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a><span class="sd"> [&#39;a&#39;, &#39;c&#39;]</span>
-</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a>
-</span><span id="L-720"><a href="#L-720"><span class="linenos">720</span></a><span class="sd"> This is necessary because duplicate column names are ambiguous.</span>
-</span><span id="L-721"><a href="#L-721"><span class="linenos">721</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a> <span class="n">counts</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
-</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">:</span>
-</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a> <span class="n">counts</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
-</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a> <span class="k">return</span> <span class="p">{</span><span class="n">column</span> <span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">counts</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">}</span>
+</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a> <span class="nd">@staticmethod</span>
+</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="k">def</span> <span class="nf">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
+</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a><span class="sd"> Find the unique columns in a list of columns.</span>
+</span><span id="L-720"><a href="#L-720"><span class="linenos">720</span></a>
+</span><span id="L-721"><a href="#L-721"><span class="linenos">721</span></a><span class="sd"> Example:</span>
+</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a><span class="sd"> &gt;&gt;&gt; sorted(Resolver._find_unique_columns([&quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot;]))</span>
+</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a><span class="sd"> [&#39;a&#39;, &#39;c&#39;]</span>
+</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a>
+</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a><span class="sd"> This is necessary because duplicate column names are ambiguous.</span>
+</span><span id="L-726"><a href="#L-726"><span class="linenos">726</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-727"><a href="#L-727"><span class="linenos">727</span></a> <span class="n">counts</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="L-728"><a href="#L-728"><span class="linenos">728</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">:</span>
+</span><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="n">counts</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a> <span class="k">return</span> <span class="p">{</span><span class="n">column</span> <span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">counts</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">}</span>
</span></pre></div>
@@ -1228,67 +1233,72 @@ know what you're doing!</li>
</span><span id="Resolver-663"><a href="#Resolver-663"><span class="linenos">663</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Resolver-664"><a href="#Resolver-664"><span class="linenos">664</span></a> <span class="n">column_aliases</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Resolver-665"><a href="#Resolver-665"><span class="linenos">665</span></a>
-</span><span id="Resolver-666"><a href="#Resolver-666"><span class="linenos">666</span></a> <span class="c1"># If the source&#39;s columns are aliased, their aliases shadow the corresponding column names</span>
-</span><span id="Resolver-667"><a href="#Resolver-667"><span class="linenos">667</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">alias</span> <span class="ow">or</span> <span class="n">name</span> <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">zip_longest</span><span class="p">(</span><span class="n">columns</span><span class="p">,</span> <span class="n">column_aliases</span><span class="p">)]</span>
-</span><span id="Resolver-668"><a href="#Resolver-668"><span class="linenos">668</span></a>
-</span><span id="Resolver-669"><a href="#Resolver-669"><span class="linenos">669</span></a> <span class="k">def</span> <span class="nf">_get_all_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
-</span><span id="Resolver-670"><a href="#Resolver-670"><span class="linenos">670</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
-</span><span id="Resolver-671"><a href="#Resolver-671"><span class="linenos">671</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
-</span><span id="Resolver-672"><a href="#Resolver-672"><span class="linenos">672</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
-</span><span id="Resolver-673"><a href="#Resolver-673"><span class="linenos">673</span></a> <span class="k">for</span> <span class="n">source_name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span>
-</span><span id="Resolver-674"><a href="#Resolver-674"><span class="linenos">674</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">lateral_sources</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
-</span><span id="Resolver-675"><a href="#Resolver-675"><span class="linenos">675</span></a> <span class="p">)</span>
-</span><span id="Resolver-676"><a href="#Resolver-676"><span class="linenos">676</span></a> <span class="p">}</span>
-</span><span id="Resolver-677"><a href="#Resolver-677"><span class="linenos">677</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
-</span><span id="Resolver-678"><a href="#Resolver-678"><span class="linenos">678</span></a>
-</span><span id="Resolver-679"><a href="#Resolver-679"><span class="linenos">679</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
-</span><span id="Resolver-680"><a href="#Resolver-680"><span class="linenos">680</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
-</span><span id="Resolver-681"><a href="#Resolver-681"><span class="linenos">681</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
-</span><span id="Resolver-682"><a href="#Resolver-682"><span class="linenos">682</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="Resolver-683"><a href="#Resolver-683"><span class="linenos">683</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
-</span><span id="Resolver-684"><a href="#Resolver-684"><span class="linenos">684</span></a>
-</span><span id="Resolver-685"><a href="#Resolver-685"><span class="linenos">685</span></a><span class="sd"> Args:</span>
-</span><span id="Resolver-686"><a href="#Resolver-686"><span class="linenos">686</span></a><span class="sd"> source_columns: Mapping of names to source columns.</span>
-</span><span id="Resolver-687"><a href="#Resolver-687"><span class="linenos">687</span></a>
-</span><span id="Resolver-688"><a href="#Resolver-688"><span class="linenos">688</span></a><span class="sd"> Returns:</span>
-</span><span id="Resolver-689"><a href="#Resolver-689"><span class="linenos">689</span></a><span class="sd"> Mapping of column name to source name.</span>
-</span><span id="Resolver-690"><a href="#Resolver-690"><span class="linenos">690</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="Resolver-691"><a href="#Resolver-691"><span class="linenos">691</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">source_columns</span><span class="p">:</span>
-</span><span id="Resolver-692"><a href="#Resolver-692"><span class="linenos">692</span></a> <span class="k">return</span> <span class="p">{}</span>
-</span><span id="Resolver-693"><a href="#Resolver-693"><span class="linenos">693</span></a>
-</span><span id="Resolver-694"><a href="#Resolver-694"><span class="linenos">694</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
-</span><span id="Resolver-695"><a href="#Resolver-695"><span class="linenos">695</span></a>
-</span><span id="Resolver-696"><a href="#Resolver-696"><span class="linenos">696</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
-</span><span id="Resolver-697"><a href="#Resolver-697"><span class="linenos">697</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">first_columns</span><span class="p">)}</span>
-</span><span id="Resolver-698"><a href="#Resolver-698"><span class="linenos">698</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
-</span><span id="Resolver-699"><a href="#Resolver-699"><span class="linenos">699</span></a>
-</span><span id="Resolver-700"><a href="#Resolver-700"><span class="linenos">700</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
-</span><span id="Resolver-701"><a href="#Resolver-701"><span class="linenos">701</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
-</span><span id="Resolver-702"><a href="#Resolver-702"><span class="linenos">702</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_columns</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
-</span><span id="Resolver-703"><a href="#Resolver-703"><span class="linenos">703</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
+</span><span id="Resolver-666"><a href="#Resolver-666"><span class="linenos">666</span></a> <span class="k">if</span> <span class="n">column_aliases</span><span class="p">:</span>
+</span><span id="Resolver-667"><a href="#Resolver-667"><span class="linenos">667</span></a> <span class="c1"># If the source&#39;s columns are aliased, their aliases shadow the corresponding column names.</span>
+</span><span id="Resolver-668"><a href="#Resolver-668"><span class="linenos">668</span></a> <span class="c1"># This can be expensive if there are lots of columns, so only do this if column_aliases exist.</span>
+</span><span id="Resolver-669"><a href="#Resolver-669"><span class="linenos">669</span></a> <span class="k">return</span> <span class="p">[</span>
+</span><span id="Resolver-670"><a href="#Resolver-670"><span class="linenos">670</span></a> <span class="n">alias</span> <span class="ow">or</span> <span class="n">name</span> <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">zip_longest</span><span class="p">(</span><span class="n">columns</span><span class="p">,</span> <span class="n">column_aliases</span><span class="p">)</span>
+</span><span id="Resolver-671"><a href="#Resolver-671"><span class="linenos">671</span></a> <span class="p">]</span>
+</span><span id="Resolver-672"><a href="#Resolver-672"><span class="linenos">672</span></a> <span class="k">return</span> <span class="n">columns</span>
+</span><span id="Resolver-673"><a href="#Resolver-673"><span class="linenos">673</span></a>
+</span><span id="Resolver-674"><a href="#Resolver-674"><span class="linenos">674</span></a> <span class="k">def</span> <span class="nf">_get_all_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
+</span><span id="Resolver-675"><a href="#Resolver-675"><span class="linenos">675</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+</span><span id="Resolver-676"><a href="#Resolver-676"><span class="linenos">676</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
+</span><span id="Resolver-677"><a href="#Resolver-677"><span class="linenos">677</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
+</span><span id="Resolver-678"><a href="#Resolver-678"><span class="linenos">678</span></a> <span class="k">for</span> <span class="n">source_name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">chain</span><span class="p">(</span>
+</span><span id="Resolver-679"><a href="#Resolver-679"><span class="linenos">679</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">lateral_sources</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
+</span><span id="Resolver-680"><a href="#Resolver-680"><span class="linenos">680</span></a> <span class="p">)</span>
+</span><span id="Resolver-681"><a href="#Resolver-681"><span class="linenos">681</span></a> <span class="p">}</span>
+</span><span id="Resolver-682"><a href="#Resolver-682"><span class="linenos">682</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
+</span><span id="Resolver-683"><a href="#Resolver-683"><span class="linenos">683</span></a>
+</span><span id="Resolver-684"><a href="#Resolver-684"><span class="linenos">684</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
+</span><span id="Resolver-685"><a href="#Resolver-685"><span class="linenos">685</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
+</span><span id="Resolver-686"><a href="#Resolver-686"><span class="linenos">686</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
+</span><span id="Resolver-687"><a href="#Resolver-687"><span class="linenos">687</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="Resolver-688"><a href="#Resolver-688"><span class="linenos">688</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
+</span><span id="Resolver-689"><a href="#Resolver-689"><span class="linenos">689</span></a>
+</span><span id="Resolver-690"><a href="#Resolver-690"><span class="linenos">690</span></a><span class="sd"> Args:</span>
+</span><span id="Resolver-691"><a href="#Resolver-691"><span class="linenos">691</span></a><span class="sd"> source_columns: Mapping of names to source columns.</span>
+</span><span id="Resolver-692"><a href="#Resolver-692"><span class="linenos">692</span></a>
+</span><span id="Resolver-693"><a href="#Resolver-693"><span class="linenos">693</span></a><span class="sd"> Returns:</span>
+</span><span id="Resolver-694"><a href="#Resolver-694"><span class="linenos">694</span></a><span class="sd"> Mapping of column name to source name.</span>
+</span><span id="Resolver-695"><a href="#Resolver-695"><span class="linenos">695</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="Resolver-696"><a href="#Resolver-696"><span class="linenos">696</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">source_columns</span><span class="p">:</span>
+</span><span id="Resolver-697"><a href="#Resolver-697"><span class="linenos">697</span></a> <span class="k">return</span> <span class="p">{}</span>
+</span><span id="Resolver-698"><a href="#Resolver-698"><span class="linenos">698</span></a>
+</span><span id="Resolver-699"><a href="#Resolver-699"><span class="linenos">699</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
+</span><span id="Resolver-700"><a href="#Resolver-700"><span class="linenos">700</span></a>
+</span><span id="Resolver-701"><a href="#Resolver-701"><span class="linenos">701</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+</span><span id="Resolver-702"><a href="#Resolver-702"><span class="linenos">702</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">first_columns</span><span class="p">)}</span>
+</span><span id="Resolver-703"><a href="#Resolver-703"><span class="linenos">703</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
</span><span id="Resolver-704"><a href="#Resolver-704"><span class="linenos">704</span></a>
-</span><span id="Resolver-705"><a href="#Resolver-705"><span class="linenos">705</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
-</span><span id="Resolver-706"><a href="#Resolver-706"><span class="linenos">706</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
-</span><span id="Resolver-707"><a href="#Resolver-707"><span class="linenos">707</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
-</span><span id="Resolver-708"><a href="#Resolver-708"><span class="linenos">708</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
+</span><span id="Resolver-705"><a href="#Resolver-705"><span class="linenos">705</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
+</span><span id="Resolver-706"><a href="#Resolver-706"><span class="linenos">706</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
+</span><span id="Resolver-707"><a href="#Resolver-707"><span class="linenos">707</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_columns</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
+</span><span id="Resolver-708"><a href="#Resolver-708"><span class="linenos">708</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
</span><span id="Resolver-709"><a href="#Resolver-709"><span class="linenos">709</span></a>
-</span><span id="Resolver-710"><a href="#Resolver-710"><span class="linenos">710</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
-</span><span id="Resolver-711"><a href="#Resolver-711"><span class="linenos">711</span></a>
-</span><span id="Resolver-712"><a href="#Resolver-712"><span class="linenos">712</span></a> <span class="nd">@staticmethod</span>
-</span><span id="Resolver-713"><a href="#Resolver-713"><span class="linenos">713</span></a> <span class="k">def</span> <span class="nf">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
-</span><span id="Resolver-714"><a href="#Resolver-714"><span class="linenos">714</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="Resolver-715"><a href="#Resolver-715"><span class="linenos">715</span></a><span class="sd"> Find the unique columns in a list of columns.</span>
+</span><span id="Resolver-710"><a href="#Resolver-710"><span class="linenos">710</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
+</span><span id="Resolver-711"><a href="#Resolver-711"><span class="linenos">711</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+</span><span id="Resolver-712"><a href="#Resolver-712"><span class="linenos">712</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
+</span><span id="Resolver-713"><a href="#Resolver-713"><span class="linenos">713</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
+</span><span id="Resolver-714"><a href="#Resolver-714"><span class="linenos">714</span></a>
+</span><span id="Resolver-715"><a href="#Resolver-715"><span class="linenos">715</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
</span><span id="Resolver-716"><a href="#Resolver-716"><span class="linenos">716</span></a>
-</span><span id="Resolver-717"><a href="#Resolver-717"><span class="linenos">717</span></a><span class="sd"> Example:</span>
-</span><span id="Resolver-718"><a href="#Resolver-718"><span class="linenos">718</span></a><span class="sd"> &gt;&gt;&gt; sorted(Resolver._find_unique_columns([&quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot;]))</span>
-</span><span id="Resolver-719"><a href="#Resolver-719"><span class="linenos">719</span></a><span class="sd"> [&#39;a&#39;, &#39;c&#39;]</span>
-</span><span id="Resolver-720"><a href="#Resolver-720"><span class="linenos">720</span></a>
-</span><span id="Resolver-721"><a href="#Resolver-721"><span class="linenos">721</span></a><span class="sd"> This is necessary because duplicate column names are ambiguous.</span>
-</span><span id="Resolver-722"><a href="#Resolver-722"><span class="linenos">722</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="Resolver-723"><a href="#Resolver-723"><span class="linenos">723</span></a> <span class="n">counts</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
-</span><span id="Resolver-724"><a href="#Resolver-724"><span class="linenos">724</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">:</span>
-</span><span id="Resolver-725"><a href="#Resolver-725"><span class="linenos">725</span></a> <span class="n">counts</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
-</span><span id="Resolver-726"><a href="#Resolver-726"><span class="linenos">726</span></a> <span class="k">return</span> <span class="p">{</span><span class="n">column</span> <span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">counts</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">}</span>
+</span><span id="Resolver-717"><a href="#Resolver-717"><span class="linenos">717</span></a> <span class="nd">@staticmethod</span>
+</span><span id="Resolver-718"><a href="#Resolver-718"><span class="linenos">718</span></a> <span class="k">def</span> <span class="nf">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
+</span><span id="Resolver-719"><a href="#Resolver-719"><span class="linenos">719</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="Resolver-720"><a href="#Resolver-720"><span class="linenos">720</span></a><span class="sd"> Find the unique columns in a list of columns.</span>
+</span><span id="Resolver-721"><a href="#Resolver-721"><span class="linenos">721</span></a>
+</span><span id="Resolver-722"><a href="#Resolver-722"><span class="linenos">722</span></a><span class="sd"> Example:</span>
+</span><span id="Resolver-723"><a href="#Resolver-723"><span class="linenos">723</span></a><span class="sd"> &gt;&gt;&gt; sorted(Resolver._find_unique_columns([&quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot;]))</span>
+</span><span id="Resolver-724"><a href="#Resolver-724"><span class="linenos">724</span></a><span class="sd"> [&#39;a&#39;, &#39;c&#39;]</span>
+</span><span id="Resolver-725"><a href="#Resolver-725"><span class="linenos">725</span></a>
+</span><span id="Resolver-726"><a href="#Resolver-726"><span class="linenos">726</span></a><span class="sd"> This is necessary because duplicate column names are ambiguous.</span>
+</span><span id="Resolver-727"><a href="#Resolver-727"><span class="linenos">727</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="Resolver-728"><a href="#Resolver-728"><span class="linenos">728</span></a> <span class="n">counts</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="Resolver-729"><a href="#Resolver-729"><span class="linenos">729</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">:</span>
+</span><span id="Resolver-730"><a href="#Resolver-730"><span class="linenos">730</span></a> <span class="n">counts</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+</span><span id="Resolver-731"><a href="#Resolver-731"><span class="linenos">731</span></a> <span class="k">return</span> <span class="p">{</span><span class="n">column</span> <span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">counts</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">}</span>
</span></pre></div>
@@ -1471,8 +1481,13 @@ know what you're doing!</li>
</span><span id="Resolver.get_source_columns-663"><a href="#Resolver.get_source_columns-663"><span class="linenos">663</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="Resolver.get_source_columns-664"><a href="#Resolver.get_source_columns-664"><span class="linenos">664</span></a> <span class="n">column_aliases</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Resolver.get_source_columns-665"><a href="#Resolver.get_source_columns-665"><span class="linenos">665</span></a>
-</span><span id="Resolver.get_source_columns-666"><a href="#Resolver.get_source_columns-666"><span class="linenos">666</span></a> <span class="c1"># If the source&#39;s columns are aliased, their aliases shadow the corresponding column names</span>
-</span><span id="Resolver.get_source_columns-667"><a href="#Resolver.get_source_columns-667"><span class="linenos">667</span></a> <span class="k">return</span> <span class="p">[</span><span class="n">alias</span> <span class="ow">or</span> <span class="n">name</span> <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">zip_longest</span><span class="p">(</span><span class="n">columns</span><span class="p">,</span> <span class="n">column_aliases</span><span class="p">)]</span>
+</span><span id="Resolver.get_source_columns-666"><a href="#Resolver.get_source_columns-666"><span class="linenos">666</span></a> <span class="k">if</span> <span class="n">column_aliases</span><span class="p">:</span>
+</span><span id="Resolver.get_source_columns-667"><a href="#Resolver.get_source_columns-667"><span class="linenos">667</span></a> <span class="c1"># If the source&#39;s columns are aliased, their aliases shadow the corresponding column names.</span>
+</span><span id="Resolver.get_source_columns-668"><a href="#Resolver.get_source_columns-668"><span class="linenos">668</span></a> <span class="c1"># This can be expensive if there are lots of columns, so only do this if column_aliases exist.</span>
+</span><span id="Resolver.get_source_columns-669"><a href="#Resolver.get_source_columns-669"><span class="linenos">669</span></a> <span class="k">return</span> <span class="p">[</span>
+</span><span id="Resolver.get_source_columns-670"><a href="#Resolver.get_source_columns-670"><span class="linenos">670</span></a> <span class="n">alias</span> <span class="ow">or</span> <span class="n">name</span> <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">zip_longest</span><span class="p">(</span><span class="n">columns</span><span class="p">,</span> <span class="n">column_aliases</span><span class="p">)</span>
+</span><span id="Resolver.get_source_columns-671"><a href="#Resolver.get_source_columns-671"><span class="linenos">671</span></a> <span class="p">]</span>
+</span><span id="Resolver.get_source_columns-672"><a href="#Resolver.get_source_columns-672"><span class="linenos">672</span></a> <span class="k">return</span> <span class="n">columns</span>
</span></pre></div>