1
0
Fork 0

Adding upstream version 11.4.1.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 15:45:33 +01:00
parent d160fb48f7
commit 36706608dc
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
89 changed files with 35352 additions and 33081 deletions

View file

@ -36,6 +36,9 @@
<li>
<a class="function" href="#eliminate_distinct_on">eliminate_distinct_on</a>
</li>
<li>
<a class="function" href="#eliminate_qualify">eliminate_qualify</a>
</li>
<li>
<a class="function" href="#remove_precision_parameterized_types">remove_precision_parameterized_types</a>
</li>
@ -72,146 +75,180 @@
</span><span id="L-2"><a href="#L-2"><span class="linenos"> 2</span></a>
</span><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="kn">import</span> <span class="nn">typing</span> <span class="k">as</span> <span class="nn">t</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</span></a>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="kn">from</span> <span class="nn">sqlglot.helper</span> <span class="kn">import</span> <span class="n">find_new_name</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">TYPE_CHECKING</span><span class="p">:</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a> <span class="kn">from</span> <span class="nn">sqlglot.generator</span> <span class="kn">import</span> <span class="n">Generator</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">expressions</span> <span class="k">as</span> <span class="n">exp</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos"> 5</span></a><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">expressions</span> <span class="k">as</span> <span class="n">exp</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">from</span> <span class="nn">sqlglot.helper</span> <span class="kn">import</span> <span class="n">find_new_name</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a>
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">TYPE_CHECKING</span><span class="p">:</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a> <span class="kn">from</span> <span class="nn">sqlglot.generator</span> <span class="kn">import</span> <span class="n">Generator</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="k">def</span> <span class="nf">unalias_group</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="sd"> Replace references to select aliases in GROUP BY clauses.</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="sd"> Example:</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="sd"> &gt;&gt;&gt; sqlglot.parse_one(&quot;SELECT a AS b FROM x GROUP BY b&quot;).transform(unalias_group).sql()</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="sd"> &#39;SELECT a AS b FROM x GROUP BY 1&#39;</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="sd"> Args:</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> Returns:</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> The transformed expression.</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</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">Group</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</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-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">aliased_selects</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="n">e</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">i</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a> <span class="p">}</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="k">for</span> <span class="n">group_by</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group_by</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-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">group_by</span><span class="o">.</span><span class="n">table</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="ow">and</span> <span class="n">group_by</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">aliased_selects</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="p">):</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="n">group_by</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">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">aliased_selects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">group_by</span><span class="o">.</span><span class="n">name</span><span class="p">)))</span>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="k">def</span> <span class="nf">unalias_group</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="sd"> Replace references to select aliases in GROUP BY clauses.</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="sd"> Example:</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="sd"> &gt;&gt;&gt; sqlglot.parse_one(&quot;SELECT a AS b FROM x GROUP BY b&quot;).transform(unalias_group).sql()</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="sd"> &#39;SELECT a AS b FROM x GROUP BY 1&#39;</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="sd"> Args:</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd"> Returns:</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> The transformed expression.</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</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">Group</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</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-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">aliased_selects</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">e</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">i</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="p">}</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="k">for</span> <span class="n">group_by</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group_by</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-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">group_by</span><span class="o">.</span><span class="n">table</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="ow">and</span> <span class="n">group_by</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">aliased_selects</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="p">):</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="n">group_by</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">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">aliased_selects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">group_by</span><span class="o">.</span><span class="n">name</span><span class="p">)))</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="k">def</span> <span class="nf">eliminate_distinct_on</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a><span class="sd"> Convert SELECT DISTINCT ON statements to a subquery with a window function.</span>
</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="sd"> This is useful for dialects that don&#39;t support SELECT DISTINCT ON but support window functions.</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a><span class="sd"> Args:</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a><span class="sd"> Returns:</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a><span class="sd"> The transformed expression.</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="ow">and</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;distinct&quot;</span><span class="p">)</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</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-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="p">):</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">distinct_cols</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;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="n">row_number</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_row_number&quot;</span><span class="p">)</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">(</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">RowNumber</span><span class="p">(),</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">partition_by</span><span class="o">=</span><span class="n">distinct_cols</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">order</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-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="k">if</span> <span class="n">order</span><span class="p">:</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">window</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">order</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="n">order</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">row_number</span><span class="p">)</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">window</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-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">outer_selects</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">())</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&quot;</span><span class="si">{</span><span class="n">row_number</span><span class="si">}</span><span class="s1">&quot; = 1&#39;</span><span class="p">)</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="k">def</span> <span class="nf">remove_precision_parameterized_types</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> Some dialects only allow the precision for parameterized types to be defined in the DDL and not in other expressions.</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a><span class="sd"> This transforms removes the precision from parameterized types in expressions.</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">(</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="o">**</span><span class="p">{</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="o">**</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">:</span> <span class="p">[</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">node_expression</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">for</span> <span class="n">node_expression</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node_expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="p">],</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="p">}</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="p">)</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="p">)</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a><span class="k">def</span> <span class="nf">eliminate_distinct_on</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a><span class="sd"> Convert SELECT DISTINCT ON statements to a subquery with a window function.</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 class="sd"> This is useful for dialects that don&#39;t support SELECT DISTINCT ON but support window functions.</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a><span class="sd"> Args:</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a><span class="sd"> Returns:</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a><span class="sd"> The transformed expression.</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="ow">and</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;distinct&quot;</span><span class="p">)</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</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-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="p">):</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="n">distinct_cols</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;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="n">row_number</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_row_number&quot;</span><span class="p">)</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">(</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">RowNumber</span><span class="p">(),</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="n">partition_by</span><span class="o">=</span><span class="n">distinct_cols</span><span class="p">,</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="p">)</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">order</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-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="k">if</span> <span class="n">order</span><span class="p">:</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">window</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">order</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">row_number</span><span class="p">)</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">window</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-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">outer_selects</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">())</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&quot;</span><span class="si">{</span><span class="n">row_number</span><span class="si">}</span><span class="s1">&quot; = 1&#39;</span><span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">return</span> <span class="n">expression</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><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="k">def</span> <span class="nf">eliminate_qualify</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd"> Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.</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 class="sd"> The idea behind this transformation can be seen in Snowflake&#39;s documentation for QUALIFY:</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> https://docs.snowflake.com/en/sql-reference/constructs/qualify</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a><span class="sd"> Some dialects don&#39;t support window functions in the WHERE clause, so we need to include them as</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a><span class="sd"> projections in the subquery, in order to refer to them in the outer filter using aliases. Also,</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="sd"> if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a><span class="sd"> otherwise we won&#39;t be able to refer to it in the outer query&#39;s WHERE clause.</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</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">Select</span><span class="p">)</span> <span class="ow">and</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;qualify&quot;</span><span class="p">):</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">taken</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">alias</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="s2">&quot;_c&quot;</span><span class="p">)</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">select</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">select</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">alias</span><span class="p">))</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">taken</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">])</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="n">qualify_filters</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;qualify&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">this</span>
</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><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</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="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">to_sql</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">],</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">]:</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="sd"> expression to SQL, using an appropriate `Generator.TRANSFORMS` function.</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd"> Args:</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd"> to_sql: final transform that converts the resulting expression to a SQL string.</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">qualify_filters</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 class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)):</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</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-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_w&quot;</span><span class="p">)</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</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">expr</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">alias</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-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">expr</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">column</span><span class="p">(</span><span class="n">alias</span><span class="p">))</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="k">elif</span> <span class="n">expr</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">:</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">copy</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-109"><a href="#L-109"><span class="linenos">109</span></a>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="k">return</span> <span class="n">outer_selects</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">alias</span><span class="o">=</span><span class="s2">&quot;_t&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">qualify_filters</span><span class="p">)</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 class="k">return</span> <span class="n">expression</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd"> Returns:</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</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-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">return</span> <span class="n">to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="k">return</span> <span class="n">_to_sql</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><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a><span class="k">def</span> <span class="nf">delegate</span><span class="p">(</span><span class="n">attr</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">:</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a><span class="sd"> Create a new method that delegates to `attr`. This is useful for creating `Generator.TRANSFORMS`</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a><span class="sd"> functions that delegate to existing generator methods.</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a><span class="sd"> &quot;&quot;&quot;</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">_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">return</span> <span class="n">_transform</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a><span class="n">UNALIAS_GROUP</span> <span class="o">=</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">preprocess</span><span class="p">([</span><span class="n">unalias_group</span><span class="p">],</span> <span class="n">delegate</span><span class="p">(</span><span class="s2">&quot;group_sql&quot;</span><span class="p">))}</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a><span class="n">ELIMINATE_DISTINCT_ON</span> <span class="o">=</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="n">preprocess</span><span class="p">([</span><span class="n">eliminate_distinct_on</span><span class="p">],</span> <span class="n">delegate</span><span class="p">(</span><span class="s2">&quot;select_sql&quot;</span><span class="p">))}</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a><span class="n">REMOVE_PRECISION_PARAMETERIZED_TYPES</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">:</span> <span class="n">preprocess</span><span class="p">([</span><span class="n">remove_precision_parameterized_types</span><span class="p">],</span> <span class="n">delegate</span><span class="p">(</span><span class="s2">&quot;cast_sql&quot;</span><span class="p">))</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="p">}</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="k">def</span> <span class="nf">remove_precision_parameterized_types</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd"> Some dialects only allow the precision for parameterized types to be defined in the DDL and not in other expressions.</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="sd"> This transforms removes the precision from parameterized types in expressions.</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">(</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="o">**</span><span class="p">{</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="o">**</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">,</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">:</span> <span class="p">[</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">node_expression</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">for</span> <span class="n">node_expression</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node_expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="p">],</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="p">}</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="p">)</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="p">)</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</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="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">to_sql</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">],</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">]:</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a><span class="sd"> expression to SQL, using an appropriate `Generator.TRANSFORMS` function.</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="sd"> Args:</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd"> to_sql: final transform that converts the resulting expression to a SQL string.</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="sd"> Returns:</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</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-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</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="n">to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a>
</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="k">def</span> <span class="nf">delegate</span><span class="p">(</span><span class="n">attr</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">:</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a><span class="sd"> Create a new method that delegates to `attr`. This is useful for creating `Generator.TRANSFORMS`</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a><span class="sd"> functions that delegate to existing generator methods.</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="k">def</span> <span class="nf">_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="k">return</span> <span class="n">_transform</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a><span class="n">UNALIAS_GROUP</span> <span class="o">=</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">preprocess</span><span class="p">([</span><span class="n">unalias_group</span><span class="p">],</span> <span class="n">delegate</span><span class="p">(</span><span class="s2">&quot;group_sql&quot;</span><span class="p">))}</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a><span class="n">ELIMINATE_DISTINCT_ON</span> <span class="o">=</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="n">preprocess</span><span class="p">([</span><span class="n">eliminate_distinct_on</span><span class="p">],</span> <span class="n">delegate</span><span class="p">(</span><span class="s2">&quot;select_sql&quot;</span><span class="p">))}</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a><span class="n">ELIMINATE_QUALIFY</span> <span class="o">=</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="n">preprocess</span><span class="p">([</span><span class="n">eliminate_qualify</span><span class="p">],</span> <span class="n">delegate</span><span class="p">(</span><span class="s2">&quot;select_sql&quot;</span><span class="p">))}</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a><span class="n">REMOVE_PRECISION_PARAMETERIZED_TYPES</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">:</span> <span class="n">preprocess</span><span class="p">([</span><span class="n">remove_precision_parameterized_types</span><span class="p">],</span> <span class="n">delegate</span><span class="p">(</span><span class="s2">&quot;cast_sql&quot;</span><span class="p">))</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a><span class="p">}</span>
</span></pre></div>
@ -227,37 +264,37 @@
</div>
<a class="headerlink" href="#unalias_group"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="unalias_group-14"><a href="#unalias_group-14"><span class="linenos">14</span></a><span class="k">def</span> <span class="nf">unalias_group</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="unalias_group-15"><a href="#unalias_group-15"><span class="linenos">15</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="unalias_group-16"><a href="#unalias_group-16"><span class="linenos">16</span></a><span class="sd"> Replace references to select aliases in GROUP BY clauses.</span>
</span><span id="unalias_group-17"><a href="#unalias_group-17"><span class="linenos">17</span></a>
</span><span id="unalias_group-18"><a href="#unalias_group-18"><span class="linenos">18</span></a><span class="sd"> Example:</span>
</span><span id="unalias_group-19"><a href="#unalias_group-19"><span class="linenos">19</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
</span><span id="unalias_group-20"><a href="#unalias_group-20"><span class="linenos">20</span></a><span class="sd"> &gt;&gt;&gt; sqlglot.parse_one(&quot;SELECT a AS b FROM x GROUP BY b&quot;).transform(unalias_group).sql()</span>
</span><span id="unalias_group-21"><a href="#unalias_group-21"><span class="linenos">21</span></a><span class="sd"> &#39;SELECT a AS b FROM x GROUP BY 1&#39;</span>
</span><span id="unalias_group-22"><a href="#unalias_group-22"><span class="linenos">22</span></a>
</span><span id="unalias_group-23"><a href="#unalias_group-23"><span class="linenos">23</span></a><span class="sd"> Args:</span>
</span><span id="unalias_group-24"><a href="#unalias_group-24"><span class="linenos">24</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="unalias_group-25"><a href="#unalias_group-25"><span class="linenos">25</span></a>
</span><span id="unalias_group-26"><a href="#unalias_group-26"><span class="linenos">26</span></a><span class="sd"> Returns:</span>
</span><span id="unalias_group-27"><a href="#unalias_group-27"><span class="linenos">27</span></a><span class="sd"> The transformed expression.</span>
</span><span id="unalias_group-28"><a href="#unalias_group-28"><span class="linenos">28</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="unalias_group-29"><a href="#unalias_group-29"><span class="linenos">29</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">Group</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</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="unalias_group-30"><a href="#unalias_group-30"><span class="linenos">30</span></a> <span class="n">aliased_selects</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="unalias_group-31"><a href="#unalias_group-31"><span class="linenos">31</span></a> <span class="n">e</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">i</span>
</span><span id="unalias_group-32"><a href="#unalias_group-32"><span class="linenos">32</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="unalias_group-33"><a href="#unalias_group-33"><span class="linenos">33</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="unalias_group-34"><a href="#unalias_group-34"><span class="linenos">34</span></a> <span class="p">}</span>
</span><span id="unalias_group-35"><a href="#unalias_group-35"><span class="linenos">35</span></a>
</span><span id="unalias_group-36"><a href="#unalias_group-36"><span class="linenos">36</span></a> <span class="k">for</span> <span class="n">group_by</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="unalias_group-37"><a href="#unalias_group-37"><span class="linenos">37</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="unalias_group-38"><a href="#unalias_group-38"><span class="linenos">38</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group_by</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="unalias_group-39"><a href="#unalias_group-39"><span class="linenos">39</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">group_by</span><span class="o">.</span><span class="n">table</span>
</span><span id="unalias_group-40"><a href="#unalias_group-40"><span class="linenos">40</span></a> <span class="ow">and</span> <span class="n">group_by</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">aliased_selects</span>
</span><span id="unalias_group-41"><a href="#unalias_group-41"><span class="linenos">41</span></a> <span class="p">):</span>
</span><span id="unalias_group-42"><a href="#unalias_group-42"><span class="linenos">42</span></a> <span class="n">group_by</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">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">aliased_selects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">group_by</span><span class="o">.</span><span class="n">name</span><span class="p">)))</span>
</span><span id="unalias_group-43"><a href="#unalias_group-43"><span class="linenos">43</span></a>
</span><span id="unalias_group-44"><a href="#unalias_group-44"><span class="linenos">44</span></a> <span class="k">return</span> <span class="n">expression</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="unalias_group-13"><a href="#unalias_group-13"><span class="linenos">13</span></a><span class="k">def</span> <span class="nf">unalias_group</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="unalias_group-14"><a href="#unalias_group-14"><span class="linenos">14</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="unalias_group-15"><a href="#unalias_group-15"><span class="linenos">15</span></a><span class="sd"> Replace references to select aliases in GROUP BY clauses.</span>
</span><span id="unalias_group-16"><a href="#unalias_group-16"><span class="linenos">16</span></a>
</span><span id="unalias_group-17"><a href="#unalias_group-17"><span class="linenos">17</span></a><span class="sd"> Example:</span>
</span><span id="unalias_group-18"><a href="#unalias_group-18"><span class="linenos">18</span></a><span class="sd"> &gt;&gt;&gt; import sqlglot</span>
</span><span id="unalias_group-19"><a href="#unalias_group-19"><span class="linenos">19</span></a><span class="sd"> &gt;&gt;&gt; sqlglot.parse_one(&quot;SELECT a AS b FROM x GROUP BY b&quot;).transform(unalias_group).sql()</span>
</span><span id="unalias_group-20"><a href="#unalias_group-20"><span class="linenos">20</span></a><span class="sd"> &#39;SELECT a AS b FROM x GROUP BY 1&#39;</span>
</span><span id="unalias_group-21"><a href="#unalias_group-21"><span class="linenos">21</span></a>
</span><span id="unalias_group-22"><a href="#unalias_group-22"><span class="linenos">22</span></a><span class="sd"> Args:</span>
</span><span id="unalias_group-23"><a href="#unalias_group-23"><span class="linenos">23</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="unalias_group-24"><a href="#unalias_group-24"><span class="linenos">24</span></a>
</span><span id="unalias_group-25"><a href="#unalias_group-25"><span class="linenos">25</span></a><span class="sd"> Returns:</span>
</span><span id="unalias_group-26"><a href="#unalias_group-26"><span class="linenos">26</span></a><span class="sd"> The transformed expression.</span>
</span><span id="unalias_group-27"><a href="#unalias_group-27"><span class="linenos">27</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="unalias_group-28"><a href="#unalias_group-28"><span class="linenos">28</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">Group</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</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="unalias_group-29"><a href="#unalias_group-29"><span class="linenos">29</span></a> <span class="n">aliased_selects</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="unalias_group-30"><a href="#unalias_group-30"><span class="linenos">30</span></a> <span class="n">e</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span> <span class="n">i</span>
</span><span id="unalias_group-31"><a href="#unalias_group-31"><span class="linenos">31</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="unalias_group-32"><a href="#unalias_group-32"><span class="linenos">32</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span>
</span><span id="unalias_group-33"><a href="#unalias_group-33"><span class="linenos">33</span></a> <span class="p">}</span>
</span><span id="unalias_group-34"><a href="#unalias_group-34"><span class="linenos">34</span></a>
</span><span id="unalias_group-35"><a href="#unalias_group-35"><span class="linenos">35</span></a> <span class="k">for</span> <span class="n">group_by</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">:</span>
</span><span id="unalias_group-36"><a href="#unalias_group-36"><span class="linenos">36</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="unalias_group-37"><a href="#unalias_group-37"><span class="linenos">37</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group_by</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="unalias_group-38"><a href="#unalias_group-38"><span class="linenos">38</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">group_by</span><span class="o">.</span><span class="n">table</span>
</span><span id="unalias_group-39"><a href="#unalias_group-39"><span class="linenos">39</span></a> <span class="ow">and</span> <span class="n">group_by</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">aliased_selects</span>
</span><span id="unalias_group-40"><a href="#unalias_group-40"><span class="linenos">40</span></a> <span class="p">):</span>
</span><span id="unalias_group-41"><a href="#unalias_group-41"><span class="linenos">41</span></a> <span class="n">group_by</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">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="n">aliased_selects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">group_by</span><span class="o">.</span><span class="n">name</span><span class="p">)))</span>
</span><span id="unalias_group-42"><a href="#unalias_group-42"><span class="linenos">42</span></a>
</span><span id="unalias_group-43"><a href="#unalias_group-43"><span class="linenos">43</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -300,40 +337,38 @@
</div>
<a class="headerlink" href="#eliminate_distinct_on"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_distinct_on-47"><a href="#eliminate_distinct_on-47"><span class="linenos">47</span></a><span class="k">def</span> <span class="nf">eliminate_distinct_on</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="eliminate_distinct_on-48"><a href="#eliminate_distinct_on-48"><span class="linenos">48</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_distinct_on-49"><a href="#eliminate_distinct_on-49"><span class="linenos">49</span></a><span class="sd"> Convert SELECT DISTINCT ON statements to a subquery with a window function.</span>
</span><span id="eliminate_distinct_on-50"><a href="#eliminate_distinct_on-50"><span class="linenos">50</span></a>
</span><span id="eliminate_distinct_on-51"><a href="#eliminate_distinct_on-51"><span class="linenos">51</span></a><span class="sd"> This is useful for dialects that don&#39;t support SELECT DISTINCT ON but support window functions.</span>
</span><span id="eliminate_distinct_on-52"><a href="#eliminate_distinct_on-52"><span class="linenos">52</span></a>
</span><span id="eliminate_distinct_on-53"><a href="#eliminate_distinct_on-53"><span class="linenos">53</span></a><span class="sd"> Args:</span>
</span><span id="eliminate_distinct_on-54"><a href="#eliminate_distinct_on-54"><span class="linenos">54</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="eliminate_distinct_on-55"><a href="#eliminate_distinct_on-55"><span class="linenos">55</span></a>
</span><span id="eliminate_distinct_on-56"><a href="#eliminate_distinct_on-56"><span class="linenos">56</span></a><span class="sd"> Returns:</span>
</span><span id="eliminate_distinct_on-57"><a href="#eliminate_distinct_on-57"><span class="linenos">57</span></a><span class="sd"> The transformed expression.</span>
</span><span id="eliminate_distinct_on-58"><a href="#eliminate_distinct_on-58"><span class="linenos">58</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_distinct_on-59"><a href="#eliminate_distinct_on-59"><span class="linenos">59</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="eliminate_distinct_on-60"><a href="#eliminate_distinct_on-60"><span class="linenos">60</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-61"><a href="#eliminate_distinct_on-61"><span class="linenos">61</span></a> <span class="ow">and</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;distinct&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-62"><a href="#eliminate_distinct_on-62"><span class="linenos">62</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</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="eliminate_distinct_on-63"><a href="#eliminate_distinct_on-63"><span class="linenos">63</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-64"><a href="#eliminate_distinct_on-64"><span class="linenos">64</span></a> <span class="p">):</span>
</span><span id="eliminate_distinct_on-65"><a href="#eliminate_distinct_on-65"><span class="linenos">65</span></a> <span class="n">distinct_cols</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;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="eliminate_distinct_on-66"><a href="#eliminate_distinct_on-66"><span class="linenos">66</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="eliminate_distinct_on-67"><a href="#eliminate_distinct_on-67"><span class="linenos">67</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span>
</span><span id="eliminate_distinct_on-68"><a href="#eliminate_distinct_on-68"><span class="linenos">68</span></a> <span class="n">row_number</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_row_number&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-69"><a href="#eliminate_distinct_on-69"><span class="linenos">69</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">(</span>
</span><span id="eliminate_distinct_on-70"><a href="#eliminate_distinct_on-70"><span class="linenos">70</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">RowNumber</span><span class="p">(),</span>
</span><span id="eliminate_distinct_on-71"><a href="#eliminate_distinct_on-71"><span class="linenos">71</span></a> <span class="n">partition_by</span><span class="o">=</span><span class="n">distinct_cols</span><span class="p">,</span>
</span><span id="eliminate_distinct_on-72"><a href="#eliminate_distinct_on-72"><span class="linenos">72</span></a> <span class="p">)</span>
</span><span id="eliminate_distinct_on-73"><a href="#eliminate_distinct_on-73"><span class="linenos">73</span></a> <span class="n">order</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="eliminate_distinct_on-74"><a href="#eliminate_distinct_on-74"><span class="linenos">74</span></a> <span class="k">if</span> <span class="n">order</span><span class="p">:</span>
</span><span id="eliminate_distinct_on-75"><a href="#eliminate_distinct_on-75"><span class="linenos">75</span></a> <span class="n">window</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">order</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="eliminate_distinct_on-76"><a href="#eliminate_distinct_on-76"><span class="linenos">76</span></a> <span class="n">order</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
</span><span id="eliminate_distinct_on-77"><a href="#eliminate_distinct_on-77"><span class="linenos">77</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">row_number</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-78"><a href="#eliminate_distinct_on-78"><span class="linenos">78</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">window</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="eliminate_distinct_on-79"><a href="#eliminate_distinct_on-79"><span class="linenos">79</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">outer_selects</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">())</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&quot;</span><span class="si">{</span><span class="n">row_number</span><span class="si">}</span><span class="s1">&quot; = 1&#39;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-80"><a href="#eliminate_distinct_on-80"><span class="linenos">80</span></a> <span class="k">return</span> <span class="n">expression</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_distinct_on-46"><a href="#eliminate_distinct_on-46"><span class="linenos">46</span></a><span class="k">def</span> <span class="nf">eliminate_distinct_on</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="eliminate_distinct_on-47"><a href="#eliminate_distinct_on-47"><span class="linenos">47</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_distinct_on-48"><a href="#eliminate_distinct_on-48"><span class="linenos">48</span></a><span class="sd"> Convert SELECT DISTINCT ON statements to a subquery with a window function.</span>
</span><span id="eliminate_distinct_on-49"><a href="#eliminate_distinct_on-49"><span class="linenos">49</span></a>
</span><span id="eliminate_distinct_on-50"><a href="#eliminate_distinct_on-50"><span class="linenos">50</span></a><span class="sd"> This is useful for dialects that don&#39;t support SELECT DISTINCT ON but support window functions.</span>
</span><span id="eliminate_distinct_on-51"><a href="#eliminate_distinct_on-51"><span class="linenos">51</span></a>
</span><span id="eliminate_distinct_on-52"><a href="#eliminate_distinct_on-52"><span class="linenos">52</span></a><span class="sd"> Args:</span>
</span><span id="eliminate_distinct_on-53"><a href="#eliminate_distinct_on-53"><span class="linenos">53</span></a><span class="sd"> expression: the expression that will be transformed.</span>
</span><span id="eliminate_distinct_on-54"><a href="#eliminate_distinct_on-54"><span class="linenos">54</span></a>
</span><span id="eliminate_distinct_on-55"><a href="#eliminate_distinct_on-55"><span class="linenos">55</span></a><span class="sd"> Returns:</span>
</span><span id="eliminate_distinct_on-56"><a href="#eliminate_distinct_on-56"><span class="linenos">56</span></a><span class="sd"> The transformed expression.</span>
</span><span id="eliminate_distinct_on-57"><a href="#eliminate_distinct_on-57"><span class="linenos">57</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_distinct_on-58"><a href="#eliminate_distinct_on-58"><span class="linenos">58</span></a> <span class="k">if</span> <span class="p">(</span>
</span><span id="eliminate_distinct_on-59"><a href="#eliminate_distinct_on-59"><span class="linenos">59</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-60"><a href="#eliminate_distinct_on-60"><span class="linenos">60</span></a> <span class="ow">and</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;distinct&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-61"><a href="#eliminate_distinct_on-61"><span class="linenos">61</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</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="eliminate_distinct_on-62"><a href="#eliminate_distinct_on-62"><span class="linenos">62</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-63"><a href="#eliminate_distinct_on-63"><span class="linenos">63</span></a> <span class="p">):</span>
</span><span id="eliminate_distinct_on-64"><a href="#eliminate_distinct_on-64"><span class="linenos">64</span></a> <span class="n">distinct_cols</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;distinct&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;on&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="eliminate_distinct_on-65"><a href="#eliminate_distinct_on-65"><span class="linenos">65</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span>
</span><span id="eliminate_distinct_on-66"><a href="#eliminate_distinct_on-66"><span class="linenos">66</span></a> <span class="n">row_number</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_row_number&quot;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-67"><a href="#eliminate_distinct_on-67"><span class="linenos">67</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Window</span><span class="p">(</span>
</span><span id="eliminate_distinct_on-68"><a href="#eliminate_distinct_on-68"><span class="linenos">68</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">RowNumber</span><span class="p">(),</span>
</span><span id="eliminate_distinct_on-69"><a href="#eliminate_distinct_on-69"><span class="linenos">69</span></a> <span class="n">partition_by</span><span class="o">=</span><span class="n">distinct_cols</span><span class="p">,</span>
</span><span id="eliminate_distinct_on-70"><a href="#eliminate_distinct_on-70"><span class="linenos">70</span></a> <span class="p">)</span>
</span><span id="eliminate_distinct_on-71"><a href="#eliminate_distinct_on-71"><span class="linenos">71</span></a> <span class="n">order</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="eliminate_distinct_on-72"><a href="#eliminate_distinct_on-72"><span class="linenos">72</span></a> <span class="k">if</span> <span class="n">order</span><span class="p">:</span>
</span><span id="eliminate_distinct_on-73"><a href="#eliminate_distinct_on-73"><span class="linenos">73</span></a> <span class="n">window</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">order</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
</span><span id="eliminate_distinct_on-74"><a href="#eliminate_distinct_on-74"><span class="linenos">74</span></a> <span class="n">window</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">window</span><span class="p">,</span> <span class="n">row_number</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-75"><a href="#eliminate_distinct_on-75"><span class="linenos">75</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">window</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="eliminate_distinct_on-76"><a href="#eliminate_distinct_on-76"><span class="linenos">76</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">outer_selects</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">())</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&quot;</span><span class="si">{</span><span class="n">row_number</span><span class="si">}</span><span class="s1">&quot; = 1&#39;</span><span class="p">)</span>
</span><span id="eliminate_distinct_on-77"><a href="#eliminate_distinct_on-77"><span class="linenos">77</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -355,6 +390,67 @@
</div>
</section>
<section id="eliminate_qualify">
<input id="eliminate_qualify-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="def">def</span>
<span class="name">eliminate_qualify</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span></span><span class="return-annotation">) -> <span class="n"><a href="expressions.html#Expression">sqlglot.expressions.Expression</a></span>:</span></span>
<label class="view-source-button" for="eliminate_qualify-view-source"><span>View Source</span></label>
</div>
<a class="headerlink" href="#eliminate_qualify"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="eliminate_qualify-80"><a href="#eliminate_qualify-80"><span class="linenos"> 80</span></a><span class="k">def</span> <span class="nf">eliminate_qualify</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="eliminate_qualify-81"><a href="#eliminate_qualify-81"><span class="linenos"> 81</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="eliminate_qualify-82"><a href="#eliminate_qualify-82"><span class="linenos"> 82</span></a><span class="sd"> Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.</span>
</span><span id="eliminate_qualify-83"><a href="#eliminate_qualify-83"><span class="linenos"> 83</span></a>
</span><span id="eliminate_qualify-84"><a href="#eliminate_qualify-84"><span class="linenos"> 84</span></a><span class="sd"> The idea behind this transformation can be seen in Snowflake&#39;s documentation for QUALIFY:</span>
</span><span id="eliminate_qualify-85"><a href="#eliminate_qualify-85"><span class="linenos"> 85</span></a><span class="sd"> https://docs.snowflake.com/en/sql-reference/constructs/qualify</span>
</span><span id="eliminate_qualify-86"><a href="#eliminate_qualify-86"><span class="linenos"> 86</span></a>
</span><span id="eliminate_qualify-87"><a href="#eliminate_qualify-87"><span class="linenos"> 87</span></a><span class="sd"> Some dialects don&#39;t support window functions in the WHERE clause, so we need to include them as</span>
</span><span id="eliminate_qualify-88"><a href="#eliminate_qualify-88"><span class="linenos"> 88</span></a><span class="sd"> projections in the subquery, in order to refer to them in the outer filter using aliases. Also,</span>
</span><span id="eliminate_qualify-89"><a href="#eliminate_qualify-89"><span class="linenos"> 89</span></a><span class="sd"> if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,</span>
</span><span id="eliminate_qualify-90"><a href="#eliminate_qualify-90"><span class="linenos"> 90</span></a><span class="sd"> otherwise we won&#39;t be able to refer to it in the outer query&#39;s WHERE clause.</span>
</span><span id="eliminate_qualify-91"><a href="#eliminate_qualify-91"><span class="linenos"> 91</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="eliminate_qualify-92"><a href="#eliminate_qualify-92"><span class="linenos"> 92</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">Select</span><span class="p">)</span> <span class="ow">and</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;qualify&quot;</span><span class="p">):</span>
</span><span id="eliminate_qualify-93"><a href="#eliminate_qualify-93"><span class="linenos"> 93</span></a> <span class="n">taken</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
</span><span id="eliminate_qualify-94"><a href="#eliminate_qualify-94"><span class="linenos"> 94</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
</span><span id="eliminate_qualify-95"><a href="#eliminate_qualify-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span>
</span><span id="eliminate_qualify-96"><a href="#eliminate_qualify-96"><span class="linenos"> 96</span></a> <span class="n">alias</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="s2">&quot;_c&quot;</span><span class="p">)</span>
</span><span id="eliminate_qualify-97"><a href="#eliminate_qualify-97"><span class="linenos"> 97</span></a> <span class="n">select</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">select</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">alias</span><span class="p">))</span>
</span><span id="eliminate_qualify-98"><a href="#eliminate_qualify-98"><span class="linenos"> 98</span></a> <span class="n">taken</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
</span><span id="eliminate_qualify-99"><a href="#eliminate_qualify-99"><span class="linenos"> 99</span></a>
</span><span id="eliminate_qualify-100"><a href="#eliminate_qualify-100"><span class="linenos">100</span></a> <span class="n">outer_selects</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">])</span>
</span><span id="eliminate_qualify-101"><a href="#eliminate_qualify-101"><span class="linenos">101</span></a> <span class="n">qualify_filters</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;qualify&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span><span class="o">.</span><span class="n">this</span>
</span><span id="eliminate_qualify-102"><a href="#eliminate_qualify-102"><span class="linenos">102</span></a>
</span><span id="eliminate_qualify-103"><a href="#eliminate_qualify-103"><span class="linenos">103</span></a> <span class="k">for</span> <span class="n">expr</span> <span class="ow">in</span> <span class="n">qualify_filters</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 class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)):</span>
</span><span id="eliminate_qualify-104"><a href="#eliminate_qualify-104"><span class="linenos">104</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</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="eliminate_qualify-105"><a href="#eliminate_qualify-105"><span class="linenos">105</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">,</span> <span class="s2">&quot;_w&quot;</span><span class="p">)</span>
</span><span id="eliminate_qualify-106"><a href="#eliminate_qualify-106"><span class="linenos">106</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</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">expr</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">alias</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="eliminate_qualify-107"><a href="#eliminate_qualify-107"><span class="linenos">107</span></a> <span class="n">expr</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">column</span><span class="p">(</span><span class="n">alias</span><span class="p">))</span>
</span><span id="eliminate_qualify-108"><a href="#eliminate_qualify-108"><span class="linenos">108</span></a> <span class="k">elif</span> <span class="n">expr</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">:</span>
</span><span id="eliminate_qualify-109"><a href="#eliminate_qualify-109"><span class="linenos">109</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">copy</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="eliminate_qualify-110"><a href="#eliminate_qualify-110"><span class="linenos">110</span></a>
</span><span id="eliminate_qualify-111"><a href="#eliminate_qualify-111"><span class="linenos">111</span></a> <span class="k">return</span> <span class="n">outer_selects</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">alias</span><span class="o">=</span><span class="s2">&quot;_t&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">qualify_filters</span><span class="p">)</span>
</span><span id="eliminate_qualify-112"><a href="#eliminate_qualify-112"><span class="linenos">112</span></a>
</span><span id="eliminate_qualify-113"><a href="#eliminate_qualify-113"><span class="linenos">113</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Convert SELECT statements that contain the QUALIFY clause into subqueries, filtered equivalently.</p>
<p>The idea behind this transformation can be seen in Snowflake's documentation for QUALIFY:
<a href="https://docs.snowflake.com/en/sql-reference/constructs/qualify">https://docs.snowflake.com/en/sql-reference/constructs/qualify</a></p>
<p>Some dialects don't support window functions in the WHERE clause, so we need to include them as
projections in the subquery, in order to refer to them in the outer filter using aliases. Also,
if a column is referenced in the QUALIFY clause but is not selected, we need to include it too,
otherwise we won't be able to refer to it in the outer query's WHERE clause.</p>
</div>
</section>
<section id="remove_precision_parameterized_types">
<input id="remove_precision_parameterized_types-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
@ -367,25 +463,25 @@
</div>
<a class="headerlink" href="#remove_precision_parameterized_types"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_precision_parameterized_types-83"><a href="#remove_precision_parameterized_types-83"><span class="linenos"> 83</span></a><span class="k">def</span> <span class="nf">remove_precision_parameterized_types</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="remove_precision_parameterized_types-84"><a href="#remove_precision_parameterized_types-84"><span class="linenos"> 84</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="remove_precision_parameterized_types-85"><a href="#remove_precision_parameterized_types-85"><span class="linenos"> 85</span></a><span class="sd"> Some dialects only allow the precision for parameterized types to be defined in the DDL and not in other expressions.</span>
</span><span id="remove_precision_parameterized_types-86"><a href="#remove_precision_parameterized_types-86"><span class="linenos"> 86</span></a><span class="sd"> This transforms removes the precision from parameterized types in expressions.</span>
</span><span id="remove_precision_parameterized_types-87"><a href="#remove_precision_parameterized_types-87"><span class="linenos"> 87</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="remove_precision_parameterized_types-88"><a href="#remove_precision_parameterized_types-88"><span class="linenos"> 88</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="remove_precision_parameterized_types-89"><a href="#remove_precision_parameterized_types-89"><span class="linenos"> 89</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">(</span>
</span><span id="remove_precision_parameterized_types-90"><a href="#remove_precision_parameterized_types-90"><span class="linenos"> 90</span></a> <span class="o">**</span><span class="p">{</span>
</span><span id="remove_precision_parameterized_types-91"><a href="#remove_precision_parameterized_types-91"><span class="linenos"> 91</span></a> <span class="o">**</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">,</span>
</span><span id="remove_precision_parameterized_types-92"><a href="#remove_precision_parameterized_types-92"><span class="linenos"> 92</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">:</span> <span class="p">[</span>
</span><span id="remove_precision_parameterized_types-93"><a href="#remove_precision_parameterized_types-93"><span class="linenos"> 93</span></a> <span class="n">node_expression</span>
</span><span id="remove_precision_parameterized_types-94"><a href="#remove_precision_parameterized_types-94"><span class="linenos"> 94</span></a> <span class="k">for</span> <span class="n">node_expression</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="remove_precision_parameterized_types-95"><a href="#remove_precision_parameterized_types-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node_expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="remove_precision_parameterized_types-96"><a href="#remove_precision_parameterized_types-96"><span class="linenos"> 96</span></a> <span class="p">],</span>
</span><span id="remove_precision_parameterized_types-97"><a href="#remove_precision_parameterized_types-97"><span class="linenos"> 97</span></a> <span class="p">}</span>
</span><span id="remove_precision_parameterized_types-98"><a href="#remove_precision_parameterized_types-98"><span class="linenos"> 98</span></a> <span class="p">)</span>
</span><span id="remove_precision_parameterized_types-99"><a href="#remove_precision_parameterized_types-99"><span class="linenos"> 99</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="remove_precision_parameterized_types-100"><a href="#remove_precision_parameterized_types-100"><span class="linenos">100</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
</span><span id="remove_precision_parameterized_types-101"><a href="#remove_precision_parameterized_types-101"><span class="linenos">101</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_precision_parameterized_types-116"><a href="#remove_precision_parameterized_types-116"><span class="linenos">116</span></a><span class="k">def</span> <span class="nf">remove_precision_parameterized_types</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
</span><span id="remove_precision_parameterized_types-117"><a href="#remove_precision_parameterized_types-117"><span class="linenos">117</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="remove_precision_parameterized_types-118"><a href="#remove_precision_parameterized_types-118"><span class="linenos">118</span></a><span class="sd"> Some dialects only allow the precision for parameterized types to be defined in the DDL and not in other expressions.</span>
</span><span id="remove_precision_parameterized_types-119"><a href="#remove_precision_parameterized_types-119"><span class="linenos">119</span></a><span class="sd"> This transforms removes the precision from parameterized types in expressions.</span>
</span><span id="remove_precision_parameterized_types-120"><a href="#remove_precision_parameterized_types-120"><span class="linenos">120</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="remove_precision_parameterized_types-121"><a href="#remove_precision_parameterized_types-121"><span class="linenos">121</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="remove_precision_parameterized_types-122"><a href="#remove_precision_parameterized_types-122"><span class="linenos">122</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">(</span>
</span><span id="remove_precision_parameterized_types-123"><a href="#remove_precision_parameterized_types-123"><span class="linenos">123</span></a> <span class="o">**</span><span class="p">{</span>
</span><span id="remove_precision_parameterized_types-124"><a href="#remove_precision_parameterized_types-124"><span class="linenos">124</span></a> <span class="o">**</span><span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="p">,</span>
</span><span id="remove_precision_parameterized_types-125"><a href="#remove_precision_parameterized_types-125"><span class="linenos">125</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">:</span> <span class="p">[</span>
</span><span id="remove_precision_parameterized_types-126"><a href="#remove_precision_parameterized_types-126"><span class="linenos">126</span></a> <span class="n">node_expression</span>
</span><span id="remove_precision_parameterized_types-127"><a href="#remove_precision_parameterized_types-127"><span class="linenos">127</span></a> <span class="k">for</span> <span class="n">node_expression</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="remove_precision_parameterized_types-128"><a href="#remove_precision_parameterized_types-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node_expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="remove_precision_parameterized_types-129"><a href="#remove_precision_parameterized_types-129"><span class="linenos">129</span></a> <span class="p">],</span>
</span><span id="remove_precision_parameterized_types-130"><a href="#remove_precision_parameterized_types-130"><span class="linenos">130</span></a> <span class="p">}</span>
</span><span id="remove_precision_parameterized_types-131"><a href="#remove_precision_parameterized_types-131"><span class="linenos">131</span></a> <span class="p">)</span>
</span><span id="remove_precision_parameterized_types-132"><a href="#remove_precision_parameterized_types-132"><span class="linenos">132</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">)</span>
</span><span id="remove_precision_parameterized_types-133"><a href="#remove_precision_parameterized_types-133"><span class="linenos">133</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
</span><span id="remove_precision_parameterized_types-134"><a href="#remove_precision_parameterized_types-134"><span class="linenos">134</span></a> <span class="p">)</span>
</span></pre></div>
@ -406,29 +502,29 @@ This transforms removes the precision from parameterized types in expressions.</
</div>
<a class="headerlink" href="#preprocess"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="preprocess-104"><a href="#preprocess-104"><span class="linenos">104</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="preprocess-105"><a href="#preprocess-105"><span class="linenos">105</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</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="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
</span><span id="preprocess-106"><a href="#preprocess-106"><span class="linenos">106</span></a> <span class="n">to_sql</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">],</span>
</span><span id="preprocess-107"><a href="#preprocess-107"><span class="linenos">107</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">]:</span>
</span><span id="preprocess-108"><a href="#preprocess-108"><span class="linenos">108</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="preprocess-109"><a href="#preprocess-109"><span class="linenos">109</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="preprocess-110"><a href="#preprocess-110"><span class="linenos">110</span></a><span class="sd"> expression to SQL, using an appropriate `Generator.TRANSFORMS` function.</span>
</span><span id="preprocess-111"><a href="#preprocess-111"><span class="linenos">111</span></a>
</span><span id="preprocess-112"><a href="#preprocess-112"><span class="linenos">112</span></a><span class="sd"> Args:</span>
</span><span id="preprocess-113"><a href="#preprocess-113"><span class="linenos">113</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="preprocess-114"><a href="#preprocess-114"><span class="linenos">114</span></a><span class="sd"> to_sql: final transform that converts the resulting expression to a SQL string.</span>
</span><span id="preprocess-115"><a href="#preprocess-115"><span class="linenos">115</span></a>
</span><span id="preprocess-116"><a href="#preprocess-116"><span class="linenos">116</span></a><span class="sd"> Returns:</span>
</span><span id="preprocess-117"><a href="#preprocess-117"><span class="linenos">117</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="preprocess-118"><a href="#preprocess-118"><span class="linenos">118</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="preprocess-119"><a href="#preprocess-119"><span class="linenos">119</span></a>
</span><span id="preprocess-120"><a href="#preprocess-120"><span class="linenos">120</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
</span><span id="preprocess-121"><a href="#preprocess-121"><span class="linenos">121</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</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="preprocess-122"><a href="#preprocess-122"><span class="linenos">122</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="preprocess-123"><a href="#preprocess-123"><span class="linenos">123</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-124"><a href="#preprocess-124"><span class="linenos">124</span></a> <span class="k">return</span> <span class="n">to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-125"><a href="#preprocess-125"><span class="linenos">125</span></a>
</span><span id="preprocess-126"><a href="#preprocess-126"><span class="linenos">126</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="preprocess-137"><a href="#preprocess-137"><span class="linenos">137</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="preprocess-138"><a href="#preprocess-138"><span class="linenos">138</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</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="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
</span><span id="preprocess-139"><a href="#preprocess-139"><span class="linenos">139</span></a> <span class="n">to_sql</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">],</span>
</span><span id="preprocess-140"><a href="#preprocess-140"><span class="linenos">140</span></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</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="nb">str</span><span class="p">]:</span>
</span><span id="preprocess-141"><a href="#preprocess-141"><span class="linenos">141</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="preprocess-142"><a href="#preprocess-142"><span class="linenos">142</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="preprocess-143"><a href="#preprocess-143"><span class="linenos">143</span></a><span class="sd"> expression to SQL, using an appropriate `Generator.TRANSFORMS` function.</span>
</span><span id="preprocess-144"><a href="#preprocess-144"><span class="linenos">144</span></a>
</span><span id="preprocess-145"><a href="#preprocess-145"><span class="linenos">145</span></a><span class="sd"> Args:</span>
</span><span id="preprocess-146"><a href="#preprocess-146"><span class="linenos">146</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="preprocess-147"><a href="#preprocess-147"><span class="linenos">147</span></a><span class="sd"> to_sql: final transform that converts the resulting expression to a SQL string.</span>
</span><span id="preprocess-148"><a href="#preprocess-148"><span class="linenos">148</span></a>
</span><span id="preprocess-149"><a href="#preprocess-149"><span class="linenos">149</span></a><span class="sd"> Returns:</span>
</span><span id="preprocess-150"><a href="#preprocess-150"><span class="linenos">150</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="preprocess-151"><a href="#preprocess-151"><span class="linenos">151</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="preprocess-152"><a href="#preprocess-152"><span class="linenos">152</span></a>
</span><span id="preprocess-153"><a href="#preprocess-153"><span class="linenos">153</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">):</span>
</span><span id="preprocess-154"><a href="#preprocess-154"><span class="linenos">154</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</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="preprocess-155"><a href="#preprocess-155"><span class="linenos">155</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
</span><span id="preprocess-156"><a href="#preprocess-156"><span class="linenos">156</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-157"><a href="#preprocess-157"><span class="linenos">157</span></a> <span class="k">return</span> <span class="n">to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-158"><a href="#preprocess-158"><span class="linenos">158</span></a>
</span><span id="preprocess-159"><a href="#preprocess-159"><span class="linenos">159</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span></pre></div>
@ -462,16 +558,16 @@ expression to SQL, using an appropriate <code>Generator.TRANSFORMS</code> functi
</div>
<a class="headerlink" href="#delegate"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="delegate-129"><a href="#delegate-129"><span class="linenos">129</span></a><span class="k">def</span> <span class="nf">delegate</span><span class="p">(</span><span class="n">attr</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">:</span>
</span><span id="delegate-130"><a href="#delegate-130"><span class="linenos">130</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="delegate-131"><a href="#delegate-131"><span class="linenos">131</span></a><span class="sd"> Create a new method that delegates to `attr`. This is useful for creating `Generator.TRANSFORMS`</span>
</span><span id="delegate-132"><a href="#delegate-132"><span class="linenos">132</span></a><span class="sd"> functions that delegate to existing generator methods.</span>
</span><span id="delegate-133"><a href="#delegate-133"><span class="linenos">133</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="delegate-134"><a href="#delegate-134"><span class="linenos">134</span></a>
</span><span id="delegate-135"><a href="#delegate-135"><span class="linenos">135</span></a> <span class="k">def</span> <span class="nf">_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="delegate-136"><a href="#delegate-136"><span class="linenos">136</span></a> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="delegate-137"><a href="#delegate-137"><span class="linenos">137</span></a>
</span><span id="delegate-138"><a href="#delegate-138"><span class="linenos">138</span></a> <span class="k">return</span> <span class="n">_transform</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="delegate-162"><a href="#delegate-162"><span class="linenos">162</span></a><span class="k">def</span> <span class="nf">delegate</span><span class="p">(</span><span class="n">attr</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">:</span>
</span><span id="delegate-163"><a href="#delegate-163"><span class="linenos">163</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="delegate-164"><a href="#delegate-164"><span class="linenos">164</span></a><span class="sd"> Create a new method that delegates to `attr`. This is useful for creating `Generator.TRANSFORMS`</span>
</span><span id="delegate-165"><a href="#delegate-165"><span class="linenos">165</span></a><span class="sd"> functions that delegate to existing generator methods.</span>
</span><span id="delegate-166"><a href="#delegate-166"><span class="linenos">166</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="delegate-167"><a href="#delegate-167"><span class="linenos">167</span></a>
</span><span id="delegate-168"><a href="#delegate-168"><span class="linenos">168</span></a> <span class="k">def</span> <span class="nf">_transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="delegate-169"><a href="#delegate-169"><span class="linenos">169</span></a> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="delegate-170"><a href="#delegate-170"><span class="linenos">170</span></a>
</span><span id="delegate-171"><a href="#delegate-171"><span class="linenos">171</span></a> <span class="k">return</span> <span class="n">_transform</span>
</span></pre></div>