summaryrefslogtreecommitdiffstats
path: root/docs/sqlglot/optimizer/scope.html
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--docs/sqlglot/optimizer/scope.html727
1 files changed, 365 insertions, 362 deletions
diff --git a/docs/sqlglot/optimizer/scope.html b/docs/sqlglot/optimizer/scope.html
index 447824e..b670de2 100644
--- a/docs/sqlglot/optimizer/scope.html
+++ b/docs/sqlglot/optimizer/scope.html
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="generator" content="pdoc 14.1.0"/>
+ <meta name="generator" content="pdoc 14.2.0"/>
<title>sqlglot.optimizer.scope API documentation</title>
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
@@ -753,307 +753,310 @@
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</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-516"><a href="#L-516"><span class="linenos">516</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-517"><a href="#L-517"><span class="linenos">517</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-518"><a href="#L-518"><span class="linenos">518</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-519"><a href="#L-519"><span class="linenos">519</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-520"><a href="#L-520"><span class="linenos">520</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-521"><a href="#L-521"><span class="linenos">521</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-522"><a href="#L-522"><span class="linenos">522</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-523"><a href="#L-523"><span class="linenos">523</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-524"><a href="#L-524"><span class="linenos">524</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-525"><a href="#L-525"><span class="linenos">525</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
-</span><span id="L-527"><a href="#L-527"><span class="linenos">527</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-528"><a href="#L-528"><span class="linenos">528</span></a> <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><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 class="k">yield</span> <span class="n">scope</span>
-</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a>
+</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="k">if</span> <span class="n">scope</span><span class="o">.</span><span class="n">is_root</span><span class="p">:</span>
+</span><span id="L-519"><a href="#L-519"><span class="linenos">519</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-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-521"><a href="#L-521"><span class="linenos">521</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-522"><a href="#L-522"><span class="linenos">522</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-523"><a href="#L-523"><span class="linenos">523</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-524"><a href="#L-524"><span class="linenos">524</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-525"><a href="#L-525"><span class="linenos">525</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-526"><a href="#L-526"><span class="linenos">526</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-527"><a href="#L-527"><span class="linenos">527</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-528"><a href="#L-528"><span class="linenos">528</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
+</span><span id="L-530"><a href="#L-530"><span class="linenos">530</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-531"><a href="#L-531"><span class="linenos">531</span></a> <span class="p">)</span>
+</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a> <span class="k">return</span>
</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a>
-</span><span id="L-534"><a href="#L-534"><span class="linenos">534</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-535"><a href="#L-535"><span class="linenos">535</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-536"><a href="#L-536"><span class="linenos">536</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-537"><a href="#L-537"><span class="linenos">537</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-538"><a href="#L-538"><span class="linenos">538</span></a>
-</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a>
-</span><span id="L-540"><a href="#L-540"><span class="linenos">540</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-541"><a href="#L-541"><span class="linenos">541</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-534"><a href="#L-534"><span class="linenos">534</span></a> <span class="k">yield</span> <span class="n">scope</span>
+</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a>
+</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 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-538"><a href="#L-538"><span class="linenos">538</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-539"><a href="#L-539"><span class="linenos">539</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-540"><a href="#L-540"><span class="linenos">540</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-541"><a href="#L-541"><span class="linenos">541</span></a>
</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a>
-</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a> <span class="c1"># The last scope to be yield should be the top most scope</span>
-</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a> <span class="n">left</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-545"><a href="#L-545"><span class="linenos">545</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-546"><a href="#L-546"><span class="linenos">546</span></a> <span class="k">yield</span> <span class="n">left</span>
-</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a>
-</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a> <span class="n">right</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-549"><a href="#L-549"><span class="linenos">549</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-550"><a href="#L-550"><span class="linenos">550</span></a> <span class="k">yield</span> <span class="n">right</span>
-</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="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-553"><a href="#L-553"><span class="linenos">553</span></a>
+</span><span id="L-543"><a href="#L-543"><span class="linenos">543</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-544"><a href="#L-544"><span class="linenos">544</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-545"><a href="#L-545"><span class="linenos">545</span></a>
+</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a> <span class="c1"># The last scope to be yield should be the top most scope</span>
+</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a> <span class="n">left</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-548"><a href="#L-548"><span class="linenos">548</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-549"><a href="#L-549"><span class="linenos">549</span></a> <span class="k">yield</span> <span class="n">left</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 class="n">right</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-552"><a href="#L-552"><span class="linenos">552</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-553"><a href="#L-553"><span class="linenos">553</span></a> <span class="k">yield</span> <span class="n">right</span>
</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a>
-</span><span id="L-555"><a href="#L-555"><span class="linenos">555</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-556"><a href="#L-556"><span class="linenos">556</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="L-555"><a href="#L-555"><span class="linenos">555</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-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">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-559"><a href="#L-559"><span class="linenos">559</span></a> <span class="n">recursive_scope</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-558"><a href="#L-558"><span class="linenos">558</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-559"><a href="#L-559"><span class="linenos">559</span></a> <span class="n">sources</span> <span class="o">=</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"># if the scope is a recursive cte, it must be in the form of base_case UNION recursive.</span>
-</span><span id="L-562"><a href="#L-562"><span class="linenos">562</span></a> <span class="c1"># thus the recursive scope is the first section of the union.</span>
-</span><span id="L-563"><a href="#L-563"><span class="linenos">563</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-564"><a href="#L-564"><span class="linenos">564</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-565"><a href="#L-565"><span class="linenos">565</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-566"><a href="#L-566"><span class="linenos">566</span></a>
-</span><span id="L-567"><a href="#L-567"><span class="linenos">567</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-568"><a href="#L-568"><span class="linenos">568</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-561"><a href="#L-561"><span class="linenos">561</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-562"><a href="#L-562"><span class="linenos">562</span></a> <span class="n">recursive_scope</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><span id="L-564"><a href="#L-564"><span class="linenos">564</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-565"><a href="#L-565"><span class="linenos">565</span></a> <span class="c1"># thus the recursive scope is the first section of the union.</span>
+</span><span id="L-566"><a href="#L-566"><span class="linenos">566</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-567"><a href="#L-567"><span class="linenos">567</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-568"><a href="#L-568"><span class="linenos">568</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-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">child_scope</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><span id="L-572"><a href="#L-572"><span class="linenos">572</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-573"><a href="#L-573"><span class="linenos">573</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
-</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">this</span><span class="p">,</span>
-</span><span id="L-575"><a href="#L-575"><span class="linenos">575</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-576"><a href="#L-576"><span class="linenos">576</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-577"><a href="#L-577"><span class="linenos">577</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-578"><a href="#L-578"><span class="linenos">578</span></a> <span class="p">)</span>
-</span><span id="L-579"><a href="#L-579"><span class="linenos">579</span></a> <span class="p">):</span>
-</span><span id="L-580"><a href="#L-580"><span class="linenos">580</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
-</span><span id="L-581"><a href="#L-581"><span class="linenos">581</span></a>
-</span><span id="L-582"><a href="#L-582"><span class="linenos">582</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-583"><a href="#L-583"><span class="linenos">583</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-570"><a href="#L-570"><span class="linenos">570</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-571"><a href="#L-571"><span class="linenos">571</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-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="n">child_scope</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a>
+</span><span id="L-575"><a href="#L-575"><span class="linenos">575</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-576"><a href="#L-576"><span class="linenos">576</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
+</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">this</span><span class="p">,</span>
+</span><span id="L-578"><a href="#L-578"><span class="linenos">578</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-579"><a href="#L-579"><span class="linenos">579</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-580"><a href="#L-580"><span class="linenos">580</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-581"><a href="#L-581"><span class="linenos">581</span></a> <span class="p">)</span>
+</span><span id="L-582"><a href="#L-582"><span class="linenos">582</span></a> <span class="p">):</span>
+</span><span id="L-583"><a href="#L-583"><span class="linenos">583</span></a> <span class="k">yield</span> <span class="n">child_scope</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="n">recursive_scope</span><span class="p">:</span>
-</span><span id="L-586"><a href="#L-586"><span class="linenos">586</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-585"><a href="#L-585"><span class="linenos">585</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-586"><a href="#L-586"><span class="linenos">586</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-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="c1"># append the final child_scope yielded</span>
-</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a> <span class="k">if</span> <span class="n">child_scope</span><span class="p">:</span>
-</span><span id="L-590"><a href="#L-590"><span class="linenos">590</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-591"><a href="#L-591"><span class="linenos">591</span></a>
-</span><span id="L-592"><a href="#L-592"><span class="linenos">592</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-593"><a href="#L-593"><span class="linenos">593</span></a>
+</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a> <span class="k">if</span> <span class="n">recursive_scope</span><span class="p">:</span>
+</span><span id="L-589"><a href="#L-589"><span class="linenos">589</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-590"><a href="#L-590"><span class="linenos">590</span></a>
+</span><span id="L-591"><a href="#L-591"><span class="linenos">591</span></a> <span class="c1"># append the final child_scope yielded</span>
+</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a> <span class="k">if</span> <span class="n">child_scope</span><span class="p">:</span>
+</span><span id="L-593"><a href="#L-593"><span class="linenos">593</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-594"><a href="#L-594"><span class="linenos">594</span></a>
-</span><span id="L-595"><a href="#L-595"><span class="linenos">595</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-596"><a href="#L-596"><span class="linenos">596</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-597"><a href="#L-597"><span class="linenos">597</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-598"><a href="#L-598"><span class="linenos">598</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-599"><a href="#L-599"><span class="linenos">599</span></a><span class="sd"> under the Subquery, so that&#39;s one exception to this rule.</span>
-</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-601"><a href="#L-601"><span class="linenos">601</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-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><span id="L-604"><a href="#L-604"><span class="linenos">604</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-605"><a href="#L-605"><span class="linenos">605</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="L-595"><a href="#L-595"><span class="linenos">595</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-596"><a href="#L-596"><span class="linenos">596</span></a>
+</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">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-599"><a href="#L-599"><span class="linenos">599</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-600"><a href="#L-600"><span class="linenos">600</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-601"><a href="#L-601"><span class="linenos">601</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-602"><a href="#L-602"><span class="linenos">602</span></a><span class="sd"> under the Subquery, so that&#39;s one exception to this rule.</span>
+</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-604"><a href="#L-604"><span class="linenos">604</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-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><span id="L-607"><a href="#L-607"><span class="linenos">607</span></a> <span class="c1"># Traverse FROMs, JOINs, and LATERALs in the order they are defined</span>
-</span><span id="L-608"><a href="#L-608"><span class="linenos">608</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
-</span><span id="L-609"><a href="#L-609"><span class="linenos">609</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-610"><a href="#L-610"><span class="linenos">610</span></a> <span class="k">if</span> <span class="n">from_</span><span class="p">:</span>
-</span><span id="L-611"><a href="#L-611"><span class="linenos">611</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-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">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-614"><a href="#L-614"><span class="linenos">614</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-607"><a href="#L-607"><span class="linenos">607</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-608"><a href="#L-608"><span class="linenos">608</span></a> <span class="n">sources</span> <span class="o">=</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="c1"># Traverse FROMs, JOINs, and LATERALs in the order they are defined</span>
+</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
+</span><span id="L-612"><a href="#L-612"><span class="linenos">612</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-613"><a href="#L-613"><span class="linenos">613</span></a> <span class="k">if</span> <span class="n">from_</span><span class="p">:</span>
+</span><span id="L-614"><a href="#L-614"><span class="linenos">614</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-615"><a href="#L-615"><span class="linenos">615</span></a>
-</span><span id="L-616"><a href="#L-616"><span class="linenos">616</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-617"><a href="#L-617"><span class="linenos">617</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-616"><a href="#L-616"><span class="linenos">616</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-617"><a href="#L-617"><span class="linenos">617</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-618"><a href="#L-618"><span class="linenos">618</span></a>
-</span><span id="L-619"><a href="#L-619"><span class="linenos">619</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-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 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-622"><a href="#L-622"><span class="linenos">622</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-623"><a href="#L-623"><span class="linenos">623</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-624"><a href="#L-624"><span class="linenos">624</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-625"><a href="#L-625"><span class="linenos">625</span></a>
-</span><span id="L-626"><a href="#L-626"><span class="linenos">626</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-627"><a href="#L-627"><span class="linenos">627</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-628"><a href="#L-628"><span class="linenos">628</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-629"><a href="#L-629"><span class="linenos">629</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-630"><a href="#L-630"><span class="linenos">630</span></a> <span class="k">if</span> <span class="n">pivots</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="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-632"><a href="#L-632"><span class="linenos">632</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-633"><a href="#L-633"><span class="linenos">633</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-634"><a href="#L-634"><span class="linenos">634</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-635"><a href="#L-635"><span class="linenos">635</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-636"><a href="#L-636"><span class="linenos">636</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-637"><a href="#L-637"><span class="linenos">637</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-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="c1"># Make sure to not include the joins twice</span>
-</span><span id="L-640"><a href="#L-640"><span class="linenos">640</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-641"><a href="#L-641"><span class="linenos">641</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-642"><a href="#L-642"><span class="linenos">642</span></a>
-</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a> <span class="k">continue</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="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-619"><a href="#L-619"><span class="linenos">619</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-620"><a href="#L-620"><span class="linenos">620</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-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="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-623"><a href="#L-623"><span class="linenos">623</span></a>
+</span><span id="L-624"><a href="#L-624"><span class="linenos">624</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-625"><a href="#L-625"><span class="linenos">625</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-626"><a href="#L-626"><span class="linenos">626</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-627"><a href="#L-627"><span class="linenos">627</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-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 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-630"><a href="#L-630"><span class="linenos">630</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-631"><a href="#L-631"><span class="linenos">631</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-632"><a href="#L-632"><span class="linenos">632</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-633"><a href="#L-633"><span class="linenos">633</span></a> <span class="k">if</span> <span class="n">pivots</span><span class="p">:</span>
+</span><span id="L-634"><a href="#L-634"><span class="linenos">634</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-635"><a href="#L-635"><span class="linenos">635</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-636"><a href="#L-636"><span class="linenos">636</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-637"><a href="#L-637"><span class="linenos">637</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-638"><a href="#L-638"><span class="linenos">638</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-639"><a href="#L-639"><span class="linenos">639</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-640"><a href="#L-640"><span class="linenos">640</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-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="c1"># Make sure to not include the joins twice</span>
+</span><span id="L-643"><a href="#L-643"><span class="linenos">643</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-644"><a href="#L-644"><span class="linenos">644</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-645"><a href="#L-645"><span class="linenos">645</span></a>
</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a> <span class="k">continue</span>
</span><span id="L-647"><a href="#L-647"><span class="linenos">647</span></a>
-</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">UDTF</span><span class="p">):</span>
-</span><span id="L-649"><a href="#L-649"><span class="linenos">649</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="n">sources</span>
-</span><span id="L-650"><a href="#L-650"><span class="linenos">650</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-651"><a href="#L-651"><span class="linenos">651</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-652"><a href="#L-652"><span class="linenos">652</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-653"><a href="#L-653"><span class="linenos">653</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-654"><a href="#L-654"><span class="linenos">654</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-655"><a href="#L-655"><span class="linenos">655</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-656"><a href="#L-656"><span class="linenos">656</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-657"><a href="#L-657"><span class="linenos">657</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-658"><a href="#L-658"><span class="linenos">658</span></a> <span class="c1"># Makes sure we check for possible sources in nested table constructs</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">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-660"><a href="#L-660"><span class="linenos">660</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-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">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-664"><a href="#L-664"><span class="linenos">664</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
-</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a> <span class="n">expression</span><span class="p">,</span>
-</span><span id="L-666"><a href="#L-666"><span class="linenos">666</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-667"><a href="#L-667"><span class="linenos">667</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-668"><a href="#L-668"><span class="linenos">668</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-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="p">)</span>
-</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="p">):</span>
-</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
-</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a>
-</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="c1"># Tables without aliases will be set as &quot;&quot;</span>
-</span><span id="L-674"><a href="#L-674"><span class="linenos">674</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-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="c1"># Until then, this means that only a single, unaliased derived table is allowed (rather,</span>
-</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="c1"># the latest one wins.</span>
-</span><span id="L-677"><a href="#L-677"><span class="linenos">677</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-678"><a href="#L-678"><span class="linenos">678</span></a>
-</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="c1"># append the final child_scope yielded</span>
-</span><span id="L-680"><a href="#L-680"><span class="linenos">680</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-681"><a href="#L-681"><span class="linenos">681</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-682"><a href="#L-682"><span class="linenos">682</span></a>
-</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="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-684"><a href="#L-684"><span class="linenos">684</span></a>
+</span><span id="L-648"><a href="#L-648"><span class="linenos">648</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-649"><a href="#L-649"><span class="linenos">649</span></a> <span class="k">continue</span>
+</span><span id="L-650"><a href="#L-650"><span class="linenos">650</span></a>
+</span><span id="L-651"><a href="#L-651"><span class="linenos">651</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-652"><a href="#L-652"><span class="linenos">652</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="n">sources</span>
+</span><span id="L-653"><a href="#L-653"><span class="linenos">653</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-654"><a href="#L-654"><span class="linenos">654</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-655"><a href="#L-655"><span class="linenos">655</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-656"><a href="#L-656"><span class="linenos">656</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-657"><a href="#L-657"><span class="linenos">657</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-658"><a href="#L-658"><span class="linenos">658</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-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 class="k">else</span><span class="p">:</span>
+</span><span id="L-661"><a href="#L-661"><span class="linenos">661</span></a> <span class="c1"># Makes sure we check for possible sources in nested table constructs</span>
+</span><span id="L-662"><a href="#L-662"><span class="linenos">662</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-663"><a href="#L-663"><span class="linenos">663</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-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">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-667"><a href="#L-667"><span class="linenos">667</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
+</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a> <span class="n">expression</span><span class="p">,</span>
+</span><span id="L-669"><a href="#L-669"><span class="linenos">669</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-670"><a href="#L-670"><span class="linenos">670</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-671"><a href="#L-671"><span class="linenos">671</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-672"><a href="#L-672"><span class="linenos">672</span></a> <span class="p">)</span>
+</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="p">):</span>
+</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
+</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a>
+</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="c1"># Tables without aliases will be set as &quot;&quot;</span>
+</span><span id="L-677"><a href="#L-677"><span class="linenos">677</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-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="c1"># Until then, this means that only a single, unaliased derived table is allowed (rather,</span>
+</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="c1"># the latest one wins.</span>
+</span><span id="L-680"><a href="#L-680"><span class="linenos">680</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-681"><a href="#L-681"><span class="linenos">681</span></a>
+</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a> <span class="c1"># append the final child_scope yielded</span>
+</span><span id="L-683"><a href="#L-683"><span class="linenos">683</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-684"><a href="#L-684"><span class="linenos">684</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-685"><a href="#L-685"><span class="linenos">685</span></a>
-</span><span id="L-686"><a href="#L-686"><span class="linenos">686</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-687"><a href="#L-687"><span class="linenos">687</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-688"><a href="#L-688"><span class="linenos">688</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
-</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 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-690"><a href="#L-690"><span class="linenos">690</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
-</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
-</span><span id="L-692"><a href="#L-692"><span class="linenos">692</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-693"><a href="#L-693"><span class="linenos">693</span></a>
-</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a>
-</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a><span class="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-696"><a href="#L-696"><span class="linenos">696</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-697"><a href="#L-697"><span class="linenos">697</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-698"><a href="#L-698"><span class="linenos">698</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-699"><a href="#L-699"><span class="linenos">699</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-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="k">else</span><span class="p">:</span>
-</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
-</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a>
-</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
-</span><span id="L-704"><a href="#L-704"><span class="linenos">704</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-705"><a href="#L-705"><span class="linenos">705</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-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
-</span><span id="L-707"><a href="#L-707"><span class="linenos">707</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-708"><a href="#L-708"><span class="linenos">708</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
-</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="n">expression</span><span class="p">,</span>
-</span><span id="L-710"><a href="#L-710"><span class="linenos">710</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-711"><a href="#L-711"><span class="linenos">711</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-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="p">)</span>
-</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a> <span class="p">):</span>
-</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
-</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
-</span><span id="L-716"><a href="#L-716"><span class="linenos">716</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-717"><a href="#L-717"><span class="linenos">717</span></a>
-</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">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-719"><a href="#L-719"><span class="linenos">719</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-686"><a href="#L-686"><span class="linenos">686</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-687"><a href="#L-687"><span class="linenos">687</span></a>
+</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">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-690"><a href="#L-690"><span class="linenos">690</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-691"><a href="#L-691"><span class="linenos">691</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-692"><a href="#L-692"><span class="linenos">692</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-693"><a href="#L-693"><span class="linenos">693</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
+</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
+</span><span id="L-695"><a href="#L-695"><span class="linenos">695</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-696"><a href="#L-696"><span class="linenos">696</span></a>
+</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="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-699"><a href="#L-699"><span class="linenos">699</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-700"><a href="#L-700"><span class="linenos">700</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-701"><a href="#L-701"><span class="linenos">701</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-702"><a href="#L-702"><span class="linenos">702</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-703"><a href="#L-703"><span class="linenos">703</span></a> <span class="k">else</span><span class="p">:</span>
+</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
+</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a>
+</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
+</span><span id="L-707"><a href="#L-707"><span class="linenos">707</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-708"><a href="#L-708"><span class="linenos">708</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-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
+</span><span id="L-710"><a href="#L-710"><span class="linenos">710</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-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
+</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="n">expression</span><span class="p">,</span>
+</span><span id="L-713"><a href="#L-713"><span class="linenos">713</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-714"><a href="#L-714"><span class="linenos">714</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-715"><a href="#L-715"><span class="linenos">715</span></a> <span class="p">)</span>
+</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a> <span class="p">):</span>
+</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="k">yield</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">top</span> <span class="o">=</span> <span class="n">child_scope</span>
+</span><span id="L-719"><a href="#L-719"><span class="linenos">719</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-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="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-722"><a href="#L-722"><span class="linenos">722</span></a>
+</span><span id="L-721"><a href="#L-721"><span class="linenos">721</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-722"><a href="#L-722"><span class="linenos">722</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-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="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-725"><a href="#L-725"><span class="linenos">725</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-724"><a href="#L-724"><span class="linenos">724</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-725"><a href="#L-725"><span class="linenos">725</span></a>
</span><span id="L-726"><a href="#L-726"><span class="linenos">726</span></a>
-</span><span id="L-727"><a href="#L-727"><span class="linenos">727</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-728"><a href="#L-728"><span class="linenos">728</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-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="p">)</span>
-</span><span id="L-730"><a href="#L-730"><span class="linenos">730</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-731"><a href="#L-731"><span class="linenos">731</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-732"><a href="#L-732"><span class="linenos">732</span></a>
-</span><span id="L-733"><a href="#L-733"><span class="linenos">733</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-734"><a href="#L-734"><span class="linenos">734</span></a>
+</span><span id="L-727"><a href="#L-727"><span class="linenos">727</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-728"><a href="#L-728"><span class="linenos">728</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-729"><a href="#L-729"><span class="linenos">729</span></a>
+</span><span id="L-730"><a href="#L-730"><span class="linenos">730</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-731"><a href="#L-731"><span class="linenos">731</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-732"><a href="#L-732"><span class="linenos">732</span></a> <span class="p">)</span>
+</span><span id="L-733"><a href="#L-733"><span class="linenos">733</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-734"><a href="#L-734"><span class="linenos">734</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-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">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 class="n">prune</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
-</span><span id="L-737"><a href="#L-737"><span class="linenos">737</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
-</span><span id="L-739"><a href="#L-739"><span class="linenos">739</span></a><span class="sd"> nodes that start child scopes.</span>
-</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a>
-</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a><span class="sd"> Args:</span>
-</span><span id="L-742"><a href="#L-742"><span class="linenos">742</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="L-743"><a href="#L-743"><span class="linenos">743</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
-</span><span id="L-744"><a href="#L-744"><span class="linenos">744</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
-</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a><span class="sd"> prune ((node, parent, arg_key) -&gt; bool): callable that returns True if</span>
-</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
-</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a>
-</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a><span class="sd"> Yields:</span>
-</span><span id="L-749"><a href="#L-749"><span class="linenos">749</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
-</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-751"><a href="#L-751"><span class="linenos">751</span></a> <span class="c1"># We&#39;ll use this variable to pass state into the dfs generator.</span>
-</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
-</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a>
-</span><span id="L-755"><a href="#L-755"><span class="linenos">755</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><span id="L-756"><a href="#L-756"><span class="linenos">756</span></a> <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">args</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
-</span><span id="L-757"><a href="#L-757"><span class="linenos">757</span></a> <span class="p">):</span>
-</span><span id="L-758"><a href="#L-758"><span class="linenos">758</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="L-759"><a href="#L-759"><span class="linenos">759</span></a>
-</span><span id="L-760"><a href="#L-760"><span class="linenos">760</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-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">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-763"><a href="#L-763"><span class="linenos">763</span></a> <span class="k">continue</span>
-</span><span id="L-764"><a href="#L-764"><span class="linenos">764</span></a> <span class="k">if</span> <span class="p">(</span>
-</span><span id="L-765"><a href="#L-765"><span class="linenos">765</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-766"><a href="#L-766"><span class="linenos">766</span></a> <span class="ow">or</span> <span class="p">(</span>
-</span><span id="L-767"><a href="#L-767"><span class="linenos">767</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-768"><a href="#L-768"><span class="linenos">768</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-769"><a href="#L-769"><span class="linenos">769</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-770"><a href="#L-770"><span class="linenos">770</span></a> <span class="p">)</span>
-</span><span id="L-771"><a href="#L-771"><span class="linenos">771</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-772"><a href="#L-772"><span class="linenos">772</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-773"><a href="#L-773"><span class="linenos">773</span></a> <span class="p">):</span>
-</span><span id="L-774"><a href="#L-774"><span class="linenos">774</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</span>
-</span><span id="L-775"><a href="#L-775"><span class="linenos">775</span></a>
-</span><span id="L-776"><a href="#L-776"><span class="linenos">776</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-777"><a href="#L-777"><span class="linenos">777</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-778"><a href="#L-778"><span class="linenos">778</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-779"><a href="#L-779"><span class="linenos">779</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-780"><a href="#L-780"><span class="linenos">780</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-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><span id="L-783"><a href="#L-783"><span class="linenos">783</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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-784"><a href="#L-784"><span class="linenos">784</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-785"><a href="#L-785"><span class="linenos">785</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
-</span><span id="L-786"><a href="#L-786"><span class="linenos">786</span></a><span class="sd"> match at least one of the specified expression types.</span>
-</span><span id="L-787"><a href="#L-787"><span class="linenos">787</span></a>
-</span><span id="L-788"><a href="#L-788"><span class="linenos">788</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
-</span><span id="L-789"><a href="#L-789"><span class="linenos">789</span></a>
-</span><span id="L-790"><a href="#L-790"><span class="linenos">790</span></a><span class="sd"> Args:</span>
-</span><span id="L-791"><a href="#L-791"><span class="linenos">791</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="L-792"><a href="#L-792"><span class="linenos">792</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
-</span><span id="L-793"><a href="#L-793"><span class="linenos">793</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
-</span><span id="L-794"><a href="#L-794"><span class="linenos">794</span></a>
-</span><span id="L-795"><a href="#L-795"><span class="linenos">795</span></a><span class="sd"> Yields:</span>
-</span><span id="L-796"><a href="#L-796"><span class="linenos">796</span></a><span class="sd"> exp.Expression: nodes</span>
-</span><span id="L-797"><a href="#L-797"><span class="linenos">797</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-798"><a href="#L-798"><span class="linenos">798</span></a> <span class="k">for</span> <span class="n">expression</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="ow">in</span> <span class="n">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="n">bfs</span><span class="p">):</span>
-</span><span id="L-799"><a href="#L-799"><span class="linenos">799</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="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
-</span><span id="L-800"><a href="#L-800"><span class="linenos">800</span></a> <span class="k">yield</span> <span class="n">expression</span>
-</span><span id="L-801"><a href="#L-801"><span class="linenos">801</span></a>
-</span><span id="L-802"><a href="#L-802"><span class="linenos">802</span></a>
-</span><span id="L-803"><a href="#L-803"><span class="linenos">803</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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-804"><a href="#L-804"><span class="linenos">804</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="L-805"><a href="#L-805"><span class="linenos">805</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
-</span><span id="L-806"><a href="#L-806"><span class="linenos">806</span></a>
-</span><span id="L-807"><a href="#L-807"><span class="linenos">807</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
-</span><span id="L-808"><a href="#L-808"><span class="linenos">808</span></a>
-</span><span id="L-809"><a href="#L-809"><span class="linenos">809</span></a><span class="sd"> Args:</span>
-</span><span id="L-810"><a href="#L-810"><span class="linenos">810</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="L-811"><a href="#L-811"><span class="linenos">811</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
-</span><span id="L-812"><a href="#L-812"><span class="linenos">812</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
-</span><span id="L-813"><a href="#L-813"><span class="linenos">813</span></a>
-</span><span id="L-814"><a href="#L-814"><span class="linenos">814</span></a><span class="sd"> Returns:</span>
-</span><span id="L-815"><a href="#L-815"><span class="linenos">815</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
-</span><span id="L-816"><a href="#L-816"><span class="linenos">816</span></a><span class="sd"> the criteria was found.</span>
-</span><span id="L-817"><a href="#L-817"><span class="linenos">817</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="L-818"><a href="#L-818"><span class="linenos">818</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="kc">None</span><span class="p">)</span>
+</span><span id="L-736"><a href="#L-736"><span class="linenos">736</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-737"><a href="#L-737"><span class="linenos">737</span></a>
+</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a>
+</span><span id="L-739"><a href="#L-739"><span class="linenos">739</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 class="n">prune</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
+</span><span id="L-742"><a href="#L-742"><span class="linenos">742</span></a><span class="sd"> nodes that start child scopes.</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="sd"> Args:</span>
+</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
+</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
+</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a><span class="sd"> prune ((node, parent, arg_key) -&gt; bool): callable that returns True if</span>
+</span><span id="L-749"><a href="#L-749"><span class="linenos">749</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
+</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a>
+</span><span id="L-751"><a href="#L-751"><span class="linenos">751</span></a><span class="sd"> Yields:</span>
+</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
+</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a> <span class="c1"># We&#39;ll use this variable to pass state into the dfs generator.</span>
+</span><span id="L-755"><a href="#L-755"><span class="linenos">755</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
+</span><span id="L-756"><a href="#L-756"><span class="linenos">756</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="L-757"><a href="#L-757"><span class="linenos">757</span></a>
+</span><span id="L-758"><a href="#L-758"><span class="linenos">758</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><span id="L-759"><a href="#L-759"><span class="linenos">759</span></a> <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">args</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</span><span id="L-760"><a href="#L-760"><span class="linenos">760</span></a> <span class="p">):</span>
+</span><span id="L-761"><a href="#L-761"><span class="linenos">761</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="L-762"><a href="#L-762"><span class="linenos">762</span></a>
+</span><span id="L-763"><a href="#L-763"><span class="linenos">763</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-764"><a href="#L-764"><span class="linenos">764</span></a>
+</span><span id="L-765"><a href="#L-765"><span class="linenos">765</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-766"><a href="#L-766"><span class="linenos">766</span></a> <span class="k">continue</span>
+</span><span id="L-767"><a href="#L-767"><span class="linenos">767</span></a> <span class="k">if</span> <span class="p">(</span>
+</span><span id="L-768"><a href="#L-768"><span class="linenos">768</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-769"><a href="#L-769"><span class="linenos">769</span></a> <span class="ow">or</span> <span class="p">(</span>
+</span><span id="L-770"><a href="#L-770"><span class="linenos">770</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-771"><a href="#L-771"><span class="linenos">771</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-772"><a href="#L-772"><span class="linenos">772</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-773"><a href="#L-773"><span class="linenos">773</span></a> <span class="p">)</span>
+</span><span id="L-774"><a href="#L-774"><span class="linenos">774</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-775"><a href="#L-775"><span class="linenos">775</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-776"><a href="#L-776"><span class="linenos">776</span></a> <span class="p">):</span>
+</span><span id="L-777"><a href="#L-777"><span class="linenos">777</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</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">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-780"><a href="#L-780"><span class="linenos">780</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-781"><a href="#L-781"><span class="linenos">781</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-782"><a href="#L-782"><span class="linenos">782</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-783"><a href="#L-783"><span class="linenos">783</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-784"><a href="#L-784"><span class="linenos">784</span></a>
+</span><span id="L-785"><a href="#L-785"><span class="linenos">785</span></a>
+</span><span id="L-786"><a href="#L-786"><span class="linenos">786</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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-787"><a href="#L-787"><span class="linenos">787</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-788"><a href="#L-788"><span class="linenos">788</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
+</span><span id="L-789"><a href="#L-789"><span class="linenos">789</span></a><span class="sd"> match at least one of the specified expression types.</span>
+</span><span id="L-790"><a href="#L-790"><span class="linenos">790</span></a>
+</span><span id="L-791"><a href="#L-791"><span class="linenos">791</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
+</span><span id="L-792"><a href="#L-792"><span class="linenos">792</span></a>
+</span><span id="L-793"><a href="#L-793"><span class="linenos">793</span></a><span class="sd"> Args:</span>
+</span><span id="L-794"><a href="#L-794"><span class="linenos">794</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="L-795"><a href="#L-795"><span class="linenos">795</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
+</span><span id="L-796"><a href="#L-796"><span class="linenos">796</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</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="sd"> Yields:</span>
+</span><span id="L-799"><a href="#L-799"><span class="linenos">799</span></a><span class="sd"> exp.Expression: nodes</span>
+</span><span id="L-800"><a href="#L-800"><span class="linenos">800</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-801"><a href="#L-801"><span class="linenos">801</span></a> <span class="k">for</span> <span class="n">expression</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="ow">in</span> <span class="n">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="n">bfs</span><span class="p">):</span>
+</span><span id="L-802"><a href="#L-802"><span class="linenos">802</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="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
+</span><span id="L-803"><a href="#L-803"><span class="linenos">803</span></a> <span class="k">yield</span> <span class="n">expression</span>
+</span><span id="L-804"><a href="#L-804"><span class="linenos">804</span></a>
+</span><span id="L-805"><a href="#L-805"><span class="linenos">805</span></a>
+</span><span id="L-806"><a href="#L-806"><span class="linenos">806</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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-807"><a href="#L-807"><span class="linenos">807</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="L-808"><a href="#L-808"><span class="linenos">808</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
+</span><span id="L-809"><a href="#L-809"><span class="linenos">809</span></a>
+</span><span id="L-810"><a href="#L-810"><span class="linenos">810</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
+</span><span id="L-811"><a href="#L-811"><span class="linenos">811</span></a>
+</span><span id="L-812"><a href="#L-812"><span class="linenos">812</span></a><span class="sd"> Args:</span>
+</span><span id="L-813"><a href="#L-813"><span class="linenos">813</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="L-814"><a href="#L-814"><span class="linenos">814</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
+</span><span id="L-815"><a href="#L-815"><span class="linenos">815</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
+</span><span id="L-816"><a href="#L-816"><span class="linenos">816</span></a>
+</span><span id="L-817"><a href="#L-817"><span class="linenos">817</span></a><span class="sd"> Returns:</span>
+</span><span id="L-818"><a href="#L-818"><span class="linenos">818</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
+</span><span id="L-819"><a href="#L-819"><span class="linenos">819</span></a><span class="sd"> the criteria was found.</span>
+</span><span id="L-820"><a href="#L-820"><span class="linenos">820</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="L-821"><a href="#L-821"><span class="linenos">821</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="kc">None</span><span class="p">)</span>
</span></pre></div>
@@ -2654,51 +2657,51 @@ 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-737"><a href="#walk_in_scope-737"><span class="linenos">737</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 class="n">prune</span><span class="o">=</span><span class="kc">None</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="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="walk_in_scope-739"><a href="#walk_in_scope-739"><span class="linenos">739</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-740"><a href="#walk_in_scope-740"><span class="linenos">740</span></a><span class="sd"> nodes that start child scopes.</span>
-</span><span id="walk_in_scope-741"><a href="#walk_in_scope-741"><span class="linenos">741</span></a>
-</span><span id="walk_in_scope-742"><a href="#walk_in_scope-742"><span class="linenos">742</span></a><span class="sd"> Args:</span>
-</span><span id="walk_in_scope-743"><a href="#walk_in_scope-743"><span class="linenos">743</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="walk_in_scope-744"><a href="#walk_in_scope-744"><span class="linenos">744</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-745"><a href="#walk_in_scope-745"><span class="linenos">745</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
-</span><span id="walk_in_scope-746"><a href="#walk_in_scope-746"><span class="linenos">746</span></a><span class="sd"> prune ((node, parent, arg_key) -&gt; bool): callable that returns True if</span>
-</span><span id="walk_in_scope-747"><a href="#walk_in_scope-747"><span class="linenos">747</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
-</span><span id="walk_in_scope-748"><a href="#walk_in_scope-748"><span class="linenos">748</span></a>
-</span><span id="walk_in_scope-749"><a href="#walk_in_scope-749"><span class="linenos">749</span></a><span class="sd"> Yields:</span>
-</span><span id="walk_in_scope-750"><a href="#walk_in_scope-750"><span class="linenos">750</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
-</span><span id="walk_in_scope-751"><a href="#walk_in_scope-751"><span class="linenos">751</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="walk_in_scope-752"><a href="#walk_in_scope-752"><span class="linenos">752</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-753"><a href="#walk_in_scope-753"><span class="linenos">753</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
-</span><span id="walk_in_scope-754"><a href="#walk_in_scope-754"><span class="linenos">754</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="walk_in_scope-755"><a href="#walk_in_scope-755"><span class="linenos">755</span></a>
-</span><span id="walk_in_scope-756"><a href="#walk_in_scope-756"><span class="linenos">756</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><span id="walk_in_scope-757"><a href="#walk_in_scope-757"><span class="linenos">757</span></a> <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">args</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
-</span><span id="walk_in_scope-758"><a href="#walk_in_scope-758"><span class="linenos">758</span></a> <span class="p">):</span>
-</span><span id="walk_in_scope-759"><a href="#walk_in_scope-759"><span class="linenos">759</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
-</span><span id="walk_in_scope-760"><a href="#walk_in_scope-760"><span class="linenos">760</span></a>
-</span><span id="walk_in_scope-761"><a href="#walk_in_scope-761"><span class="linenos">761</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-762"><a href="#walk_in_scope-762"><span class="linenos">762</span></a>
-</span><span id="walk_in_scope-763"><a href="#walk_in_scope-763"><span class="linenos">763</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-764"><a href="#walk_in_scope-764"><span class="linenos">764</span></a> <span class="k">continue</span>
-</span><span id="walk_in_scope-765"><a href="#walk_in_scope-765"><span class="linenos">765</span></a> <span class="k">if</span> <span class="p">(</span>
-</span><span id="walk_in_scope-766"><a href="#walk_in_scope-766"><span class="linenos">766</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-767"><a href="#walk_in_scope-767"><span class="linenos">767</span></a> <span class="ow">or</span> <span class="p">(</span>
-</span><span id="walk_in_scope-768"><a href="#walk_in_scope-768"><span class="linenos">768</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-769"><a href="#walk_in_scope-769"><span class="linenos">769</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-770"><a href="#walk_in_scope-770"><span class="linenos">770</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-771"><a href="#walk_in_scope-771"><span class="linenos">771</span></a> <span class="p">)</span>
-</span><span id="walk_in_scope-772"><a href="#walk_in_scope-772"><span class="linenos">772</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-773"><a href="#walk_in_scope-773"><span class="linenos">773</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-774"><a href="#walk_in_scope-774"><span class="linenos">774</span></a> <span class="p">):</span>
-</span><span id="walk_in_scope-775"><a href="#walk_in_scope-775"><span class="linenos">775</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</span>
-</span><span id="walk_in_scope-776"><a href="#walk_in_scope-776"><span class="linenos">776</span></a>
-</span><span id="walk_in_scope-777"><a href="#walk_in_scope-777"><span class="linenos">777</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-778"><a href="#walk_in_scope-778"><span class="linenos">778</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-779"><a href="#walk_in_scope-779"><span class="linenos">779</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-780"><a href="#walk_in_scope-780"><span class="linenos">780</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-781"><a href="#walk_in_scope-781"><span class="linenos">781</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-740"><a href="#walk_in_scope-740"><span class="linenos">740</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 class="n">prune</span><span class="o">=</span><span class="kc">None</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="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="walk_in_scope-742"><a href="#walk_in_scope-742"><span class="linenos">742</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-743"><a href="#walk_in_scope-743"><span class="linenos">743</span></a><span class="sd"> nodes that start child scopes.</span>
+</span><span id="walk_in_scope-744"><a href="#walk_in_scope-744"><span class="linenos">744</span></a>
+</span><span id="walk_in_scope-745"><a href="#walk_in_scope-745"><span class="linenos">745</span></a><span class="sd"> Args:</span>
+</span><span id="walk_in_scope-746"><a href="#walk_in_scope-746"><span class="linenos">746</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="walk_in_scope-747"><a href="#walk_in_scope-747"><span class="linenos">747</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-748"><a href="#walk_in_scope-748"><span class="linenos">748</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
+</span><span id="walk_in_scope-749"><a href="#walk_in_scope-749"><span class="linenos">749</span></a><span class="sd"> prune ((node, parent, arg_key) -&gt; bool): callable that returns True if</span>
+</span><span id="walk_in_scope-750"><a href="#walk_in_scope-750"><span class="linenos">750</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
+</span><span id="walk_in_scope-751"><a href="#walk_in_scope-751"><span class="linenos">751</span></a>
+</span><span id="walk_in_scope-752"><a href="#walk_in_scope-752"><span class="linenos">752</span></a><span class="sd"> Yields:</span>
+</span><span id="walk_in_scope-753"><a href="#walk_in_scope-753"><span class="linenos">753</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
+</span><span id="walk_in_scope-754"><a href="#walk_in_scope-754"><span class="linenos">754</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="walk_in_scope-755"><a href="#walk_in_scope-755"><span class="linenos">755</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-756"><a href="#walk_in_scope-756"><span class="linenos">756</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
+</span><span id="walk_in_scope-757"><a href="#walk_in_scope-757"><span class="linenos">757</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="walk_in_scope-758"><a href="#walk_in_scope-758"><span class="linenos">758</span></a>
+</span><span id="walk_in_scope-759"><a href="#walk_in_scope-759"><span class="linenos">759</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><span id="walk_in_scope-760"><a href="#walk_in_scope-760"><span class="linenos">760</span></a> <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">args</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span>
+</span><span id="walk_in_scope-761"><a href="#walk_in_scope-761"><span class="linenos">761</span></a> <span class="p">):</span>
+</span><span id="walk_in_scope-762"><a href="#walk_in_scope-762"><span class="linenos">762</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
+</span><span id="walk_in_scope-763"><a href="#walk_in_scope-763"><span class="linenos">763</span></a>
+</span><span id="walk_in_scope-764"><a href="#walk_in_scope-764"><span class="linenos">764</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-765"><a href="#walk_in_scope-765"><span class="linenos">765</span></a>
+</span><span id="walk_in_scope-766"><a href="#walk_in_scope-766"><span class="linenos">766</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-767"><a href="#walk_in_scope-767"><span class="linenos">767</span></a> <span class="k">continue</span>
+</span><span id="walk_in_scope-768"><a href="#walk_in_scope-768"><span class="linenos">768</span></a> <span class="k">if</span> <span class="p">(</span>
+</span><span id="walk_in_scope-769"><a href="#walk_in_scope-769"><span class="linenos">769</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-770"><a href="#walk_in_scope-770"><span class="linenos">770</span></a> <span class="ow">or</span> <span class="p">(</span>
+</span><span id="walk_in_scope-771"><a href="#walk_in_scope-771"><span class="linenos">771</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-772"><a href="#walk_in_scope-772"><span class="linenos">772</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-773"><a href="#walk_in_scope-773"><span class="linenos">773</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-774"><a href="#walk_in_scope-774"><span class="linenos">774</span></a> <span class="p">)</span>
+</span><span id="walk_in_scope-775"><a href="#walk_in_scope-775"><span class="linenos">775</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-776"><a href="#walk_in_scope-776"><span class="linenos">776</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-777"><a href="#walk_in_scope-777"><span class="linenos">777</span></a> <span class="p">):</span>
+</span><span id="walk_in_scope-778"><a href="#walk_in_scope-778"><span class="linenos">778</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</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">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-781"><a href="#walk_in_scope-781"><span class="linenos">781</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-782"><a href="#walk_in_scope-782"><span class="linenos">782</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-783"><a href="#walk_in_scope-783"><span class="linenos">783</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-784"><a href="#walk_in_scope-784"><span class="linenos">784</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>
@@ -2735,24 +2738,24 @@ the generator should stop traversing this branch of the tree.</li>
</div>
<a class="headerlink" href="#find_all_in_scope"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="find_all_in_scope-784"><a href="#find_all_in_scope-784"><span class="linenos">784</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="find_all_in_scope-785"><a href="#find_all_in_scope-785"><span class="linenos">785</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="find_all_in_scope-786"><a href="#find_all_in_scope-786"><span class="linenos">786</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
-</span><span id="find_all_in_scope-787"><a href="#find_all_in_scope-787"><span class="linenos">787</span></a><span class="sd"> match at least one of the specified expression types.</span>
-</span><span id="find_all_in_scope-788"><a href="#find_all_in_scope-788"><span class="linenos">788</span></a>
-</span><span id="find_all_in_scope-789"><a href="#find_all_in_scope-789"><span class="linenos">789</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
-</span><span id="find_all_in_scope-790"><a href="#find_all_in_scope-790"><span class="linenos">790</span></a>
-</span><span id="find_all_in_scope-791"><a href="#find_all_in_scope-791"><span class="linenos">791</span></a><span class="sd"> Args:</span>
-</span><span id="find_all_in_scope-792"><a href="#find_all_in_scope-792"><span class="linenos">792</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="find_all_in_scope-793"><a href="#find_all_in_scope-793"><span class="linenos">793</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
-</span><span id="find_all_in_scope-794"><a href="#find_all_in_scope-794"><span class="linenos">794</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
-</span><span id="find_all_in_scope-795"><a href="#find_all_in_scope-795"><span class="linenos">795</span></a>
-</span><span id="find_all_in_scope-796"><a href="#find_all_in_scope-796"><span class="linenos">796</span></a><span class="sd"> Yields:</span>
-</span><span id="find_all_in_scope-797"><a href="#find_all_in_scope-797"><span class="linenos">797</span></a><span class="sd"> exp.Expression: nodes</span>
-</span><span id="find_all_in_scope-798"><a href="#find_all_in_scope-798"><span class="linenos">798</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="find_all_in_scope-799"><a href="#find_all_in_scope-799"><span class="linenos">799</span></a> <span class="k">for</span> <span class="n">expression</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="ow">in</span> <span class="n">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="n">bfs</span><span class="p">):</span>
-</span><span id="find_all_in_scope-800"><a href="#find_all_in_scope-800"><span class="linenos">800</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="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
-</span><span id="find_all_in_scope-801"><a href="#find_all_in_scope-801"><span class="linenos">801</span></a> <span class="k">yield</span> <span class="n">expression</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="find_all_in_scope-787"><a href="#find_all_in_scope-787"><span class="linenos">787</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="find_all_in_scope-788"><a href="#find_all_in_scope-788"><span class="linenos">788</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="find_all_in_scope-789"><a href="#find_all_in_scope-789"><span class="linenos">789</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
+</span><span id="find_all_in_scope-790"><a href="#find_all_in_scope-790"><span class="linenos">790</span></a><span class="sd"> match at least one of the specified expression types.</span>
+</span><span id="find_all_in_scope-791"><a href="#find_all_in_scope-791"><span class="linenos">791</span></a>
+</span><span id="find_all_in_scope-792"><a href="#find_all_in_scope-792"><span class="linenos">792</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
+</span><span id="find_all_in_scope-793"><a href="#find_all_in_scope-793"><span class="linenos">793</span></a>
+</span><span id="find_all_in_scope-794"><a href="#find_all_in_scope-794"><span class="linenos">794</span></a><span class="sd"> Args:</span>
+</span><span id="find_all_in_scope-795"><a href="#find_all_in_scope-795"><span class="linenos">795</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="find_all_in_scope-796"><a href="#find_all_in_scope-796"><span class="linenos">796</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
+</span><span id="find_all_in_scope-797"><a href="#find_all_in_scope-797"><span class="linenos">797</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
+</span><span id="find_all_in_scope-798"><a href="#find_all_in_scope-798"><span class="linenos">798</span></a>
+</span><span id="find_all_in_scope-799"><a href="#find_all_in_scope-799"><span class="linenos">799</span></a><span class="sd"> Yields:</span>
+</span><span id="find_all_in_scope-800"><a href="#find_all_in_scope-800"><span class="linenos">800</span></a><span class="sd"> exp.Expression: nodes</span>
+</span><span id="find_all_in_scope-801"><a href="#find_all_in_scope-801"><span class="linenos">801</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="find_all_in_scope-802"><a href="#find_all_in_scope-802"><span class="linenos">802</span></a> <span class="k">for</span> <span class="n">expression</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="ow">in</span> <span class="n">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="n">bfs</span><span class="p">):</span>
+</span><span id="find_all_in_scope-803"><a href="#find_all_in_scope-803"><span class="linenos">803</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="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
+</span><span id="find_all_in_scope-804"><a href="#find_all_in_scope-804"><span class="linenos">804</span></a> <span class="k">yield</span> <span class="n">expression</span>
</span></pre></div>
@@ -2789,22 +2792,22 @@ match at least one of the specified expression types.</p>
</div>
<a class="headerlink" href="#find_in_scope"></a>
- <div class="pdoc-code codehilite"><pre><span></span><span id="find_in_scope-804"><a href="#find_in_scope-804"><span class="linenos">804</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="find_in_scope-805"><a href="#find_in_scope-805"><span class="linenos">805</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
-</span><span id="find_in_scope-806"><a href="#find_in_scope-806"><span class="linenos">806</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
-</span><span id="find_in_scope-807"><a href="#find_in_scope-807"><span class="linenos">807</span></a>
-</span><span id="find_in_scope-808"><a href="#find_in_scope-808"><span class="linenos">808</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
-</span><span id="find_in_scope-809"><a href="#find_in_scope-809"><span class="linenos">809</span></a>
-</span><span id="find_in_scope-810"><a href="#find_in_scope-810"><span class="linenos">810</span></a><span class="sd"> Args:</span>
-</span><span id="find_in_scope-811"><a href="#find_in_scope-811"><span class="linenos">811</span></a><span class="sd"> expression (exp.Expression):</span>
-</span><span id="find_in_scope-812"><a href="#find_in_scope-812"><span class="linenos">812</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
-</span><span id="find_in_scope-813"><a href="#find_in_scope-813"><span class="linenos">813</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
-</span><span id="find_in_scope-814"><a href="#find_in_scope-814"><span class="linenos">814</span></a>
-</span><span id="find_in_scope-815"><a href="#find_in_scope-815"><span class="linenos">815</span></a><span class="sd"> Returns:</span>
-</span><span id="find_in_scope-816"><a href="#find_in_scope-816"><span class="linenos">816</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
-</span><span id="find_in_scope-817"><a href="#find_in_scope-817"><span class="linenos">817</span></a><span class="sd"> the criteria was found.</span>
-</span><span id="find_in_scope-818"><a href="#find_in_scope-818"><span class="linenos">818</span></a><span class="sd"> &quot;&quot;&quot;</span>
-</span><span id="find_in_scope-819"><a href="#find_in_scope-819"><span class="linenos">819</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="kc">None</span><span class="p">)</span>
+ <div class="pdoc-code codehilite"><pre><span></span><span id="find_in_scope-807"><a href="#find_in_scope-807"><span class="linenos">807</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="find_in_scope-808"><a href="#find_in_scope-808"><span class="linenos">808</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
+</span><span id="find_in_scope-809"><a href="#find_in_scope-809"><span class="linenos">809</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
+</span><span id="find_in_scope-810"><a href="#find_in_scope-810"><span class="linenos">810</span></a>
+</span><span id="find_in_scope-811"><a href="#find_in_scope-811"><span class="linenos">811</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
+</span><span id="find_in_scope-812"><a href="#find_in_scope-812"><span class="linenos">812</span></a>
+</span><span id="find_in_scope-813"><a href="#find_in_scope-813"><span class="linenos">813</span></a><span class="sd"> Args:</span>
+</span><span id="find_in_scope-814"><a href="#find_in_scope-814"><span class="linenos">814</span></a><span class="sd"> expression (exp.Expression):</span>
+</span><span id="find_in_scope-815"><a href="#find_in_scope-815"><span class="linenos">815</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
+</span><span id="find_in_scope-816"><a href="#find_in_scope-816"><span class="linenos">816</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
+</span><span id="find_in_scope-817"><a href="#find_in_scope-817"><span class="linenos">817</span></a>
+</span><span id="find_in_scope-818"><a href="#find_in_scope-818"><span class="linenos">818</span></a><span class="sd"> Returns:</span>
+</span><span id="find_in_scope-819"><a href="#find_in_scope-819"><span class="linenos">819</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
+</span><span id="find_in_scope-820"><a href="#find_in_scope-820"><span class="linenos">820</span></a><span class="sd"> the criteria was found.</span>
+</span><span id="find_in_scope-821"><a href="#find_in_scope-821"><span class="linenos">821</span></a><span class="sd"> &quot;&quot;&quot;</span>
+</span><span id="find_in_scope-822"><a href="#find_in_scope-822"><span class="linenos">822</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</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="kc">None</span><span class="p">)</span>
</span></pre></div>