1
0
Fork 0

Merging upstream version 23.7.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 21:30:28 +01:00
parent ebba7c6a18
commit d26905e4af
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
187 changed files with 86502 additions and 71397 deletions

View file

@ -568,7 +568,7 @@
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a> <span class="k">if</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;recursive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span> <span class="o">+</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a>
@ -585,7 +585,7 @@
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a> <span class="p">):</span>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a> <span class="n">node</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">neq</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a> <span class="n">ensure_bools</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">_ensure_bool</span><span class="p">)</span>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a> <span class="k">return</span> <span class="n">expression</span>
@ -682,65 +682,63 @@
</span><span id="L-561"><a href="#L-561"><span class="linenos">561</span></a>
</span><span id="L-562"><a href="#L-562"><span class="linenos">562</span></a>
</span><span id="L-563"><a href="#L-563"><span class="linenos">563</span></a><span class="k">def</span> <span class="nf">struct_kv_to_alias</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-564"><a href="#L-564"><span class="linenos">564</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-565"><a href="#L-565"><span class="linenos">565</span></a><span class="sd"> Convert struct arguments to aliases: STRUCT(1 AS y) .</span>
</span><span id="L-566"><a href="#L-566"><span class="linenos">566</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-567"><a href="#L-567"><span class="linenos">567</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Struct</span><span class="p">):</span>
</span><span id="L-568"><a href="#L-568"><span class="linenos">568</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="L-569"><a href="#L-569"><span class="linenos">569</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span>
</span><span id="L-570"><a href="#L-570"><span class="linenos">570</span></a> <span class="p">[</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos">571</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <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">PropertyEQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">e</span>
</span><span id="L-572"><a href="#L-572"><span class="linenos">572</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-573"><a href="#L-573"><span class="linenos">573</span></a> <span class="p">],</span>
</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a> <span class="p">)</span>
</span><span id="L-564"><a href="#L-564"><span class="linenos">564</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts struct arguments to aliases, e.g. STRUCT(1 AS y).&quot;&quot;&quot;</span>
</span><span id="L-565"><a href="#L-565"><span class="linenos">565</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">Struct</span><span class="p">):</span>
</span><span id="L-566"><a href="#L-566"><span class="linenos">566</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="L-567"><a href="#L-567"><span class="linenos">567</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span>
</span><span id="L-568"><a href="#L-568"><span class="linenos">568</span></a> <span class="p">[</span>
</span><span id="L-569"><a href="#L-569"><span class="linenos">569</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <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">PropertyEQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">e</span>
</span><span id="L-570"><a href="#L-570"><span class="linenos">570</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos">571</span></a> <span class="p">],</span>
</span><span id="L-572"><a href="#L-572"><span class="linenos">572</span></a> <span class="p">)</span>
</span><span id="L-573"><a href="#L-573"><span class="linenos">573</span></a>
</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-575"><a href="#L-575"><span class="linenos">575</span></a>
</span><span id="L-576"><a href="#L-576"><span class="linenos">576</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a>
</span><span id="L-578"><a href="#L-578"><span class="linenos">578</span></a>
</span><span id="L-579"><a href="#L-579"><span class="linenos">579</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="L-580"><a href="#L-580"><span class="linenos">580</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-581"><a href="#L-581"><span class="linenos">581</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-582"><a href="#L-582"><span class="linenos">582</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-583"><a href="#L-583"><span class="linenos">583</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="L-584"><a href="#L-584"><span class="linenos">584</span></a><span class="sd"> expression to SQL, using either the &quot;_sql&quot; method corresponding to the resulting expression,</span>
</span><span id="L-585"><a href="#L-585"><span class="linenos">585</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
</span><span id="L-586"><a href="#L-586"><span class="linenos">586</span></a>
</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a><span class="sd"> Args:</span>
</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a>
</span><span id="L-590"><a href="#L-590"><span class="linenos">590</span></a><span class="sd"> Returns:</span>
</span><span id="L-591"><a href="#L-591"><span class="linenos">591</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a>
</span><span id="L-594"><a href="#L-594"><span class="linenos">594</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 class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-595"><a href="#L-595"><span class="linenos">595</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-596"><a href="#L-596"><span class="linenos">596</span></a>
</span><span id="L-597"><a href="#L-597"><span class="linenos">597</span></a> <span 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="p">)</span>
</span><span id="L-598"><a href="#L-598"><span class="linenos">598</span></a> <span class="k">for</span> <span class="n">transform</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-599"><a href="#L-599"><span class="linenos">599</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a>
</span><span id="L-601"><a href="#L-601"><span class="linenos">601</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;_sql&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-602"><a href="#L-602"><span class="linenos">602</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-604"><a href="#L-604"><span class="linenos">604</span></a>
</span><span id="L-605"><a href="#L-605"><span class="linenos">605</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
</span><span id="L-606"><a href="#L-606"><span class="linenos">606</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
</span><span id="L-607"><a href="#L-607"><span class="linenos">607</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-608"><a href="#L-608"><span class="linenos">608</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">Func</span><span class="p">):</span>
</span><span id="L-609"><a href="#L-609"><span class="linenos">609</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-610"><a href="#L-610"><span class="linenos">610</span></a>
</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a> <span class="c1"># Ensures we don&#39;t enter an infinite loop. This can happen when the original expression</span>
</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a> <span class="c1"># has the same type as the final expression and there&#39;s no _sql method available for it,</span>
</span><span id="L-613"><a href="#L-613"><span class="linenos">613</span></a> <span class="c1"># because then it&#39;d re-enter _to_sql.</span>
</span><span id="L-614"><a href="#L-614"><span class="linenos">614</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
</span><span id="L-615"><a href="#L-615"><span class="linenos">615</span></a> <span class="sa">f</span><span class="s2">&quot;Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed.&quot;</span>
</span><span id="L-616"><a href="#L-616"><span class="linenos">616</span></a> <span class="p">)</span>
</span><span id="L-576"><a href="#L-576"><span class="linenos">576</span></a>
</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="L-578"><a href="#L-578"><span class="linenos">578</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-579"><a href="#L-579"><span class="linenos">579</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-580"><a href="#L-580"><span class="linenos">580</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-581"><a href="#L-581"><span class="linenos">581</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="L-582"><a href="#L-582"><span class="linenos">582</span></a><span class="sd"> expression to SQL, using either the &quot;_sql&quot; method corresponding to the resulting expression,</span>
</span><span id="L-583"><a href="#L-583"><span class="linenos">583</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
</span><span id="L-584"><a href="#L-584"><span class="linenos">584</span></a>
</span><span id="L-585"><a href="#L-585"><span class="linenos">585</span></a><span class="sd"> Args:</span>
</span><span id="L-586"><a href="#L-586"><span class="linenos">586</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a>
</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a><span class="sd"> Returns:</span>
</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="L-590"><a href="#L-590"><span class="linenos">590</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-591"><a href="#L-591"><span class="linenos">591</span></a>
</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a> <span class="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 class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-594"><a href="#L-594"><span class="linenos">594</span></a>
</span><span id="L-595"><a href="#L-595"><span class="linenos">595</span></a> <span class="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="p">)</span>
</span><span id="L-596"><a href="#L-596"><span class="linenos">596</span></a> <span class="k">for</span> <span class="n">transform</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-597"><a href="#L-597"><span class="linenos">597</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-598"><a href="#L-598"><span class="linenos">598</span></a>
</span><span id="L-599"><a href="#L-599"><span class="linenos">599</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;_sql&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
</span><span id="L-601"><a href="#L-601"><span class="linenos">601</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-602"><a href="#L-602"><span class="linenos">602</span></a>
</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
</span><span id="L-604"><a href="#L-604"><span class="linenos">604</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
</span><span id="L-605"><a href="#L-605"><span class="linenos">605</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="L-606"><a href="#L-606"><span class="linenos">606</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">Func</span><span class="p">):</span>
</span><span id="L-607"><a href="#L-607"><span class="linenos">607</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-608"><a href="#L-608"><span class="linenos">608</span></a>
</span><span id="L-609"><a href="#L-609"><span class="linenos">609</span></a> <span class="c1"># Ensures we don&#39;t enter an infinite loop. This can happen when the original expression</span>
</span><span id="L-610"><a href="#L-610"><span class="linenos">610</span></a> <span class="c1"># has the same type as the final expression and there&#39;s no _sql method available for it,</span>
</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a> <span class="c1"># because then it&#39;d re-enter _to_sql.</span>
</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
</span><span id="L-613"><a href="#L-613"><span class="linenos">613</span></a> <span class="sa">f</span><span class="s2">&quot;Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed.&quot;</span>
</span><span id="L-614"><a href="#L-614"><span class="linenos">614</span></a> <span class="p">)</span>
</span><span id="L-615"><a href="#L-615"><span class="linenos">615</span></a>
</span><span id="L-616"><a href="#L-616"><span class="linenos">616</span></a> <span class="k">return</span> <span class="n">transforms_handler</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-617"><a href="#L-617"><span class="linenos">617</span></a>
</span><span id="L-618"><a href="#L-618"><span class="linenos">618</span></a> <span class="k">return</span> <span class="n">transforms_handler</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-618"><a href="#L-618"><span class="linenos">618</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-619"><a href="#L-619"><span class="linenos">619</span></a>
</span><span id="L-620"><a href="#L-620"><span class="linenos">620</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="L-621"><a href="#L-621"><span class="linenos">621</span></a>
</span><span id="L-622"><a href="#L-622"><span class="linenos">622</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span><span id="L-620"><a href="#L-620"><span class="linenos">620</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span></pre></div>
@ -1455,7 +1453,7 @@ for queries that have a single FULL OUTER join.</p>
</span><span id="move_ctes_to_top_level-448"><a href="#move_ctes_to_top_level-448"><span class="linenos">448</span></a> <span class="k">if</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
</span><span id="move_ctes_to_top_level-449"><a href="#move_ctes_to_top_level-449"><span class="linenos">449</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;recursive&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-450"><a href="#move_ctes_to_top_level-450"><span class="linenos">450</span></a>
</span><span id="move_ctes_to_top_level-451"><a href="#move_ctes_to_top_level-451"><span class="linenos">451</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-451"><a href="#move_ctes_to_top_level-451"><span class="linenos">451</span></a> <span class="n">top_level_with</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;expressions&quot;</span><span class="p">,</span> <span class="n">inner_with</span><span class="o">.</span><span class="n">expressions</span> <span class="o">+</span> <span class="n">top_level_with</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="move_ctes_to_top_level-452"><a href="#move_ctes_to_top_level-452"><span class="linenos">452</span></a>
</span><span id="move_ctes_to_top_level-453"><a href="#move_ctes_to_top_level-453"><span class="linenos">453</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
@ -1498,7 +1496,7 @@ moved to the top level so that the final SQL code is valid from a syntax standpo
</span><span id="ensure_bools-465"><a href="#ensure_bools-465"><span class="linenos">465</span></a> <span class="p">):</span>
</span><span id="ensure_bools-466"><a href="#ensure_bools-466"><span class="linenos">466</span></a> <span class="n">node</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">neq</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
</span><span id="ensure_bools-467"><a href="#ensure_bools-467"><span class="linenos">467</span></a>
</span><span id="ensure_bools-468"><a href="#ensure_bools-468"><span class="linenos">468</span></a> <span class="k">for</span> <span class="n">node</span><span class="p">,</span> <span class="o">*</span><span class="n">_</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
</span><span id="ensure_bools-468"><a href="#ensure_bools-468"><span class="linenos">468</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
</span><span id="ensure_bools-469"><a href="#ensure_bools-469"><span class="linenos">469</span></a> <span class="n">ensure_bools</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">_ensure_bool</span><span class="p">)</span>
</span><span id="ensure_bools-470"><a href="#ensure_bools-470"><span class="linenos">470</span></a>
</span><span id="ensure_bools-471"><a href="#ensure_bools-471"><span class="linenos">471</span></a> <span class="k">return</span> <span class="n">expression</span>
@ -1695,23 +1693,21 @@ The corresponding columns are removed from the create statement.</p>
</div>
<a class="headerlink" href="#struct_kv_to_alias"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="struct_kv_to_alias-564"><a href="#struct_kv_to_alias-564"><span class="linenos">564</span></a><span class="k">def</span> <span class="nf">struct_kv_to_alias</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="struct_kv_to_alias-565"><a href="#struct_kv_to_alias-565"><span class="linenos">565</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="struct_kv_to_alias-566"><a href="#struct_kv_to_alias-566"><span class="linenos">566</span></a><span class="sd"> Convert struct arguments to aliases: STRUCT(1 AS y) .</span>
</span><span id="struct_kv_to_alias-567"><a href="#struct_kv_to_alias-567"><span class="linenos">567</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="struct_kv_to_alias-568"><a href="#struct_kv_to_alias-568"><span class="linenos">568</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">Struct</span><span class="p">):</span>
</span><span id="struct_kv_to_alias-569"><a href="#struct_kv_to_alias-569"><span class="linenos">569</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="struct_kv_to_alias-570"><a href="#struct_kv_to_alias-570"><span class="linenos">570</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span>
</span><span id="struct_kv_to_alias-571"><a href="#struct_kv_to_alias-571"><span class="linenos">571</span></a> <span class="p">[</span>
</span><span id="struct_kv_to_alias-572"><a href="#struct_kv_to_alias-572"><span class="linenos">572</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <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">PropertyEQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">e</span>
</span><span id="struct_kv_to_alias-573"><a href="#struct_kv_to_alias-573"><span class="linenos">573</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="struct_kv_to_alias-574"><a href="#struct_kv_to_alias-574"><span class="linenos">574</span></a> <span class="p">],</span>
</span><span id="struct_kv_to_alias-575"><a href="#struct_kv_to_alias-575"><span class="linenos">575</span></a> <span class="p">)</span>
</span><span id="struct_kv_to_alias-576"><a href="#struct_kv_to_alias-576"><span class="linenos">576</span></a>
</span><span id="struct_kv_to_alias-577"><a href="#struct_kv_to_alias-577"><span class="linenos">577</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="struct_kv_to_alias-565"><a href="#struct_kv_to_alias-565"><span class="linenos">565</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts struct arguments to aliases, e.g. STRUCT(1 AS y).&quot;&quot;&quot;</span>
</span><span id="struct_kv_to_alias-566"><a href="#struct_kv_to_alias-566"><span class="linenos">566</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">Struct</span><span class="p">):</span>
</span><span id="struct_kv_to_alias-567"><a href="#struct_kv_to_alias-567"><span class="linenos">567</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
</span><span id="struct_kv_to_alias-568"><a href="#struct_kv_to_alias-568"><span class="linenos">568</span></a> <span class="s2">&quot;expressions&quot;</span><span class="p">,</span>
</span><span id="struct_kv_to_alias-569"><a href="#struct_kv_to_alias-569"><span class="linenos">569</span></a> <span class="p">[</span>
</span><span id="struct_kv_to_alias-570"><a href="#struct_kv_to_alias-570"><span class="linenos">570</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <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">PropertyEQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">e</span>
</span><span id="struct_kv_to_alias-571"><a href="#struct_kv_to_alias-571"><span class="linenos">571</span></a> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
</span><span id="struct_kv_to_alias-572"><a href="#struct_kv_to_alias-572"><span class="linenos">572</span></a> <span class="p">],</span>
</span><span id="struct_kv_to_alias-573"><a href="#struct_kv_to_alias-573"><span class="linenos">573</span></a> <span class="p">)</span>
</span><span id="struct_kv_to_alias-574"><a href="#struct_kv_to_alias-574"><span class="linenos">574</span></a>
</span><span id="struct_kv_to_alias-575"><a href="#struct_kv_to_alias-575"><span class="linenos">575</span></a> <span class="k">return</span> <span class="n">expression</span>
</span></pre></div>
<div class="docstring"><p>Convert struct arguments to aliases: STRUCT(1 AS y) .</p>
<div class="docstring"><p>Converts struct arguments to aliases, e.g. STRUCT(1 AS y).</p>
</div>
@ -1727,50 +1723,50 @@ The corresponding columns are removed from the create statement.</p>
</div>
<a class="headerlink" href="#preprocess"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="preprocess-580"><a href="#preprocess-580"><span class="linenos">580</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="preprocess-581"><a href="#preprocess-581"><span class="linenos">581</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-582"><a href="#preprocess-582"><span class="linenos">582</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-583"><a href="#preprocess-583"><span class="linenos">583</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="preprocess-584"><a href="#preprocess-584"><span class="linenos">584</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="preprocess-585"><a href="#preprocess-585"><span class="linenos">585</span></a><span class="sd"> expression to SQL, using either the &quot;_sql&quot; method corresponding to the resulting expression,</span>
</span><span id="preprocess-586"><a href="#preprocess-586"><span class="linenos">586</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
</span><span id="preprocess-587"><a href="#preprocess-587"><span class="linenos">587</span></a>
</span><span id="preprocess-588"><a href="#preprocess-588"><span class="linenos">588</span></a><span class="sd"> Args:</span>
</span><span id="preprocess-589"><a href="#preprocess-589"><span class="linenos">589</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="preprocess-590"><a href="#preprocess-590"><span class="linenos">590</span></a>
</span><span id="preprocess-591"><a href="#preprocess-591"><span class="linenos">591</span></a><span class="sd"> Returns:</span>
</span><span id="preprocess-592"><a href="#preprocess-592"><span class="linenos">592</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="preprocess-593"><a href="#preprocess-593"><span class="linenos">593</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="preprocess-594"><a href="#preprocess-594"><span class="linenos">594</span></a>
</span><span id="preprocess-595"><a href="#preprocess-595"><span class="linenos">595</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 class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="preprocess-596"><a href="#preprocess-596"><span class="linenos">596</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-597"><a href="#preprocess-597"><span class="linenos">597</span></a>
</span><span id="preprocess-598"><a href="#preprocess-598"><span class="linenos">598</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="p">)</span>
</span><span id="preprocess-599"><a href="#preprocess-599"><span class="linenos">599</span></a> <span class="k">for</span> <span class="n">transform</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-600"><a href="#preprocess-600"><span class="linenos">600</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-601"><a href="#preprocess-601"><span class="linenos">601</span></a>
</span><span id="preprocess-602"><a href="#preprocess-602"><span class="linenos">602</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;_sql&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="preprocess-603"><a href="#preprocess-603"><span class="linenos">603</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
</span><span id="preprocess-604"><a href="#preprocess-604"><span class="linenos">604</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-605"><a href="#preprocess-605"><span class="linenos">605</span></a>
</span><span id="preprocess-606"><a href="#preprocess-606"><span class="linenos">606</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
</span><span id="preprocess-607"><a href="#preprocess-607"><span class="linenos">607</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
</span><span id="preprocess-608"><a href="#preprocess-608"><span class="linenos">608</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="preprocess-609"><a href="#preprocess-609"><span class="linenos">609</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">Func</span><span class="p">):</span>
</span><span id="preprocess-610"><a href="#preprocess-610"><span class="linenos">610</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-611"><a href="#preprocess-611"><span class="linenos">611</span></a>
</span><span id="preprocess-612"><a href="#preprocess-612"><span class="linenos">612</span></a> <span class="c1"># Ensures we don&#39;t enter an infinite loop. This can happen when the original expression</span>
</span><span id="preprocess-613"><a href="#preprocess-613"><span class="linenos">613</span></a> <span class="c1"># has the same type as the final expression and there&#39;s no _sql method available for it,</span>
</span><span id="preprocess-614"><a href="#preprocess-614"><span class="linenos">614</span></a> <span class="c1"># because then it&#39;d re-enter _to_sql.</span>
</span><span id="preprocess-615"><a href="#preprocess-615"><span class="linenos">615</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
</span><span id="preprocess-616"><a href="#preprocess-616"><span class="linenos">616</span></a> <span class="sa">f</span><span class="s2">&quot;Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed.&quot;</span>
</span><span id="preprocess-617"><a href="#preprocess-617"><span class="linenos">617</span></a> <span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="preprocess-578"><a href="#preprocess-578"><span class="linenos">578</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
</span><span id="preprocess-579"><a href="#preprocess-579"><span class="linenos">579</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-580"><a href="#preprocess-580"><span class="linenos">580</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-581"><a href="#preprocess-581"><span class="linenos">581</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="preprocess-582"><a href="#preprocess-582"><span class="linenos">582</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
</span><span id="preprocess-583"><a href="#preprocess-583"><span class="linenos">583</span></a><span class="sd"> expression to SQL, using either the &quot;_sql&quot; method corresponding to the resulting expression,</span>
</span><span id="preprocess-584"><a href="#preprocess-584"><span class="linenos">584</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
</span><span id="preprocess-585"><a href="#preprocess-585"><span class="linenos">585</span></a>
</span><span id="preprocess-586"><a href="#preprocess-586"><span class="linenos">586</span></a><span class="sd"> Args:</span>
</span><span id="preprocess-587"><a href="#preprocess-587"><span class="linenos">587</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
</span><span id="preprocess-588"><a href="#preprocess-588"><span class="linenos">588</span></a>
</span><span id="preprocess-589"><a href="#preprocess-589"><span class="linenos">589</span></a><span class="sd"> Returns:</span>
</span><span id="preprocess-590"><a href="#preprocess-590"><span class="linenos">590</span></a><span class="sd"> Function that can be used as a generator transform.</span>
</span><span id="preprocess-591"><a href="#preprocess-591"><span class="linenos">591</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="preprocess-592"><a href="#preprocess-592"><span class="linenos">592</span></a>
</span><span id="preprocess-593"><a href="#preprocess-593"><span class="linenos">593</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 class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="preprocess-594"><a href="#preprocess-594"><span class="linenos">594</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-595"><a href="#preprocess-595"><span class="linenos">595</span></a>
</span><span id="preprocess-596"><a href="#preprocess-596"><span class="linenos">596</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="p">)</span>
</span><span id="preprocess-597"><a href="#preprocess-597"><span class="linenos">597</span></a> <span class="k">for</span> <span class="n">transform</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-598"><a href="#preprocess-598"><span class="linenos">598</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-599"><a href="#preprocess-599"><span class="linenos">599</span></a>
</span><span id="preprocess-600"><a href="#preprocess-600"><span class="linenos">600</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;_sql&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="preprocess-601"><a href="#preprocess-601"><span class="linenos">601</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
</span><span id="preprocess-602"><a href="#preprocess-602"><span class="linenos">602</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-603"><a href="#preprocess-603"><span class="linenos">603</span></a>
</span><span id="preprocess-604"><a href="#preprocess-604"><span class="linenos">604</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
</span><span id="preprocess-605"><a href="#preprocess-605"><span class="linenos">605</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
</span><span id="preprocess-606"><a href="#preprocess-606"><span class="linenos">606</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
</span><span id="preprocess-607"><a href="#preprocess-607"><span class="linenos">607</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">Func</span><span class="p">):</span>
</span><span id="preprocess-608"><a href="#preprocess-608"><span class="linenos">608</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="preprocess-609"><a href="#preprocess-609"><span class="linenos">609</span></a>
</span><span id="preprocess-610"><a href="#preprocess-610"><span class="linenos">610</span></a> <span class="c1"># Ensures we don&#39;t enter an infinite loop. This can happen when the original expression</span>
</span><span id="preprocess-611"><a href="#preprocess-611"><span class="linenos">611</span></a> <span class="c1"># has the same type as the final expression and there&#39;s no _sql method available for it,</span>
</span><span id="preprocess-612"><a href="#preprocess-612"><span class="linenos">612</span></a> <span class="c1"># because then it&#39;d re-enter _to_sql.</span>
</span><span id="preprocess-613"><a href="#preprocess-613"><span class="linenos">613</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
</span><span id="preprocess-614"><a href="#preprocess-614"><span class="linenos">614</span></a> <span class="sa">f</span><span class="s2">&quot;Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed.&quot;</span>
</span><span id="preprocess-615"><a href="#preprocess-615"><span class="linenos">615</span></a> <span class="p">)</span>
</span><span id="preprocess-616"><a href="#preprocess-616"><span class="linenos">616</span></a>
</span><span id="preprocess-617"><a href="#preprocess-617"><span class="linenos">617</span></a> <span class="k">return</span> <span class="n">transforms_handler</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-618"><a href="#preprocess-618"><span class="linenos">618</span></a>
</span><span id="preprocess-619"><a href="#preprocess-619"><span class="linenos">619</span></a> <span class="k">return</span> <span class="n">transforms_handler</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-619"><a href="#preprocess-619"><span class="linenos">619</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="preprocess-620"><a href="#preprocess-620"><span class="linenos">620</span></a>
</span><span id="preprocess-621"><a href="#preprocess-621"><span class="linenos">621</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
</span><span id="preprocess-622"><a href="#preprocess-622"><span class="linenos">622</span></a>
</span><span id="preprocess-623"><a href="#preprocess-623"><span class="linenos">623</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span><span id="preprocess-621"><a href="#preprocess-621"><span class="linenos">621</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
</span></pre></div>