summaryrefslogtreecommitdiffstats
path: root/docs/sqlglot/optimizer/scope.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/sqlglot/optimizer/scope.html')
-rw-r--r--docs/sqlglot/optimizer/scope.html1006
1 files changed, 530 insertions, 476 deletions
diff --git a/docs/sqlglot/optimizer/scope.html b/docs/sqlglot/optimizer/scope.html
index 608ee9b..bbbc3d6 100644
--- a/docs/sqlglot/optimizer/scope.html
+++ b/docs/sqlglot/optimizer/scope.html
@@ -667,323 +667,371 @@
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a> <span class="nd">@property</span>
</span><span id="L-436"><a href="#L-436"><span class="linenos">436</span></a> <span class="k">def</span> <span class="nf">is_correlated_subquery</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Determine if this scope is a correlated subquery&quot;&quot;&quot;</span>
-</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">is_subquery</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">external_columns</span><span class="p">)</span>
-</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a>
-</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a> <span class="k">def</span> <span class="nf">rename_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">old_name</span><span class="p">,</span> <span class="n">new_name</span><span class="p">):</span>
-</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Rename a source in this scope&quot;&quot;&quot;</span>
-</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">old_name</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="p">[])</span>
-</span><span id="L-443"><a href="#L-443"><span class="linenos">443</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">columns</span>
-</span><span id="L-444"><a href="#L-444"><span class="linenos">444</span></a>
-</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
-</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a source to this scope&quot;&quot;&quot;</span>
-</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">source</span>
-</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
-</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a>
-</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="k">def</span> <span class="nf">remove_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
-</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a source from this scope&quot;&quot;&quot;</span>
-</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
-</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
-</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a>
-</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;Scope&lt;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span><span class="si">}</span><span class="s2">&gt;&quot;</span>
+</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span>
+</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">is_subquery</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">)))</span>
+</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">external_columns</span>
+</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a> <span class="p">)</span>
+</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a>
+</span><span id="L-443"><a href="#L-443"><span class="linenos">443</span></a> <span class="k">def</span> <span class="nf">rename_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">old_name</span><span class="p">,</span> <span class="n">new_name</span><span class="p">):</span>
+</span><span id="L-444"><a href="#L-444"><span class="linenos">444</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Rename a source in this scope&quot;&quot;&quot;</span>
+</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">old_name</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="p">[])</span>
+</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">columns</span>
+</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a>
+</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
+</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a source to this scope&quot;&quot;&quot;</span>
+</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">source</span>
+</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
+</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a>
+</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a> <span class="k">def</span> <span class="nf">remove_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a source from this scope&quot;&quot;&quot;</span>
+</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a>
-</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a> <span class="k">def</span> <span class="nf">traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a><span class="sd"> Traverse the scope tree from this node.</span>
-</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a>
-</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a><span class="sd"> Yields:</span>
-</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a><span class="sd"> Scope: scope instances in depth-first-search post-order</span>
-</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a> <span class="k">for</span> <span class="n">child_scope</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-466"><a href="#L-466"><span class="linenos">466</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">cte_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_scopes</span>
-</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a> <span class="p">):</span>
-</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a> <span class="k">yield from</span> <span class="n">child_scope</span><span class="o">.</span><span class="n">traverse</span><span class="p">()</span>
-</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a> <span class="k">yield</span> <span class="bp">self</span>
-</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a>
-</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a> <span class="k">def</span> <span class="nf">ref_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a><span class="sd"> Count the number of times each scope in this tree is referenced.</span>
-</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a>
-</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a><span class="sd"> Returns:</span>
-</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a><span class="sd"> dict[int, int]: Mapping of Scope instance ID to reference count</span>
-</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a> <span class="n">scope_ref_count</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span>
-</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a>
-</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">traverse</span><span class="p">():</span>
-</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
-</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a> <span class="n">scope_ref_count</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">source</span><span class="p">)]</span> <span class="o">+=</span> <span class="mi">1</span>
-</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a>
-</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a> <span class="k">return</span> <span class="n">scope_ref_count</span>
-</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a>
+</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;Scope&lt;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span><span class="si">}</span><span class="s2">&gt;&quot;</span>
+</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a>
+</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a> <span class="k">def</span> <span class="nf">traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a><span class="sd"> Traverse the scope tree from this node.</span>
+</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a>
+</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a><span class="sd"> Yields:</span>
+</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a><span class="sd"> Scope: scope instances in depth-first-search post-order</span>
+</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a> <span class="k">for</span> <span class="n">child_scope</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-469"><a href="#L-469"><span class="linenos">469</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">cte_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_scopes</span>
+</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a> <span class="p">):</span>
+</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a> <span class="k">yield from</span> <span class="n">child_scope</span><span class="o">.</span><span class="n">traverse</span><span class="p">()</span>
+</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a> <span class="k">yield</span> <span class="bp">self</span>
+</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a>
+</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a> <span class="k">def</span> <span class="nf">ref_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a><span class="sd"> Count the number of times each scope in this tree is referenced.</span>
+</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a>
+</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a><span class="sd"> Returns:</span>
+</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a><span class="sd"> dict[int, int]: Mapping of Scope instance ID to reference count</span>
+</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a> <span class="n">scope_ref_count</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span>
+</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a>
+</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">traverse</span><span class="p">():</span>
+</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a> <span class="n">scope_ref_count</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">source</span><span class="p">)]</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a>
-</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a><span class="k">def</span> <span class="nf">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
-</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a><span class="sd"> Traverse an expression by it&#39;s &quot;scopes&quot;.</span>
-</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a>
-</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a><span class="sd"> &quot;Scope&quot; represents the current context of a Select statement.</span>
-</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a>
-</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a><span class="sd"> This is helpful for optimizing queries, where we need more information than</span>
-</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a><span class="sd"> the expression tree itself. For example, we might care about the source</span>
-</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a><span class="sd"> names within a subquery. Returns a list because a generator could result in</span>
-</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a><span class="sd"> incomplete properties which is confusing.</span>
-</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a>
-</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a><span class="sd"> Examples:</span>
-</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
-</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a><span class="sd"> &gt;&gt;&gt; expression = sqlglot.parse_one(&quot;SELECT a FROM (SELECT a FROM x) AS y&quot;)</span>
-</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a><span class="sd"> &gt;&gt;&gt; scopes = traverse_scope(expression)</span>
-</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a><span class="sd"> &gt;&gt;&gt; scopes[0].expression.sql(), list(scopes[0].sources)</span>
-</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a><span class="sd"> (&#39;SELECT a FROM x&#39;, [&#39;x&#39;])</span>
-</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a><span class="sd"> &gt;&gt;&gt; scopes[1].expression.sql(), list(scopes[1].sources)</span>
-</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a><span class="sd"> (&#39;SELECT a FROM (SELECT a FROM x) AS y&#39;, [&#39;y&#39;])</span>
-</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a>
-</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a><span class="sd"> Args:</span>
-</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a><span class="sd"> expression (exp.Expression): expression to traverse</span>
-</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a><span class="sd"> Returns:</span>
-</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a><span class="sd"> list[Scope]: scope instances</span>
-</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unionable</span><span class="p">):</span>
-</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a> <span class="k">return</span> <span class="p">[]</span>
-</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">_traverse_scope</span><span class="p">(</span><span class="n">Scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)))</span>
-</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a>
-</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a>
-</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a><span class="k">def</span> <span class="nf">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
-</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a><span class="sd"> Build a scope tree.</span>
-</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a>
-</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a><span class="sd"> Args:</span>
-</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a><span class="sd"> expression (exp.Expression): expression to build the scope tree for</span>
-</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a><span class="sd"> Returns:</span>
-</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a><span class="sd"> Scope: root scope</span>
-</span><span id="L-525"><a href="#L-525"><span class="linenos">525</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
-</span><span id="L-527"><a href="#L-527"><span class="linenos">527</span></a> <span class="k">if</span> <span class="n">scopes</span><span class="p">:</span>
-</span><span id="L-528"><a href="#L-528"><span class="linenos">528</span></a> <span class="k">return</span> <span class="n">scopes</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a> <span class="k">return</span> <span class="kc">None</span>
-</span><span id="L-530"><a href="#L-530"><span class="linenos">530</span></a>
-</span><span id="L-531"><a href="#L-531"><span class="linenos">531</span></a>
-</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a><span class="k">def</span> <span class="nf">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
-</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
-</span><span id="L-534"><a href="#L-534"><span class="linenos">534</span></a> <span class="k">yield from</span> <span class="n">_traverse_select</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
-</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Union</span><span class="p">):</span>
-</span><span id="L-536"><a href="#L-536"><span class="linenos">536</span></a> <span class="k">yield from</span> <span class="n">_traverse_union</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
-</span><span id="L-537"><a href="#L-537"><span class="linenos">537</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">):</span>
-</span><span id="L-538"><a href="#L-538"><span class="linenos">538</span></a> <span class="k">yield from</span> <span class="n">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
-</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
-</span><span id="L-540"><a href="#L-540"><span class="linenos">540</span></a> <span class="k">yield from</span> <span class="n">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
-</span><span id="L-541"><a href="#L-541"><span class="linenos">541</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">):</span>
-</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a> <span class="k">pass</span>
-</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
-</span><span id="L-545"><a href="#L-545"><span class="linenos">545</span></a> <span class="s2">&quot;Cannot traverse scope </span><span class="si">%s</span><span class="s2"> with type &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span><span class="p">,</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
-</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a> <span class="p">)</span>
-</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a> <span class="k">return</span>
-</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a>
-</span><span id="L-549"><a href="#L-549"><span class="linenos">549</span></a> <span class="k">yield</span> <span class="n">scope</span>
-</span><span id="L-550"><a href="#L-550"><span class="linenos">550</span></a>
-</span><span id="L-551"><a href="#L-551"><span class="linenos">551</span></a>
-</span><span id="L-552"><a href="#L-552"><span class="linenos">552</span></a><span class="k">def</span> <span class="nf">_traverse_select</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
-</span><span id="L-553"><a href="#L-553"><span class="linenos">553</span></a> <span class="k">yield from</span> <span class="n">_traverse_ctes</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
-</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a> <span class="k">yield from</span> <span class="n">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
-</span><span id="L-555"><a href="#L-555"><span class="linenos">555</span></a> <span class="k">yield from</span> <span class="n">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a> <span class="k">return</span> <span class="n">scope_ref_count</span>
+</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a>
+</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a>
+</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a><span class="k">def</span> <span class="nf">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
+</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a><span class="sd"> Traverse an expression by its &quot;scopes&quot;.</span>
+</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a>
+</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a><span class="sd"> &quot;Scope&quot; represents the current context of a Select statement.</span>
+</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a>
+</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a><span class="sd"> This is helpful for optimizing queries, where we need more information than</span>
+</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a><span class="sd"> the expression tree itself. For example, we might care about the source</span>
+</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a><span class="sd"> names within a subquery. Returns a list because a generator could result in</span>
+</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a><span class="sd"> incomplete properties which is confusing.</span>
+</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a>
+</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a><span class="sd"> Examples:</span>
+</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
+</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a><span class="sd"> &gt;&gt;&gt; expression = sqlglot.parse_one(&quot;SELECT a FROM (SELECT a FROM x) AS y&quot;)</span>
+</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a><span class="sd"> &gt;&gt;&gt; scopes = traverse_scope(expression)</span>
+</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a><span class="sd"> &gt;&gt;&gt; scopes[0].expression.sql(), list(scopes[0].sources)</span>
+</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a><span class="sd"> (&#39;SELECT a FROM x&#39;, [&#39;x&#39;])</span>
+</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a><span class="sd"> &gt;&gt;&gt; scopes[1].expression.sql(), list(scopes[1].sources)</span>
+</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a><span class="sd"> (&#39;SELECT a FROM (SELECT a FROM x) AS y&#39;, [&#39;y&#39;])</span>
+</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a>
+</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a><span class="sd"> Args:</span>
+</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a><span class="sd"> expression (exp.Expression): expression to traverse</span>
+</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a><span class="sd"> Returns:</span>
+</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a><span class="sd"> list[Scope]: scope instances</span>
+</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unionable</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
+</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DDL</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">)</span>
+</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a> <span class="p">):</span>
+</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">_traverse_scope</span><span class="p">(</span><span class="n">Scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)))</span>
+</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a>
+</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="k">return</span> <span class="p">[]</span>
+</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a>
+</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a>
+</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a><span class="k">def</span> <span class="nf">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
+</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-525"><a href="#L-525"><span class="linenos">525</span></a><span class="sd"> Build a scope tree.</span>
+</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a>
+</span><span id="L-527"><a href="#L-527"><span class="linenos">527</span></a><span class="sd"> Args:</span>
+</span><span id="L-528"><a href="#L-528"><span class="linenos">528</span></a><span class="sd"> expression (exp.Expression): expression to build the scope tree for</span>
+</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a><span class="sd"> Returns:</span>
+</span><span id="L-530"><a href="#L-530"><span class="linenos">530</span></a><span class="sd"> Scope: root scope</span>
+</span><span id="L-531"><a href="#L-531"><span class="linenos">531</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
+</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a> <span class="k">if</span> <span class="n">scopes</span><span class="p">:</span>
+</span><span id="L-534"><a href="#L-534"><span class="linenos">534</span></a> <span class="k">return</span> <span class="n">scopes</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a> <span class="k">return</span> <span class="kc">None</span>
+</span><span id="L-536"><a href="#L-536"><span class="linenos">536</span></a>
+</span><span id="L-537"><a href="#L-537"><span class="linenos">537</span></a>
+</span><span id="L-538"><a href="#L-538"><span class="linenos">538</span></a><span class="k">def</span> <span class="nf">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
+</span><span id="L-540"><a href="#L-540"><span class="linenos">540</span></a> <span class="k">yield from</span> <span class="n">_traverse_select</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-541"><a href="#L-541"><span class="linenos">541</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Union</span><span class="p">):</span>
+</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a> <span class="k">yield from</span> <span class="n">_traverse_union</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">):</span>
+</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a> <span class="k">yield from</span> <span class="n">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-545"><a href="#L-545"><span class="linenos">545</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
+</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a> <span class="k">yield from</span> <span class="n">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">):</span>
+</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a> <span class="k">yield from</span> <span class="n">_traverse_udtfs</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-549"><a href="#L-549"><span class="linenos">549</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DDL</span><span class="p">):</span>
+</span><span id="L-550"><a href="#L-550"><span class="linenos">550</span></a> <span class="k">yield from</span> <span class="n">_traverse_ddl</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-551"><a href="#L-551"><span class="linenos">551</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-552"><a href="#L-552"><span class="linenos">552</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
+</span><span id="L-553"><a href="#L-553"><span class="linenos">553</span></a> <span class="s2">&quot;Cannot traverse scope </span><span class="si">%s</span><span class="s2"> with type &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span><span class="p">,</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
+</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a> <span class="p">)</span>
+</span><span id="L-555"><a href="#L-555"><span class="linenos">555</span></a> <span class="k">return</span>
</span><span id="L-556"><a href="#L-556"><span class="linenos">556</span></a>
-</span><span id="L-557"><a href="#L-557"><span class="linenos">557</span></a>
-</span><span id="L-558"><a href="#L-558"><span class="linenos">558</span></a><span class="k">def</span> <span class="nf">_traverse_union</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
-</span><span id="L-559"><a href="#L-559"><span class="linenos">559</span></a> <span class="k">yield from</span> <span class="n">_traverse_ctes</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
-</span><span id="L-560"><a href="#L-560"><span class="linenos">560</span></a>
-</span><span id="L-561"><a href="#L-561"><span class="linenos">561</span></a> <span class="c1"># The last scope to be yield should be the top most scope</span>
-</span><span id="L-562"><a href="#L-562"><span class="linenos">562</span></a> <span class="n">left</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-563"><a href="#L-563"><span class="linenos">563</span></a> <span class="k">for</span> <span class="n">left</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">UNION</span><span class="p">)):</span>
-</span><span id="L-564"><a href="#L-564"><span class="linenos">564</span></a> <span class="k">yield</span> <span class="n">left</span>
+</span><span id="L-557"><a href="#L-557"><span class="linenos">557</span></a> <span class="k">yield</span> <span class="n">scope</span>
+</span><span id="L-558"><a href="#L-558"><span class="linenos">558</span></a>
+</span><span id="L-559"><a href="#L-559"><span class="linenos">559</span></a>
+</span><span id="L-560"><a href="#L-560"><span class="linenos">560</span></a><span class="k">def</span> <span class="nf">_traverse_select</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-561"><a href="#L-561"><span class="linenos">561</span></a> <span class="k">yield from</span> <span class="n">_traverse_ctes</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-562"><a href="#L-562"><span class="linenos">562</span></a> <span class="k">yield from</span> <span class="n">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-563"><a href="#L-563"><span class="linenos">563</span></a> <span class="k">yield from</span> <span class="n">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-564"><a href="#L-564"><span class="linenos">564</span></a>
</span><span id="L-565"><a href="#L-565"><span class="linenos">565</span></a>
-</span><span id="L-566"><a href="#L-566"><span class="linenos">566</span></a> <span class="n">right</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-567"><a href="#L-567"><span class="linenos">567</span></a> <span class="k">for</span> <span class="n">right</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">right</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">UNION</span><span class="p">)):</span>
-</span><span id="L-568"><a href="#L-568"><span class="linenos">568</span></a> <span class="k">yield</span> <span class="n">right</span>
-</span><span id="L-569"><a href="#L-569"><span class="linenos">569</span></a>
-</span><span id="L-570"><a href="#L-570"><span class="linenos">570</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">union_scopes</span> <span class="o">=</span> <span class="p">[</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">]</span>
-</span><span id="L-571"><a href="#L-571"><span class="linenos">571</span></a>
-</span><span id="L-572"><a href="#L-572"><span class="linenos">572</span></a>
-</span><span id="L-573"><a href="#L-573"><span class="linenos">573</span></a><span class="k">def</span> <span class="nf">_traverse_ctes</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
-</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
-</span><span id="L-575"><a href="#L-575"><span class="linenos">575</span></a>
-</span><span id="L-576"><a href="#L-576"><span class="linenos">576</span></a> <span class="k">for</span> <span class="n">cte</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">ctes</span><span class="p">:</span>
-</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a> <span class="n">recursive_scope</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-578"><a href="#L-578"><span class="linenos">578</span></a>
-</span><span id="L-579"><a href="#L-579"><span class="linenos">579</span></a> <span class="c1"># if the scope is a recursive cte, it must be in the form of</span>
-</span><span id="L-580"><a href="#L-580"><span class="linenos">580</span></a> <span class="c1"># base_case UNION recursive. thus the recursive scope is the first</span>
-</span><span id="L-581"><a href="#L-581"><span class="linenos">581</span></a> <span class="c1"># section of the union.</span>
-</span><span id="L-582"><a href="#L-582"><span class="linenos">582</span></a> <span class="k">if</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;with&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
-</span><span id="L-583"><a href="#L-583"><span class="linenos">583</span></a> <span class="n">union</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
-</span><span id="L-584"><a href="#L-584"><span class="linenos">584</span></a>
-</span><span id="L-585"><a href="#L-585"><span class="linenos">585</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Union</span><span class="p">):</span>
-</span><span id="L-586"><a href="#L-586"><span class="linenos">586</span></a> <span class="n">recursive_scope</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">union</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
-</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a>
-</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a> <span class="n">child_scope</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a>
-</span><span id="L-590"><a href="#L-590"><span class="linenos">590</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
-</span><span id="L-591"><a href="#L-591"><span class="linenos">591</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
-</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">this</span><span class="p">,</span>
-</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a> <span class="n">chain_sources</span><span class="o">=</span><span class="n">sources</span><span class="p">,</span>
-</span><span id="L-594"><a href="#L-594"><span class="linenos">594</span></a> <span class="n">outer_column_list</span><span class="o">=</span><span class="n">cte</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
-</span><span id="L-595"><a href="#L-595"><span class="linenos">595</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">CTE</span><span class="p">,</span>
-</span><span id="L-596"><a href="#L-596"><span class="linenos">596</span></a> <span class="p">)</span>
-</span><span id="L-597"><a href="#L-597"><span class="linenos">597</span></a> <span class="p">):</span>
-</span><span id="L-598"><a href="#L-598"><span class="linenos">598</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
-</span><span id="L-599"><a href="#L-599"><span class="linenos">599</span></a>
-</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">alias</span>
-</span><span id="L-601"><a href="#L-601"><span class="linenos">601</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
-</span><span id="L-602"><a href="#L-602"><span class="linenos">602</span></a>
-</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a> <span class="k">if</span> <span class="n">recursive_scope</span><span class="p">:</span>
-</span><span id="L-604"><a href="#L-604"><span class="linenos">604</span></a> <span class="n">child_scope</span><span class="o">.</span><span class="n">add_source</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">recursive_scope</span><span class="p">)</span>
-</span><span id="L-605"><a href="#L-605"><span class="linenos">605</span></a>
-</span><span id="L-606"><a href="#L-606"><span class="linenos">606</span></a> <span class="c1"># append the final child_scope yielded</span>
-</span><span id="L-607"><a href="#L-607"><span class="linenos">607</span></a> <span class="k">if</span> <span class="n">child_scope</span><span class="p">:</span>
-</span><span id="L-608"><a href="#L-608"><span class="linenos">608</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">cte_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
-</span><span id="L-609"><a href="#L-609"><span class="linenos">609</span></a>
-</span><span id="L-610"><a href="#L-610"><span class="linenos">610</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
-</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a>
-</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a>
-</span><span id="L-613"><a href="#L-613"><span class="linenos">613</span></a><span class="k">def</span> <span class="nf">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
-</span><span id="L-614"><a href="#L-614"><span class="linenos">614</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-615"><a href="#L-615"><span class="linenos">615</span></a><span class="sd"> We represent (tbl1 JOIN tbl2) as a Subquery, but it&#39;s not really a &quot;derived table&quot;,</span>
-</span><span id="L-616"><a href="#L-616"><span class="linenos">616</span></a><span class="sd"> as it doesn&#39;t introduce a new scope. If an alias is present, it shadows all names</span>
-</span><span id="L-617"><a href="#L-617"><span class="linenos">617</span></a><span class="sd"> under the Subquery, so that&#39;s one exception to this rule.</span>
-</span><span id="L-618"><a href="#L-618"><span class="linenos">618</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-619"><a href="#L-619"><span class="linenos">619</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">))</span>
+</span><span id="L-566"><a href="#L-566"><span class="linenos">566</span></a><span class="k">def</span> <span class="nf">_traverse_union</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-567"><a href="#L-567"><span class="linenos">567</span></a> <span class="k">yield from</span> <span class="n">_traverse_ctes</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-568"><a href="#L-568"><span class="linenos">568</span></a>
+</span><span id="L-569"><a href="#L-569"><span class="linenos">569</span></a> <span class="c1"># The last scope to be yield should be the top most scope</span>
+</span><span id="L-570"><a href="#L-570"><span class="linenos">570</span></a> <span class="n">left</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-571"><a href="#L-571"><span class="linenos">571</span></a> <span class="k">for</span> <span class="n">left</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">UNION</span><span class="p">)):</span>
+</span><span id="L-572"><a href="#L-572"><span class="linenos">572</span></a> <span class="k">yield</span> <span class="n">left</span>
+</span><span id="L-573"><a href="#L-573"><span class="linenos">573</span></a>
+</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a> <span class="n">right</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-575"><a href="#L-575"><span class="linenos">575</span></a> <span class="k">for</span> <span class="n">right</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">right</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">UNION</span><span class="p">)):</span>
+</span><span id="L-576"><a href="#L-576"><span class="linenos">576</span></a> <span class="k">yield</span> <span class="n">right</span>
+</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a>
+</span><span id="L-578"><a href="#L-578"><span class="linenos">578</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">union_scopes</span> <span class="o">=</span> <span class="p">[</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">]</span>
+</span><span id="L-579"><a href="#L-579"><span class="linenos">579</span></a>
+</span><span id="L-580"><a href="#L-580"><span class="linenos">580</span></a>
+</span><span id="L-581"><a href="#L-581"><span class="linenos">581</span></a><span class="k">def</span> <span class="nf">_traverse_ctes</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-582"><a href="#L-582"><span class="linenos">582</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="L-583"><a href="#L-583"><span class="linenos">583</span></a>
+</span><span id="L-584"><a href="#L-584"><span class="linenos">584</span></a> <span class="k">for</span> <span class="n">cte</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">ctes</span><span class="p">:</span>
+</span><span id="L-585"><a href="#L-585"><span class="linenos">585</span></a> <span class="n">recursive_scope</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-586"><a href="#L-586"><span class="linenos">586</span></a>
+</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a> <span class="c1"># if the scope is a recursive cte, it must be in the form of base_case UNION recursive.</span>
+</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a> <span class="c1"># thus the recursive scope is the first section of the union.</span>
+</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a> <span class="n">with_</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;with&quot;</span><span class="p">)</span>
+</span><span id="L-590"><a href="#L-590"><span class="linenos">590</span></a> <span class="k">if</span> <span class="n">with_</span> <span class="ow">and</span> <span class="n">with_</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
+</span><span id="L-591"><a href="#L-591"><span class="linenos">591</span></a> <span class="n">union</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
+</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a>
+</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Union</span><span class="p">):</span>
+</span><span id="L-594"><a href="#L-594"><span class="linenos">594</span></a> <span class="n">recursive_scope</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">union</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
+</span><span id="L-595"><a href="#L-595"><span class="linenos">595</span></a>
+</span><span id="L-596"><a href="#L-596"><span class="linenos">596</span></a> <span class="n">child_scope</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-597"><a href="#L-597"><span class="linenos">597</span></a>
+</span><span id="L-598"><a href="#L-598"><span class="linenos">598</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
+</span><span id="L-599"><a href="#L-599"><span class="linenos">599</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
+</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">this</span><span class="p">,</span>
+</span><span id="L-601"><a href="#L-601"><span class="linenos">601</span></a> <span class="n">chain_sources</span><span class="o">=</span><span class="n">sources</span><span class="p">,</span>
+</span><span id="L-602"><a href="#L-602"><span class="linenos">602</span></a> <span class="n">outer_column_list</span><span class="o">=</span><span class="n">cte</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
+</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">CTE</span><span class="p">,</span>
+</span><span id="L-604"><a href="#L-604"><span class="linenos">604</span></a> <span class="p">)</span>
+</span><span id="L-605"><a href="#L-605"><span class="linenos">605</span></a> <span class="p">):</span>
+</span><span id="L-606"><a href="#L-606"><span class="linenos">606</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
+</span><span id="L-607"><a href="#L-607"><span class="linenos">607</span></a>
+</span><span id="L-608"><a href="#L-608"><span class="linenos">608</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">alias</span>
+</span><span id="L-609"><a href="#L-609"><span class="linenos">609</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
+</span><span id="L-610"><a href="#L-610"><span class="linenos">610</span></a>
+</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a> <span class="k">if</span> <span class="n">recursive_scope</span><span class="p">:</span>
+</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a> <span class="n">child_scope</span><span class="o">.</span><span class="n">add_source</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">recursive_scope</span><span class="p">)</span>
+</span><span id="L-613"><a href="#L-613"><span class="linenos">613</span></a>
+</span><span id="L-614"><a href="#L-614"><span class="linenos">614</span></a> <span class="c1"># append the final child_scope yielded</span>
+</span><span id="L-615"><a href="#L-615"><span class="linenos">615</span></a> <span class="k">if</span> <span class="n">child_scope</span><span class="p">:</span>
+</span><span id="L-616"><a href="#L-616"><span class="linenos">616</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">cte_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
+</span><span id="L-617"><a href="#L-617"><span class="linenos">617</span></a>
+</span><span id="L-618"><a href="#L-618"><span class="linenos">618</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
+</span><span id="L-619"><a href="#L-619"><span class="linenos">619</span></a>
</span><span id="L-620"><a href="#L-620"><span class="linenos">620</span></a>
-</span><span id="L-621"><a href="#L-621"><span class="linenos">621</span></a>
-</span><span id="L-622"><a href="#L-622"><span class="linenos">622</span></a><span class="k">def</span> <span class="nf">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
-</span><span id="L-623"><a href="#L-623"><span class="linenos">623</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
-</span><span id="L-624"><a href="#L-624"><span class="linenos">624</span></a>
-</span><span id="L-625"><a href="#L-625"><span class="linenos">625</span></a> <span class="c1"># Traverse FROMs, JOINs, and LATERALs in the order they are defined</span>
-</span><span id="L-626"><a href="#L-626"><span class="linenos">626</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
-</span><span id="L-627"><a href="#L-627"><span class="linenos">627</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;from&quot;</span><span class="p">)</span>
-</span><span id="L-628"><a href="#L-628"><span class="linenos">628</span></a> <span class="k">if</span> <span class="n">from_</span><span class="p">:</span>
-</span><span id="L-629"><a href="#L-629"><span class="linenos">629</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">from_</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
-</span><span id="L-630"><a href="#L-630"><span class="linenos">630</span></a>
-</span><span id="L-631"><a href="#L-631"><span class="linenos">631</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
-</span><span id="L-632"><a href="#L-632"><span class="linenos">632</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
-</span><span id="L-633"><a href="#L-633"><span class="linenos">633</span></a>
-</span><span id="L-634"><a href="#L-634"><span class="linenos">634</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
-</span><span id="L-635"><a href="#L-635"><span class="linenos">635</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
-</span><span id="L-636"><a href="#L-636"><span class="linenos">636</span></a>
-</span><span id="L-637"><a href="#L-637"><span class="linenos">637</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;laterals&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
+</span><span id="L-621"><a href="#L-621"><span class="linenos">621</span></a><span class="k">def</span> <span class="nf">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
+</span><span id="L-622"><a href="#L-622"><span class="linenos">622</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-623"><a href="#L-623"><span class="linenos">623</span></a><span class="sd"> We represent (tbl1 JOIN tbl2) as a Subquery, but it&#39;s not really a &quot;derived table&quot;,</span>
+</span><span id="L-624"><a href="#L-624"><span class="linenos">624</span></a><span class="sd"> as it doesn&#39;t introduce a new scope. If an alias is present, it shadows all names</span>
+</span><span id="L-625"><a href="#L-625"><span class="linenos">625</span></a><span class="sd"> under the Subquery, so that&#39;s one exception to this rule.</span>
+</span><span id="L-626"><a href="#L-626"><span class="linenos">626</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-627"><a href="#L-627"><span class="linenos">627</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">))</span>
+</span><span id="L-628"><a href="#L-628"><span class="linenos">628</span></a>
+</span><span id="L-629"><a href="#L-629"><span class="linenos">629</span></a>
+</span><span id="L-630"><a href="#L-630"><span class="linenos">630</span></a><span class="k">def</span> <span class="nf">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-631"><a href="#L-631"><span class="linenos">631</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="L-632"><a href="#L-632"><span class="linenos">632</span></a>
+</span><span id="L-633"><a href="#L-633"><span class="linenos">633</span></a> <span class="c1"># Traverse FROMs, JOINs, and LATERALs in the order they are defined</span>
+</span><span id="L-634"><a href="#L-634"><span class="linenos">634</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
+</span><span id="L-635"><a href="#L-635"><span class="linenos">635</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;from&quot;</span><span class="p">)</span>
+</span><span id="L-636"><a href="#L-636"><span class="linenos">636</span></a> <span class="k">if</span> <span class="n">from_</span><span class="p">:</span>
+</span><span id="L-637"><a href="#L-637"><span class="linenos">637</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">from_</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
</span><span id="L-638"><a href="#L-638"><span class="linenos">638</span></a>
-</span><span id="L-639"><a href="#L-639"><span class="linenos">639</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
-</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
-</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a> <span class="n">table_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span>
-</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a> <span class="n">source_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">alias_or_name</span>
-</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a>
-</span><span id="L-644"><a href="#L-644"><span class="linenos">644</span></a> <span class="k">if</span> <span class="n">table_name</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
-</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a> <span class="c1"># This is a reference to a parent source (e.g. a CTE), not an actual table, unless</span>
-</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a> <span class="c1"># it is pivoted, because then we get back a new table and hence a new source.</span>
-</span><span id="L-647"><a href="#L-647"><span class="linenos">647</span></a> <span class="n">pivots</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;pivots&quot;</span><span class="p">)</span>
-</span><span id="L-648"><a href="#L-648"><span class="linenos">648</span></a> <span class="k">if</span> <span class="n">pivots</span><span class="p">:</span>
-</span><span id="L-649"><a href="#L-649"><span class="linenos">649</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</span>
-</span><span id="L-650"><a href="#L-650"><span class="linenos">650</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-651"><a href="#L-651"><span class="linenos">651</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">table_name</span><span class="p">]</span>
-</span><span id="L-652"><a href="#L-652"><span class="linenos">652</span></a> <span class="k">elif</span> <span class="n">source_name</span> <span class="ow">in</span> <span class="n">sources</span><span class="p">:</span>
-</span><span id="L-653"><a href="#L-653"><span class="linenos">653</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">find_new_name</span><span class="p">(</span><span class="n">sources</span><span class="p">,</span> <span class="n">table_name</span><span class="p">)]</span> <span class="o">=</span> <span class="n">expression</span>
-</span><span id="L-654"><a href="#L-654"><span class="linenos">654</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-655"><a href="#L-655"><span class="linenos">655</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</span>
-</span><span id="L-656"><a href="#L-656"><span class="linenos">656</span></a>
-</span><span id="L-657"><a href="#L-657"><span class="linenos">657</span></a> <span class="c1"># Make sure to not include the joins twice</span>
-</span><span id="L-658"><a href="#L-658"><span class="linenos">658</span></a> <span class="k">if</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">:</span>
-</span><span id="L-659"><a href="#L-659"><span class="linenos">659</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
-</span><span id="L-660"><a href="#L-660"><span class="linenos">660</span></a>
-</span><span id="L-661"><a href="#L-661"><span class="linenos">661</span></a> <span class="k">continue</span>
-</span><span id="L-662"><a href="#L-662"><span class="linenos">662</span></a>
-</span><span id="L-663"><a href="#L-663"><span class="linenos">663</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DerivedTable</span><span class="p">):</span>
-</span><span id="L-664"><a href="#L-664"><span class="linenos">664</span></a> <span class="k">continue</span>
-</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a>
-</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">):</span>
-</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="n">sources</span>
-</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">UDTF</span>
-</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">udtf_scopes</span>
-</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="k">elif</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
-</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span>
-</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">derived_table_scopes</span>
-</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
-</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="c1"># Makes sure we check for possible sources in nested table constructs</span>
-</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
-</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
-</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="k">continue</span>
-</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a>
-</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
-</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
-</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="n">expression</span><span class="p">,</span>
-</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a> <span class="n">lateral_sources</span><span class="o">=</span><span class="n">lateral_sources</span><span class="p">,</span>
-</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a> <span class="n">outer_column_list</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
-</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">scope_type</span><span class="p">,</span>
-</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a> <span class="p">)</span>
-</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a> <span class="p">):</span>
-</span><span id="L-689"><a href="#L-689"><span class="linenos">689</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
-</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a>
-</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a> <span class="c1"># Tables without aliases will be set as &quot;&quot;</span>
-</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a> <span class="c1"># This shouldn&#39;t be a problem once qualify_columns runs, as it adds aliases on everything.</span>
-</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a> <span class="c1"># Until then, this means that only a single, unaliased derived table is allowed (rather,</span>
-</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a> <span class="c1"># the latest one wins.</span>
-</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">alias</span>
-</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</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="c1"># append the final child_scope yielded</span>
-</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a> <span class="n">scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
-</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
-</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a>
-</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
-</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a>
+</span><span id="L-639"><a href="#L-639"><span class="linenos">639</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
+</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
+</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a>
+</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
+</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
+</span><span id="L-644"><a href="#L-644"><span class="linenos">644</span></a>
+</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;laterals&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
+</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a>
+</span><span id="L-647"><a href="#L-647"><span class="linenos">647</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
+</span><span id="L-648"><a href="#L-648"><span class="linenos">648</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
+</span><span id="L-649"><a href="#L-649"><span class="linenos">649</span></a> <span class="n">table_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span>
+</span><span id="L-650"><a href="#L-650"><span class="linenos">650</span></a> <span class="n">source_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">alias_or_name</span>
+</span><span id="L-651"><a href="#L-651"><span class="linenos">651</span></a>
+</span><span id="L-652"><a href="#L-652"><span class="linenos">652</span></a> <span class="k">if</span> <span class="n">table_name</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
+</span><span id="L-653"><a href="#L-653"><span class="linenos">653</span></a> <span class="c1"># This is a reference to a parent source (e.g. a CTE), not an actual table, unless</span>
+</span><span id="L-654"><a href="#L-654"><span class="linenos">654</span></a> <span class="c1"># it is pivoted, because then we get back a new table and hence a new source.</span>
+</span><span id="L-655"><a href="#L-655"><span class="linenos">655</span></a> <span class="n">pivots</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;pivots&quot;</span><span class="p">)</span>
+</span><span id="L-656"><a href="#L-656"><span class="linenos">656</span></a> <span class="k">if</span> <span class="n">pivots</span><span class="p">:</span>
+</span><span id="L-657"><a href="#L-657"><span class="linenos">657</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</span>
+</span><span id="L-658"><a href="#L-658"><span class="linenos">658</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-659"><a href="#L-659"><span class="linenos">659</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">table_name</span><span class="p">]</span>
+</span><span id="L-660"><a href="#L-660"><span class="linenos">660</span></a> <span class="k">elif</span> <span class="n">source_name</span> <span class="ow">in</span> <span class="n">sources</span><span class="p">:</span>
+</span><span id="L-661"><a href="#L-661"><span class="linenos">661</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">find_new_name</span><span class="p">(</span><span class="n">sources</span><span class="p">,</span> <span class="n">table_name</span><span class="p">)]</span> <span class="o">=</span> <span class="n">expression</span>
+</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">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</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"># Make sure to not include the joins twice</span>
+</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a> <span class="k">if</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">:</span>
+</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
+</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a>
+</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="k">continue</span>
+</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a>
+</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DerivedTable</span><span class="p">):</span>
+</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a> <span class="k">continue</span>
+</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a>
+</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">):</span>
+</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="n">sources</span>
+</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">UDTF</span>
+</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">udtf_scopes</span>
+</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="k">elif</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
+</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span>
+</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">derived_table_scopes</span>
+</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
+</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a> <span class="c1"># Makes sure we check for possible sources in nested table constructs</span>
+</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
+</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
+</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a> <span class="k">continue</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="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
+</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
+</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a> <span class="n">expression</span><span class="p">,</span>
+</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a> <span class="n">lateral_sources</span><span class="o">=</span><span class="n">lateral_sources</span><span class="p">,</span>
+</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a> <span class="n">outer_column_list</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
+</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">scope_type</span><span class="p">,</span>
+</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a> <span class="p">)</span>
+</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a> <span class="p">):</span>
+</span><span id="L-697"><a href="#L-697"><span class="linenos">697</span></a> <span class="k">yield</span> <span class="n">child_scope</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="c1"># Tables without aliases will be set as &quot;&quot;</span>
+</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="c1"># This shouldn&#39;t be a problem once qualify_columns runs, as it adds aliases on everything.</span>
+</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="c1"># Until then, this means that only a single, unaliased derived table is allowed (rather,</span>
+</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="c1"># the latest one wins.</span>
+</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a>
-</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a><span class="k">def</span> <span class="nf">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</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">subquery</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">subqueries</span><span class="p">:</span>
-</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">subquery</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">SUBQUERY</span><span class="p">)):</span>
-</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
-</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
-</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">subquery_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
-</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a>
-</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">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
-</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
-</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a><span class="sd"> nodes that start child scopes.</span>
-</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a>
-</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a><span class="sd"> Args:</span>
-</span><span id="L-720"><a href="#L-720"><span class="linenos">720</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="L-721"><a href="#L-721"><span class="linenos">721</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
-</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
-</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a>
-</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a><span class="sd"> Yields:</span>
-</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</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="c1"># We&#39;ll use this variable to pass state into the dfs generator.</span>
-</span><span id="L-728"><a href="#L-728"><span class="linenos">728</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
-</span><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a>
-</span><span id="L-731"><a href="#L-731"><span class="linenos">731</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="n">prune</span><span class="p">):</span>
-</span><span id="L-732"><a href="#L-732"><span class="linenos">732</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="L-733"><a href="#L-733"><span class="linenos">733</span></a>
-</span><span id="L-734"><a href="#L-734"><span class="linenos">734</span></a> <span class="k">yield</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span>
-</span><span id="L-735"><a href="#L-735"><span class="linenos">735</span></a>
-</span><span id="L-736"><a href="#L-736"><span class="linenos">736</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
-</span><span id="L-737"><a href="#L-737"><span class="linenos">737</span></a> <span class="k">continue</span>
-</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a> <span class="k">if</span> <span class="p">(</span>
-</span><span id="L-739"><a href="#L-739"><span class="linenos">739</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
-</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a> <span class="ow">or</span> <span class="p">(</span>
-</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
-</span><span id="L-742"><a href="#L-742"><span class="linenos">742</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
-</span><span id="L-743"><a href="#L-743"><span class="linenos">743</span></a> <span class="ow">and</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
-</span><span id="L-744"><a href="#L-744"><span class="linenos">744</span></a> <span class="p">)</span>
-</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)</span>
-</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">)</span>
-</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a> <span class="p">):</span>
-</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">True</span>
+</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a> <span class="c1"># append the final child_scope yielded</span>
+</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
+</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</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="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</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><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a><span class="k">def</span> <span class="nf">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a> <span class="k">for</span> <span class="n">subquery</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">subqueries</span><span class="p">:</span>
+</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">subquery</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">SUBQUERY</span><span class="p">)):</span>
+</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
+</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
+</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">subquery_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</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><span id="L-721"><a href="#L-721"><span class="linenos">721</span></a><span class="k">def</span> <span class="nf">_traverse_udtfs</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">):</span>
+</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
+</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">):</span>
+</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">]</span>
+</span><span id="L-726"><a href="#L-726"><span class="linenos">726</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-727"><a href="#L-727"><span class="linenos">727</span></a> <span class="n">expressions</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><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
+</span><span id="L-731"><a href="#L-731"><span class="linenos">731</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span> <span class="ow">and</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
+</span><span id="L-732"><a href="#L-732"><span class="linenos">732</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-733"><a href="#L-733"><span class="linenos">733</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
+</span><span id="L-734"><a href="#L-734"><span class="linenos">734</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
+</span><span id="L-735"><a href="#L-735"><span class="linenos">735</span></a> <span class="n">expression</span><span class="p">,</span>
+</span><span id="L-736"><a href="#L-736"><span class="linenos">736</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span><span class="p">,</span>
+</span><span id="L-737"><a href="#L-737"><span class="linenos">737</span></a> <span class="n">outer_column_list</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
+</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a> <span class="p">)</span>
+</span><span id="L-739"><a href="#L-739"><span class="linenos">739</span></a> <span class="p">):</span>
+</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
+</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
+</span><span id="L-742"><a href="#L-742"><span class="linenos">742</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
+</span><span id="L-743"><a href="#L-743"><span class="linenos">743</span></a>
+</span><span id="L-744"><a href="#L-744"><span class="linenos">744</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">derived_table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
+</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
+</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a>
+</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
+</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a>
</span><span id="L-749"><a href="#L-749"><span class="linenos">749</span></a>
-</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
-</span><span id="L-751"><a href="#L-751"><span class="linenos">751</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
-</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="s2">&quot;laterals&quot;</span><span class="p">,</span> <span class="s2">&quot;pivots&quot;</span><span class="p">):</span>
-</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
-</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
+</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a><span class="k">def</span> <span class="nf">_traverse_ddl</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
+</span><span id="L-751"><a href="#L-751"><span class="linenos">751</span></a> <span class="k">yield from</span> <span class="n">_traverse_ctes</span><span class="p">(</span><span class="n">scope</span><span class="p">)</span>
+</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a>
+</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a> <span class="n">query_scope</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
+</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span><span class="p">,</span> <span class="n">chain_sources</span><span class="o">=</span><span class="n">scope</span><span class="o">.</span><span class="n">sources</span>
+</span><span id="L-755"><a href="#L-755"><span class="linenos">755</span></a> <span class="p">)</span>
+</span><span id="L-756"><a href="#L-756"><span class="linenos">756</span></a> <span class="n">query_scope</span><span class="o">.</span><span class="n">_collect</span><span class="p">()</span>
+</span><span id="L-757"><a href="#L-757"><span class="linenos">757</span></a> <span class="n">query_scope</span><span class="o">.</span><span class="n">_ctes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">ctes</span> <span class="o">+</span> <span class="n">query_scope</span><span class="o">.</span><span class="n">_ctes</span>
+</span><span id="L-758"><a href="#L-758"><span class="linenos">758</span></a>
+</span><span id="L-759"><a href="#L-759"><span class="linenos">759</span></a> <span class="k">yield from</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">query_scope</span><span class="p">)</span>
+</span><span id="L-760"><a href="#L-760"><span class="linenos">760</span></a>
+</span><span id="L-761"><a href="#L-761"><span class="linenos">761</span></a>
+</span><span id="L-762"><a href="#L-762"><span class="linenos">762</span></a><span class="k">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+</span><span id="L-763"><a href="#L-763"><span class="linenos">763</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-764"><a href="#L-764"><span class="linenos">764</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
+</span><span id="L-765"><a href="#L-765"><span class="linenos">765</span></a><span class="sd"> nodes that start child scopes.</span>
+</span><span id="L-766"><a href="#L-766"><span class="linenos">766</span></a>
+</span><span id="L-767"><a href="#L-767"><span class="linenos">767</span></a><span class="sd"> Args:</span>
+</span><span id="L-768"><a href="#L-768"><span class="linenos">768</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="L-769"><a href="#L-769"><span class="linenos">769</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
+</span><span id="L-770"><a href="#L-770"><span class="linenos">770</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
+</span><span id="L-771"><a href="#L-771"><span class="linenos">771</span></a>
+</span><span id="L-772"><a href="#L-772"><span class="linenos">772</span></a><span class="sd"> Yields:</span>
+</span><span id="L-773"><a href="#L-773"><span class="linenos">773</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
+</span><span id="L-774"><a href="#L-774"><span class="linenos">774</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-775"><a href="#L-775"><span class="linenos">775</span></a> <span class="c1"># We&#39;ll use this variable to pass state into the dfs generator.</span>
+</span><span id="L-776"><a href="#L-776"><span class="linenos">776</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
+</span><span id="L-777"><a href="#L-777"><span class="linenos">777</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="L-778"><a href="#L-778"><span class="linenos">778</span></a>
+</span><span id="L-779"><a href="#L-779"><span class="linenos">779</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="n">prune</span><span class="p">):</span>
+</span><span id="L-780"><a href="#L-780"><span class="linenos">780</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="L-781"><a href="#L-781"><span class="linenos">781</span></a>
+</span><span id="L-782"><a href="#L-782"><span class="linenos">782</span></a> <span class="k">yield</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span>
+</span><span id="L-783"><a href="#L-783"><span class="linenos">783</span></a>
+</span><span id="L-784"><a href="#L-784"><span class="linenos">784</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
+</span><span id="L-785"><a href="#L-785"><span class="linenos">785</span></a> <span class="k">continue</span>
+</span><span id="L-786"><a href="#L-786"><span class="linenos">786</span></a> <span class="k">if</span> <span class="p">(</span>
+</span><span id="L-787"><a href="#L-787"><span class="linenos">787</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
+</span><span id="L-788"><a href="#L-788"><span class="linenos">788</span></a> <span class="ow">or</span> <span class="p">(</span>
+</span><span id="L-789"><a href="#L-789"><span class="linenos">789</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
+</span><span id="L-790"><a href="#L-790"><span class="linenos">790</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
+</span><span id="L-791"><a href="#L-791"><span class="linenos">791</span></a> <span class="ow">and</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+</span><span id="L-792"><a href="#L-792"><span class="linenos">792</span></a> <span class="p">)</span>
+</span><span id="L-793"><a href="#L-793"><span class="linenos">793</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)</span>
+</span><span id="L-794"><a href="#L-794"><span class="linenos">794</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">)</span>
+</span><span id="L-795"><a href="#L-795"><span class="linenos">795</span></a> <span class="p">):</span>
+</span><span id="L-796"><a href="#L-796"><span class="linenos">796</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">True</span>
+</span><span id="L-797"><a href="#L-797"><span class="linenos">797</span></a>
+</span><span id="L-798"><a href="#L-798"><span class="linenos">798</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
+</span><span id="L-799"><a href="#L-799"><span class="linenos">799</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
+</span><span id="L-800"><a href="#L-800"><span class="linenos">800</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="s2">&quot;laterals&quot;</span><span class="p">,</span> <span class="s2">&quot;pivots&quot;</span><span class="p">):</span>
+</span><span id="L-801"><a href="#L-801"><span class="linenos">801</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
+</span><span id="L-802"><a href="#L-802"><span class="linenos">802</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
</span></pre></div>
@@ -1534,53 +1582,56 @@
</span><span id="Scope-436"><a href="#Scope-436"><span class="linenos">436</span></a> <span class="nd">@property</span>
</span><span id="Scope-437"><a href="#Scope-437"><span class="linenos">437</span></a> <span class="k">def</span> <span class="nf">is_correlated_subquery</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Scope-438"><a href="#Scope-438"><span class="linenos">438</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Determine if this scope is a correlated subquery&quot;&quot;&quot;</span>
-</span><span id="Scope-439"><a href="#Scope-439"><span class="linenos">439</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">is_subquery</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">external_columns</span><span class="p">)</span>
-</span><span id="Scope-440"><a href="#Scope-440"><span class="linenos">440</span></a>
-</span><span id="Scope-441"><a href="#Scope-441"><span class="linenos">441</span></a> <span class="k">def</span> <span class="nf">rename_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">old_name</span><span class="p">,</span> <span class="n">new_name</span><span class="p">):</span>
-</span><span id="Scope-442"><a href="#Scope-442"><span class="linenos">442</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Rename a source in this scope&quot;&quot;&quot;</span>
-</span><span id="Scope-443"><a href="#Scope-443"><span class="linenos">443</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">old_name</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="p">[])</span>
-</span><span id="Scope-444"><a href="#Scope-444"><span class="linenos">444</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">columns</span>
-</span><span id="Scope-445"><a href="#Scope-445"><span class="linenos">445</span></a>
-</span><span id="Scope-446"><a href="#Scope-446"><span class="linenos">446</span></a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
-</span><span id="Scope-447"><a href="#Scope-447"><span class="linenos">447</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a source to this scope&quot;&quot;&quot;</span>
-</span><span id="Scope-448"><a href="#Scope-448"><span class="linenos">448</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">source</span>
-</span><span id="Scope-449"><a href="#Scope-449"><span class="linenos">449</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
-</span><span id="Scope-450"><a href="#Scope-450"><span class="linenos">450</span></a>
-</span><span id="Scope-451"><a href="#Scope-451"><span class="linenos">451</span></a> <span class="k">def</span> <span class="nf">remove_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
-</span><span id="Scope-452"><a href="#Scope-452"><span class="linenos">452</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a source from this scope&quot;&quot;&quot;</span>
-</span><span id="Scope-453"><a href="#Scope-453"><span class="linenos">453</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
-</span><span id="Scope-454"><a href="#Scope-454"><span class="linenos">454</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
-</span><span id="Scope-455"><a href="#Scope-455"><span class="linenos">455</span></a>
-</span><span id="Scope-456"><a href="#Scope-456"><span class="linenos">456</span></a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="Scope-457"><a href="#Scope-457"><span class="linenos">457</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;Scope&lt;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span><span class="si">}</span><span class="s2">&gt;&quot;</span>
+</span><span id="Scope-439"><a href="#Scope-439"><span class="linenos">439</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span>
+</span><span id="Scope-440"><a href="#Scope-440"><span class="linenos">440</span></a> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">is_subquery</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">)))</span>
+</span><span id="Scope-441"><a href="#Scope-441"><span class="linenos">441</span></a> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">external_columns</span>
+</span><span id="Scope-442"><a href="#Scope-442"><span class="linenos">442</span></a> <span class="p">)</span>
+</span><span id="Scope-443"><a href="#Scope-443"><span class="linenos">443</span></a>
+</span><span id="Scope-444"><a href="#Scope-444"><span class="linenos">444</span></a> <span class="k">def</span> <span class="nf">rename_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">old_name</span><span class="p">,</span> <span class="n">new_name</span><span class="p">):</span>
+</span><span id="Scope-445"><a href="#Scope-445"><span class="linenos">445</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Rename a source in this scope&quot;&quot;&quot;</span>
+</span><span id="Scope-446"><a href="#Scope-446"><span class="linenos">446</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">old_name</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="p">[])</span>
+</span><span id="Scope-447"><a href="#Scope-447"><span class="linenos">447</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">columns</span>
+</span><span id="Scope-448"><a href="#Scope-448"><span class="linenos">448</span></a>
+</span><span id="Scope-449"><a href="#Scope-449"><span class="linenos">449</span></a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
+</span><span id="Scope-450"><a href="#Scope-450"><span class="linenos">450</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a source to this scope&quot;&quot;&quot;</span>
+</span><span id="Scope-451"><a href="#Scope-451"><span class="linenos">451</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">source</span>
+</span><span id="Scope-452"><a href="#Scope-452"><span class="linenos">452</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
+</span><span id="Scope-453"><a href="#Scope-453"><span class="linenos">453</span></a>
+</span><span id="Scope-454"><a href="#Scope-454"><span class="linenos">454</span></a> <span class="k">def</span> <span class="nf">remove_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+</span><span id="Scope-455"><a href="#Scope-455"><span class="linenos">455</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a source from this scope&quot;&quot;&quot;</span>
+</span><span id="Scope-456"><a href="#Scope-456"><span class="linenos">456</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+</span><span id="Scope-457"><a href="#Scope-457"><span class="linenos">457</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="Scope-458"><a href="#Scope-458"><span class="linenos">458</span></a>
-</span><span id="Scope-459"><a href="#Scope-459"><span class="linenos">459</span></a> <span class="k">def</span> <span class="nf">traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="Scope-460"><a href="#Scope-460"><span class="linenos">460</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="Scope-461"><a href="#Scope-461"><span class="linenos">461</span></a><span class="sd"> Traverse the scope tree from this node.</span>
-</span><span id="Scope-462"><a href="#Scope-462"><span class="linenos">462</span></a>
-</span><span id="Scope-463"><a href="#Scope-463"><span class="linenos">463</span></a><span class="sd"> Yields:</span>
-</span><span id="Scope-464"><a href="#Scope-464"><span class="linenos">464</span></a><span class="sd"> Scope: scope instances in depth-first-search post-order</span>
-</span><span id="Scope-465"><a href="#Scope-465"><span class="linenos">465</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="Scope-466"><a href="#Scope-466"><span class="linenos">466</span></a> <span class="k">for</span> <span class="n">child_scope</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="Scope-467"><a href="#Scope-467"><span class="linenos">467</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">cte_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_scopes</span>
-</span><span id="Scope-468"><a href="#Scope-468"><span class="linenos">468</span></a> <span class="p">):</span>
-</span><span id="Scope-469"><a href="#Scope-469"><span class="linenos">469</span></a> <span class="k">yield from</span> <span class="n">child_scope</span><span class="o">.</span><span class="n">traverse</span><span class="p">()</span>
-</span><span id="Scope-470"><a href="#Scope-470"><span class="linenos">470</span></a> <span class="k">yield</span> <span class="bp">self</span>
-</span><span id="Scope-471"><a href="#Scope-471"><span class="linenos">471</span></a>
-</span><span id="Scope-472"><a href="#Scope-472"><span class="linenos">472</span></a> <span class="k">def</span> <span class="nf">ref_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="Scope-473"><a href="#Scope-473"><span class="linenos">473</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="Scope-474"><a href="#Scope-474"><span class="linenos">474</span></a><span class="sd"> Count the number of times each scope in this tree is referenced.</span>
-</span><span id="Scope-475"><a href="#Scope-475"><span class="linenos">475</span></a>
-</span><span id="Scope-476"><a href="#Scope-476"><span class="linenos">476</span></a><span class="sd"> Returns:</span>
-</span><span id="Scope-477"><a href="#Scope-477"><span class="linenos">477</span></a><span class="sd"> dict[int, int]: Mapping of Scope instance ID to reference count</span>
-</span><span id="Scope-478"><a href="#Scope-478"><span class="linenos">478</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="Scope-479"><a href="#Scope-479"><span class="linenos">479</span></a> <span class="n">scope_ref_count</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span>
-</span><span id="Scope-480"><a href="#Scope-480"><span class="linenos">480</span></a>
-</span><span id="Scope-481"><a href="#Scope-481"><span class="linenos">481</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">traverse</span><span class="p">():</span>
-</span><span id="Scope-482"><a href="#Scope-482"><span class="linenos">482</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
-</span><span id="Scope-483"><a href="#Scope-483"><span class="linenos">483</span></a> <span class="n">scope_ref_count</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">source</span><span class="p">)]</span> <span class="o">+=</span> <span class="mi">1</span>
-</span><span id="Scope-484"><a href="#Scope-484"><span class="linenos">484</span></a>
-</span><span id="Scope-485"><a href="#Scope-485"><span class="linenos">485</span></a> <span class="k">return</span> <span class="n">scope_ref_count</span>
+</span><span id="Scope-459"><a href="#Scope-459"><span class="linenos">459</span></a> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="Scope-460"><a href="#Scope-460"><span class="linenos">460</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;Scope&lt;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">sql</span><span class="p">()</span><span class="si">}</span><span class="s2">&gt;&quot;</span>
+</span><span id="Scope-461"><a href="#Scope-461"><span class="linenos">461</span></a>
+</span><span id="Scope-462"><a href="#Scope-462"><span class="linenos">462</span></a> <span class="k">def</span> <span class="nf">traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="Scope-463"><a href="#Scope-463"><span class="linenos">463</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="Scope-464"><a href="#Scope-464"><span class="linenos">464</span></a><span class="sd"> Traverse the scope tree from this node.</span>
+</span><span id="Scope-465"><a href="#Scope-465"><span class="linenos">465</span></a>
+</span><span id="Scope-466"><a href="#Scope-466"><span class="linenos">466</span></a><span class="sd"> Yields:</span>
+</span><span id="Scope-467"><a href="#Scope-467"><span class="linenos">467</span></a><span class="sd"> Scope: scope instances in depth-first-search post-order</span>
+</span><span id="Scope-468"><a href="#Scope-468"><span class="linenos">468</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="Scope-469"><a href="#Scope-469"><span class="linenos">469</span></a> <span class="k">for</span> <span class="n">child_scope</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="Scope-470"><a href="#Scope-470"><span class="linenos">470</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">cte_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_scopes</span>
+</span><span id="Scope-471"><a href="#Scope-471"><span class="linenos">471</span></a> <span class="p">):</span>
+</span><span id="Scope-472"><a href="#Scope-472"><span class="linenos">472</span></a> <span class="k">yield from</span> <span class="n">child_scope</span><span class="o">.</span><span class="n">traverse</span><span class="p">()</span>
+</span><span id="Scope-473"><a href="#Scope-473"><span class="linenos">473</span></a> <span class="k">yield</span> <span class="bp">self</span>
+</span><span id="Scope-474"><a href="#Scope-474"><span class="linenos">474</span></a>
+</span><span id="Scope-475"><a href="#Scope-475"><span class="linenos">475</span></a> <span class="k">def</span> <span class="nf">ref_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="Scope-476"><a href="#Scope-476"><span class="linenos">476</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="Scope-477"><a href="#Scope-477"><span class="linenos">477</span></a><span class="sd"> Count the number of times each scope in this tree is referenced.</span>
+</span><span id="Scope-478"><a href="#Scope-478"><span class="linenos">478</span></a>
+</span><span id="Scope-479"><a href="#Scope-479"><span class="linenos">479</span></a><span class="sd"> Returns:</span>
+</span><span id="Scope-480"><a href="#Scope-480"><span class="linenos">480</span></a><span class="sd"> dict[int, int]: Mapping of Scope instance ID to reference count</span>
+</span><span id="Scope-481"><a href="#Scope-481"><span class="linenos">481</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="Scope-482"><a href="#Scope-482"><span class="linenos">482</span></a> <span class="n">scope_ref_count</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span>
+</span><span id="Scope-483"><a href="#Scope-483"><span class="linenos">483</span></a>
+</span><span id="Scope-484"><a href="#Scope-484"><span class="linenos">484</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">traverse</span><span class="p">():</span>
+</span><span id="Scope-485"><a href="#Scope-485"><span class="linenos">485</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+</span><span id="Scope-486"><a href="#Scope-486"><span class="linenos">486</span></a> <span class="n">scope_ref_count</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">source</span><span class="p">)]</span> <span class="o">+=</span> <span class="mi">1</span>
+</span><span id="Scope-487"><a href="#Scope-487"><span class="linenos">487</span></a>
+</span><span id="Scope-488"><a href="#Scope-488"><span class="linenos">488</span></a> <span class="k">return</span> <span class="n">scope_ref_count</span>
</span></pre></div>
@@ -2399,10 +2450,10 @@ table only becomes a selected source if it's included in a FROM or JOIN clause.<
</div>
<a class="headerlink" href="#Scope.rename_source"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.rename_source-441"><a href="#Scope.rename_source-441"><span class="linenos">441</span></a> <span class="k">def</span> <span class="nf">rename_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">old_name</span><span class="p">,</span> <span class="n">new_name</span><span class="p">):</span>
-</span><span id="Scope.rename_source-442"><a href="#Scope.rename_source-442"><span class="linenos">442</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Rename a source in this scope&quot;&quot;&quot;</span>
-</span><span id="Scope.rename_source-443"><a href="#Scope.rename_source-443"><span class="linenos">443</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">old_name</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="p">[])</span>
-</span><span id="Scope.rename_source-444"><a href="#Scope.rename_source-444"><span class="linenos">444</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">columns</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.rename_source-444"><a href="#Scope.rename_source-444"><span class="linenos">444</span></a> <span class="k">def</span> <span class="nf">rename_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">old_name</span><span class="p">,</span> <span class="n">new_name</span><span class="p">):</span>
+</span><span id="Scope.rename_source-445"><a href="#Scope.rename_source-445"><span class="linenos">445</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Rename a source in this scope&quot;&quot;&quot;</span>
+</span><span id="Scope.rename_source-446"><a href="#Scope.rename_source-446"><span class="linenos">446</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">old_name</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="p">[])</span>
+</span><span id="Scope.rename_source-447"><a href="#Scope.rename_source-447"><span class="linenos">447</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">columns</span>
</span></pre></div>
@@ -2422,10 +2473,10 @@ table only becomes a selected source if it's included in a FROM or JOIN clause.<
</div>
<a class="headerlink" href="#Scope.add_source"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.add_source-446"><a href="#Scope.add_source-446"><span class="linenos">446</span></a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
-</span><span id="Scope.add_source-447"><a href="#Scope.add_source-447"><span class="linenos">447</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a source to this scope&quot;&quot;&quot;</span>
-</span><span id="Scope.add_source-448"><a href="#Scope.add_source-448"><span class="linenos">448</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">source</span>
-</span><span id="Scope.add_source-449"><a href="#Scope.add_source-449"><span class="linenos">449</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.add_source-449"><a href="#Scope.add_source-449"><span class="linenos">449</span></a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span><span class="p">):</span>
+</span><span id="Scope.add_source-450"><a href="#Scope.add_source-450"><span class="linenos">450</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a source to this scope&quot;&quot;&quot;</span>
+</span><span id="Scope.add_source-451"><a href="#Scope.add_source-451"><span class="linenos">451</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">source</span>
+</span><span id="Scope.add_source-452"><a href="#Scope.add_source-452"><span class="linenos">452</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span></pre></div>
@@ -2445,10 +2496,10 @@ table only becomes a selected source if it's included in a FROM or JOIN clause.<
</div>
<a class="headerlink" href="#Scope.remove_source"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.remove_source-451"><a href="#Scope.remove_source-451"><span class="linenos">451</span></a> <span class="k">def</span> <span class="nf">remove_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
-</span><span id="Scope.remove_source-452"><a href="#Scope.remove_source-452"><span class="linenos">452</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a source from this scope&quot;&quot;&quot;</span>
-</span><span id="Scope.remove_source-453"><a href="#Scope.remove_source-453"><span class="linenos">453</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
-</span><span id="Scope.remove_source-454"><a href="#Scope.remove_source-454"><span class="linenos">454</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.remove_source-454"><a href="#Scope.remove_source-454"><span class="linenos">454</span></a> <span class="k">def</span> <span class="nf">remove_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+</span><span id="Scope.remove_source-455"><a href="#Scope.remove_source-455"><span class="linenos">455</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a source from this scope&quot;&quot;&quot;</span>
+</span><span id="Scope.remove_source-456"><a href="#Scope.remove_source-456"><span class="linenos">456</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+</span><span id="Scope.remove_source-457"><a href="#Scope.remove_source-457"><span class="linenos">457</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span></pre></div>
@@ -2468,18 +2519,18 @@ table only becomes a selected source if it's included in a FROM or JOIN clause.<
</div>
<a class="headerlink" href="#Scope.traverse"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.traverse-459"><a href="#Scope.traverse-459"><span class="linenos">459</span></a> <span class="k">def</span> <span class="nf">traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="Scope.traverse-460"><a href="#Scope.traverse-460"><span class="linenos">460</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="Scope.traverse-461"><a href="#Scope.traverse-461"><span class="linenos">461</span></a><span class="sd"> Traverse the scope tree from this node.</span>
-</span><span id="Scope.traverse-462"><a href="#Scope.traverse-462"><span class="linenos">462</span></a>
-</span><span id="Scope.traverse-463"><a href="#Scope.traverse-463"><span class="linenos">463</span></a><span class="sd"> Yields:</span>
-</span><span id="Scope.traverse-464"><a href="#Scope.traverse-464"><span class="linenos">464</span></a><span class="sd"> Scope: scope instances in depth-first-search post-order</span>
-</span><span id="Scope.traverse-465"><a href="#Scope.traverse-465"><span class="linenos">465</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="Scope.traverse-466"><a href="#Scope.traverse-466"><span class="linenos">466</span></a> <span class="k">for</span> <span class="n">child_scope</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="Scope.traverse-467"><a href="#Scope.traverse-467"><span class="linenos">467</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">cte_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_scopes</span>
-</span><span id="Scope.traverse-468"><a href="#Scope.traverse-468"><span class="linenos">468</span></a> <span class="p">):</span>
-</span><span id="Scope.traverse-469"><a href="#Scope.traverse-469"><span class="linenos">469</span></a> <span class="k">yield from</span> <span class="n">child_scope</span><span class="o">.</span><span class="n">traverse</span><span class="p">()</span>
-</span><span id="Scope.traverse-470"><a href="#Scope.traverse-470"><span class="linenos">470</span></a> <span class="k">yield</span> <span class="bp">self</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.traverse-462"><a href="#Scope.traverse-462"><span class="linenos">462</span></a> <span class="k">def</span> <span class="nf">traverse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="Scope.traverse-463"><a href="#Scope.traverse-463"><span class="linenos">463</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="Scope.traverse-464"><a href="#Scope.traverse-464"><span class="linenos">464</span></a><span class="sd"> Traverse the scope tree from this node.</span>
+</span><span id="Scope.traverse-465"><a href="#Scope.traverse-465"><span class="linenos">465</span></a>
+</span><span id="Scope.traverse-466"><a href="#Scope.traverse-466"><span class="linenos">466</span></a><span class="sd"> Yields:</span>
+</span><span id="Scope.traverse-467"><a href="#Scope.traverse-467"><span class="linenos">467</span></a><span class="sd"> Scope: scope instances in depth-first-search post-order</span>
+</span><span id="Scope.traverse-468"><a href="#Scope.traverse-468"><span class="linenos">468</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="Scope.traverse-469"><a href="#Scope.traverse-469"><span class="linenos">469</span></a> <span class="k">for</span> <span class="n">child_scope</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="Scope.traverse-470"><a href="#Scope.traverse-470"><span class="linenos">470</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">cte_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_scopes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_scopes</span>
+</span><span id="Scope.traverse-471"><a href="#Scope.traverse-471"><span class="linenos">471</span></a> <span class="p">):</span>
+</span><span id="Scope.traverse-472"><a href="#Scope.traverse-472"><span class="linenos">472</span></a> <span class="k">yield from</span> <span class="n">child_scope</span><span class="o">.</span><span class="n">traverse</span><span class="p">()</span>
+</span><span id="Scope.traverse-473"><a href="#Scope.traverse-473"><span class="linenos">473</span></a> <span class="k">yield</span> <span class="bp">self</span>
</span></pre></div>
@@ -2505,20 +2556,20 @@ table only becomes a selected source if it's included in a FROM or JOIN clause.<
</div>
<a class="headerlink" href="#Scope.ref_count"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.ref_count-472"><a href="#Scope.ref_count-472"><span class="linenos">472</span></a> <span class="k">def</span> <span class="nf">ref_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-</span><span id="Scope.ref_count-473"><a href="#Scope.ref_count-473"><span class="linenos">473</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="Scope.ref_count-474"><a href="#Scope.ref_count-474"><span class="linenos">474</span></a><span class="sd"> Count the number of times each scope in this tree is referenced.</span>
-</span><span id="Scope.ref_count-475"><a href="#Scope.ref_count-475"><span class="linenos">475</span></a>
-</span><span id="Scope.ref_count-476"><a href="#Scope.ref_count-476"><span class="linenos">476</span></a><span class="sd"> Returns:</span>
-</span><span id="Scope.ref_count-477"><a href="#Scope.ref_count-477"><span class="linenos">477</span></a><span class="sd"> dict[int, int]: Mapping of Scope instance ID to reference count</span>
-</span><span id="Scope.ref_count-478"><a href="#Scope.ref_count-478"><span class="linenos">478</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="Scope.ref_count-479"><a href="#Scope.ref_count-479"><span class="linenos">479</span></a> <span class="n">scope_ref_count</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span>
-</span><span id="Scope.ref_count-480"><a href="#Scope.ref_count-480"><span class="linenos">480</span></a>
-</span><span id="Scope.ref_count-481"><a href="#Scope.ref_count-481"><span class="linenos">481</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">traverse</span><span class="p">():</span>
-</span><span id="Scope.ref_count-482"><a href="#Scope.ref_count-482"><span class="linenos">482</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
-</span><span id="Scope.ref_count-483"><a href="#Scope.ref_count-483"><span class="linenos">483</span></a> <span class="n">scope_ref_count</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">source</span><span class="p">)]</span> <span class="o">+=</span> <span class="mi">1</span>
-</span><span id="Scope.ref_count-484"><a href="#Scope.ref_count-484"><span class="linenos">484</span></a>
-</span><span id="Scope.ref_count-485"><a href="#Scope.ref_count-485"><span class="linenos">485</span></a> <span class="k">return</span> <span class="n">scope_ref_count</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="Scope.ref_count-475"><a href="#Scope.ref_count-475"><span class="linenos">475</span></a> <span class="k">def</span> <span class="nf">ref_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+</span><span id="Scope.ref_count-476"><a href="#Scope.ref_count-476"><span class="linenos">476</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="Scope.ref_count-477"><a href="#Scope.ref_count-477"><span class="linenos">477</span></a><span class="sd"> Count the number of times each scope in this tree is referenced.</span>
+</span><span id="Scope.ref_count-478"><a href="#Scope.ref_count-478"><span class="linenos">478</span></a>
+</span><span id="Scope.ref_count-479"><a href="#Scope.ref_count-479"><span class="linenos">479</span></a><span class="sd"> Returns:</span>
+</span><span id="Scope.ref_count-480"><a href="#Scope.ref_count-480"><span class="linenos">480</span></a><span class="sd"> dict[int, int]: Mapping of Scope instance ID to reference count</span>
+</span><span id="Scope.ref_count-481"><a href="#Scope.ref_count-481"><span class="linenos">481</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="Scope.ref_count-482"><a href="#Scope.ref_count-482"><span class="linenos">482</span></a> <span class="n">scope_ref_count</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="mi">0</span><span class="p">)</span>
+</span><span id="Scope.ref_count-483"><a href="#Scope.ref_count-483"><span class="linenos">483</span></a>
+</span><span id="Scope.ref_count-484"><a href="#Scope.ref_count-484"><span class="linenos">484</span></a> <span class="k">for</span> <span class="n">scope</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">traverse</span><span class="p">():</span>
+</span><span id="Scope.ref_count-485"><a href="#Scope.ref_count-485"><span class="linenos">485</span></a> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+</span><span id="Scope.ref_count-486"><a href="#Scope.ref_count-486"><span class="linenos">486</span></a> <span class="n">scope_ref_count</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">source</span><span class="p">)]</span> <span class="o">+=</span> <span class="mi">1</span>
+</span><span id="Scope.ref_count-487"><a href="#Scope.ref_count-487"><span class="linenos">487</span></a>
+</span><span id="Scope.ref_count-488"><a href="#Scope.ref_count-488"><span class="linenos">488</span></a> <span class="k">return</span> <span class="n">scope_ref_count</span>
</span></pre></div>
@@ -2545,38 +2596,41 @@ table only becomes a selected source if it's included in a FROM or JOIN clause.<
</div>
<a class="headerlink" href="#traverse_scope"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="traverse_scope-488"><a href="#traverse_scope-488"><span class="linenos">488</span></a><span class="k">def</span> <span class="nf">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
-</span><span id="traverse_scope-489"><a href="#traverse_scope-489"><span class="linenos">489</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="traverse_scope-490"><a href="#traverse_scope-490"><span class="linenos">490</span></a><span class="sd"> Traverse an expression by it&#39;s &quot;scopes&quot;.</span>
-</span><span id="traverse_scope-491"><a href="#traverse_scope-491"><span class="linenos">491</span></a>
-</span><span id="traverse_scope-492"><a href="#traverse_scope-492"><span class="linenos">492</span></a><span class="sd"> &quot;Scope&quot; represents the current context of a Select statement.</span>
-</span><span id="traverse_scope-493"><a href="#traverse_scope-493"><span class="linenos">493</span></a>
-</span><span id="traverse_scope-494"><a href="#traverse_scope-494"><span class="linenos">494</span></a><span class="sd"> This is helpful for optimizing queries, where we need more information than</span>
-</span><span id="traverse_scope-495"><a href="#traverse_scope-495"><span class="linenos">495</span></a><span class="sd"> the expression tree itself. For example, we might care about the source</span>
-</span><span id="traverse_scope-496"><a href="#traverse_scope-496"><span class="linenos">496</span></a><span class="sd"> names within a subquery. Returns a list because a generator could result in</span>
-</span><span id="traverse_scope-497"><a href="#traverse_scope-497"><span class="linenos">497</span></a><span class="sd"> incomplete properties which is confusing.</span>
-</span><span id="traverse_scope-498"><a href="#traverse_scope-498"><span class="linenos">498</span></a>
-</span><span id="traverse_scope-499"><a href="#traverse_scope-499"><span class="linenos">499</span></a><span class="sd"> Examples:</span>
-</span><span id="traverse_scope-500"><a href="#traverse_scope-500"><span class="linenos">500</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
-</span><span id="traverse_scope-501"><a href="#traverse_scope-501"><span class="linenos">501</span></a><span class="sd"> &gt;&gt;&gt; expression = sqlglot.parse_one(&quot;SELECT a FROM (SELECT a FROM x) AS y&quot;)</span>
-</span><span id="traverse_scope-502"><a href="#traverse_scope-502"><span class="linenos">502</span></a><span class="sd"> &gt;&gt;&gt; scopes = traverse_scope(expression)</span>
-</span><span id="traverse_scope-503"><a href="#traverse_scope-503"><span class="linenos">503</span></a><span class="sd"> &gt;&gt;&gt; scopes[0].expression.sql(), list(scopes[0].sources)</span>
-</span><span id="traverse_scope-504"><a href="#traverse_scope-504"><span class="linenos">504</span></a><span class="sd"> (&#39;SELECT a FROM x&#39;, [&#39;x&#39;])</span>
-</span><span id="traverse_scope-505"><a href="#traverse_scope-505"><span class="linenos">505</span></a><span class="sd"> &gt;&gt;&gt; scopes[1].expression.sql(), list(scopes[1].sources)</span>
-</span><span id="traverse_scope-506"><a href="#traverse_scope-506"><span class="linenos">506</span></a><span class="sd"> (&#39;SELECT a FROM (SELECT a FROM x) AS y&#39;, [&#39;y&#39;])</span>
-</span><span id="traverse_scope-507"><a href="#traverse_scope-507"><span class="linenos">507</span></a>
-</span><span id="traverse_scope-508"><a href="#traverse_scope-508"><span class="linenos">508</span></a><span class="sd"> Args:</span>
-</span><span id="traverse_scope-509"><a href="#traverse_scope-509"><span class="linenos">509</span></a><span class="sd"> expression (exp.Expression): expression to traverse</span>
-</span><span id="traverse_scope-510"><a href="#traverse_scope-510"><span class="linenos">510</span></a><span class="sd"> Returns:</span>
-</span><span id="traverse_scope-511"><a href="#traverse_scope-511"><span class="linenos">511</span></a><span class="sd"> list[Scope]: scope instances</span>
-</span><span id="traverse_scope-512"><a href="#traverse_scope-512"><span class="linenos">512</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="traverse_scope-513"><a href="#traverse_scope-513"><span class="linenos">513</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unionable</span><span class="p">):</span>
-</span><span id="traverse_scope-514"><a href="#traverse_scope-514"><span class="linenos">514</span></a> <span class="k">return</span> <span class="p">[]</span>
-</span><span id="traverse_scope-515"><a href="#traverse_scope-515"><span class="linenos">515</span></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">_traverse_scope</span><span class="p">(</span><span class="n">Scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)))</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="traverse_scope-491"><a href="#traverse_scope-491"><span class="linenos">491</span></a><span class="k">def</span> <span class="nf">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
+</span><span id="traverse_scope-492"><a href="#traverse_scope-492"><span class="linenos">492</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="traverse_scope-493"><a href="#traverse_scope-493"><span class="linenos">493</span></a><span class="sd"> Traverse an expression by its &quot;scopes&quot;.</span>
+</span><span id="traverse_scope-494"><a href="#traverse_scope-494"><span class="linenos">494</span></a>
+</span><span id="traverse_scope-495"><a href="#traverse_scope-495"><span class="linenos">495</span></a><span class="sd"> &quot;Scope&quot; represents the current context of a Select statement.</span>
+</span><span id="traverse_scope-496"><a href="#traverse_scope-496"><span class="linenos">496</span></a>
+</span><span id="traverse_scope-497"><a href="#traverse_scope-497"><span class="linenos">497</span></a><span class="sd"> This is helpful for optimizing queries, where we need more information than</span>
+</span><span id="traverse_scope-498"><a href="#traverse_scope-498"><span class="linenos">498</span></a><span class="sd"> the expression tree itself. For example, we might care about the source</span>
+</span><span id="traverse_scope-499"><a href="#traverse_scope-499"><span class="linenos">499</span></a><span class="sd"> names within a subquery. Returns a list because a generator could result in</span>
+</span><span id="traverse_scope-500"><a href="#traverse_scope-500"><span class="linenos">500</span></a><span class="sd"> incomplete properties which is confusing.</span>
+</span><span id="traverse_scope-501"><a href="#traverse_scope-501"><span class="linenos">501</span></a>
+</span><span id="traverse_scope-502"><a href="#traverse_scope-502"><span class="linenos">502</span></a><span class="sd"> Examples:</span>
+</span><span id="traverse_scope-503"><a href="#traverse_scope-503"><span class="linenos">503</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
+</span><span id="traverse_scope-504"><a href="#traverse_scope-504"><span class="linenos">504</span></a><span class="sd"> &gt;&gt;&gt; expression = sqlglot.parse_one(&quot;SELECT a FROM (SELECT a FROM x) AS y&quot;)</span>
+</span><span id="traverse_scope-505"><a href="#traverse_scope-505"><span class="linenos">505</span></a><span class="sd"> &gt;&gt;&gt; scopes = traverse_scope(expression)</span>
+</span><span id="traverse_scope-506"><a href="#traverse_scope-506"><span class="linenos">506</span></a><span class="sd"> &gt;&gt;&gt; scopes[0].expression.sql(), list(scopes[0].sources)</span>
+</span><span id="traverse_scope-507"><a href="#traverse_scope-507"><span class="linenos">507</span></a><span class="sd"> (&#39;SELECT a FROM x&#39;, [&#39;x&#39;])</span>
+</span><span id="traverse_scope-508"><a href="#traverse_scope-508"><span class="linenos">508</span></a><span class="sd"> &gt;&gt;&gt; scopes[1].expression.sql(), list(scopes[1].sources)</span>
+</span><span id="traverse_scope-509"><a href="#traverse_scope-509"><span class="linenos">509</span></a><span class="sd"> (&#39;SELECT a FROM (SELECT a FROM x) AS y&#39;, [&#39;y&#39;])</span>
+</span><span id="traverse_scope-510"><a href="#traverse_scope-510"><span class="linenos">510</span></a>
+</span><span id="traverse_scope-511"><a href="#traverse_scope-511"><span class="linenos">511</span></a><span class="sd"> Args:</span>
+</span><span id="traverse_scope-512"><a href="#traverse_scope-512"><span class="linenos">512</span></a><span class="sd"> expression (exp.Expression): expression to traverse</span>
+</span><span id="traverse_scope-513"><a href="#traverse_scope-513"><span class="linenos">513</span></a><span class="sd"> Returns:</span>
+</span><span id="traverse_scope-514"><a href="#traverse_scope-514"><span class="linenos">514</span></a><span class="sd"> list[Scope]: scope instances</span>
+</span><span id="traverse_scope-515"><a href="#traverse_scope-515"><span class="linenos">515</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="traverse_scope-516"><a href="#traverse_scope-516"><span class="linenos">516</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unionable</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
+</span><span id="traverse_scope-517"><a href="#traverse_scope-517"><span class="linenos">517</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DDL</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">)</span>
+</span><span id="traverse_scope-518"><a href="#traverse_scope-518"><span class="linenos">518</span></a> <span class="p">):</span>
+</span><span id="traverse_scope-519"><a href="#traverse_scope-519"><span class="linenos">519</span></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">_traverse_scope</span><span class="p">(</span><span class="n">Scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)))</span>
+</span><span id="traverse_scope-520"><a href="#traverse_scope-520"><span class="linenos">520</span></a>
+</span><span id="traverse_scope-521"><a href="#traverse_scope-521"><span class="linenos">521</span></a> <span class="k">return</span> <span class="p">[]</span>
</span></pre></div>
- <div class="docstring"><p>Traverse an expression by it's "scopes".</p>
+ <div class="docstring"><p>Traverse an expression by its "scopes".</p>
<p>"Scope" represents the current context of a Select statement.</p>
@@ -2626,19 +2680,19 @@ incomplete properties which is confusing.</p>
</div>
<a class="headerlink" href="#build_scope"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="build_scope-518"><a href="#build_scope-518"><span class="linenos">518</span></a><span class="k">def</span> <span class="nf">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
-</span><span id="build_scope-519"><a href="#build_scope-519"><span class="linenos">519</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="build_scope-520"><a href="#build_scope-520"><span class="linenos">520</span></a><span class="sd"> Build a scope tree.</span>
-</span><span id="build_scope-521"><a href="#build_scope-521"><span class="linenos">521</span></a>
-</span><span id="build_scope-522"><a href="#build_scope-522"><span class="linenos">522</span></a><span class="sd"> Args:</span>
-</span><span id="build_scope-523"><a href="#build_scope-523"><span class="linenos">523</span></a><span class="sd"> expression (exp.Expression): expression to build the scope tree for</span>
-</span><span id="build_scope-524"><a href="#build_scope-524"><span class="linenos">524</span></a><span class="sd"> Returns:</span>
-</span><span id="build_scope-525"><a href="#build_scope-525"><span class="linenos">525</span></a><span class="sd"> Scope: root scope</span>
-</span><span id="build_scope-526"><a href="#build_scope-526"><span class="linenos">526</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="build_scope-527"><a href="#build_scope-527"><span class="linenos">527</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
-</span><span id="build_scope-528"><a href="#build_scope-528"><span class="linenos">528</span></a> <span class="k">if</span> <span class="n">scopes</span><span class="p">:</span>
-</span><span id="build_scope-529"><a href="#build_scope-529"><span class="linenos">529</span></a> <span class="k">return</span> <span class="n">scopes</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-</span><span id="build_scope-530"><a href="#build_scope-530"><span class="linenos">530</span></a> <span class="k">return</span> <span class="kc">None</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="build_scope-524"><a href="#build_scope-524"><span class="linenos">524</span></a><span class="k">def</span> <span class="nf">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">Scope</span><span class="p">]:</span>
+</span><span id="build_scope-525"><a href="#build_scope-525"><span class="linenos">525</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="build_scope-526"><a href="#build_scope-526"><span class="linenos">526</span></a><span class="sd"> Build a scope tree.</span>
+</span><span id="build_scope-527"><a href="#build_scope-527"><span class="linenos">527</span></a>
+</span><span id="build_scope-528"><a href="#build_scope-528"><span class="linenos">528</span></a><span class="sd"> Args:</span>
+</span><span id="build_scope-529"><a href="#build_scope-529"><span class="linenos">529</span></a><span class="sd"> expression (exp.Expression): expression to build the scope tree for</span>
+</span><span id="build_scope-530"><a href="#build_scope-530"><span class="linenos">530</span></a><span class="sd"> Returns:</span>
+</span><span id="build_scope-531"><a href="#build_scope-531"><span class="linenos">531</span></a><span class="sd"> Scope: root scope</span>
+</span><span id="build_scope-532"><a href="#build_scope-532"><span class="linenos">532</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="build_scope-533"><a href="#build_scope-533"><span class="linenos">533</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
+</span><span id="build_scope-534"><a href="#build_scope-534"><span class="linenos">534</span></a> <span class="k">if</span> <span class="n">scopes</span><span class="p">:</span>
+</span><span id="build_scope-535"><a href="#build_scope-535"><span class="linenos">535</span></a> <span class="k">return</span> <span class="n">scopes</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+</span><span id="build_scope-536"><a href="#build_scope-536"><span class="linenos">536</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
@@ -2670,47 +2724,47 @@ incomplete properties which is confusing.</p>
</div>
<a class="headerlink" href="#walk_in_scope"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="walk_in_scope-715"><a href="#walk_in_scope-715"><span class="linenos">715</span></a><span class="k">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
-</span><span id="walk_in_scope-716"><a href="#walk_in_scope-716"><span class="linenos">716</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="walk_in_scope-717"><a href="#walk_in_scope-717"><span class="linenos">717</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
-</span><span id="walk_in_scope-718"><a href="#walk_in_scope-718"><span class="linenos">718</span></a><span class="sd"> nodes that start child scopes.</span>
-</span><span id="walk_in_scope-719"><a href="#walk_in_scope-719"><span class="linenos">719</span></a>
-</span><span id="walk_in_scope-720"><a href="#walk_in_scope-720"><span class="linenos">720</span></a><span class="sd"> Args:</span>
-</span><span id="walk_in_scope-721"><a href="#walk_in_scope-721"><span class="linenos">721</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="walk_in_scope-722"><a href="#walk_in_scope-722"><span class="linenos">722</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
-</span><span id="walk_in_scope-723"><a href="#walk_in_scope-723"><span class="linenos">723</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
-</span><span id="walk_in_scope-724"><a href="#walk_in_scope-724"><span class="linenos">724</span></a>
-</span><span id="walk_in_scope-725"><a href="#walk_in_scope-725"><span class="linenos">725</span></a><span class="sd"> Yields:</span>
-</span><span id="walk_in_scope-726"><a href="#walk_in_scope-726"><span class="linenos">726</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
-</span><span id="walk_in_scope-727"><a href="#walk_in_scope-727"><span class="linenos">727</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="walk_in_scope-728"><a href="#walk_in_scope-728"><span class="linenos">728</span></a> <span class="c1"># We&#39;ll use this variable to pass state into the dfs generator.</span>
-</span><span id="walk_in_scope-729"><a href="#walk_in_scope-729"><span class="linenos">729</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
-</span><span id="walk_in_scope-730"><a href="#walk_in_scope-730"><span class="linenos">730</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="walk_in_scope-731"><a href="#walk_in_scope-731"><span class="linenos">731</span></a>
-</span><span id="walk_in_scope-732"><a href="#walk_in_scope-732"><span class="linenos">732</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="n">prune</span><span class="p">):</span>
-</span><span id="walk_in_scope-733"><a href="#walk_in_scope-733"><span class="linenos">733</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="walk_in_scope-734"><a href="#walk_in_scope-734"><span class="linenos">734</span></a>
-</span><span id="walk_in_scope-735"><a href="#walk_in_scope-735"><span class="linenos">735</span></a> <span class="k">yield</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span>
-</span><span id="walk_in_scope-736"><a href="#walk_in_scope-736"><span class="linenos">736</span></a>
-</span><span id="walk_in_scope-737"><a href="#walk_in_scope-737"><span class="linenos">737</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
-</span><span id="walk_in_scope-738"><a href="#walk_in_scope-738"><span class="linenos">738</span></a> <span class="k">continue</span>
-</span><span id="walk_in_scope-739"><a href="#walk_in_scope-739"><span class="linenos">739</span></a> <span class="k">if</span> <span class="p">(</span>
-</span><span id="walk_in_scope-740"><a href="#walk_in_scope-740"><span class="linenos">740</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
-</span><span id="walk_in_scope-741"><a href="#walk_in_scope-741"><span class="linenos">741</span></a> <span class="ow">or</span> <span class="p">(</span>
-</span><span id="walk_in_scope-742"><a href="#walk_in_scope-742"><span class="linenos">742</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
-</span><span id="walk_in_scope-743"><a href="#walk_in_scope-743"><span class="linenos">743</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
-</span><span id="walk_in_scope-744"><a href="#walk_in_scope-744"><span class="linenos">744</span></a> <span class="ow">and</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
-</span><span id="walk_in_scope-745"><a href="#walk_in_scope-745"><span class="linenos">745</span></a> <span class="p">)</span>
-</span><span id="walk_in_scope-746"><a href="#walk_in_scope-746"><span class="linenos">746</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)</span>
-</span><span id="walk_in_scope-747"><a href="#walk_in_scope-747"><span class="linenos">747</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">)</span>
-</span><span id="walk_in_scope-748"><a href="#walk_in_scope-748"><span class="linenos">748</span></a> <span class="p">):</span>
-</span><span id="walk_in_scope-749"><a href="#walk_in_scope-749"><span class="linenos">749</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">True</span>
-</span><span id="walk_in_scope-750"><a href="#walk_in_scope-750"><span class="linenos">750</span></a>
-</span><span id="walk_in_scope-751"><a href="#walk_in_scope-751"><span class="linenos">751</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
-</span><span id="walk_in_scope-752"><a href="#walk_in_scope-752"><span class="linenos">752</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
-</span><span id="walk_in_scope-753"><a href="#walk_in_scope-753"><span class="linenos">753</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="s2">&quot;laterals&quot;</span><span class="p">,</span> <span class="s2">&quot;pivots&quot;</span><span class="p">):</span>
-</span><span id="walk_in_scope-754"><a href="#walk_in_scope-754"><span class="linenos">754</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
-</span><span id="walk_in_scope-755"><a href="#walk_in_scope-755"><span class="linenos">755</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="walk_in_scope-763"><a href="#walk_in_scope-763"><span class="linenos">763</span></a><span class="k">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+</span><span id="walk_in_scope-764"><a href="#walk_in_scope-764"><span class="linenos">764</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="walk_in_scope-765"><a href="#walk_in_scope-765"><span class="linenos">765</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
+</span><span id="walk_in_scope-766"><a href="#walk_in_scope-766"><span class="linenos">766</span></a><span class="sd"> nodes that start child scopes.</span>
+</span><span id="walk_in_scope-767"><a href="#walk_in_scope-767"><span class="linenos">767</span></a>
+</span><span id="walk_in_scope-768"><a href="#walk_in_scope-768"><span class="linenos">768</span></a><span class="sd"> Args:</span>
+</span><span id="walk_in_scope-769"><a href="#walk_in_scope-769"><span class="linenos">769</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="walk_in_scope-770"><a href="#walk_in_scope-770"><span class="linenos">770</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
+</span><span id="walk_in_scope-771"><a href="#walk_in_scope-771"><span class="linenos">771</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
+</span><span id="walk_in_scope-772"><a href="#walk_in_scope-772"><span class="linenos">772</span></a>
+</span><span id="walk_in_scope-773"><a href="#walk_in_scope-773"><span class="linenos">773</span></a><span class="sd"> Yields:</span>
+</span><span id="walk_in_scope-774"><a href="#walk_in_scope-774"><span class="linenos">774</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
+</span><span id="walk_in_scope-775"><a href="#walk_in_scope-775"><span class="linenos">775</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="walk_in_scope-776"><a href="#walk_in_scope-776"><span class="linenos">776</span></a> <span class="c1"># We&#39;ll use this variable to pass state into the dfs generator.</span>
+</span><span id="walk_in_scope-777"><a href="#walk_in_scope-777"><span class="linenos">777</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
+</span><span id="walk_in_scope-778"><a href="#walk_in_scope-778"><span class="linenos">778</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="walk_in_scope-779"><a href="#walk_in_scope-779"><span class="linenos">779</span></a>
+</span><span id="walk_in_scope-780"><a href="#walk_in_scope-780"><span class="linenos">780</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="n">prune</span><span class="p">):</span>
+</span><span id="walk_in_scope-781"><a href="#walk_in_scope-781"><span class="linenos">781</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="walk_in_scope-782"><a href="#walk_in_scope-782"><span class="linenos">782</span></a>
+</span><span id="walk_in_scope-783"><a href="#walk_in_scope-783"><span class="linenos">783</span></a> <span class="k">yield</span> <span class="n">node</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">key</span>
+</span><span id="walk_in_scope-784"><a href="#walk_in_scope-784"><span class="linenos">784</span></a>
+</span><span id="walk_in_scope-785"><a href="#walk_in_scope-785"><span class="linenos">785</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
+</span><span id="walk_in_scope-786"><a href="#walk_in_scope-786"><span class="linenos">786</span></a> <span class="k">continue</span>
+</span><span id="walk_in_scope-787"><a href="#walk_in_scope-787"><span class="linenos">787</span></a> <span class="k">if</span> <span class="p">(</span>
+</span><span id="walk_in_scope-788"><a href="#walk_in_scope-788"><span class="linenos">788</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
+</span><span id="walk_in_scope-789"><a href="#walk_in_scope-789"><span class="linenos">789</span></a> <span class="ow">or</span> <span class="p">(</span>
+</span><span id="walk_in_scope-790"><a href="#walk_in_scope-790"><span class="linenos">790</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
+</span><span id="walk_in_scope-791"><a href="#walk_in_scope-791"><span class="linenos">791</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
+</span><span id="walk_in_scope-792"><a href="#walk_in_scope-792"><span class="linenos">792</span></a> <span class="ow">and</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
+</span><span id="walk_in_scope-793"><a href="#walk_in_scope-793"><span class="linenos">793</span></a> <span class="p">)</span>
+</span><span id="walk_in_scope-794"><a href="#walk_in_scope-794"><span class="linenos">794</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)</span>
+</span><span id="walk_in_scope-795"><a href="#walk_in_scope-795"><span class="linenos">795</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subqueryable</span><span class="p">)</span>
+</span><span id="walk_in_scope-796"><a href="#walk_in_scope-796"><span class="linenos">796</span></a> <span class="p">):</span>
+</span><span id="walk_in_scope-797"><a href="#walk_in_scope-797"><span class="linenos">797</span></a> <span class="n">prune</span> <span class="o">=</span> <span class="kc">True</span>
+</span><span id="walk_in_scope-798"><a href="#walk_in_scope-798"><span class="linenos">798</span></a>
+</span><span id="walk_in_scope-799"><a href="#walk_in_scope-799"><span class="linenos">799</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
+</span><span id="walk_in_scope-800"><a href="#walk_in_scope-800"><span class="linenos">800</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
+</span><span id="walk_in_scope-801"><a href="#walk_in_scope-801"><span class="linenos">801</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="s2">&quot;laterals&quot;</span><span class="p">,</span> <span class="s2">&quot;pivots&quot;</span><span class="p">):</span>
+</span><span id="walk_in_scope-802"><a href="#walk_in_scope-802"><span class="linenos">802</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
+</span><span id="walk_in_scope-803"><a href="#walk_in_scope-803"><span class="linenos">803</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
</span></pre></div>