1
0
Fork 0

Merging upstream version 16.7.7.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 20:39:26 +01:00
parent 4d512c00f3
commit 70bf18533e
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
59 changed files with 16125 additions and 15681 deletions

File diff suppressed because one or more lines are too long

View file

@ -36,6 +36,9 @@
<li>
<a class="variable" href="#UNMERGABLE_ARGS">UNMERGABLE_ARGS</a>
</li>
<li>
<a class="variable" href="#SAFE_TO_REPLACE_UNWRAPPED">SAFE_TO_REPLACE_UNWRAPPED</a>
</li>
<li>
<a class="function" href="#merge_ctes">merge_ctes</a>
</li>
@ -114,336 +117,356 @@
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="p">}</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a><span class="k">def</span> <span class="nf">merge_ctes</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="c1"># All places where we select from CTEs.</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="c1"># We key on the CTE scope so we can detect CTES that are selected from multiple times.</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">cte_selections</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">scopes</span><span class="p">:</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">inner_scope</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">,</span> <span class="n">Scope</span><span class="p">)</span> <span class="ow">and</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">is_cte</span><span class="p">:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">cte_selections</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="p">(</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="n">outer_scope</span><span class="p">,</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="n">inner_scope</span><span class="p">,</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="n">table</span><span class="p">,</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="p">)</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="p">)</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="n">singular_cte_selections</span> <span class="o">=</span> <span class="p">[</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">cte_selections</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="k">for</span> <span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">singular_cte_selections</span><span class="p">:</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">find_ancestor</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><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">_pop_cte</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="k">def</span> <span class="nf">merge_derived_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">for</span> <span class="n">subquery</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">derived_tables</span><span class="p">:</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">find_ancestor</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><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">inner_scope</span> <span class="o">=</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">subquery</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="k">def</span> <span class="nf">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a><span class="sd"> Return True if `inner_select` can be merged into outer query.</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="sd"> Args:</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="sd"> outer_scope (Scope)</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="sd"> inner_scope (Scope)</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="sd"> leave_tables_isolated (bool)</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a><span class="sd"> from_or_join (exp.From|exp.Join)</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd"> Returns:</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="sd"> bool: True if can be merged</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">inner_select</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">unnest</span><span class="p">()</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">def</span> <span class="nf">_is_a_window_expression_in_unmergable_operation</span><span class="p">():</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="n">window_expressions</span> <span class="o">=</span> <span class="n">inner_select</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">)</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="n">window_alias_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">window</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</span> <span class="n">window_expressions</span><span class="p">}</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">inner_select_name</span> <span class="o">=</span> <span class="n">inner_select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="n">unmergable_window_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="n">column</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">columns</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</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">Having</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="p">)</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="p">]</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="n">window_expressions_in_unmergable</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="n">column</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unmergable_window_columns</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">table</span> <span class="o">==</span> <span class="n">inner_select_name</span> <span class="ow">and</span> <span class="n">column</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">window_alias_names</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="p">]</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">return</span> <span class="nb">any</span><span class="p">(</span><span class="n">window_expressions_in_unmergable</span><span class="p">)</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="k">def</span> <span class="nf">_outer_select_joins_on_inner_select_join</span><span class="p">():</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a><span class="sd"> All columns from the inner select in the ON clause must be from the first FROM table.</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a><span class="sd"> That is, this can be merged:</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a><span class="sd"> SELECT * FROM x JOIN (SELECT y.a AS a FROM y JOIN z) AS q ON x.a = q.a</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a><span class="sd"> ^^^ ^</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a><span class="sd"> But this can&#39;t:</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a><span class="sd"> SELECT * FROM x JOIN (SELECT z.a AS a FROM y JOIN z) AS q ON x.a = q.a</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a><span class="sd"> ^^^ ^</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">from_or_join</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="n">on</span> <span class="o">=</span> <span class="n">from_or_join</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;on&quot;</span><span class="p">)</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">on</span><span class="p">:</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">selections</span> <span class="o">=</span> <span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">on</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">table</span> <span class="o">==</span> <span class="n">alias</span><span class="p">]</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="n">inner_from</span> <span class="o">=</span> <span class="n">inner_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-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inner_from</span><span class="p">:</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="n">inner_from_table</span> <span class="o">=</span> <span class="n">inner_from</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="n">inner_projections</span> <span class="o">=</span> <span class="p">{</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">s</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">selects</span><span class="p">}</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">return</span> <span class="nb">any</span><span class="p">(</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="n">col</span><span class="o">.</span><span class="n">table</span> <span class="o">!=</span> <span class="n">inner_from_table</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="k">for</span> <span class="n">selection</span> <span class="ow">in</span> <span class="n">selections</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">inner_projections</span><span class="p">[</span><span class="n">selection</span><span class="p">]</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="p">)</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="p">(</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">inner_select</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">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">UNMERGABLE_ARGS</span><span class="p">)</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="ow">and</span> <span class="n">inner_select</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-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">pivots</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">inner_select</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span><span class="n">leave_tables_isolated</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">)</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="ow">and</span> <span class="n">inner_select</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;where&quot;</span><span class="p">)</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="ow">and</span> <span class="n">from_or_join</span><span class="o">.</span><span class="n">side</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;FULL&quot;</span><span class="p">,</span> <span class="s2">&quot;LEFT&quot;</span><span class="p">,</span> <span class="s2">&quot;RIGHT&quot;</span><span class="p">}</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="p">)</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">)</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="ow">and</span> <span class="n">inner_select</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;where&quot;</span><span class="p">)</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="n">j</span><span class="o">.</span><span class="n">side</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;FULL&quot;</span><span class="p">,</span> <span class="s2">&quot;RIGHT&quot;</span><span class="p">}</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">outer_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="p">[])</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="p">)</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="p">)</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">_outer_select_joins_on_inner_select_join</span><span class="p">()</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">_is_a_window_expression_in_unmergable_operation</span><span class="p">()</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="p">)</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a><span class="k">def</span> <span class="nf">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">):</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a><span class="sd"> Renames any sources in the inner query that conflict with names in the outer query.</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a><span class="sd"> Args:</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a><span class="sd"> alias (str)</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="n">taken</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span>
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="n">conflicts</span> <span class="o">=</span> <span class="n">taken</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">inner_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">))</span>
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a> <span class="n">conflicts</span> <span class="o">-=</span> <span class="p">{</span><span class="n">alias</span><span class="p">}</span>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a> <span class="k">for</span> <span class="n">conflict</span> <span class="ow">in</span> <span class="n">conflicts</span><span class="p">:</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a> <span class="n">new_name</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken</span><span class="p">,</span> <span class="n">conflict</span><span class="p">)</span>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="n">source</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">[</span><span class="n">conflict</span><span class="p">]</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="n">new_alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">new_name</span><span class="p">)</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</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-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="n">source</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">new_alias</span><span class="p">))</span>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span> <span class="ow">and</span> <span class="n">source</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="n">source</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="n">new_alias</span><span class="p">)</span>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</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-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="n">source</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">new_alias</span><span class="p">))</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">source_columns</span><span class="p">(</span><span class="n">conflict</span><span class="p">):</span>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;table&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">new_name</span><span class="p">))</span>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a>
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a> <span class="n">inner_scope</span><span class="o">.</span><span class="n">rename_source</span><span class="p">(</span><span class="n">conflict</span><span class="p">,</span> <span class="n">new_name</span><span class="p">)</span>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a>
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a><span class="k">def</span> <span class="nf">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">node_to_replace</span><span class="p">,</span> <span class="n">alias</span><span class="p">):</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a><span class="sd"> Merge FROM clause of inner query into outer query.</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a><span class="sd"> Args:</span>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a><span class="sd"> node_to_replace (exp.Subquery|exp.Table)</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a><span class="sd"> alias (str)</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="n">new_subquery</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="n">node_to_replace</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">new_subquery</span><span class="p">)</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="k">for</span> <span class="n">join_hint</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">join_hints</span><span class="p">:</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="n">tables</span> <span class="o">=</span> <span class="n">join_hint</span><span class="o">.</span><span class="n">find_all</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-236"><a href="#L-236"><span class="linenos">236</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">tables</span><span class="p">:</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="k">if</span> <span class="n">table</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="o">==</span> <span class="n">node_to_replace</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="n">table</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">new_subquery</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">))</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">remove_source</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">add_source</span><span class="p">(</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="n">new_subquery</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_subquery</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">]</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="p">)</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a><span class="k">def</span> <span class="nf">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a><span class="sd"> Merge JOIN clauses of inner query into outer query.</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a><span class="sd"> Args:</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a><span class="sd"> from_or_join (exp.From|exp.Join)</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a><span class="c1"># Projections in the outer query that are instances of these types can be replaced</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a><span class="c1"># without getting wrapped in parentheses, because the precedence won&#39;t be altered.</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a><span class="n">SAFE_TO_REPLACE_UNWRAPPED</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">,</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Func</span><span class="p">,</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">NEQ</span><span class="p">,</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Paren</span><span class="p">,</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a><span class="p">)</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a><span class="k">def</span> <span class="nf">merge_ctes</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="c1"># All places where we select from CTEs.</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="c1"># We key on the CTE scope so we can detect CTES that are selected from multiple times.</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="n">cte_selections</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">scopes</span><span class="p">:</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">inner_scope</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">,</span> <span class="n">Scope</span><span class="p">)</span> <span class="ow">and</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">is_cte</span><span class="p">:</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">cte_selections</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="p">(</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">outer_scope</span><span class="p">,</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="n">inner_scope</span><span class="p">,</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">table</span><span class="p">,</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="p">)</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">singular_cte_selections</span> <span class="o">=</span> <span class="p">[</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">cte_selections</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">for</span> <span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">singular_cte_selections</span><span class="p">:</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">find_ancestor</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><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="n">_pop_cte</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a><span class="k">def</span> <span class="nf">merge_derived_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="k">for</span> <span class="n">subquery</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">derived_tables</span><span class="p">:</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">find_ancestor</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><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="n">inner_scope</span> <span class="o">=</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">subquery</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="k">def</span> <span class="nf">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd"> Return True if `inner_select` can be merged into outer query.</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> Args:</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> outer_scope (Scope)</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a><span class="sd"> inner_scope (Scope)</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a><span class="sd"> leave_tables_isolated (bool)</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a><span class="sd"> from_or_join (exp.From|exp.Join)</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a><span class="sd"> Returns:</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a><span class="sd"> bool: True if can be merged</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">inner_select</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">unnest</span><span class="p">()</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">def</span> <span class="nf">_is_a_window_expression_in_unmergable_operation</span><span class="p">():</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="n">window_expressions</span> <span class="o">=</span> <span class="n">inner_select</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">)</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="n">window_alias_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">window</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="k">for</span> <span class="n">window</span> <span class="ow">in</span> <span class="n">window_expressions</span><span class="p">}</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="n">inner_select_name</span> <span class="o">=</span> <span class="n">inner_select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">unmergable_window_columns</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="n">column</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">columns</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Order</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">Having</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="p">)</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="p">]</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">window_expressions_in_unmergable</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="n">column</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unmergable_window_columns</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">table</span> <span class="o">==</span> <span class="n">inner_select_name</span> <span class="ow">and</span> <span class="n">column</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">window_alias_names</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="p">]</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">return</span> <span class="nb">any</span><span class="p">(</span><span class="n">window_expressions_in_unmergable</span><span class="p">)</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">def</span> <span class="nf">_outer_select_joins_on_inner_select_join</span><span class="p">():</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="sd"> All columns from the inner select in the ON clause must be from the first FROM table.</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="sd"> That is, this can be merged:</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> SELECT * FROM x JOIN (SELECT y.a AS a FROM y JOIN z) AS q ON x.a = q.a</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd"> ^^^ ^</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a><span class="sd"> But this can&#39;t:</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a><span class="sd"> SELECT * FROM x JOIN (SELECT z.a AS a FROM y JOIN z) AS q ON x.a = q.a</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a><span class="sd"> ^^^ ^</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">from_or_join</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="n">on</span> <span class="o">=</span> <span class="n">from_or_join</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;on&quot;</span><span class="p">)</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">on</span><span class="p">:</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="n">selections</span> <span class="o">=</span> <span class="p">[</span><span class="n">c</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">on</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">table</span> <span class="o">==</span> <span class="n">alias</span><span class="p">]</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="n">inner_from</span> <span class="o">=</span> <span class="n">inner_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-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inner_from</span><span class="p">:</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="k">return</span> <span class="kc">False</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="n">inner_from_table</span> <span class="o">=</span> <span class="n">inner_from</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">inner_projections</span> <span class="o">=</span> <span class="p">{</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">s</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">selects</span><span class="p">}</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="k">return</span> <span class="nb">any</span><span class="p">(</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="n">col</span><span class="o">.</span><span class="n">table</span> <span class="o">!=</span> <span class="n">inner_from_table</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="k">for</span> <span class="n">selection</span> <span class="ow">in</span> <span class="n">selections</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">inner_projections</span><span class="p">[</span><span class="n">selection</span><span class="p">]</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="p">)</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="k">return</span> <span class="p">(</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">inner_select</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">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">UNMERGABLE_ARGS</span><span class="p">)</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="ow">and</span> <span class="n">inner_select</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-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">pivots</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">inner_select</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span><span class="n">leave_tables_isolated</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">)</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="ow">and</span> <span class="n">inner_select</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;where&quot;</span><span class="p">)</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="ow">and</span> <span class="n">from_or_join</span><span class="o">.</span><span class="n">side</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;FULL&quot;</span><span class="p">,</span> <span class="s2">&quot;LEFT&quot;</span><span class="p">,</span> <span class="s2">&quot;RIGHT&quot;</span><span class="p">}</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="p">)</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">)</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="ow">and</span> <span class="n">inner_select</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;where&quot;</span><span class="p">)</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="n">j</span><span class="o">.</span><span class="n">side</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;FULL&quot;</span><span class="p">,</span> <span class="s2">&quot;RIGHT&quot;</span><span class="p">}</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">outer_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="p">[])</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="p">)</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="p">)</span>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">_outer_select_joins_on_inner_select_join</span><span class="p">()</span>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">_is_a_window_expression_in_unmergable_operation</span><span class="p">()</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="p">)</span>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a>
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a>
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a><span class="k">def</span> <span class="nf">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">):</span>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a><span class="sd"> Renames any sources in the inner query that conflict with names in the outer query.</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a><span class="sd"> Args:</span>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a><span class="sd"> alias (str)</span>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="n">taken</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="n">conflicts</span> <span class="o">=</span> <span class="n">taken</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">inner_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">))</span>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="n">conflicts</span> <span class="o">-=</span> <span class="p">{</span><span class="n">alias</span><span class="p">}</span>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a>
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="k">for</span> <span class="n">conflict</span> <span class="ow">in</span> <span class="n">conflicts</span><span class="p">:</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="n">new_name</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken</span><span class="p">,</span> <span class="n">conflict</span><span class="p">)</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="n">source</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">[</span><span class="n">conflict</span><span class="p">]</span>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="n">new_alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">new_name</span><span class="p">)</span>
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</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-221"><a href="#L-221"><span class="linenos">221</span></a> <span class="n">source</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">new_alias</span><span class="p">))</span>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span> <span class="ow">and</span> <span class="n">source</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="n">source</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="n">new_alias</span><span class="p">)</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</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-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="n">source</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">new_alias</span><span class="p">))</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">source_columns</span><span class="p">(</span><span class="n">conflict</span><span class="p">):</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;table&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">new_name</span><span class="p">))</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="n">inner_scope</span><span class="o">.</span><span class="n">rename_source</span><span class="p">(</span><span class="n">conflict</span><span class="p">,</span> <span class="n">new_name</span><span class="p">)</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a><span class="k">def</span> <span class="nf">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">node_to_replace</span><span class="p">,</span> <span class="n">alias</span><span class="p">):</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a><span class="sd"> Merge FROM clause of inner query into outer query.</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a><span class="sd"> Args:</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a><span class="sd"> node_to_replace (exp.Subquery|exp.Table)</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a><span class="sd"> alias (str)</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="n">new_subquery</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;from&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="n">node_to_replace</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">new_subquery</span><span class="p">)</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="k">for</span> <span class="n">join_hint</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">join_hints</span><span class="p">:</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="n">tables</span> <span class="o">=</span> <span class="n">join_hint</span><span class="o">.</span><span class="n">find_all</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-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">tables</span><span class="p">:</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="k">if</span> <span class="n">table</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="o">==</span> <span class="n">node_to_replace</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="n">table</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">new_subquery</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">))</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">remove_source</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">add_source</span><span class="p">(</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="n">new_subquery</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">new_subquery</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">]</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="p">)</span>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="n">new_joins</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">inner_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-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">joins</span><span class="p">:</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="n">new_joins</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">join</span><span class="p">)</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">add_source</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">])</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="k">if</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="n">outer_joins</span> <span class="o">=</span> <span class="n">outer_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="p">[])</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="c1"># Maintain the join order</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">):</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="n">position</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="n">position</span> <span class="o">=</span> <span class="n">outer_joins</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">outer_joins</span><span class="p">[</span><span class="n">position</span><span class="p">:</span><span class="n">position</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_joins</span>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="n">outer_joins</span><span class="p">)</span>
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a>
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a>
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a><span class="k">def</span> <span class="nf">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">):</span>
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a><span class="sd"> Merge projections of inner query into outer query.</span>
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a>
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a><span class="sd"> Args:</span>
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a><span class="sd"> alias (str)</span>
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a> <span class="c1"># Collect all columns that reference the alias of the inner query</span>
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a> <span class="n">outer_columns</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">table</span> <span class="o">==</span> <span class="n">alias</span><span class="p">:</span>
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a> <span class="n">outer_columns</span><span class="p">[</span><span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">column</span><span class="p">)</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a><span class="k">def</span> <span class="nf">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a><span class="sd"> Merge JOIN clauses of inner query into outer query.</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a><span class="sd"> Args:</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a><span class="sd"> from_or_join (exp.From|exp.Join)</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="n">new_joins</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="n">joins</span> <span class="o">=</span> <span class="n">inner_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-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">joins</span><span class="p">:</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">new_joins</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">join</span><span class="p">)</span>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">add_source</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">])</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a>
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="k">if</span> <span class="n">new_joins</span><span class="p">:</span>
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="n">outer_joins</span> <span class="o">=</span> <span class="n">outer_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="p">[])</span>
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a>
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="c1"># Maintain the join order</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">):</span>
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a> <span class="n">position</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="n">position</span> <span class="o">=</span> <span class="n">outer_joins</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a> <span class="n">outer_joins</span><span class="p">[</span><span class="n">position</span><span class="p">:</span><span class="n">position</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_joins</span>
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a>
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;joins&quot;</span><span class="p">,</span> <span class="n">outer_joins</span><span class="p">)</span>
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a>
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a>
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a><span class="k">def</span> <span class="nf">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">):</span>
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a><span class="sd"> Merge projections of inner query into outer query.</span>
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a>
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a> <span class="c1"># Replace columns with the projection expression in the inner query</span>
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a> <span class="n">projection_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-293"><a href="#L-293"><span class="linenos">293</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">projection_name</span><span class="p">:</span>
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a> <span class="k">continue</span>
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a> <span class="n">columns_to_replace</span> <span class="o">=</span> <span class="n">outer_columns</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">projection_name</span><span class="p">,</span> <span class="p">[])</span>
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns_to_replace</span><span class="p">:</span>
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a> <span class="n">column</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">unalias</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a>
</span><span id="L-299"><a href="#L-299"><span class="linenos">299</span></a>
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a><span class="k">def</span> <span class="nf">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</span></a><span class="sd"> Merge WHERE clause of inner query into outer query.</span>
</span><span id="L-303"><a href="#L-303"><span class="linenos">303</span></a>
</span><span id="L-304"><a href="#L-304"><span class="linenos">304</span></a><span class="sd"> Args:</span>
</span><span id="L-305"><a href="#L-305"><span class="linenos">305</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-306"><a href="#L-306"><span class="linenos">306</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-307"><a href="#L-307"><span class="linenos">307</span></a><span class="sd"> from_or_join (exp.From|exp.Join)</span>
</span><span id="L-308"><a href="#L-308"><span class="linenos">308</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-309"><a href="#L-309"><span class="linenos">309</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">inner_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;where&quot;</span><span class="p">)</span>
</span><span id="L-310"><a href="#L-310"><span class="linenos">310</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
</span><span id="L-311"><a href="#L-311"><span class="linenos">311</span></a> <span class="k">return</span>
</span><span id="L-312"><a href="#L-312"><span class="linenos">312</span></a>
</span><span id="L-313"><a href="#L-313"><span class="linenos">313</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span>
</span><span id="L-314"><a href="#L-314"><span class="linenos">314</span></a>
</span><span id="L-315"><a href="#L-315"><span class="linenos">315</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="L-316"><a href="#L-316"><span class="linenos">316</span></a> <span class="c1"># Merge predicates from an outer join to the ON clause</span>
</span><span id="L-317"><a href="#L-317"><span class="linenos">317</span></a> <span class="c1"># if it only has columns that are already joined</span>
</span><span id="L-318"><a href="#L-318"><span class="linenos">318</span></a> <span class="n">from_</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-319"><a href="#L-319"><span class="linenos">319</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{</span><span class="n">from_</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">}</span> <span class="k">if</span> <span class="n">from_</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="L-320"><a href="#L-320"><span class="linenos">320</span></a>
</span><span id="L-321"><a href="#L-321"><span class="linenos">321</span></a> <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="p">[</span><span class="s2">&quot;joins&quot;</span><span class="p">]:</span>
</span><span id="L-322"><a href="#L-322"><span class="linenos">322</span></a> <span class="n">source</span> <span class="o">=</span> <span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-323"><a href="#L-323"><span class="linenos">323</span></a> <span class="n">sources</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
</span><span id="L-324"><a href="#L-324"><span class="linenos">324</span></a> <span class="k">if</span> <span class="n">source</span> <span class="o">==</span> <span class="n">from_or_join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="L-325"><a href="#L-325"><span class="linenos">325</span></a> <span class="k">break</span>
</span><span id="L-326"><a href="#L-326"><span class="linenos">326</span></a>
</span><span id="L-327"><a href="#L-327"><span class="linenos">327</span></a> <span class="k">if</span> <span class="n">exp</span><span class="o">.</span><span class="n">column_table_names</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">sources</span><span class="p">:</span>
</span><span id="L-328"><a href="#L-328"><span class="linenos">328</span></a> <span class="n">from_or_join</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-329"><a href="#L-329"><span class="linenos">329</span></a> <span class="n">from_or_join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="n">from_or_join</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;on&quot;</span><span class="p">))</span>
</span><span id="L-330"><a href="#L-330"><span class="linenos">330</span></a> <span class="k">return</span>
</span><span id="L-331"><a href="#L-331"><span class="linenos">331</span></a>
</span><span id="L-332"><a href="#L-332"><span class="linenos">332</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-333"><a href="#L-333"><span class="linenos">333</span></a>
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a><span class="sd"> Args:</span>
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a><span class="sd"> alias (str)</span>
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a> <span class="c1"># Collect all columns that reference the alias of the inner query</span>
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a> <span class="n">outer_columns</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">table</span> <span class="o">==</span> <span class="n">alias</span><span class="p">:</span>
</span><span id="L-299"><a href="#L-299"><span class="linenos">299</span></a> <span class="n">outer_columns</span><span class="p">[</span><span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">column</span><span class="p">)</span>
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a>
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a> <span class="c1"># Replace columns with the projection expression in the inner query</span>
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-303"><a href="#L-303"><span class="linenos">303</span></a> <span class="n">projection_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-304"><a href="#L-304"><span class="linenos">304</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">projection_name</span><span class="p">:</span>
</span><span id="L-305"><a href="#L-305"><span class="linenos">305</span></a> <span class="k">continue</span>
</span><span id="L-306"><a href="#L-306"><span class="linenos">306</span></a> <span class="n">columns_to_replace</span> <span class="o">=</span> <span class="n">outer_columns</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">projection_name</span><span class="p">,</span> <span class="p">[])</span>
</span><span id="L-307"><a href="#L-307"><span class="linenos">307</span></a>
</span><span id="L-308"><a href="#L-308"><span class="linenos">308</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">unalias</span><span class="p">()</span>
</span><span id="L-309"><a href="#L-309"><span class="linenos">309</span></a> <span class="n">must_wrap_expression</span> <span class="o">=</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">SAFE_TO_REPLACE_UNWRAPPED</span><span class="p">)</span>
</span><span id="L-310"><a href="#L-310"><span class="linenos">310</span></a>
</span><span id="L-311"><a href="#L-311"><span class="linenos">311</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns_to_replace</span><span class="p">:</span>
</span><span id="L-312"><a href="#L-312"><span class="linenos">312</span></a> <span class="c1"># Ensures we don&#39;t alter the intended operator precedence if there&#39;s additional</span>
</span><span id="L-313"><a href="#L-313"><span class="linenos">313</span></a> <span class="c1"># context surrounding the outer expression (i.e. it&#39;s not a simple projection).</span>
</span><span id="L-314"><a href="#L-314"><span class="linenos">314</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">column</span><span class="o">.</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">Unary</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">))</span> <span class="ow">and</span> <span class="n">must_wrap_expression</span><span class="p">:</span>
</span><span id="L-315"><a href="#L-315"><span class="linenos">315</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-316"><a href="#L-316"><span class="linenos">316</span></a>
</span><span id="L-317"><a href="#L-317"><span class="linenos">317</span></a> <span class="n">column</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="L-318"><a href="#L-318"><span class="linenos">318</span></a>
</span><span id="L-319"><a href="#L-319"><span class="linenos">319</span></a>
</span><span id="L-320"><a href="#L-320"><span class="linenos">320</span></a><span class="k">def</span> <span class="nf">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="L-321"><a href="#L-321"><span class="linenos">321</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-322"><a href="#L-322"><span class="linenos">322</span></a><span class="sd"> Merge WHERE clause of inner query into outer query.</span>
</span><span id="L-323"><a href="#L-323"><span class="linenos">323</span></a>
</span><span id="L-324"><a href="#L-324"><span class="linenos">324</span></a><span class="sd"> Args:</span>
</span><span id="L-325"><a href="#L-325"><span class="linenos">325</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-326"><a href="#L-326"><span class="linenos">326</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-327"><a href="#L-327"><span class="linenos">327</span></a><span class="sd"> from_or_join (exp.From|exp.Join)</span>
</span><span id="L-328"><a href="#L-328"><span class="linenos">328</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-329"><a href="#L-329"><span class="linenos">329</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">inner_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;where&quot;</span><span class="p">)</span>
</span><span id="L-330"><a href="#L-330"><span class="linenos">330</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
</span><span id="L-331"><a href="#L-331"><span class="linenos">331</span></a> <span class="k">return</span>
</span><span id="L-332"><a href="#L-332"><span class="linenos">332</span></a>
</span><span id="L-333"><a href="#L-333"><span class="linenos">333</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span>
</span><span id="L-334"><a href="#L-334"><span class="linenos">334</span></a>
</span><span id="L-335"><a href="#L-335"><span class="linenos">335</span></a><span class="k">def</span> <span class="nf">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">):</span>
</span><span id="L-336"><a href="#L-336"><span class="linenos">336</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-337"><a href="#L-337"><span class="linenos">337</span></a><span class="sd"> Merge ORDER clause of inner query into outer query.</span>
</span><span id="L-338"><a href="#L-338"><span class="linenos">338</span></a>
</span><span id="L-339"><a href="#L-339"><span class="linenos">339</span></a><span class="sd"> Args:</span>
</span><span id="L-340"><a href="#L-340"><span class="linenos">340</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-341"><a href="#L-341"><span class="linenos">341</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-342"><a href="#L-342"><span class="linenos">342</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-343"><a href="#L-343"><span class="linenos">343</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-344"><a href="#L-344"><span class="linenos">344</span></a> <span class="nb">any</span><span class="p">(</span>
</span><span id="L-345"><a href="#L-345"><span class="linenos">345</span></a> <span class="n">outer_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="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;group&quot;</span><span class="p">,</span> <span class="s2">&quot;distinct&quot;</span><span class="p">,</span> <span class="s2">&quot;having&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">]</span>
</span><span id="L-346"><a href="#L-346"><span class="linenos">346</span></a> <span class="p">)</span>
</span><span id="L-347"><a href="#L-347"><span class="linenos">347</span></a> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span>
</span><span id="L-348"><a href="#L-348"><span class="linenos">348</span></a> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-349"><a href="#L-349"><span class="linenos">349</span></a> <span class="p">):</span>
</span><span id="L-350"><a href="#L-350"><span class="linenos">350</span></a> <span class="k">return</span>
</span><span id="L-335"><a href="#L-335"><span class="linenos">335</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_or_join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="L-336"><a href="#L-336"><span class="linenos">336</span></a> <span class="c1"># Merge predicates from an outer join to the ON clause</span>
</span><span id="L-337"><a href="#L-337"><span class="linenos">337</span></a> <span class="c1"># if it only has columns that are already joined</span>
</span><span id="L-338"><a href="#L-338"><span class="linenos">338</span></a> <span class="n">from_</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-339"><a href="#L-339"><span class="linenos">339</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{</span><span class="n">from_</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">}</span> <span class="k">if</span> <span class="n">from_</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="L-340"><a href="#L-340"><span class="linenos">340</span></a>
</span><span id="L-341"><a href="#L-341"><span class="linenos">341</span></a> <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="p">[</span><span class="s2">&quot;joins&quot;</span><span class="p">]:</span>
</span><span id="L-342"><a href="#L-342"><span class="linenos">342</span></a> <span class="n">source</span> <span class="o">=</span> <span class="n">join</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="L-343"><a href="#L-343"><span class="linenos">343</span></a> <span class="n">sources</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
</span><span id="L-344"><a href="#L-344"><span class="linenos">344</span></a> <span class="k">if</span> <span class="n">source</span> <span class="o">==</span> <span class="n">from_or_join</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="L-345"><a href="#L-345"><span class="linenos">345</span></a> <span class="k">break</span>
</span><span id="L-346"><a href="#L-346"><span class="linenos">346</span></a>
</span><span id="L-347"><a href="#L-347"><span class="linenos">347</span></a> <span class="k">if</span> <span class="n">exp</span><span class="o">.</span><span class="n">column_table_names</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">sources</span><span class="p">:</span>
</span><span id="L-348"><a href="#L-348"><span class="linenos">348</span></a> <span class="n">from_or_join</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-349"><a href="#L-349"><span class="linenos">349</span></a> <span class="n">from_or_join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="n">from_or_join</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;on&quot;</span><span class="p">))</span>
</span><span id="L-350"><a href="#L-350"><span class="linenos">350</span></a> <span class="k">return</span>
</span><span id="L-351"><a href="#L-351"><span class="linenos">351</span></a>
</span><span id="L-352"><a href="#L-352"><span class="linenos">352</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="n">inner_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;order&quot;</span><span class="p">))</span>
</span><span id="L-352"><a href="#L-352"><span class="linenos">352</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-353"><a href="#L-353"><span class="linenos">353</span></a>
</span><span id="L-354"><a href="#L-354"><span class="linenos">354</span></a>
</span><span id="L-355"><a href="#L-355"><span class="linenos">355</span></a><span class="k">def</span> <span class="nf">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">):</span>
</span><span id="L-356"><a href="#L-356"><span class="linenos">356</span></a> <span class="n">inner_scope_hint</span> <span class="o">=</span> <span class="n">inner_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;hint&quot;</span><span class="p">)</span>
</span><span id="L-357"><a href="#L-357"><span class="linenos">357</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inner_scope_hint</span><span class="p">:</span>
</span><span id="L-358"><a href="#L-358"><span class="linenos">358</span></a> <span class="k">return</span>
</span><span id="L-359"><a href="#L-359"><span class="linenos">359</span></a> <span class="n">outer_scope_hint</span> <span class="o">=</span> <span class="n">outer_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;hint&quot;</span><span class="p">)</span>
</span><span id="L-360"><a href="#L-360"><span class="linenos">360</span></a> <span class="k">if</span> <span class="n">outer_scope_hint</span><span class="p">:</span>
</span><span id="L-361"><a href="#L-361"><span class="linenos">361</span></a> <span class="k">for</span> <span class="n">hint_expression</span> <span class="ow">in</span> <span class="n">inner_scope_hint</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-362"><a href="#L-362"><span class="linenos">362</span></a> <span class="n">outer_scope_hint</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">hint_expression</span><span class="p">)</span>
</span><span id="L-363"><a href="#L-363"><span class="linenos">363</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-364"><a href="#L-364"><span class="linenos">364</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;hint&quot;</span><span class="p">,</span> <span class="n">inner_scope_hint</span><span class="p">)</span>
</span><span id="L-365"><a href="#L-365"><span class="linenos">365</span></a>
</span><span id="L-366"><a href="#L-366"><span class="linenos">366</span></a>
</span><span id="L-367"><a href="#L-367"><span class="linenos">367</span></a><span class="k">def</span> <span class="nf">_pop_cte</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">):</span>
</span><span id="L-368"><a href="#L-368"><span class="linenos">368</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-369"><a href="#L-369"><span class="linenos">369</span></a><span class="sd"> Remove CTE from the AST.</span>
</span><span id="L-370"><a href="#L-370"><span class="linenos">370</span></a>
</span><span id="L-371"><a href="#L-371"><span class="linenos">371</span></a><span class="sd"> Args:</span>
</span><span id="L-372"><a href="#L-372"><span class="linenos">372</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-373"><a href="#L-373"><span class="linenos">373</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-374"><a href="#L-374"><span class="linenos">374</span></a> <span class="n">cte</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-375"><a href="#L-375"><span class="linenos">375</span></a> <span class="n">with_</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-376"><a href="#L-376"><span class="linenos">376</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">with_</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-377"><a href="#L-377"><span class="linenos">377</span></a> <span class="n">with_</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-378"><a href="#L-378"><span class="linenos">378</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-379"><a href="#L-379"><span class="linenos">379</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-355"><a href="#L-355"><span class="linenos">355</span></a><span class="k">def</span> <span class="nf">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">):</span>
</span><span id="L-356"><a href="#L-356"><span class="linenos">356</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-357"><a href="#L-357"><span class="linenos">357</span></a><span class="sd"> Merge ORDER clause of inner query into outer query.</span>
</span><span id="L-358"><a href="#L-358"><span class="linenos">358</span></a>
</span><span id="L-359"><a href="#L-359"><span class="linenos">359</span></a><span class="sd"> Args:</span>
</span><span id="L-360"><a href="#L-360"><span class="linenos">360</span></a><span class="sd"> outer_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-361"><a href="#L-361"><span class="linenos">361</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-362"><a href="#L-362"><span class="linenos">362</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-363"><a href="#L-363"><span class="linenos">363</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-364"><a href="#L-364"><span class="linenos">364</span></a> <span class="nb">any</span><span class="p">(</span>
</span><span id="L-365"><a href="#L-365"><span class="linenos">365</span></a> <span class="n">outer_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="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;group&quot;</span><span class="p">,</span> <span class="s2">&quot;distinct&quot;</span><span class="p">,</span> <span class="s2">&quot;having&quot;</span><span class="p">,</span> <span class="s2">&quot;order&quot;</span><span class="p">]</span>
</span><span id="L-366"><a href="#L-366"><span class="linenos">366</span></a> <span class="p">)</span>
</span><span id="L-367"><a href="#L-367"><span class="linenos">367</span></a> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span>
</span><span id="L-368"><a href="#L-368"><span class="linenos">368</span></a> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-369"><a href="#L-369"><span class="linenos">369</span></a> <span class="p">):</span>
</span><span id="L-370"><a href="#L-370"><span class="linenos">370</span></a> <span class="k">return</span>
</span><span id="L-371"><a href="#L-371"><span class="linenos">371</span></a>
</span><span id="L-372"><a href="#L-372"><span class="linenos">372</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;order&quot;</span><span class="p">,</span> <span class="n">inner_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;order&quot;</span><span class="p">))</span>
</span><span id="L-373"><a href="#L-373"><span class="linenos">373</span></a>
</span><span id="L-374"><a href="#L-374"><span class="linenos">374</span></a>
</span><span id="L-375"><a href="#L-375"><span class="linenos">375</span></a><span class="k">def</span> <span class="nf">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">):</span>
</span><span id="L-376"><a href="#L-376"><span class="linenos">376</span></a> <span class="n">inner_scope_hint</span> <span class="o">=</span> <span class="n">inner_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;hint&quot;</span><span class="p">)</span>
</span><span id="L-377"><a href="#L-377"><span class="linenos">377</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">inner_scope_hint</span><span class="p">:</span>
</span><span id="L-378"><a href="#L-378"><span class="linenos">378</span></a> <span class="k">return</span>
</span><span id="L-379"><a href="#L-379"><span class="linenos">379</span></a> <span class="n">outer_scope_hint</span> <span class="o">=</span> <span class="n">outer_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;hint&quot;</span><span class="p">)</span>
</span><span id="L-380"><a href="#L-380"><span class="linenos">380</span></a> <span class="k">if</span> <span class="n">outer_scope_hint</span><span class="p">:</span>
</span><span id="L-381"><a href="#L-381"><span class="linenos">381</span></a> <span class="k">for</span> <span class="n">hint_expression</span> <span class="ow">in</span> <span class="n">inner_scope_hint</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-382"><a href="#L-382"><span class="linenos">382</span></a> <span class="n">outer_scope_hint</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">hint_expression</span><span class="p">)</span>
</span><span id="L-383"><a href="#L-383"><span class="linenos">383</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-384"><a href="#L-384"><span class="linenos">384</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;hint&quot;</span><span class="p">,</span> <span class="n">inner_scope_hint</span><span class="p">)</span>
</span><span id="L-385"><a href="#L-385"><span class="linenos">385</span></a>
</span><span id="L-386"><a href="#L-386"><span class="linenos">386</span></a>
</span><span id="L-387"><a href="#L-387"><span class="linenos">387</span></a><span class="k">def</span> <span class="nf">_pop_cte</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">):</span>
</span><span id="L-388"><a href="#L-388"><span class="linenos">388</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-389"><a href="#L-389"><span class="linenos">389</span></a><span class="sd"> Remove CTE from the AST.</span>
</span><span id="L-390"><a href="#L-390"><span class="linenos">390</span></a>
</span><span id="L-391"><a href="#L-391"><span class="linenos">391</span></a><span class="sd"> Args:</span>
</span><span id="L-392"><a href="#L-392"><span class="linenos">392</span></a><span class="sd"> inner_scope (sqlglot.optimizer.scope.Scope)</span>
</span><span id="L-393"><a href="#L-393"><span class="linenos">393</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-394"><a href="#L-394"><span class="linenos">394</span></a> <span class="n">cte</span> <span class="o">=</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-395"><a href="#L-395"><span class="linenos">395</span></a> <span class="n">with_</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">parent</span>
</span><span id="L-396"><a href="#L-396"><span class="linenos">396</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">with_</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-397"><a href="#L-397"><span class="linenos">397</span></a> <span class="n">with_</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-398"><a href="#L-398"><span class="linenos">398</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-399"><a href="#L-399"><span class="linenos">399</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span></pre></div>
@ -542,7 +565,7 @@ queries if it would result in multiple table selects in a single query:</p>
<div class="attr variable">
<span class="name">UNMERGABLE_ARGS</span> =
<input id="UNMERGABLE_ARGS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{&#39;into&#39;, &#39;sample&#39;, &#39;limit&#39;, &#39;settings&#39;, &#39;windows&#39;, &#39;with&#39;, &#39;qualify&#39;, &#39;distinct&#39;, &#39;format&#39;, &#39;locks&#39;, &#39;offset&#39;, &#39;laterals&#39;, &#39;cluster&#39;, &#39;group&#39;, &#39;pivots&#39;, &#39;having&#39;, &#39;match&#39;, &#39;kind&#39;, &#39;distribute&#39;, &#39;sort&#39;}</span>
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{&#39;sort&#39;, &#39;group&#39;, &#39;cluster&#39;, &#39;offset&#39;, &#39;distinct&#39;, &#39;pivots&#39;, &#39;limit&#39;, &#39;qualify&#39;, &#39;format&#39;, &#39;with&#39;, &#39;settings&#39;, &#39;locks&#39;, &#39;into&#39;, &#39;distribute&#39;, &#39;laterals&#39;, &#39;windows&#39;, &#39;match&#39;, &#39;sample&#39;, &#39;kind&#39;, &#39;having&#39;}</span>
</div>
@ -550,6 +573,19 @@ queries if it would result in multiple table selects in a single query:</p>
</section>
<section id="SAFE_TO_REPLACE_UNWRAPPED">
<div class="attr variable">
<span class="name">SAFE_TO_REPLACE_UNWRAPPED</span> =
<input id="SAFE_TO_REPLACE_UNWRAPPED-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="SAFE_TO_REPLACE_UNWRAPPED-view-value"></label><span class="default_value">(&lt;class &#39;<a href="../expressions.html#Column">sqlglot.expressions.Column</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#EQ">sqlglot.expressions.EQ</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#Func">sqlglot.expressions.Func</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#NEQ">sqlglot.expressions.NEQ</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#Paren">sqlglot.expressions.Paren</a>&#39;&gt;)</span>
</div>
<a class="headerlink" href="#SAFE_TO_REPLACE_UNWRAPPED"></a>
</section>
<section id="merge_ctes">
<input id="merge_ctes-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
@ -562,38 +598,38 @@ queries if it would result in multiple table selects in a single query:</p>
</div>
<a class="headerlink" href="#merge_ctes"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="merge_ctes-51"><a href="#merge_ctes-51"><span class="linenos">51</span></a><span class="k">def</span> <span class="nf">merge_ctes</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="merge_ctes-52"><a href="#merge_ctes-52"><span class="linenos">52</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="merge_ctes-53"><a href="#merge_ctes-53"><span class="linenos">53</span></a>
</span><span id="merge_ctes-54"><a href="#merge_ctes-54"><span class="linenos">54</span></a> <span class="c1"># All places where we select from CTEs.</span>
</span><span id="merge_ctes-55"><a href="#merge_ctes-55"><span class="linenos">55</span></a> <span class="c1"># We key on the CTE scope so we can detect CTES that are selected from multiple times.</span>
</span><span id="merge_ctes-56"><a href="#merge_ctes-56"><span class="linenos">56</span></a> <span class="n">cte_selections</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
</span><span id="merge_ctes-57"><a href="#merge_ctes-57"><span class="linenos">57</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">scopes</span><span class="p">:</span>
</span><span id="merge_ctes-58"><a href="#merge_ctes-58"><span class="linenos">58</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">inner_scope</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span><span id="merge_ctes-59"><a href="#merge_ctes-59"><span class="linenos">59</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">,</span> <span class="n">Scope</span><span class="p">)</span> <span class="ow">and</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">is_cte</span><span class="p">:</span>
</span><span id="merge_ctes-60"><a href="#merge_ctes-60"><span class="linenos">60</span></a> <span class="n">cte_selections</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="merge_ctes-61"><a href="#merge_ctes-61"><span class="linenos">61</span></a> <span class="p">(</span>
</span><span id="merge_ctes-62"><a href="#merge_ctes-62"><span class="linenos">62</span></a> <span class="n">outer_scope</span><span class="p">,</span>
</span><span id="merge_ctes-63"><a href="#merge_ctes-63"><span class="linenos">63</span></a> <span class="n">inner_scope</span><span class="p">,</span>
</span><span id="merge_ctes-64"><a href="#merge_ctes-64"><span class="linenos">64</span></a> <span class="n">table</span><span class="p">,</span>
</span><span id="merge_ctes-65"><a href="#merge_ctes-65"><span class="linenos">65</span></a> <span class="p">)</span>
</span><span id="merge_ctes-66"><a href="#merge_ctes-66"><span class="linenos">66</span></a> <span class="p">)</span>
</span><span id="merge_ctes-67"><a href="#merge_ctes-67"><span class="linenos">67</span></a>
</span><span id="merge_ctes-68"><a href="#merge_ctes-68"><span class="linenos">68</span></a> <span class="n">singular_cte_selections</span> <span class="o">=</span> <span class="p">[</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">cte_selections</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
</span><span id="merge_ctes-69"><a href="#merge_ctes-69"><span class="linenos">69</span></a> <span class="k">for</span> <span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">singular_cte_selections</span><span class="p">:</span>
</span><span id="merge_ctes-70"><a href="#merge_ctes-70"><span class="linenos">70</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">find_ancestor</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><span id="merge_ctes-71"><a href="#merge_ctes-71"><span class="linenos">71</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="merge_ctes-72"><a href="#merge_ctes-72"><span class="linenos">72</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="merge_ctes-73"><a href="#merge_ctes-73"><span class="linenos">73</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_ctes-74"><a href="#merge_ctes-74"><span class="linenos">74</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_ctes-75"><a href="#merge_ctes-75"><span class="linenos">75</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_ctes-76"><a href="#merge_ctes-76"><span class="linenos">76</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_ctes-77"><a href="#merge_ctes-77"><span class="linenos">77</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_ctes-78"><a href="#merge_ctes-78"><span class="linenos">78</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_ctes-79"><a href="#merge_ctes-79"><span class="linenos">79</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_ctes-80"><a href="#merge_ctes-80"><span class="linenos">80</span></a> <span class="n">_pop_cte</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_ctes-81"><a href="#merge_ctes-81"><span class="linenos">81</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="merge_ctes-82"><a href="#merge_ctes-82"><span class="linenos">82</span></a> <span class="k">return</span> <span class="n">expression</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="merge_ctes-62"><a href="#merge_ctes-62"><span class="linenos">62</span></a><span class="k">def</span> <span class="nf">merge_ctes</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="merge_ctes-63"><a href="#merge_ctes-63"><span class="linenos">63</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="merge_ctes-64"><a href="#merge_ctes-64"><span class="linenos">64</span></a>
</span><span id="merge_ctes-65"><a href="#merge_ctes-65"><span class="linenos">65</span></a> <span class="c1"># All places where we select from CTEs.</span>
</span><span id="merge_ctes-66"><a href="#merge_ctes-66"><span class="linenos">66</span></a> <span class="c1"># We key on the CTE scope so we can detect CTES that are selected from multiple times.</span>
</span><span id="merge_ctes-67"><a href="#merge_ctes-67"><span class="linenos">67</span></a> <span class="n">cte_selections</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
</span><span id="merge_ctes-68"><a href="#merge_ctes-68"><span class="linenos">68</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">scopes</span><span class="p">:</span>
</span><span id="merge_ctes-69"><a href="#merge_ctes-69"><span class="linenos">69</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">inner_scope</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
</span><span id="merge_ctes-70"><a href="#merge_ctes-70"><span class="linenos">70</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">,</span> <span class="n">Scope</span><span class="p">)</span> <span class="ow">and</span> <span class="n">inner_scope</span><span class="o">.</span><span class="n">is_cte</span><span class="p">:</span>
</span><span id="merge_ctes-71"><a href="#merge_ctes-71"><span class="linenos">71</span></a> <span class="n">cte_selections</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span><span id="merge_ctes-72"><a href="#merge_ctes-72"><span class="linenos">72</span></a> <span class="p">(</span>
</span><span id="merge_ctes-73"><a href="#merge_ctes-73"><span class="linenos">73</span></a> <span class="n">outer_scope</span><span class="p">,</span>
</span><span id="merge_ctes-74"><a href="#merge_ctes-74"><span class="linenos">74</span></a> <span class="n">inner_scope</span><span class="p">,</span>
</span><span id="merge_ctes-75"><a href="#merge_ctes-75"><span class="linenos">75</span></a> <span class="n">table</span><span class="p">,</span>
</span><span id="merge_ctes-76"><a href="#merge_ctes-76"><span class="linenos">76</span></a> <span class="p">)</span>
</span><span id="merge_ctes-77"><a href="#merge_ctes-77"><span class="linenos">77</span></a> <span class="p">)</span>
</span><span id="merge_ctes-78"><a href="#merge_ctes-78"><span class="linenos">78</span></a>
</span><span id="merge_ctes-79"><a href="#merge_ctes-79"><span class="linenos">79</span></a> <span class="n">singular_cte_selections</span> <span class="o">=</span> <span class="p">[</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">cte_selections</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
</span><span id="merge_ctes-80"><a href="#merge_ctes-80"><span class="linenos">80</span></a> <span class="k">for</span> <span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">singular_cte_selections</span><span class="p">:</span>
</span><span id="merge_ctes-81"><a href="#merge_ctes-81"><span class="linenos">81</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">find_ancestor</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><span id="merge_ctes-82"><a href="#merge_ctes-82"><span class="linenos">82</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="merge_ctes-83"><a href="#merge_ctes-83"><span class="linenos">83</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="merge_ctes-84"><a href="#merge_ctes-84"><span class="linenos">84</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_ctes-85"><a href="#merge_ctes-85"><span class="linenos">85</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">table</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_ctes-86"><a href="#merge_ctes-86"><span class="linenos">86</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_ctes-87"><a href="#merge_ctes-87"><span class="linenos">87</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_ctes-88"><a href="#merge_ctes-88"><span class="linenos">88</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_ctes-89"><a href="#merge_ctes-89"><span class="linenos">89</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_ctes-90"><a href="#merge_ctes-90"><span class="linenos">90</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_ctes-91"><a href="#merge_ctes-91"><span class="linenos">91</span></a> <span class="n">_pop_cte</span><span class="p">(</span><span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_ctes-92"><a href="#merge_ctes-92"><span class="linenos">92</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="merge_ctes-93"><a href="#merge_ctes-93"><span class="linenos">93</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -611,22 +647,22 @@ queries if it would result in multiple table selects in a single query:</p>
</div>
<a class="headerlink" href="#merge_derived_tables"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="merge_derived_tables-85"><a href="#merge_derived_tables-85"><span class="linenos"> 85</span></a><span class="k">def</span> <span class="nf">merge_derived_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="merge_derived_tables-86"><a href="#merge_derived_tables-86"><span class="linenos"> 86</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="merge_derived_tables-87"><a href="#merge_derived_tables-87"><span class="linenos"> 87</span></a> <span class="k">for</span> <span class="n">subquery</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">derived_tables</span><span class="p">:</span>
</span><span id="merge_derived_tables-88"><a href="#merge_derived_tables-88"><span class="linenos"> 88</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">find_ancestor</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><span id="merge_derived_tables-89"><a href="#merge_derived_tables-89"><span class="linenos"> 89</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="merge_derived_tables-90"><a href="#merge_derived_tables-90"><span class="linenos"> 90</span></a> <span class="n">inner_scope</span> <span class="o">=</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span>
</span><span id="merge_derived_tables-91"><a href="#merge_derived_tables-91"><span class="linenos"> 91</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="merge_derived_tables-92"><a href="#merge_derived_tables-92"><span class="linenos"> 92</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_derived_tables-93"><a href="#merge_derived_tables-93"><span class="linenos"> 93</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">subquery</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_derived_tables-94"><a href="#merge_derived_tables-94"><span class="linenos"> 94</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_derived_tables-95"><a href="#merge_derived_tables-95"><span class="linenos"> 95</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_derived_tables-96"><a href="#merge_derived_tables-96"><span class="linenos"> 96</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_derived_tables-97"><a href="#merge_derived_tables-97"><span class="linenos"> 97</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_derived_tables-98"><a href="#merge_derived_tables-98"><span class="linenos"> 98</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_derived_tables-99"><a href="#merge_derived_tables-99"><span class="linenos"> 99</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="merge_derived_tables-100"><a href="#merge_derived_tables-100"><span class="linenos">100</span></a> <span class="k">return</span> <span class="n">expression</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="merge_derived_tables-96"><a href="#merge_derived_tables-96"><span class="linenos"> 96</span></a><span class="k">def</span> <span class="nf">merge_derived_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
</span><span id="merge_derived_tables-97"><a href="#merge_derived_tables-97"><span class="linenos"> 97</span></a> <span class="k">for</span> <span class="n">outer_scope</span> <span class="ow">in</span> <span class="n">traverse_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="merge_derived_tables-98"><a href="#merge_derived_tables-98"><span class="linenos"> 98</span></a> <span class="k">for</span> <span class="n">subquery</span> <span class="ow">in</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">derived_tables</span><span class="p">:</span>
</span><span id="merge_derived_tables-99"><a href="#merge_derived_tables-99"><span class="linenos"> 99</span></a> <span class="n">from_or_join</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">find_ancestor</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><span id="merge_derived_tables-100"><a href="#merge_derived_tables-100"><span class="linenos">100</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">subquery</span><span class="o">.</span><span class="n">alias_or_name</span>
</span><span id="merge_derived_tables-101"><a href="#merge_derived_tables-101"><span class="linenos">101</span></a> <span class="n">inner_scope</span> <span class="o">=</span> <span class="n">outer_scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span>
</span><span id="merge_derived_tables-102"><a href="#merge_derived_tables-102"><span class="linenos">102</span></a> <span class="k">if</span> <span class="n">_mergeable</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">leave_tables_isolated</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">):</span>
</span><span id="merge_derived_tables-103"><a href="#merge_derived_tables-103"><span class="linenos">103</span></a> <span class="n">_rename_inner_sources</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_derived_tables-104"><a href="#merge_derived_tables-104"><span class="linenos">104</span></a> <span class="n">_merge_from</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">subquery</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_derived_tables-105"><a href="#merge_derived_tables-105"><span class="linenos">105</span></a> <span class="n">_merge_expressions</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
</span><span id="merge_derived_tables-106"><a href="#merge_derived_tables-106"><span class="linenos">106</span></a> <span class="n">_merge_joins</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_derived_tables-107"><a href="#merge_derived_tables-107"><span class="linenos">107</span></a> <span class="n">_merge_where</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">,</span> <span class="n">from_or_join</span><span class="p">)</span>
</span><span id="merge_derived_tables-108"><a href="#merge_derived_tables-108"><span class="linenos">108</span></a> <span class="n">_merge_order</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_derived_tables-109"><a href="#merge_derived_tables-109"><span class="linenos">109</span></a> <span class="n">_merge_hints</span><span class="p">(</span><span class="n">outer_scope</span><span class="p">,</span> <span class="n">inner_scope</span><span class="p">)</span>
</span><span id="merge_derived_tables-110"><a href="#merge_derived_tables-110"><span class="linenos">110</span></a> <span class="n">outer_scope</span><span class="o">.</span><span class="n">clear_cache</span><span class="p">()</span>
</span><span id="merge_derived_tables-111"><a href="#merge_derived_tables-111"><span class="linenos">111</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -527,127 +527,128 @@
</span><span id="L-400"><a href="#L-400"><span class="linenos">400</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">)</span>
</span><span id="L-401"><a href="#L-401"><span class="linenos">401</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Add</span><span class="p">)</span> <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="n">exp</span><span class="o">.</span><span class="n">Add</span><span class="p">))</span>
</span><span id="L-402"><a href="#L-402"><span class="linenos">402</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Mul</span><span class="p">)</span> <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="n">exp</span><span class="o">.</span><span class="n">Mul</span><span class="p">))</span>
</span><span id="L-403"><a href="#L-403"><span class="linenos">403</span></a> <span class="p">):</span>
</span><span id="L-404"><a href="#L-404"><span class="linenos">404</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-405"><a href="#L-405"><span class="linenos">405</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-406"><a href="#L-406"><span class="linenos">406</span></a>
</span><span id="L-403"><a href="#L-403"><span class="linenos">403</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Mul</span><span class="p">)</span> <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">Add</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Sub</span><span class="p">)))</span>
</span><span id="L-404"><a href="#L-404"><span class="linenos">404</span></a> <span class="p">):</span>
</span><span id="L-405"><a href="#L-405"><span class="linenos">405</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-406"><a href="#L-406"><span class="linenos">406</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-407"><a href="#L-407"><span class="linenos">407</span></a>
</span><span id="L-408"><a href="#L-408"><span class="linenos">408</span></a><span class="k">def</span> <span class="nf">remove_where_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-409"><a href="#L-409"><span class="linenos">409</span></a> <span class="k">for</span> <span class="n">where</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">):</span>
</span><span id="L-410"><a href="#L-410"><span class="linenos">410</span></a> <span class="k">if</span> <span class="n">always_true</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">):</span>
</span><span id="L-411"><a href="#L-411"><span class="linenos">411</span></a> <span class="n">where</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-412"><a href="#L-412"><span class="linenos">412</span></a> <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">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="L-413"><a href="#L-413"><span class="linenos">413</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-414"><a href="#L-414"><span class="linenos">414</span></a> <span class="n">always_true</span><span class="p">(</span><span class="n">join</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;on&quot;</span><span class="p">))</span>
</span><span id="L-415"><a href="#L-415"><span class="linenos">415</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;using&quot;</span><span class="p">)</span>
</span><span id="L-416"><a href="#L-416"><span class="linenos">416</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;method&quot;</span><span class="p">)</span>
</span><span id="L-417"><a href="#L-417"><span class="linenos">417</span></a> <span class="p">):</span>
</span><span id="L-418"><a href="#L-418"><span class="linenos">418</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-419"><a href="#L-419"><span class="linenos">419</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-420"><a href="#L-420"><span class="linenos">420</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="L-421"><a href="#L-421"><span class="linenos">421</span></a>
</span><span id="L-408"><a href="#L-408"><span class="linenos">408</span></a>
</span><span id="L-409"><a href="#L-409"><span class="linenos">409</span></a><span class="k">def</span> <span class="nf">remove_where_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-410"><a href="#L-410"><span class="linenos">410</span></a> <span class="k">for</span> <span class="n">where</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">):</span>
</span><span id="L-411"><a href="#L-411"><span class="linenos">411</span></a> <span class="k">if</span> <span class="n">always_true</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">):</span>
</span><span id="L-412"><a href="#L-412"><span class="linenos">412</span></a> <span class="n">where</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-413"><a href="#L-413"><span class="linenos">413</span></a> <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">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="L-414"><a href="#L-414"><span class="linenos">414</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-415"><a href="#L-415"><span class="linenos">415</span></a> <span class="n">always_true</span><span class="p">(</span><span class="n">join</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;on&quot;</span><span class="p">))</span>
</span><span id="L-416"><a href="#L-416"><span class="linenos">416</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;using&quot;</span><span class="p">)</span>
</span><span id="L-417"><a href="#L-417"><span class="linenos">417</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;method&quot;</span><span class="p">)</span>
</span><span id="L-418"><a href="#L-418"><span class="linenos">418</span></a> <span class="p">):</span>
</span><span id="L-419"><a href="#L-419"><span class="linenos">419</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-420"><a href="#L-420"><span class="linenos">420</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-421"><a href="#L-421"><span class="linenos">421</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span><span id="L-422"><a href="#L-422"><span class="linenos">422</span></a>
</span><span id="L-423"><a href="#L-423"><span class="linenos">423</span></a><span class="k">def</span> <span class="nf">always_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-424"><a href="#L-424"><span class="linenos">424</span></a> <span class="k">return</span> <span class="p">(</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">Boolean</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="L-425"><a href="#L-425"><span class="linenos">425</span></a> <span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span>
</span><span id="L-426"><a href="#L-426"><span class="linenos">426</span></a> <span class="p">)</span>
</span><span id="L-427"><a href="#L-427"><span class="linenos">427</span></a>
</span><span id="L-423"><a href="#L-423"><span class="linenos">423</span></a>
</span><span id="L-424"><a href="#L-424"><span class="linenos">424</span></a><span class="k">def</span> <span class="nf">always_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-425"><a href="#L-425"><span class="linenos">425</span></a> <span class="k">return</span> <span class="p">(</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">Boolean</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="L-426"><a href="#L-426"><span class="linenos">426</span></a> <span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span>
</span><span id="L-427"><a href="#L-427"><span class="linenos">427</span></a> <span class="p">)</span>
</span><span id="L-428"><a href="#L-428"><span class="linenos">428</span></a>
</span><span id="L-429"><a href="#L-429"><span class="linenos">429</span></a><span class="k">def</span> <span class="nf">is_complement</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="L-430"><a href="#L-430"><span class="linenos">430</span></a> <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">)</span> <span class="ow">and</span> <span class="n">b</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">a</span>
</span><span id="L-431"><a href="#L-431"><span class="linenos">431</span></a>
</span><span id="L-429"><a href="#L-429"><span class="linenos">429</span></a>
</span><span id="L-430"><a href="#L-430"><span class="linenos">430</span></a><span class="k">def</span> <span class="nf">is_complement</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="L-431"><a href="#L-431"><span class="linenos">431</span></a> <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">)</span> <span class="ow">and</span> <span class="n">b</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">a</span>
</span><span id="L-432"><a href="#L-432"><span class="linenos">432</span></a>
</span><span id="L-433"><a href="#L-433"><span class="linenos">433</span></a><span class="k">def</span> <span class="nf">is_false</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-434"><a href="#L-434"><span class="linenos">434</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Boolean</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">a</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a>
</span><span id="L-433"><a href="#L-433"><span class="linenos">433</span></a>
</span><span id="L-434"><a href="#L-434"><span class="linenos">434</span></a><span class="k">def</span> <span class="nf">is_false</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Boolean</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">a</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-436"><a href="#L-436"><span class="linenos">436</span></a>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a><span class="k">def</span> <span class="nf">is_null</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Null</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a>
</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a><span class="k">def</span> <span class="nf">is_null</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Null</span>
</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a>
</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a><span class="k">def</span> <span class="nf">eval_boolean</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="L-442"><a href="#L-442"><span class="linenos">442</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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">)):</span>
</span><span id="L-443"><a href="#L-443"><span class="linenos">443</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-444"><a href="#L-444"><span class="linenos">444</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">NEQ</span><span class="p">):</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">!=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-446"><a href="#L-446"><span class="linenos">446</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">GT</span><span class="p">):</span>
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</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">GTE</span><span class="p">):</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</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">LT</span><span class="p">):</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</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">LTE</span><span class="p">):</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a>
</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a>
</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a><span class="k">def</span> <span class="nf">eval_boolean</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="L-443"><a href="#L-443"><span class="linenos">443</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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">)):</span>
</span><span id="L-444"><a href="#L-444"><span class="linenos">444</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos">445</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">NEQ</span><span class="p">):</span>
</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">!=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</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">GT</span><span class="p">):</span>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</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">GTE</span><span class="p">):</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</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">LT</span><span class="p">):</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</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">LTE</span><span class="p">):</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a><span class="k">def</span> <span class="nf">extract_date</span><span class="p">(</span><span class="n">cast</span><span class="p">):</span>
</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a> <span class="c1"># The &quot;fromisoformat&quot; conversion could fail if the cast is used on an identifier,</span>
</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a> <span class="c1"># so in that case we can&#39;t extract the date.</span>
</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATE</span><span class="p">:</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a>
</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a><span class="k">def</span> <span class="nf">extract_date</span><span class="p">(</span><span class="n">cast</span><span class="p">):</span>
</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a> <span class="c1"># The &quot;fromisoformat&quot; conversion could fail if the cast is used on an identifier,</span>
</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a> <span class="c1"># so in that case we can&#39;t extract the date.</span>
</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATE</span><span class="p">:</span>
</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a><span class="k">def</span> <span class="nf">extract_interval</span><span class="p">(</span><span class="n">interval</span><span class="p">):</span>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a> <span class="kn">from</span> <span class="nn">dateutil.relativedelta</span> <span class="kn">import</span> <span class="n">relativedelta</span> <span class="c1"># type: ignore</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a> <span class="k">except</span> <span class="ne">ModuleNotFoundError</span><span class="p">:</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a>
</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">interval</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a> <span class="n">unit</span> <span class="o">=</span> <span class="n">interval</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="s2">&quot;unit&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a>
</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;year&quot;</span><span class="p">:</span>
</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">years</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;month&quot;</span><span class="p">:</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">months</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;week&quot;</span><span class="p">:</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">weeks</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;day&quot;</span><span class="p">:</span>
</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a><span class="k">def</span> <span class="nf">extract_interval</span><span class="p">(</span><span class="n">interval</span><span class="p">):</span>
</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a> <span class="kn">from</span> <span class="nn">dateutil.relativedelta</span> <span class="kn">import</span> <span class="n">relativedelta</span> <span class="c1"># type: ignore</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a> <span class="k">except</span> <span class="ne">ModuleNotFoundError</span><span class="p">:</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a>
</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">interval</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a> <span class="n">unit</span> <span class="o">=</span> <span class="n">interval</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="s2">&quot;unit&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a>
</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;year&quot;</span><span class="p">:</span>
</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">years</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;month&quot;</span><span class="p">:</span>
</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">months</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;week&quot;</span><span class="p">:</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">weeks</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;day&quot;</span><span class="p">:</span>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a>
</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a><span class="k">def</span> <span class="nf">date_literal</span><span class="p">(</span><span class="n">date</span><span class="p">):</span>
</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span>
</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="n">date</span><span class="p">),</span>
</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a> <span class="s2">&quot;DATETIME&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;DATE&quot;</span><span class="p">,</span>
</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a> <span class="p">)</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a>
</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a>
</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a><span class="k">def</span> <span class="nf">date_literal</span><span class="p">(</span><span class="n">date</span><span class="p">):</span>
</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span>
</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="n">date</span><span class="p">),</span>
</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a> <span class="s2">&quot;DATETIME&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;DATE&quot;</span><span class="p">,</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a> <span class="p">)</span>
</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a>
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a><span class="k">def</span> <span class="nf">boolean_literal</span><span class="p">(</span><span class="n">condition</span><span class="p">):</span>
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">()</span> <span class="k">if</span> <span class="n">condition</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">false</span><span class="p">()</span>
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a>
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a>
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a><span class="k">def</span> <span class="nf">boolean_literal</span><span class="p">(</span><span class="n">condition</span><span class="p">):</span>
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">()</span> <span class="k">if</span> <span class="n">condition</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">false</span><span class="p">()</span>
</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a>
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a><span class="k">def</span> <span class="nf">_flat_simplify</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">simplifier</span><span class="p">,</span> <span class="n">root</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a> <span class="k">if</span> <span class="n">root</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">same_parent</span><span class="p">:</span>
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a> <span class="n">operands</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a> <span class="n">queue</span> <span class="o">=</span> <span class="n">deque</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">unnest</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a> <span class="n">size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">queue</span><span class="p">)</span>
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a>
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a> <span class="k">while</span> <span class="n">queue</span><span class="p">:</span>
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a> <span class="n">a</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">popleft</span><span class="p">()</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a>
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">queue</span><span class="p">:</span>
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">simplifier</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a>
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a> <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a> <span class="n">queue</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a> <span class="n">queue</span><span class="o">.</span><span class="n">appendleft</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a> <span class="k">break</span>
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a> <span class="n">operands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a>
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">operands</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">:</span>
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="k">return</span> <span class="n">functools</span><span class="o">.</span><span class="n">reduce</span><span class="p">(</span>
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a> <span class="k">lambda</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">b</span><span class="p">),</span> <span class="n">operands</span>
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a> <span class="p">)</span>
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a>
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a><span class="k">def</span> <span class="nf">_flat_simplify</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">simplifier</span><span class="p">,</span> <span class="n">root</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a> <span class="k">if</span> <span class="n">root</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">same_parent</span><span class="p">:</span>
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a> <span class="n">operands</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a> <span class="n">queue</span> <span class="o">=</span> <span class="n">deque</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">unnest</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a> <span class="n">size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">queue</span><span class="p">)</span>
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a>
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a> <span class="k">while</span> <span class="n">queue</span><span class="p">:</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a> <span class="n">a</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">popleft</span><span class="p">()</span>
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a>
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">queue</span><span class="p">:</span>
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">simplifier</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a>
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a> <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a> <span class="n">queue</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a> <span class="n">queue</span><span class="o">.</span><span class="n">appendleft</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a> <span class="k">break</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="n">operands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a>
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">operands</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">:</span>
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a> <span class="k">return</span> <span class="n">functools</span><span class="o">.</span><span class="n">reduce</span><span class="p">(</span>
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a> <span class="k">lambda</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">b</span><span class="p">),</span> <span class="n">operands</span>
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a> <span class="p">)</span>
</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -1155,9 +1156,10 @@ elimination:
</span><span id="simplify_parens-401"><a href="#simplify_parens-401"><span class="linenos">401</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">)</span>
</span><span id="simplify_parens-402"><a href="#simplify_parens-402"><span class="linenos">402</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Add</span><span class="p">)</span> <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="n">exp</span><span class="o">.</span><span class="n">Add</span><span class="p">))</span>
</span><span id="simplify_parens-403"><a href="#simplify_parens-403"><span class="linenos">403</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Mul</span><span class="p">)</span> <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="n">exp</span><span class="o">.</span><span class="n">Mul</span><span class="p">))</span>
</span><span id="simplify_parens-404"><a href="#simplify_parens-404"><span class="linenos">404</span></a> <span class="p">):</span>
</span><span id="simplify_parens-405"><a href="#simplify_parens-405"><span class="linenos">405</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="simplify_parens-406"><a href="#simplify_parens-406"><span class="linenos">406</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="simplify_parens-404"><a href="#simplify_parens-404"><span class="linenos">404</span></a> <span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Mul</span><span class="p">)</span> <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">Add</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Sub</span><span class="p">)))</span>
</span><span id="simplify_parens-405"><a href="#simplify_parens-405"><span class="linenos">405</span></a> <span class="p">):</span>
</span><span id="simplify_parens-406"><a href="#simplify_parens-406"><span class="linenos">406</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="simplify_parens-407"><a href="#simplify_parens-407"><span class="linenos">407</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -1175,19 +1177,19 @@ elimination:
</div>
<a class="headerlink" href="#remove_where_true"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_where_true-409"><a href="#remove_where_true-409"><span class="linenos">409</span></a><span class="k">def</span> <span class="nf">remove_where_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="remove_where_true-410"><a href="#remove_where_true-410"><span class="linenos">410</span></a> <span class="k">for</span> <span class="n">where</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">):</span>
</span><span id="remove_where_true-411"><a href="#remove_where_true-411"><span class="linenos">411</span></a> <span class="k">if</span> <span class="n">always_true</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">):</span>
</span><span id="remove_where_true-412"><a href="#remove_where_true-412"><span class="linenos">412</span></a> <span class="n">where</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="remove_where_true-413"><a href="#remove_where_true-413"><span class="linenos">413</span></a> <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">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="remove_where_true-414"><a href="#remove_where_true-414"><span class="linenos">414</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="remove_where_true-415"><a href="#remove_where_true-415"><span class="linenos">415</span></a> <span class="n">always_true</span><span class="p">(</span><span class="n">join</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;on&quot;</span><span class="p">))</span>
</span><span id="remove_where_true-416"><a href="#remove_where_true-416"><span class="linenos">416</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;using&quot;</span><span class="p">)</span>
</span><span id="remove_where_true-417"><a href="#remove_where_true-417"><span class="linenos">417</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;method&quot;</span><span class="p">)</span>
</span><span id="remove_where_true-418"><a href="#remove_where_true-418"><span class="linenos">418</span></a> <span class="p">):</span>
</span><span id="remove_where_true-419"><a href="#remove_where_true-419"><span class="linenos">419</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="remove_where_true-420"><a href="#remove_where_true-420"><span class="linenos">420</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="remove_where_true-421"><a href="#remove_where_true-421"><span class="linenos">421</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_where_true-410"><a href="#remove_where_true-410"><span class="linenos">410</span></a><span class="k">def</span> <span class="nf">remove_where_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="remove_where_true-411"><a href="#remove_where_true-411"><span class="linenos">411</span></a> <span class="k">for</span> <span class="n">where</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">):</span>
</span><span id="remove_where_true-412"><a href="#remove_where_true-412"><span class="linenos">412</span></a> <span class="k">if</span> <span class="n">always_true</span><span class="p">(</span><span class="n">where</span><span class="o">.</span><span class="n">this</span><span class="p">):</span>
</span><span id="remove_where_true-413"><a href="#remove_where_true-413"><span class="linenos">413</span></a> <span class="n">where</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;where&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="remove_where_true-414"><a href="#remove_where_true-414"><span class="linenos">414</span></a> <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">find_all</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
</span><span id="remove_where_true-415"><a href="#remove_where_true-415"><span class="linenos">415</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="remove_where_true-416"><a href="#remove_where_true-416"><span class="linenos">416</span></a> <span class="n">always_true</span><span class="p">(</span><span class="n">join</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;on&quot;</span><span class="p">))</span>
</span><span id="remove_where_true-417"><a href="#remove_where_true-417"><span class="linenos">417</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;using&quot;</span><span class="p">)</span>
</span><span id="remove_where_true-418"><a href="#remove_where_true-418"><span class="linenos">418</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">join</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;method&quot;</span><span class="p">)</span>
</span><span id="remove_where_true-419"><a href="#remove_where_true-419"><span class="linenos">419</span></a> <span class="p">):</span>
</span><span id="remove_where_true-420"><a href="#remove_where_true-420"><span class="linenos">420</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;on&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="remove_where_true-421"><a href="#remove_where_true-421"><span class="linenos">421</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;side&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="remove_where_true-422"><a href="#remove_where_true-422"><span class="linenos">422</span></a> <span class="n">join</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;kind&quot;</span><span class="p">,</span> <span class="s2">&quot;CROSS&quot;</span><span class="p">)</span>
</span></pre></div>
@ -1205,10 +1207,10 @@ elimination:
</div>
<a class="headerlink" href="#always_true"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="always_true-424"><a href="#always_true-424"><span class="linenos">424</span></a><span class="k">def</span> <span class="nf">always_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="always_true-425"><a href="#always_true-425"><span class="linenos">425</span></a> <span class="k">return</span> <span class="p">(</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">Boolean</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="always_true-426"><a href="#always_true-426"><span class="linenos">426</span></a> <span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span>
</span><span id="always_true-427"><a href="#always_true-427"><span class="linenos">427</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="always_true-425"><a href="#always_true-425"><span class="linenos">425</span></a><span class="k">def</span> <span class="nf">always_true</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="always_true-426"><a href="#always_true-426"><span class="linenos">426</span></a> <span class="k">return</span> <span class="p">(</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">Boolean</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span>
</span><span id="always_true-427"><a href="#always_true-427"><span class="linenos">427</span></a> <span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span>
</span><span id="always_true-428"><a href="#always_true-428"><span class="linenos">428</span></a> <span class="p">)</span>
</span></pre></div>
@ -1226,8 +1228,8 @@ elimination:
</div>
<a class="headerlink" href="#is_complement"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_complement-430"><a href="#is_complement-430"><span class="linenos">430</span></a><span class="k">def</span> <span class="nf">is_complement</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="is_complement-431"><a href="#is_complement-431"><span class="linenos">431</span></a> <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">)</span> <span class="ow">and</span> <span class="n">b</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">a</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_complement-431"><a href="#is_complement-431"><span class="linenos">431</span></a><span class="k">def</span> <span class="nf">is_complement</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="is_complement-432"><a href="#is_complement-432"><span class="linenos">432</span></a> <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">)</span> <span class="ow">and</span> <span class="n">b</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">a</span>
</span></pre></div>
@ -1245,8 +1247,8 @@ elimination:
</div>
<a class="headerlink" href="#is_false"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_false-434"><a href="#is_false-434"><span class="linenos">434</span></a><span class="k">def</span> <span class="nf">is_false</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_false-435"><a href="#is_false-435"><span class="linenos">435</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Boolean</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">a</span><span class="o">.</span><span class="n">this</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_false-435"><a href="#is_false-435"><span class="linenos">435</span></a><span class="k">def</span> <span class="nf">is_false</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_false-436"><a href="#is_false-436"><span class="linenos">436</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Boolean</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">a</span><span class="o">.</span><span class="n">this</span>
</span></pre></div>
@ -1264,8 +1266,8 @@ elimination:
</div>
<a class="headerlink" href="#is_null"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_null-438"><a href="#is_null-438"><span class="linenos">438</span></a><span class="k">def</span> <span class="nf">is_null</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_null-439"><a href="#is_null-439"><span class="linenos">439</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Null</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="is_null-439"><a href="#is_null-439"><span class="linenos">439</span></a><span class="k">def</span> <span class="nf">is_null</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
</span><span id="is_null-440"><a href="#is_null-440"><span class="linenos">440</span></a> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="ow">is</span> <span class="n">exp</span><span class="o">.</span><span class="n">Null</span>
</span></pre></div>
@ -1283,20 +1285,20 @@ elimination:
</div>
<a class="headerlink" href="#eval_boolean"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eval_boolean-442"><a href="#eval_boolean-442"><span class="linenos">442</span></a><span class="k">def</span> <span class="nf">eval_boolean</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="eval_boolean-443"><a href="#eval_boolean-443"><span class="linenos">443</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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">)):</span>
</span><span id="eval_boolean-444"><a href="#eval_boolean-444"><span class="linenos">444</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-445"><a href="#eval_boolean-445"><span class="linenos">445</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">NEQ</span><span class="p">):</span>
</span><span id="eval_boolean-446"><a href="#eval_boolean-446"><span class="linenos">446</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">!=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-447"><a href="#eval_boolean-447"><span class="linenos">447</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">GT</span><span class="p">):</span>
</span><span id="eval_boolean-448"><a href="#eval_boolean-448"><span class="linenos">448</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-449"><a href="#eval_boolean-449"><span class="linenos">449</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">GTE</span><span class="p">):</span>
</span><span id="eval_boolean-450"><a href="#eval_boolean-450"><span class="linenos">450</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-451"><a href="#eval_boolean-451"><span class="linenos">451</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">LT</span><span class="p">):</span>
</span><span id="eval_boolean-452"><a href="#eval_boolean-452"><span class="linenos">452</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-453"><a href="#eval_boolean-453"><span class="linenos">453</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">LTE</span><span class="p">):</span>
</span><span id="eval_boolean-454"><a href="#eval_boolean-454"><span class="linenos">454</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-455"><a href="#eval_boolean-455"><span class="linenos">455</span></a> <span class="k">return</span> <span class="kc">None</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="eval_boolean-443"><a href="#eval_boolean-443"><span class="linenos">443</span></a><span class="k">def</span> <span class="nf">eval_boolean</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
</span><span id="eval_boolean-444"><a href="#eval_boolean-444"><span class="linenos">444</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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">)):</span>
</span><span id="eval_boolean-445"><a href="#eval_boolean-445"><span class="linenos">445</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-446"><a href="#eval_boolean-446"><span class="linenos">446</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">NEQ</span><span class="p">):</span>
</span><span id="eval_boolean-447"><a href="#eval_boolean-447"><span class="linenos">447</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">!=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-448"><a href="#eval_boolean-448"><span class="linenos">448</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">GT</span><span class="p">):</span>
</span><span id="eval_boolean-449"><a href="#eval_boolean-449"><span class="linenos">449</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-450"><a href="#eval_boolean-450"><span class="linenos">450</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">GTE</span><span class="p">):</span>
</span><span id="eval_boolean-451"><a href="#eval_boolean-451"><span class="linenos">451</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-452"><a href="#eval_boolean-452"><span class="linenos">452</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">LT</span><span class="p">):</span>
</span><span id="eval_boolean-453"><a href="#eval_boolean-453"><span class="linenos">453</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-454"><a href="#eval_boolean-454"><span class="linenos">454</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">LTE</span><span class="p">):</span>
</span><span id="eval_boolean-455"><a href="#eval_boolean-455"><span class="linenos">455</span></a> <span class="k">return</span> <span class="n">boolean_literal</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="p">)</span>
</span><span id="eval_boolean-456"><a href="#eval_boolean-456"><span class="linenos">456</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
@ -1314,16 +1316,16 @@ elimination:
</div>
<a class="headerlink" href="#extract_date"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="extract_date-458"><a href="#extract_date-458"><span class="linenos">458</span></a><span class="k">def</span> <span class="nf">extract_date</span><span class="p">(</span><span class="n">cast</span><span class="p">):</span>
</span><span id="extract_date-459"><a href="#extract_date-459"><span class="linenos">459</span></a> <span class="c1"># The &quot;fromisoformat&quot; conversion could fail if the cast is used on an identifier,</span>
</span><span id="extract_date-460"><a href="#extract_date-460"><span class="linenos">460</span></a> <span class="c1"># so in that case we can&#39;t extract the date.</span>
</span><span id="extract_date-461"><a href="#extract_date-461"><span class="linenos">461</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="extract_date-462"><a href="#extract_date-462"><span class="linenos">462</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATE</span><span class="p">:</span>
</span><span id="extract_date-463"><a href="#extract_date-463"><span class="linenos">463</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="extract_date-464"><a href="#extract_date-464"><span class="linenos">464</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span>
</span><span id="extract_date-465"><a href="#extract_date-465"><span class="linenos">465</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="extract_date-466"><a href="#extract_date-466"><span class="linenos">466</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="extract_date-467"><a href="#extract_date-467"><span class="linenos">467</span></a> <span class="k">return</span> <span class="kc">None</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="extract_date-459"><a href="#extract_date-459"><span class="linenos">459</span></a><span class="k">def</span> <span class="nf">extract_date</span><span class="p">(</span><span class="n">cast</span><span class="p">):</span>
</span><span id="extract_date-460"><a href="#extract_date-460"><span class="linenos">460</span></a> <span class="c1"># The &quot;fromisoformat&quot; conversion could fail if the cast is used on an identifier,</span>
</span><span id="extract_date-461"><a href="#extract_date-461"><span class="linenos">461</span></a> <span class="c1"># so in that case we can&#39;t extract the date.</span>
</span><span id="extract_date-462"><a href="#extract_date-462"><span class="linenos">462</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="extract_date-463"><a href="#extract_date-463"><span class="linenos">463</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATE</span><span class="p">:</span>
</span><span id="extract_date-464"><a href="#extract_date-464"><span class="linenos">464</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="extract_date-465"><a href="#extract_date-465"><span class="linenos">465</span></a> <span class="k">if</span> <span class="n">cast</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;to&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">this</span> <span class="o">==</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span>
</span><span id="extract_date-466"><a href="#extract_date-466"><span class="linenos">466</span></a> <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">cast</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="extract_date-467"><a href="#extract_date-467"><span class="linenos">467</span></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span><span id="extract_date-468"><a href="#extract_date-468"><span class="linenos">468</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
@ -1341,24 +1343,24 @@ elimination:
</div>
<a class="headerlink" href="#extract_interval"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="extract_interval-470"><a href="#extract_interval-470"><span class="linenos">470</span></a><span class="k">def</span> <span class="nf">extract_interval</span><span class="p">(</span><span class="n">interval</span><span class="p">):</span>
</span><span id="extract_interval-471"><a href="#extract_interval-471"><span class="linenos">471</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="extract_interval-472"><a href="#extract_interval-472"><span class="linenos">472</span></a> <span class="kn">from</span> <span class="nn">dateutil.relativedelta</span> <span class="kn">import</span> <span class="n">relativedelta</span> <span class="c1"># type: ignore</span>
</span><span id="extract_interval-473"><a href="#extract_interval-473"><span class="linenos">473</span></a> <span class="k">except</span> <span class="ne">ModuleNotFoundError</span><span class="p">:</span>
</span><span id="extract_interval-474"><a href="#extract_interval-474"><span class="linenos">474</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="extract_interval-475"><a href="#extract_interval-475"><span class="linenos">475</span></a>
</span><span id="extract_interval-476"><a href="#extract_interval-476"><span class="linenos">476</span></a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">interval</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="extract_interval-477"><a href="#extract_interval-477"><span class="linenos">477</span></a> <span class="n">unit</span> <span class="o">=</span> <span class="n">interval</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="s2">&quot;unit&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="extract_interval-478"><a href="#extract_interval-478"><span class="linenos">478</span></a>
</span><span id="extract_interval-479"><a href="#extract_interval-479"><span class="linenos">479</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;year&quot;</span><span class="p">:</span>
</span><span id="extract_interval-480"><a href="#extract_interval-480"><span class="linenos">480</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">years</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-481"><a href="#extract_interval-481"><span class="linenos">481</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;month&quot;</span><span class="p">:</span>
</span><span id="extract_interval-482"><a href="#extract_interval-482"><span class="linenos">482</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">months</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-483"><a href="#extract_interval-483"><span class="linenos">483</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;week&quot;</span><span class="p">:</span>
</span><span id="extract_interval-484"><a href="#extract_interval-484"><span class="linenos">484</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">weeks</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-485"><a href="#extract_interval-485"><span class="linenos">485</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;day&quot;</span><span class="p">:</span>
</span><span id="extract_interval-486"><a href="#extract_interval-486"><span class="linenos">486</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-487"><a href="#extract_interval-487"><span class="linenos">487</span></a> <span class="k">return</span> <span class="kc">None</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="extract_interval-471"><a href="#extract_interval-471"><span class="linenos">471</span></a><span class="k">def</span> <span class="nf">extract_interval</span><span class="p">(</span><span class="n">interval</span><span class="p">):</span>
</span><span id="extract_interval-472"><a href="#extract_interval-472"><span class="linenos">472</span></a> <span class="k">try</span><span class="p">:</span>
</span><span id="extract_interval-473"><a href="#extract_interval-473"><span class="linenos">473</span></a> <span class="kn">from</span> <span class="nn">dateutil.relativedelta</span> <span class="kn">import</span> <span class="n">relativedelta</span> <span class="c1"># type: ignore</span>
</span><span id="extract_interval-474"><a href="#extract_interval-474"><span class="linenos">474</span></a> <span class="k">except</span> <span class="ne">ModuleNotFoundError</span><span class="p">:</span>
</span><span id="extract_interval-475"><a href="#extract_interval-475"><span class="linenos">475</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="extract_interval-476"><a href="#extract_interval-476"><span class="linenos">476</span></a>
</span><span id="extract_interval-477"><a href="#extract_interval-477"><span class="linenos">477</span></a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">interval</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="extract_interval-478"><a href="#extract_interval-478"><span class="linenos">478</span></a> <span class="n">unit</span> <span class="o">=</span> <span class="n">interval</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="s2">&quot;unit&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
</span><span id="extract_interval-479"><a href="#extract_interval-479"><span class="linenos">479</span></a>
</span><span id="extract_interval-480"><a href="#extract_interval-480"><span class="linenos">480</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;year&quot;</span><span class="p">:</span>
</span><span id="extract_interval-481"><a href="#extract_interval-481"><span class="linenos">481</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">years</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-482"><a href="#extract_interval-482"><span class="linenos">482</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;month&quot;</span><span class="p">:</span>
</span><span id="extract_interval-483"><a href="#extract_interval-483"><span class="linenos">483</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">months</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-484"><a href="#extract_interval-484"><span class="linenos">484</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;week&quot;</span><span class="p">:</span>
</span><span id="extract_interval-485"><a href="#extract_interval-485"><span class="linenos">485</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">weeks</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-486"><a href="#extract_interval-486"><span class="linenos">486</span></a> <span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;day&quot;</span><span class="p">:</span>
</span><span id="extract_interval-487"><a href="#extract_interval-487"><span class="linenos">487</span></a> <span class="k">return</span> <span class="n">relativedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
</span><span id="extract_interval-488"><a href="#extract_interval-488"><span class="linenos">488</span></a> <span class="k">return</span> <span class="kc">None</span>
</span></pre></div>
@ -1376,11 +1378,11 @@ elimination:
</div>
<a class="headerlink" href="#date_literal"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="date_literal-490"><a href="#date_literal-490"><span class="linenos">490</span></a><span class="k">def</span> <span class="nf">date_literal</span><span class="p">(</span><span class="n">date</span><span class="p">):</span>
</span><span id="date_literal-491"><a href="#date_literal-491"><span class="linenos">491</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span>
</span><span id="date_literal-492"><a href="#date_literal-492"><span class="linenos">492</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="n">date</span><span class="p">),</span>
</span><span id="date_literal-493"><a href="#date_literal-493"><span class="linenos">493</span></a> <span class="s2">&quot;DATETIME&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;DATE&quot;</span><span class="p">,</span>
</span><span id="date_literal-494"><a href="#date_literal-494"><span class="linenos">494</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="date_literal-491"><a href="#date_literal-491"><span class="linenos">491</span></a><span class="k">def</span> <span class="nf">date_literal</span><span class="p">(</span><span class="n">date</span><span class="p">):</span>
</span><span id="date_literal-492"><a href="#date_literal-492"><span class="linenos">492</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span>
</span><span id="date_literal-493"><a href="#date_literal-493"><span class="linenos">493</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="n">date</span><span class="p">),</span>
</span><span id="date_literal-494"><a href="#date_literal-494"><span class="linenos">494</span></a> <span class="s2">&quot;DATETIME&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;DATE&quot;</span><span class="p">,</span>
</span><span id="date_literal-495"><a href="#date_literal-495"><span class="linenos">495</span></a> <span class="p">)</span>
</span></pre></div>
@ -1398,8 +1400,8 @@ elimination:
</div>
<a class="headerlink" href="#boolean_literal"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="boolean_literal-497"><a href="#boolean_literal-497"><span class="linenos">497</span></a><span class="k">def</span> <span class="nf">boolean_literal</span><span class="p">(</span><span class="n">condition</span><span class="p">):</span>
</span><span id="boolean_literal-498"><a href="#boolean_literal-498"><span class="linenos">498</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">()</span> <span class="k">if</span> <span class="n">condition</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">false</span><span class="p">()</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="boolean_literal-498"><a href="#boolean_literal-498"><span class="linenos">498</span></a><span class="k">def</span> <span class="nf">boolean_literal</span><span class="p">(</span><span class="n">condition</span><span class="p">):</span>
</span><span id="boolean_literal-499"><a href="#boolean_literal-499"><span class="linenos">499</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">()</span> <span class="k">if</span> <span class="n">condition</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">false</span><span class="p">()</span>
</span></pre></div>