1
0
Fork 0

Merging upstream version 23.12.1.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 21:32:41 +01:00
parent 1271e5fe1c
commit 740634a4e8
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
93 changed files with 55455 additions and 52777 deletions

View file

@ -76,8 +76,8 @@
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="n">__version_tuple__</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="n">version_tuple</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">&#39;23.9.0&#39;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">&#39;23.12.0&#39;</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span></pre></div>
@ -97,7 +97,7 @@
<section id="version">
<div class="attr variable">
<span class="name">version</span><span class="annotation">: str</span> =
<span class="default_value">&#39;23.9.0&#39;</span>
<span class="default_value">&#39;23.12.0&#39;</span>
</div>
@ -109,7 +109,7 @@
<section id="version_tuple">
<div class="attr variable">
<span class="name">version_tuple</span><span class="annotation">: object</span> =
<span class="default_value">(23, 9, 0)</span>
<span class="default_value">(23, 12, 0)</span>
</div>

View file

@ -791,7 +791,7 @@
<div class="attr function">
<span class="def">def</span>
<span class="name">createDataFrame</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">data</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525565941872&#39;</span><span class="o">&gt;</span><span class="p">],</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525565941872&#39;</span><span class="o">&gt;</span><span class="p">],</span> <span class="n">Tuple</span><span class="p">]]</span>,</span><span class="param"> <span class="n">schema</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525567126176&#39;</span><span class="o">&gt;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">samplingRatio</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verifySchema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<span class="name">createDataFrame</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">data</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396128570384&#39;</span><span class="o">&gt;</span><span class="p">],</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396128570384&#39;</span><span class="o">&gt;</span><span class="p">],</span> <span class="n">Tuple</span><span class="p">]]</span>,</span><span class="param"> <span class="n">schema</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396128323856&#39;</span><span class="o">&gt;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">samplingRatio</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">verifySchema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<label class="view-source-button" for="SparkSession.createDataFrame-view-source"><span>View Source</span></label>
@ -1848,7 +1848,7 @@
<input id="DataFrame.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">DataFrame</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">spark</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525568781152&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="../expressions.html#Select">sqlglot.expressions.Select</a></span>,</span><span class="param"> <span class="n">branch_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">sequence_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">last_op</span><span class="p">:</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">dataframe</span><span class="o">.</span><span class="n">sql</span><span class="o">.</span><span class="n">operations</span><span class="o">.</span><span class="n">Operation</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">Operation</span><span class="o">.</span><span class="n">INIT</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">pending_hints</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">output_expression_container</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525570298720&#39;</span><span class="o">&gt;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span>)</span>
<span class="name">DataFrame</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">spark</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396133005680&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n"><a href="../expressions.html#Select">sqlglot.expressions.Select</a></span>,</span><span class="param"> <span class="n">branch_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">sequence_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">last_op</span><span class="p">:</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">dataframe</span><span class="o">.</span><span class="n">sql</span><span class="o">.</span><span class="n">operations</span><span class="o">.</span><span class="n">Operation</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">Operation</span><span class="o">.</span><span class="n">INIT</span><span class="p">:</span> <span class="o">-</span><span class="mi">1</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">pending_hints</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">output_expression_container</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396133947408&#39;</span><span class="o">&gt;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span>)</span>
<label class="view-source-button" for="DataFrame.__init__-view-source"><span>View Source</span></label>
@ -2096,7 +2096,7 @@
<div class="attr function">
<span class="def">def</span>
<span class="name">sql</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">dialect</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525565635088&#39;</span><span class="o">&gt;</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">optimize</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
<span class="name">sql</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">dialect</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396128968112&#39;</span><span class="o">&gt;</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">optimize</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="DataFrame.sql-view-source"><span>View Source</span></label>
@ -2846,7 +2846,7 @@ is unlikely to come up.</p>
<div class="decorator">@operation(Operation.FROM)</div>
<span class="def">def</span>
<span class="name">fillna</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525564319232&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">subset</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">...</span><span class="p">],</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<span class="name">fillna</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396129406016&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">subset</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o">...</span><span class="p">],</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<label class="view-source-button" for="DataFrame.fillna-view-source"><span>View Source</span></label>
@ -2915,7 +2915,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="decorator">@operation(Operation.FROM)</div>
<span class="def">def</span>
<span class="name">replace</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">to_replace</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">]</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">subset</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">Collection</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525564304720&#39;</span><span class="o">&gt;</span><span class="p">],</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525564304720&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<span class="name">replace</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">to_replace</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">]</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">subset</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">Collection</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396129194224&#39;</span><span class="o">&gt;</span><span class="p">],</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396129194224&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<label class="view-source-button" for="DataFrame.replace-view-source"><span>View Source</span></label>
@ -3120,7 +3120,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="decorator">@operation(Operation.NO_OP)</div>
<span class="def">def</span>
<span class="name">repartition</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">numPartitions</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525564304720&#39;</span><span class="o">&gt;</span><span class="p">]</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525564304720&#39;</span><span class="o">&gt;</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<span class="name">repartition</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">numPartitions</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396129194224&#39;</span><span class="o">&gt;</span><span class="p">]</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396129194224&#39;</span><span class="o">&gt;</span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
<label class="view-source-button" for="DataFrame.repartition-view-source"><span>View Source</span></label>
@ -3840,7 +3840,7 @@ and check if it matches the type of the value provided. If not then make it null
<input id="Column.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
<span class="name">Column</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span></span>)</span>
<span class="name">Column</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span></span>)</span>
<label class="view-source-button" for="Column.__init__-view-source"><span>View Source</span></label>
@ -3884,7 +3884,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="decorator">@classmethod</div>
<span class="def">def</span>
<span class="name">ensure_col</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<span class="name">ensure_col</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<label class="view-source-button" for="Column.ensure_col-view-source"><span>View Source</span></label>
@ -3905,7 +3905,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="decorator">@classmethod</div>
<span class="def">def</span>
<span class="name">ensure_cols</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="n"><a href="#Column">Column</a></span><span class="p">]</span>:</span></span>
<span class="name">ensure_cols</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n"><a href="../expressions.html#Expression">sqlglot.expressions.Expression</a></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="n"><a href="#Column">Column</a></span><span class="p">]</span>:</span></span>
<label class="view-source-button" for="Column.ensure_cols-view-source"><span>View Source</span></label>
@ -3926,7 +3926,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="decorator">@classmethod</div>
<span class="def">def</span>
<span class="name">invoke_anonymous_function</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">column</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">]</span>,</span><span class="param"> <span class="n">func_name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<span class="name">invoke_anonymous_function</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">column</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">]</span>,</span><span class="param"> <span class="n">func_name</span><span class="p">:</span> <span class="nb">str</span>,</span><span class="param"> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<label class="view-source-button" for="Column.invoke_anonymous_function-view-source"><span>View Source</span></label>
@ -3953,7 +3953,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="decorator">@classmethod</div>
<span class="def">def</span>
<span class="name">invoke_expression_over_column</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">column</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">]</span>,</span><span class="param"> <span class="n">callable_expression</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<span class="name">invoke_expression_over_column</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">column</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">]</span>,</span><span class="param"> <span class="n">callable_expression</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<label class="view-source-button" for="Column.invoke_expression_over_column-view-source"><span>View Source</span></label>
@ -3992,7 +3992,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="attr function">
<span class="def">def</span>
<span class="name">binary_op</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">klass</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="n">other</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<span class="name">binary_op</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">klass</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="n">other</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<label class="view-source-button" for="Column.binary_op-view-source"><span>View Source</span></label>
@ -4013,7 +4013,7 @@ and check if it matches the type of the value provided. If not then make it null
<div class="attr function">
<span class="def">def</span>
<span class="name">inverse_binary_op</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">klass</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="n">other</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<span class="name">inverse_binary_op</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">klass</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="n">other</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<label class="view-source-button" for="Column.inverse_binary_op-view-source"><span>View Source</span></label>
@ -4607,7 +4607,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
<div class="attr function">
<span class="def">def</span>
<span class="name">isin</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">):</span></span>
<span class="name">isin</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">):</span></span>
<label class="view-source-button" for="Column.isin-view-source"><span>View Source</span></label>
@ -4628,7 +4628,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
<div class="attr function">
<span class="def">def</span>
<span class="name">between</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">lowerBound</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">upperBound</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525566740416&#39;</span><span class="o">&gt;</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<span class="name">between</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">lowerBound</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span>,</span><span class="param"> <span class="n">upperBound</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396130510128&#39;</span><span class="o">&gt;</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<label class="view-source-button" for="Column.between-view-source"><span>View Source</span></label>
@ -4663,7 +4663,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
<div class="attr function">
<span class="def">def</span>
<span class="name">over</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">window</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563380736&#39;</span><span class="o">&gt;</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<span class="name">over</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">window</span><span class="p">:</span> <span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396129954368&#39;</span><span class="o">&gt;</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
<label class="view-source-button" for="Column.over-view-source"><span>View Source</span></label>
@ -4908,7 +4908,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
<div class="decorator">@classmethod</div>
<span class="def">def</span>
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<label class="view-source-button" for="Window.partitionBy-view-source"><span>View Source</span></label>
@ -4929,7 +4929,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
<div class="decorator">@classmethod</div>
<span class="def">def</span>
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<label class="view-source-button" for="Window.orderBy-view-source"><span>View Source</span></label>
@ -5171,7 +5171,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
<div class="attr function">
<span class="def">def</span>
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<label class="view-source-button" for="WindowSpec.partitionBy-view-source"><span>View Source</span></label>
@ -5198,7 +5198,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
<div class="attr function">
<span class="def">def</span>
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140525563620288&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o">&lt;</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">&#39;140396127480864&#39;</span><span class="o">&gt;</span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
<label class="view-source-button" for="WindowSpec.orderBy-view-source"><span>View Source</span></label>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -903,6 +903,7 @@ Default: 3</li>
<dd id="Databricks.Parser.JSON_ARROWS_REQUIRE_JSON_TYPE" class="variable"><a href="../parser.html#Parser.JSON_ARROWS_REQUIRE_JSON_TYPE">JSON_ARROWS_REQUIRE_JSON_TYPE</a></dd>
<dd id="Databricks.Parser.SUPPORTS_IMPLICIT_UNNEST" class="variable"><a href="../parser.html#Parser.SUPPORTS_IMPLICIT_UNNEST">SUPPORTS_IMPLICIT_UNNEST</a></dd>
<dd id="Databricks.Parser.INTERVAL_SPANS" class="variable"><a href="../parser.html#Parser.INTERVAL_SPANS">INTERVAL_SPANS</a></dd>
<dd id="Databricks.Parser.SUPPORTS_PARTITION_SELECTION" class="variable"><a href="../parser.html#Parser.SUPPORTS_PARTITION_SELECTION">SUPPORTS_PARTITION_SELECTION</a></dd>
<dd id="Databricks.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
<dd id="Databricks.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
<dd id="Databricks.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
@ -1213,6 +1214,7 @@ Default: True</li>
<dd id="Databricks.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Databricks.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Databricks.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Databricks.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Databricks.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Databricks.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Databricks.Generator.columnconstraint_sql" class="function"><a href="../generator.html#Generator.columnconstraint_sql">columnconstraint_sql</a></dd>
@ -1456,7 +1458,7 @@ Default: True</li>
<dd id="Databricks.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Databricks.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Databricks.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Databricks.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Databricks.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Databricks.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Databricks.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Databricks.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>

View file

@ -1109,7 +1109,7 @@
</span><span id="L-568"><a href="#L-568"><span class="linenos"> 568</span></a>
</span><span id="L-569"><a href="#L-569"><span class="linenos"> 569</span></a>
</span><span id="L-570"><a href="#L-570"><span class="linenos"> 570</span></a><span class="k">def</span> <span class="nf">inline_array_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Generator</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">Array</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos"> 571</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos"> 571</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span><span class="w"> </span><span class="n">dynamic</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span><span class="w"> </span><span class="n">new_line</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span><span class="w"> </span><span class="n">skip_first</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span><span class="w"> </span><span class="n">skip_last</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="L-572"><a href="#L-572"><span class="linenos"> 572</span></a>
</span><span id="L-573"><a href="#L-573"><span class="linenos"> 573</span></a>
</span><span id="L-574"><a href="#L-574"><span class="linenos"> 574</span></a><span class="k">def</span> <span class="nf">inline_array_unless_query</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Generator</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">Array</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
@ -3916,7 +3916,7 @@ that it can analyze queries in the optimizer and successfully capture their sema
</div>
<a class="headerlink" href="#inline_array_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="inline_array_sql-571"><a href="#inline_array_sql-571"><span class="linenos">571</span></a><span class="k">def</span> <span class="nf">inline_array_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Generator</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">Array</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="inline_array_sql-572"><a href="#inline_array_sql-572"><span class="linenos">572</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="inline_array_sql-572"><a href="#inline_array_sql-572"><span class="linenos">572</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span><span class="w"> </span><span class="n">dynamic</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span><span class="w"> </span><span class="n">new_line</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span><span class="w"> </span><span class="n">skip_first</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span><span class="w"> </span><span class="n">skip_last</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span></pre></div>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -478,65 +478,66 @@
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">TIMESTAMPTZ</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">BINARY</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">VARBINARY</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="p">}</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ConnectByRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;CONNECT_BY_ROOT </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="s2">&quot;TO_DATE&quot;</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="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;YYYY-MM-DD&quot;</span><span class="p">)</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="p">),</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">transforms</span><span class="o">.</span><span class="n">unalias_group</span><span class="p">]),</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ILike</span><span class="p">:</span> <span class="n">no_ilike_sql</span><span class="p">,</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a> <span class="p">[</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_distinct_on</span><span class="p">,</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="p">]</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="p">),</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;SUBSTR&quot;</span><span class="p">),</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TableSample</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesample_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;GLOBAL&#39;</span><span class="si">}</span><span class="s2"> TEMPORARY&quot;</span><span class="p">,</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToNumber</span><span class="p">:</span> <span class="n">to_number_with_nls_param</span><span class="p">,</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;TO_DATE(&#39;1970-01-01&#39;, &#39;YYYY-MM-DD&#39;) + (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> / 86400)&quot;</span><span class="p">,</span>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="p">}</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="p">}</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="p">)</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a>
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ROWVERSION</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a> <span class="p">}</span>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ConnectByRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;CONNECT_BY_ROOT </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="s2">&quot;TO_DATE&quot;</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="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;YYYY-MM-DD&quot;</span><span class="p">)</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="p">),</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">transforms</span><span class="o">.</span><span class="n">unalias_group</span><span class="p">]),</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ILike</span><span class="p">:</span> <span class="n">no_ilike_sql</span><span class="p">,</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="p">[</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_distinct_on</span><span class="p">,</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="p">]</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="p">),</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;SUBSTR&quot;</span><span class="p">),</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TableSample</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesample_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;GLOBAL&#39;</span><span class="si">}</span><span class="s2"> TEMPORARY&quot;</span><span class="p">,</span>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToNumber</span><span class="p">:</span> <span class="n">to_number_with_nls_param</span><span class="p">,</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;TO_DATE(&#39;1970-01-01&#39;, &#39;YYYY-MM-DD&#39;) + (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> / 86400)&quot;</span><span class="p">,</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="p">}</span>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="p">}</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a> <span class="p">)</span>
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a>
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
</span></pre></div>
@ -742,65 +743,66 @@
</span><span id="Oracle-223"><a href="#Oracle-223"><span class="linenos">223</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">TIMESTAMPTZ</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Oracle-224"><a href="#Oracle-224"><span class="linenos">224</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">BINARY</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="Oracle-225"><a href="#Oracle-225"><span class="linenos">225</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">VARBINARY</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="Oracle-226"><a href="#Oracle-226"><span class="linenos">226</span></a> <span class="p">}</span>
</span><span id="Oracle-227"><a href="#Oracle-227"><span class="linenos">227</span></a>
</span><span id="Oracle-228"><a href="#Oracle-228"><span class="linenos">228</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle-229"><a href="#Oracle-229"><span class="linenos">229</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Oracle-230"><a href="#Oracle-230"><span class="linenos">230</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ConnectByRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;CONNECT_BY_ROOT </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Oracle-231"><a href="#Oracle-231"><span class="linenos">231</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Oracle-232"><a href="#Oracle-232"><span class="linenos">232</span></a> <span class="s2">&quot;TO_DATE&quot;</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="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;YYYY-MM-DD&quot;</span><span class="p">)</span>
</span><span id="Oracle-233"><a href="#Oracle-233"><span class="linenos">233</span></a> <span class="p">),</span>
</span><span id="Oracle-234"><a href="#Oracle-234"><span class="linenos">234</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">transforms</span><span class="o">.</span><span class="n">unalias_group</span><span class="p">]),</span>
</span><span id="Oracle-235"><a href="#Oracle-235"><span class="linenos">235</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ILike</span><span class="p">:</span> <span class="n">no_ilike_sql</span><span class="p">,</span>
</span><span id="Oracle-236"><a href="#Oracle-236"><span class="linenos">236</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Oracle-237"><a href="#Oracle-237"><span class="linenos">237</span></a> <span class="p">[</span>
</span><span id="Oracle-238"><a href="#Oracle-238"><span class="linenos">238</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_distinct_on</span><span class="p">,</span>
</span><span id="Oracle-239"><a href="#Oracle-239"><span class="linenos">239</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Oracle-240"><a href="#Oracle-240"><span class="linenos">240</span></a> <span class="p">]</span>
</span><span id="Oracle-241"><a href="#Oracle-241"><span class="linenos">241</span></a> <span class="p">),</span>
</span><span id="Oracle-242"><a href="#Oracle-242"><span class="linenos">242</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle-243"><a href="#Oracle-243"><span class="linenos">243</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle-244"><a href="#Oracle-244"><span class="linenos">244</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle-245"><a href="#Oracle-245"><span class="linenos">245</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;SUBSTR&quot;</span><span class="p">),</span>
</span><span id="Oracle-246"><a href="#Oracle-246"><span class="linenos">246</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle-247"><a href="#Oracle-247"><span class="linenos">247</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TableSample</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesample_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle-248"><a href="#Oracle-248"><span class="linenos">248</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;GLOBAL&#39;</span><span class="si">}</span><span class="s2"> TEMPORARY&quot;</span><span class="p">,</span>
</span><span id="Oracle-249"><a href="#Oracle-249"><span class="linenos">249</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle-250"><a href="#Oracle-250"><span class="linenos">250</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Oracle-251"><a href="#Oracle-251"><span class="linenos">251</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToNumber</span><span class="p">:</span> <span class="n">to_number_with_nls_param</span><span class="p">,</span>
</span><span id="Oracle-252"><a href="#Oracle-252"><span class="linenos">252</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Oracle-253"><a href="#Oracle-253"><span class="linenos">253</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span>
</span><span id="Oracle-254"><a href="#Oracle-254"><span class="linenos">254</span></a> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;TO_DATE(&#39;1970-01-01&#39;, &#39;YYYY-MM-DD&#39;) + (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> / 86400)&quot;</span><span class="p">,</span>
</span><span id="Oracle-255"><a href="#Oracle-255"><span class="linenos">255</span></a> <span class="p">}</span>
</span><span id="Oracle-256"><a href="#Oracle-256"><span class="linenos">256</span></a>
</span><span id="Oracle-257"><a href="#Oracle-257"><span class="linenos">257</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle-258"><a href="#Oracle-258"><span class="linenos">258</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Oracle-259"><a href="#Oracle-259"><span class="linenos">259</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Oracle-260"><a href="#Oracle-260"><span class="linenos">260</span></a> <span class="p">}</span>
</span><span id="Oracle-261"><a href="#Oracle-261"><span class="linenos">261</span></a>
</span><span id="Oracle-262"><a href="#Oracle-262"><span class="linenos">262</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-263"><a href="#Oracle-263"><span class="linenos">263</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="Oracle-264"><a href="#Oracle-264"><span class="linenos">264</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
</span><span id="Oracle-265"><a href="#Oracle-265"><span class="linenos">265</span></a>
</span><span id="Oracle-266"><a href="#Oracle-266"><span class="linenos">266</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-267"><a href="#Oracle-267"><span class="linenos">267</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
</span><span id="Oracle-268"><a href="#Oracle-268"><span class="linenos">268</span></a>
</span><span id="Oracle-269"><a href="#Oracle-269"><span class="linenos">269</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-270"><a href="#Oracle-270"><span class="linenos">270</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Oracle-271"><a href="#Oracle-271"><span class="linenos">271</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="Oracle-272"><a href="#Oracle-272"><span class="linenos">272</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle-273"><a href="#Oracle-273"><span class="linenos">273</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="Oracle-274"><a href="#Oracle-274"><span class="linenos">274</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle-275"><a href="#Oracle-275"><span class="linenos">275</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Oracle-276"><a href="#Oracle-276"><span class="linenos">276</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle-277"><a href="#Oracle-277"><span class="linenos">277</span></a> <span class="p">)</span>
</span><span id="Oracle-278"><a href="#Oracle-278"><span class="linenos">278</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Oracle-279"><a href="#Oracle-279"><span class="linenos">279</span></a>
</span><span id="Oracle-280"><a href="#Oracle-280"><span class="linenos">280</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-281"><a href="#Oracle-281"><span class="linenos">281</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="Oracle-282"><a href="#Oracle-282"><span class="linenos">282</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Oracle-283"><a href="#Oracle-283"><span class="linenos">283</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Oracle-284"><a href="#Oracle-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Oracle-226"><a href="#Oracle-226"><span class="linenos">226</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ROWVERSION</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="Oracle-227"><a href="#Oracle-227"><span class="linenos">227</span></a> <span class="p">}</span>
</span><span id="Oracle-228"><a href="#Oracle-228"><span class="linenos">228</span></a>
</span><span id="Oracle-229"><a href="#Oracle-229"><span class="linenos">229</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle-230"><a href="#Oracle-230"><span class="linenos">230</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Oracle-231"><a href="#Oracle-231"><span class="linenos">231</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ConnectByRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;CONNECT_BY_ROOT </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Oracle-232"><a href="#Oracle-232"><span class="linenos">232</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Oracle-233"><a href="#Oracle-233"><span class="linenos">233</span></a> <span class="s2">&quot;TO_DATE&quot;</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="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;YYYY-MM-DD&quot;</span><span class="p">)</span>
</span><span id="Oracle-234"><a href="#Oracle-234"><span class="linenos">234</span></a> <span class="p">),</span>
</span><span id="Oracle-235"><a href="#Oracle-235"><span class="linenos">235</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">transforms</span><span class="o">.</span><span class="n">unalias_group</span><span class="p">]),</span>
</span><span id="Oracle-236"><a href="#Oracle-236"><span class="linenos">236</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ILike</span><span class="p">:</span> <span class="n">no_ilike_sql</span><span class="p">,</span>
</span><span id="Oracle-237"><a href="#Oracle-237"><span class="linenos">237</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Oracle-238"><a href="#Oracle-238"><span class="linenos">238</span></a> <span class="p">[</span>
</span><span id="Oracle-239"><a href="#Oracle-239"><span class="linenos">239</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_distinct_on</span><span class="p">,</span>
</span><span id="Oracle-240"><a href="#Oracle-240"><span class="linenos">240</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Oracle-241"><a href="#Oracle-241"><span class="linenos">241</span></a> <span class="p">]</span>
</span><span id="Oracle-242"><a href="#Oracle-242"><span class="linenos">242</span></a> <span class="p">),</span>
</span><span id="Oracle-243"><a href="#Oracle-243"><span class="linenos">243</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle-244"><a href="#Oracle-244"><span class="linenos">244</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle-245"><a href="#Oracle-245"><span class="linenos">245</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle-246"><a href="#Oracle-246"><span class="linenos">246</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;SUBSTR&quot;</span><span class="p">),</span>
</span><span id="Oracle-247"><a href="#Oracle-247"><span class="linenos">247</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle-248"><a href="#Oracle-248"><span class="linenos">248</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TableSample</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesample_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle-249"><a href="#Oracle-249"><span class="linenos">249</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;GLOBAL&#39;</span><span class="si">}</span><span class="s2"> TEMPORARY&quot;</span><span class="p">,</span>
</span><span id="Oracle-250"><a href="#Oracle-250"><span class="linenos">250</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle-251"><a href="#Oracle-251"><span class="linenos">251</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Oracle-252"><a href="#Oracle-252"><span class="linenos">252</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToNumber</span><span class="p">:</span> <span class="n">to_number_with_nls_param</span><span class="p">,</span>
</span><span id="Oracle-253"><a href="#Oracle-253"><span class="linenos">253</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Oracle-254"><a href="#Oracle-254"><span class="linenos">254</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span>
</span><span id="Oracle-255"><a href="#Oracle-255"><span class="linenos">255</span></a> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;TO_DATE(&#39;1970-01-01&#39;, &#39;YYYY-MM-DD&#39;) + (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> / 86400)&quot;</span><span class="p">,</span>
</span><span id="Oracle-256"><a href="#Oracle-256"><span class="linenos">256</span></a> <span class="p">}</span>
</span><span id="Oracle-257"><a href="#Oracle-257"><span class="linenos">257</span></a>
</span><span id="Oracle-258"><a href="#Oracle-258"><span class="linenos">258</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle-259"><a href="#Oracle-259"><span class="linenos">259</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Oracle-260"><a href="#Oracle-260"><span class="linenos">260</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Oracle-261"><a href="#Oracle-261"><span class="linenos">261</span></a> <span class="p">}</span>
</span><span id="Oracle-262"><a href="#Oracle-262"><span class="linenos">262</span></a>
</span><span id="Oracle-263"><a href="#Oracle-263"><span class="linenos">263</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-264"><a href="#Oracle-264"><span class="linenos">264</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="Oracle-265"><a href="#Oracle-265"><span class="linenos">265</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
</span><span id="Oracle-266"><a href="#Oracle-266"><span class="linenos">266</span></a>
</span><span id="Oracle-267"><a href="#Oracle-267"><span class="linenos">267</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-268"><a href="#Oracle-268"><span class="linenos">268</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
</span><span id="Oracle-269"><a href="#Oracle-269"><span class="linenos">269</span></a>
</span><span id="Oracle-270"><a href="#Oracle-270"><span class="linenos">270</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-271"><a href="#Oracle-271"><span class="linenos">271</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Oracle-272"><a href="#Oracle-272"><span class="linenos">272</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="Oracle-273"><a href="#Oracle-273"><span class="linenos">273</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle-274"><a href="#Oracle-274"><span class="linenos">274</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="Oracle-275"><a href="#Oracle-275"><span class="linenos">275</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle-276"><a href="#Oracle-276"><span class="linenos">276</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Oracle-277"><a href="#Oracle-277"><span class="linenos">277</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle-278"><a href="#Oracle-278"><span class="linenos">278</span></a> <span class="p">)</span>
</span><span id="Oracle-279"><a href="#Oracle-279"><span class="linenos">279</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Oracle-280"><a href="#Oracle-280"><span class="linenos">280</span></a>
</span><span id="Oracle-281"><a href="#Oracle-281"><span class="linenos">281</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle-282"><a href="#Oracle-282"><span class="linenos">282</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="Oracle-283"><a href="#Oracle-283"><span class="linenos">283</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Oracle-284"><a href="#Oracle-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Oracle-285"><a href="#Oracle-285"><span class="linenos">285</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
</span></pre></div>
@ -1203,7 +1205,7 @@
<div id="Oracle.Tokenizer.VAR_SINGLE_TOKENS" class="classattr">
<div class="attr variable">
<span class="name">VAR_SINGLE_TOKENS</span> =
<span class="default_value">{&#39;$&#39;, &#39;@&#39;, &#39;#&#39;}</span>
<span class="default_value">{&#39;$&#39;, &#39;#&#39;, &#39;@&#39;}</span>
</div>
@ -1411,7 +1413,7 @@ Default: 3</li>
<div id="Oracle.Parser.WINDOW_BEFORE_PAREN_TOKENS" class="classattr">
<div class="attr variable">
<span class="name">WINDOW_BEFORE_PAREN_TOKENS</span> =
<span class="default_value">{&lt;TokenType.KEEP: &#39;KEEP&#39;&gt;, &lt;TokenType.OVER: &#39;OVER&#39;&gt;}</span>
<span class="default_value">{&lt;TokenType.OVER: &#39;OVER&#39;&gt;, &lt;TokenType.KEEP: &#39;KEEP&#39;&gt;}</span>
</div>
@ -1512,7 +1514,7 @@ Default: 3</li>
<div id="Oracle.Parser.DISTINCT_TOKENS" class="classattr">
<div class="attr variable">
<span class="name">DISTINCT_TOKENS</span> =
<span class="default_value">{&lt;TokenType.DISTINCT: &#39;DISTINCT&#39;&gt;, &lt;TokenType.UNIQUE: &#39;UNIQUE&#39;&gt;}</span>
<span class="default_value">{&lt;TokenType.UNIQUE: &#39;UNIQUE&#39;&gt;, &lt;TokenType.DISTINCT: &#39;DISTINCT&#39;&gt;}</span>
</div>
@ -1639,6 +1641,7 @@ Default: 3</li>
<dd id="Oracle.Parser.JSON_ARROWS_REQUIRE_JSON_TYPE" class="variable"><a href="../parser.html#Parser.JSON_ARROWS_REQUIRE_JSON_TYPE">JSON_ARROWS_REQUIRE_JSON_TYPE</a></dd>
<dd id="Oracle.Parser.SUPPORTS_IMPLICIT_UNNEST" class="variable"><a href="../parser.html#Parser.SUPPORTS_IMPLICIT_UNNEST">SUPPORTS_IMPLICIT_UNNEST</a></dd>
<dd id="Oracle.Parser.INTERVAL_SPANS" class="variable"><a href="../parser.html#Parser.INTERVAL_SPANS">INTERVAL_SPANS</a></dd>
<dd id="Oracle.Parser.SUPPORTS_PARTITION_SELECTION" class="variable"><a href="../parser.html#Parser.SUPPORTS_PARTITION_SELECTION">SUPPORTS_PARTITION_SELECTION</a></dd>
<dd id="Oracle.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
<dd id="Oracle.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
<dd id="Oracle.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
@ -1697,65 +1700,66 @@ Default: 3</li>
</span><span id="Oracle.Generator-223"><a href="#Oracle.Generator-223"><span class="linenos">223</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">TIMESTAMPTZ</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-224"><a href="#Oracle.Generator-224"><span class="linenos">224</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">BINARY</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-225"><a href="#Oracle.Generator-225"><span class="linenos">225</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">VARBINARY</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-226"><a href="#Oracle.Generator-226"><span class="linenos">226</span></a> <span class="p">}</span>
</span><span id="Oracle.Generator-227"><a href="#Oracle.Generator-227"><span class="linenos">227</span></a>
</span><span id="Oracle.Generator-228"><a href="#Oracle.Generator-228"><span class="linenos">228</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle.Generator-229"><a href="#Oracle.Generator-229"><span class="linenos">229</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Oracle.Generator-230"><a href="#Oracle.Generator-230"><span class="linenos">230</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ConnectByRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;CONNECT_BY_ROOT </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-231"><a href="#Oracle.Generator-231"><span class="linenos">231</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Oracle.Generator-232"><a href="#Oracle.Generator-232"><span class="linenos">232</span></a> <span class="s2">&quot;TO_DATE&quot;</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="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;YYYY-MM-DD&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-233"><a href="#Oracle.Generator-233"><span class="linenos">233</span></a> <span class="p">),</span>
</span><span id="Oracle.Generator-234"><a href="#Oracle.Generator-234"><span class="linenos">234</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">transforms</span><span class="o">.</span><span class="n">unalias_group</span><span class="p">]),</span>
</span><span id="Oracle.Generator-235"><a href="#Oracle.Generator-235"><span class="linenos">235</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ILike</span><span class="p">:</span> <span class="n">no_ilike_sql</span><span class="p">,</span>
</span><span id="Oracle.Generator-236"><a href="#Oracle.Generator-236"><span class="linenos">236</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Oracle.Generator-237"><a href="#Oracle.Generator-237"><span class="linenos">237</span></a> <span class="p">[</span>
</span><span id="Oracle.Generator-238"><a href="#Oracle.Generator-238"><span class="linenos">238</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_distinct_on</span><span class="p">,</span>
</span><span id="Oracle.Generator-239"><a href="#Oracle.Generator-239"><span class="linenos">239</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Oracle.Generator-240"><a href="#Oracle.Generator-240"><span class="linenos">240</span></a> <span class="p">]</span>
</span><span id="Oracle.Generator-241"><a href="#Oracle.Generator-241"><span class="linenos">241</span></a> <span class="p">),</span>
</span><span id="Oracle.Generator-242"><a href="#Oracle.Generator-242"><span class="linenos">242</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle.Generator-243"><a href="#Oracle.Generator-243"><span class="linenos">243</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle.Generator-244"><a href="#Oracle.Generator-244"><span class="linenos">244</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-245"><a href="#Oracle.Generator-245"><span class="linenos">245</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;SUBSTR&quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-246"><a href="#Oracle.Generator-246"><span class="linenos">246</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-247"><a href="#Oracle.Generator-247"><span class="linenos">247</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TableSample</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesample_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-248"><a href="#Oracle.Generator-248"><span class="linenos">248</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;GLOBAL&#39;</span><span class="si">}</span><span class="s2"> TEMPORARY&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-249"><a href="#Oracle.Generator-249"><span class="linenos">249</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle.Generator-250"><a href="#Oracle.Generator-250"><span class="linenos">250</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Oracle.Generator-251"><a href="#Oracle.Generator-251"><span class="linenos">251</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToNumber</span><span class="p">:</span> <span class="n">to_number_with_nls_param</span><span class="p">,</span>
</span><span id="Oracle.Generator-252"><a href="#Oracle.Generator-252"><span class="linenos">252</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Oracle.Generator-253"><a href="#Oracle.Generator-253"><span class="linenos">253</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span>
</span><span id="Oracle.Generator-254"><a href="#Oracle.Generator-254"><span class="linenos">254</span></a> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;TO_DATE(&#39;1970-01-01&#39;, &#39;YYYY-MM-DD&#39;) + (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> / 86400)&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-255"><a href="#Oracle.Generator-255"><span class="linenos">255</span></a> <span class="p">}</span>
</span><span id="Oracle.Generator-256"><a href="#Oracle.Generator-256"><span class="linenos">256</span></a>
</span><span id="Oracle.Generator-257"><a href="#Oracle.Generator-257"><span class="linenos">257</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle.Generator-258"><a href="#Oracle.Generator-258"><span class="linenos">258</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Oracle.Generator-259"><a href="#Oracle.Generator-259"><span class="linenos">259</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Oracle.Generator-260"><a href="#Oracle.Generator-260"><span class="linenos">260</span></a> <span class="p">}</span>
</span><span id="Oracle.Generator-261"><a href="#Oracle.Generator-261"><span class="linenos">261</span></a>
</span><span id="Oracle.Generator-262"><a href="#Oracle.Generator-262"><span class="linenos">262</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-263"><a href="#Oracle.Generator-263"><span class="linenos">263</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="Oracle.Generator-264"><a href="#Oracle.Generator-264"><span class="linenos">264</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
</span><span id="Oracle.Generator-265"><a href="#Oracle.Generator-265"><span class="linenos">265</span></a>
</span><span id="Oracle.Generator-266"><a href="#Oracle.Generator-266"><span class="linenos">266</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-267"><a href="#Oracle.Generator-267"><span class="linenos">267</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
</span><span id="Oracle.Generator-268"><a href="#Oracle.Generator-268"><span class="linenos">268</span></a>
</span><span id="Oracle.Generator-269"><a href="#Oracle.Generator-269"><span class="linenos">269</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-270"><a href="#Oracle.Generator-270"><span class="linenos">270</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-271"><a href="#Oracle.Generator-271"><span class="linenos">271</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-272"><a href="#Oracle.Generator-272"><span class="linenos">272</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator-273"><a href="#Oracle.Generator-273"><span class="linenos">273</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-274"><a href="#Oracle.Generator-274"><span class="linenos">274</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator-275"><a href="#Oracle.Generator-275"><span class="linenos">275</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Oracle.Generator-276"><a href="#Oracle.Generator-276"><span class="linenos">276</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator-277"><a href="#Oracle.Generator-277"><span class="linenos">277</span></a> <span class="p">)</span>
</span><span id="Oracle.Generator-278"><a href="#Oracle.Generator-278"><span class="linenos">278</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Oracle.Generator-279"><a href="#Oracle.Generator-279"><span class="linenos">279</span></a>
</span><span id="Oracle.Generator-280"><a href="#Oracle.Generator-280"><span class="linenos">280</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-281"><a href="#Oracle.Generator-281"><span class="linenos">281</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="Oracle.Generator-282"><a href="#Oracle.Generator-282"><span class="linenos">282</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Oracle.Generator-283"><a href="#Oracle.Generator-283"><span class="linenos">283</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Oracle.Generator-284"><a href="#Oracle.Generator-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Oracle.Generator-226"><a href="#Oracle.Generator-226"><span class="linenos">226</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ROWVERSION</span><span class="p">:</span> <span class="s2">&quot;BLOB&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-227"><a href="#Oracle.Generator-227"><span class="linenos">227</span></a> <span class="p">}</span>
</span><span id="Oracle.Generator-228"><a href="#Oracle.Generator-228"><span class="linenos">228</span></a>
</span><span id="Oracle.Generator-229"><a href="#Oracle.Generator-229"><span class="linenos">229</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle.Generator-230"><a href="#Oracle.Generator-230"><span class="linenos">230</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Oracle.Generator-231"><a href="#Oracle.Generator-231"><span class="linenos">231</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ConnectByRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;CONNECT_BY_ROOT </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-232"><a href="#Oracle.Generator-232"><span class="linenos">232</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Oracle.Generator-233"><a href="#Oracle.Generator-233"><span class="linenos">233</span></a> <span class="s2">&quot;TO_DATE&quot;</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="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">&quot;YYYY-MM-DD&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-234"><a href="#Oracle.Generator-234"><span class="linenos">234</span></a> <span class="p">),</span>
</span><span id="Oracle.Generator-235"><a href="#Oracle.Generator-235"><span class="linenos">235</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Group</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">transforms</span><span class="o">.</span><span class="n">unalias_group</span><span class="p">]),</span>
</span><span id="Oracle.Generator-236"><a href="#Oracle.Generator-236"><span class="linenos">236</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ILike</span><span class="p">:</span> <span class="n">no_ilike_sql</span><span class="p">,</span>
</span><span id="Oracle.Generator-237"><a href="#Oracle.Generator-237"><span class="linenos">237</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Oracle.Generator-238"><a href="#Oracle.Generator-238"><span class="linenos">238</span></a> <span class="p">[</span>
</span><span id="Oracle.Generator-239"><a href="#Oracle.Generator-239"><span class="linenos">239</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_distinct_on</span><span class="p">,</span>
</span><span id="Oracle.Generator-240"><a href="#Oracle.Generator-240"><span class="linenos">240</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Oracle.Generator-241"><a href="#Oracle.Generator-241"><span class="linenos">241</span></a> <span class="p">]</span>
</span><span id="Oracle.Generator-242"><a href="#Oracle.Generator-242"><span class="linenos">242</span></a> <span class="p">),</span>
</span><span id="Oracle.Generator-243"><a href="#Oracle.Generator-243"><span class="linenos">243</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle.Generator-244"><a href="#Oracle.Generator-244"><span class="linenos">244</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle.Generator-245"><a href="#Oracle.Generator-245"><span class="linenos">245</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">subquery_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-246"><a href="#Oracle.Generator-246"><span class="linenos">246</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;SUBSTR&quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-247"><a href="#Oracle.Generator-247"><span class="linenos">247</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">table_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-248"><a href="#Oracle.Generator-248"><span class="linenos">248</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TableSample</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">tablesample_sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">),</span>
</span><span id="Oracle.Generator-249"><a href="#Oracle.Generator-249"><span class="linenos">249</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TemporaryProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">name</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;GLOBAL&#39;</span><span class="si">}</span><span class="s2"> TEMPORARY&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-250"><a href="#Oracle.Generator-250"><span class="linenos">250</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Oracle.Generator-251"><a href="#Oracle.Generator-251"><span class="linenos">251</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Oracle.Generator-252"><a href="#Oracle.Generator-252"><span class="linenos">252</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToNumber</span><span class="p">:</span> <span class="n">to_number_with_nls_param</span><span class="p">,</span>
</span><span id="Oracle.Generator-253"><a href="#Oracle.Generator-253"><span class="linenos">253</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Oracle.Generator-254"><a href="#Oracle.Generator-254"><span class="linenos">254</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span>
</span><span id="Oracle.Generator-255"><a href="#Oracle.Generator-255"><span class="linenos">255</span></a> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;TO_DATE(&#39;1970-01-01&#39;, &#39;YYYY-MM-DD&#39;) + (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> / 86400)&quot;</span><span class="p">,</span>
</span><span id="Oracle.Generator-256"><a href="#Oracle.Generator-256"><span class="linenos">256</span></a> <span class="p">}</span>
</span><span id="Oracle.Generator-257"><a href="#Oracle.Generator-257"><span class="linenos">257</span></a>
</span><span id="Oracle.Generator-258"><a href="#Oracle.Generator-258"><span class="linenos">258</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Oracle.Generator-259"><a href="#Oracle.Generator-259"><span class="linenos">259</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Oracle.Generator-260"><a href="#Oracle.Generator-260"><span class="linenos">260</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Oracle.Generator-261"><a href="#Oracle.Generator-261"><span class="linenos">261</span></a> <span class="p">}</span>
</span><span id="Oracle.Generator-262"><a href="#Oracle.Generator-262"><span class="linenos">262</span></a>
</span><span id="Oracle.Generator-263"><a href="#Oracle.Generator-263"><span class="linenos">263</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-264"><a href="#Oracle.Generator-264"><span class="linenos">264</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="Oracle.Generator-265"><a href="#Oracle.Generator-265"><span class="linenos">265</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
</span><span id="Oracle.Generator-266"><a href="#Oracle.Generator-266"><span class="linenos">266</span></a>
</span><span id="Oracle.Generator-267"><a href="#Oracle.Generator-267"><span class="linenos">267</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-268"><a href="#Oracle.Generator-268"><span class="linenos">268</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
</span><span id="Oracle.Generator-269"><a href="#Oracle.Generator-269"><span class="linenos">269</span></a>
</span><span id="Oracle.Generator-270"><a href="#Oracle.Generator-270"><span class="linenos">270</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-271"><a href="#Oracle.Generator-271"><span class="linenos">271</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-272"><a href="#Oracle.Generator-272"><span class="linenos">272</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-273"><a href="#Oracle.Generator-273"><span class="linenos">273</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator-274"><a href="#Oracle.Generator-274"><span class="linenos">274</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator-275"><a href="#Oracle.Generator-275"><span class="linenos">275</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator-276"><a href="#Oracle.Generator-276"><span class="linenos">276</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Oracle.Generator-277"><a href="#Oracle.Generator-277"><span class="linenos">277</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator-278"><a href="#Oracle.Generator-278"><span class="linenos">278</span></a> <span class="p">)</span>
</span><span id="Oracle.Generator-279"><a href="#Oracle.Generator-279"><span class="linenos">279</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Oracle.Generator-280"><a href="#Oracle.Generator-280"><span class="linenos">280</span></a>
</span><span id="Oracle.Generator-281"><a href="#Oracle.Generator-281"><span class="linenos">281</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator-282"><a href="#Oracle.Generator-282"><span class="linenos">282</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="Oracle.Generator-283"><a href="#Oracle.Generator-283"><span class="linenos">283</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Oracle.Generator-284"><a href="#Oracle.Generator-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Oracle.Generator-285"><a href="#Oracle.Generator-285"><span class="linenos">285</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
</span></pre></div>
@ -1936,7 +1940,7 @@ Default: True</li>
<div class="attr variable">
<span class="name">TYPE_MAPPING</span> =
<input id="Oracle.Generator.TYPE_MAPPING-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="Oracle.Generator.TYPE_MAPPING-view-value"></label><span class="default_value">{&lt;Type.NCHAR: &#39;NCHAR&#39;&gt;: &#39;NCHAR&#39;, &lt;Type.NVARCHAR: &#39;NVARCHAR&#39;&gt;: &#39;NVARCHAR2&#39;, &lt;Type.MEDIUMTEXT: &#39;MEDIUMTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.LONGTEXT: &#39;LONGTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.TINYTEXT: &#39;TINYTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.MEDIUMBLOB: &#39;MEDIUMBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.LONGBLOB: &#39;LONGBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.TINYBLOB: &#39;TINYBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.INET: &#39;INET&#39;&gt;: &#39;INET&#39;, &lt;Type.TINYINT: &#39;TINYINT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.SMALLINT: &#39;SMALLINT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.INT: &#39;INT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.BIGINT: &#39;BIGINT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.DECIMAL: &#39;DECIMAL&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.DOUBLE: &#39;DOUBLE&#39;&gt;: &#39;DOUBLE PRECISION&#39;, &lt;Type.VARCHAR: &#39;VARCHAR&#39;&gt;: &#39;VARCHAR2&#39;, &lt;Type.TEXT: &#39;TEXT&#39;&gt;: &#39;CLOB&#39;, &lt;Type.TIMETZ: &#39;TIMETZ&#39;&gt;: &#39;TIME&#39;, &lt;Type.TIMESTAMPTZ: &#39;TIMESTAMPTZ&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.BINARY: &#39;BINARY&#39;&gt;: &#39;BLOB&#39;, &lt;Type.VARBINARY: &#39;VARBINARY&#39;&gt;: &#39;BLOB&#39;}</span>
<label class="view-value-button pdoc-button" for="Oracle.Generator.TYPE_MAPPING-view-value"></label><span class="default_value">{&lt;Type.NCHAR: &#39;NCHAR&#39;&gt;: &#39;NCHAR&#39;, &lt;Type.NVARCHAR: &#39;NVARCHAR&#39;&gt;: &#39;NVARCHAR2&#39;, &lt;Type.MEDIUMTEXT: &#39;MEDIUMTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.LONGTEXT: &#39;LONGTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.TINYTEXT: &#39;TINYTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.MEDIUMBLOB: &#39;MEDIUMBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.LONGBLOB: &#39;LONGBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.TINYBLOB: &#39;TINYBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.INET: &#39;INET&#39;&gt;: &#39;INET&#39;, &lt;Type.ROWVERSION: &#39;ROWVERSION&#39;&gt;: &#39;BLOB&#39;, &lt;Type.TINYINT: &#39;TINYINT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.SMALLINT: &#39;SMALLINT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.INT: &#39;INT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.BIGINT: &#39;BIGINT&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.DECIMAL: &#39;DECIMAL&#39;&gt;: &#39;NUMBER&#39;, &lt;Type.DOUBLE: &#39;DOUBLE&#39;&gt;: &#39;DOUBLE PRECISION&#39;, &lt;Type.VARCHAR: &#39;VARCHAR&#39;&gt;: &#39;VARCHAR2&#39;, &lt;Type.TEXT: &#39;TEXT&#39;&gt;: &#39;CLOB&#39;, &lt;Type.TIMETZ: &#39;TIMETZ&#39;&gt;: &#39;TIME&#39;, &lt;Type.TIMESTAMPTZ: &#39;TIMESTAMPTZ&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.BINARY: &#39;BINARY&#39;&gt;: &#39;BLOB&#39;, &lt;Type.VARBINARY: &#39;VARBINARY&#39;&gt;: &#39;BLOB&#39;}</span>
</div>
@ -1982,9 +1986,9 @@ Default: True</li>
</div>
<a class="headerlink" href="#Oracle.Generator.currenttimestamp_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.currenttimestamp_sql-262"><a href="#Oracle.Generator.currenttimestamp_sql-262"><span class="linenos">262</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.currenttimestamp_sql-263"><a href="#Oracle.Generator.currenttimestamp_sql-263"><span class="linenos">263</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="Oracle.Generator.currenttimestamp_sql-264"><a href="#Oracle.Generator.currenttimestamp_sql-264"><span class="linenos">264</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.currenttimestamp_sql-263"><a href="#Oracle.Generator.currenttimestamp_sql-263"><span class="linenos">263</span></a> <span class="k">def</span> <span class="nf">currenttimestamp_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">CurrentTimestamp</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.currenttimestamp_sql-264"><a href="#Oracle.Generator.currenttimestamp_sql-264"><span class="linenos">264</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
</span><span id="Oracle.Generator.currenttimestamp_sql-265"><a href="#Oracle.Generator.currenttimestamp_sql-265"><span class="linenos">265</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="k">if</span> <span class="n">this</span> <span class="k">else</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span>
</span></pre></div>
@ -2002,8 +2006,8 @@ Default: True</li>
</div>
<a class="headerlink" href="#Oracle.Generator.offset_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.offset_sql-266"><a href="#Oracle.Generator.offset_sql-266"><span class="linenos">266</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.offset_sql-267"><a href="#Oracle.Generator.offset_sql-267"><span class="linenos">267</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.offset_sql-267"><a href="#Oracle.Generator.offset_sql-267"><span class="linenos">267</span></a> <span class="k">def</span> <span class="nf">offset_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">Offset</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.offset_sql-268"><a href="#Oracle.Generator.offset_sql-268"><span class="linenos">268</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">offset_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span><span class="si">}</span><span class="s2"> ROWS&quot;</span>
</span></pre></div>
@ -2021,16 +2025,16 @@ Default: True</li>
</div>
<a class="headerlink" href="#Oracle.Generator.xmltable_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.xmltable_sql-269"><a href="#Oracle.Generator.xmltable_sql-269"><span class="linenos">269</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.xmltable_sql-270"><a href="#Oracle.Generator.xmltable_sql-270"><span class="linenos">270</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-271"><a href="#Oracle.Generator.xmltable_sql-271"><span class="linenos">271</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-272"><a href="#Oracle.Generator.xmltable_sql-272"><span class="linenos">272</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator.xmltable_sql-273"><a href="#Oracle.Generator.xmltable_sql-273"><span class="linenos">273</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-274"><a href="#Oracle.Generator.xmltable_sql-274"><span class="linenos">274</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator.xmltable_sql-275"><a href="#Oracle.Generator.xmltable_sql-275"><span class="linenos">275</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Oracle.Generator.xmltable_sql-276"><a href="#Oracle.Generator.xmltable_sql-276"><span class="linenos">276</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator.xmltable_sql-277"><a href="#Oracle.Generator.xmltable_sql-277"><span class="linenos">277</span></a> <span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-278"><a href="#Oracle.Generator.xmltable_sql-278"><span class="linenos">278</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.xmltable_sql-270"><a href="#Oracle.Generator.xmltable_sql-270"><span class="linenos">270</span></a> <span class="k">def</span> <span class="nf">xmltable_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">XMLTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.xmltable_sql-271"><a href="#Oracle.Generator.xmltable_sql-271"><span class="linenos">271</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-272"><a href="#Oracle.Generator.xmltable_sql-272"><span class="linenos">272</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;passing&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-273"><a href="#Oracle.Generator.xmltable_sql-273"><span class="linenos">273</span></a> <span class="n">passing</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">PASSING</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">passing</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">passing</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator.xmltable_sql-274"><a href="#Oracle.Generator.xmltable_sql-274"><span class="linenos">274</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;columns&quot;</span><span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-275"><a href="#Oracle.Generator.xmltable_sql-275"><span class="linenos">275</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">COLUMNS</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">columns</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator.xmltable_sql-276"><a href="#Oracle.Generator.xmltable_sql-276"><span class="linenos">276</span></a> <span class="n">by_ref</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="Oracle.Generator.xmltable_sql-277"><a href="#Oracle.Generator.xmltable_sql-277"><span class="linenos">277</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">()</span><span class="si">}</span><span class="s2">RETURNING SEQUENCE BY REF&quot;</span> <span class="k">if</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;by_ref&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Oracle.Generator.xmltable_sql-278"><a href="#Oracle.Generator.xmltable_sql-278"><span class="linenos">278</span></a> <span class="p">)</span>
</span><span id="Oracle.Generator.xmltable_sql-279"><a href="#Oracle.Generator.xmltable_sql-279"><span class="linenos">279</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;XMLTABLE(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sep</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">this</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">passing</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">by_ref</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">columns</span><span class="p">)</span><span class="si">}{</span><span class="bp">self</span><span class="o">.</span><span class="n">seg</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span></pre></div>
@ -2048,11 +2052,11 @@ Default: True</li>
</div>
<a class="headerlink" href="#Oracle.Generator.add_column_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.add_column_sql-280"><a href="#Oracle.Generator.add_column_sql-280"><span class="linenos">280</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.add_column_sql-281"><a href="#Oracle.Generator.add_column_sql-281"><span class="linenos">281</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="Oracle.Generator.add_column_sql-282"><a href="#Oracle.Generator.add_column_sql-282"><span class="linenos">282</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Oracle.Generator.add_column_sql-283"><a href="#Oracle.Generator.add_column_sql-283"><span class="linenos">283</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Oracle.Generator.add_column_sql-284"><a href="#Oracle.Generator.add_column_sql-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="Oracle.Generator.add_column_sql-281"><a href="#Oracle.Generator.add_column_sql-281"><span class="linenos">281</span></a> <span class="k">def</span> <span class="nf">add_column_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">AlterTable</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Oracle.Generator.add_column_sql-282"><a href="#Oracle.Generator.add_column_sql-282"><span class="linenos">282</span></a> <span class="n">actions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="s2">&quot;actions&quot;</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="Oracle.Generator.add_column_sql-283"><a href="#Oracle.Generator.add_column_sql-283"><span class="linenos">283</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</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;actions&quot;</span><span class="p">,</span> <span class="p">[]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Oracle.Generator.add_column_sql-284"><a href="#Oracle.Generator.add_column_sql-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD (</span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Oracle.Generator.add_column_sql-285"><a href="#Oracle.Generator.add_column_sql-285"><span class="linenos">285</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;ADD </span><span class="si">{</span><span class="n">actions</span><span class="si">}</span><span class="s2">&quot;</span>
</span></pre></div>
@ -2177,6 +2181,7 @@ Default: True</li>
<dd id="Oracle.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Oracle.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Oracle.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Oracle.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Oracle.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Oracle.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Oracle.Generator.columndef_sql" class="function"><a href="../generator.html#Generator.columndef_sql">columndef_sql</a></dd>
@ -2428,7 +2433,7 @@ Default: True</li>
<dd id="Oracle.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Oracle.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Oracle.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Oracle.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Oracle.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Oracle.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Oracle.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Oracle.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>

View file

@ -726,132 +726,133 @@
</span><span id="L-431"><a href="#L-431"><span class="linenos">431</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DOUBLE</span><span class="p">:</span> <span class="s2">&quot;DOUBLE PRECISION&quot;</span><span class="p">,</span>
</span><span id="L-432"><a href="#L-432"><span class="linenos">432</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">BINARY</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="L-433"><a href="#L-433"><span class="linenos">433</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">VARBINARY</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="L-434"><a href="#L-434"><span class="linenos">434</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a> <span class="p">}</span>
</span><span id="L-436"><a href="#L-436"><span class="linenos">436</span></a>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">AnyValue</span><span class="p">:</span> <span class="n">any_value_to_max_sql</span><span class="p">,</span>
</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="p">(</span>
</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq_get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="mi">0</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-443"><a href="#L-443"><span class="linenos">443</span></a> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="L-444"><a href="#L-444"><span class="linenos">444</span></a> <span class="p">),</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayConcat</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;ARRAY_CAT&quot;</span><span class="p">),</span>
</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContained</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&lt;@&quot;</span><span class="p">),</span>
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;@&gt;&quot;</span><span class="p">),</span>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayOverlaps</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&amp;&amp;&quot;</span><span class="p">),</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayFilter</span><span class="p">:</span> <span class="n">filter_array_using_unnest</span><span class="p">,</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;ARRAY_LENGTH&quot;</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="n">e</span><span class="o">.</span><span class="n">expression</span> <span class="ow">or</span> <span class="s2">&quot;1&quot;</span><span class="p">),</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">BitwiseXor</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&quot;</span><span class="p">),</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">_auto_increment_to_serial</span><span class="p">,</span> <span class="n">_serial_to_generated</span><span class="p">]),</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentDate</span><span class="p">:</span> <span class="n">no_paren_current_date_sql</span><span class="p">,</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentTimestamp</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentUser</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_USER&quot;</span><span class="p">,</span>
</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="n">datestrtodate_sql</span><span class="p">,</span>
</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">:</span> <span class="n">_datatype_sql</span><span class="p">,</span>
</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateSub</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">),</span>
</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;UNNEST&quot;</span><span class="p">),</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">GroupConcat</span><span class="p">:</span> <span class="n">_string_agg_sql</span><span class="p">,</span>
</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtract</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">),</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtractScalar</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH_TEXT&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtract</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&quot;</span><span class="p">),</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtractScalar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">),</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ParseJSON</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</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="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">)),</span>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathKey</span><span class="p">:</span> <span class="n">json_path_key_only_name</span><span class="p">,</span>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathSubscript</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">json_path_part</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LastDay</span><span class="p">:</span> <span class="n">no_last_day_sql</span><span class="p">,</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalOr</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_OR&quot;</span><span class="p">),</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalAnd</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_AND&quot;</span><span class="p">),</span>
</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">:</span> <span class="n">max_or_greatest</span><span class="p">,</span>
</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">MapFromEntries</span><span class="p">:</span> <span class="n">no_map_from_entries_sql</span><span class="p">,</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Min</span><span class="p">:</span> <span class="n">min_or_least</span><span class="p">,</span>
</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">:</span> <span class="n">merge_without_target_sql</span><span class="p">,</span>
</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;PARTITION BY </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a> <span class="p">),</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a> <span class="p">),</span>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pivot</span><span class="p">:</span> <span class="n">no_pivot_sql</span><span class="p">,</span>
</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pow</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;^&quot;</span><span class="p">),</span>
</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Rand</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;RANDOM&quot;</span><span class="p">),</span>
</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpLike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~&quot;</span><span class="p">),</span>
</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpILike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~*&quot;</span><span class="p">),</span>
</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a> <span class="p">[</span>
</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_semi_and_anti_joins</span><span class="p">,</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a> <span class="p">]</span>
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a> <span class="p">),</span>
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrPosition</span><span class="p">:</span> <span class="n">str_position_sql</span><span class="p">,</span>
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StructExtract</span><span class="p">:</span> <span class="n">struct_extract_sql</span><span class="p">,</span>
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">_substring_sql</span><span class="p">,</span>
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIME&quot;</span><span class="p">),</span>
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIMESTAMP&quot;</span><span class="p">),</span>
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampTrunc</span><span class="p">:</span> <span class="n">timestamptrunc_sql</span><span class="p">,</span>
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeStrToTime</span><span class="p">:</span> <span class="n">timestrtotime_sql</span><span class="p">,</span>
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">:</span> <span class="n">no_trycast_sql</span><span class="p">,</span>
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToUnix</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a> <span class="s2">&quot;DATE_PART&quot;</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">string</span><span class="p">(</span><span class="s2">&quot;epoch&quot;</span><span class="p">),</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a> <span class="p">),</span>
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VariancePop</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_POP&quot;</span><span class="p">),</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Variance</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_SAMP&quot;</span><span class="p">),</span>
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Xor</span><span class="p">:</span> <span class="n">bool_xor_sql</span><span class="p">,</span>
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a> <span class="p">}</span>
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a>
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">POST_SCHEMA</span><span class="p">,</span>
</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TransientProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="L-525"><a href="#L-525"><span class="linenos">525</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a> <span class="p">}</span>
</span><span id="L-527"><a href="#L-527"><span class="linenos">527</span></a>
</span><span id="L-528"><a href="#L-528"><span class="linenos">528</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-530"><a href="#L-530"><span class="linenos">530</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="L-531"><a href="#L-531"><span class="linenos">531</span></a>
</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="L-534"><a href="#L-534"><span class="linenos">534</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-536"><a href="#L-536"><span class="linenos">536</span></a>
</span><span id="L-537"><a href="#L-537"><span class="linenos">537</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="L-538"><a href="#L-538"><span class="linenos">538</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-540"><a href="#L-540"><span class="linenos">540</span></a>
</span><span id="L-541"><a href="#L-541"><span class="linenos">541</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a>
</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-545"><a href="#L-545"><span class="linenos">545</span></a>
</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a>
</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-549"><a href="#L-549"><span class="linenos">549</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="L-550"><a href="#L-550"><span class="linenos">550</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="L-551"><a href="#L-551"><span class="linenos">551</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="L-552"><a href="#L-552"><span class="linenos">552</span></a>
</span><span id="L-553"><a href="#L-553"><span class="linenos">553</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a>
</span><span id="L-555"><a href="#L-555"><span class="linenos">555</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-556"><a href="#L-556"><span class="linenos">556</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="L-557"><a href="#L-557"><span class="linenos">557</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="L-558"><a href="#L-558"><span class="linenos">558</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-559"><a href="#L-559"><span class="linenos">559</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
</span><span id="L-434"><a href="#L-434"><span class="linenos">434</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ROWVERSION</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="L-436"><a href="#L-436"><span class="linenos">436</span></a> <span class="p">}</span>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a>
</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">AnyValue</span><span class="p">:</span> <span class="n">any_value_to_max_sql</span><span class="p">,</span>
</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="p">(</span>
</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="L-443"><a href="#L-443"><span class="linenos">443</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq_get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="mi">0</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-444"><a href="#L-444"><span class="linenos">444</span></a> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a> <span class="p">),</span>
</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayConcat</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;ARRAY_CAT&quot;</span><span class="p">),</span>
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContained</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&lt;@&quot;</span><span class="p">),</span>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;@&gt;&quot;</span><span class="p">),</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayOverlaps</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&amp;&amp;&quot;</span><span class="p">),</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayFilter</span><span class="p">:</span> <span class="n">filter_array_using_unnest</span><span class="p">,</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;ARRAY_LENGTH&quot;</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="n">e</span><span class="o">.</span><span class="n">expression</span> <span class="ow">or</span> <span class="s2">&quot;1&quot;</span><span class="p">),</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">BitwiseXor</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&quot;</span><span class="p">),</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">_auto_increment_to_serial</span><span class="p">,</span> <span class="n">_serial_to_generated</span><span class="p">]),</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentDate</span><span class="p">:</span> <span class="n">no_paren_current_date_sql</span><span class="p">,</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentTimestamp</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentUser</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_USER&quot;</span><span class="p">,</span>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="n">datestrtodate_sql</span><span class="p">,</span>
</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">:</span> <span class="n">_datatype_sql</span><span class="p">,</span>
</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateSub</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">),</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;UNNEST&quot;</span><span class="p">),</span>
</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">GroupConcat</span><span class="p">:</span> <span class="n">_string_agg_sql</span><span class="p">,</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtract</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">),</span>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtractScalar</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH_TEXT&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtract</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&quot;</span><span class="p">),</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtractScalar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">),</span>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ParseJSON</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</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="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">)),</span>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathKey</span><span class="p">:</span> <span class="n">json_path_key_only_name</span><span class="p">,</span>
</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathSubscript</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">json_path_part</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LastDay</span><span class="p">:</span> <span class="n">no_last_day_sql</span><span class="p">,</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalOr</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_OR&quot;</span><span class="p">),</span>
</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalAnd</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_AND&quot;</span><span class="p">),</span>
</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">:</span> <span class="n">max_or_greatest</span><span class="p">,</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">MapFromEntries</span><span class="p">:</span> <span class="n">no_map_from_entries_sql</span><span class="p">,</span>
</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Min</span><span class="p">:</span> <span class="n">min_or_least</span><span class="p">,</span>
</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">:</span> <span class="n">merge_without_target_sql</span><span class="p">,</span>
</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;PARTITION BY </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a> <span class="p">),</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a> <span class="p">),</span>
</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pivot</span><span class="p">:</span> <span class="n">no_pivot_sql</span><span class="p">,</span>
</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pow</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;^&quot;</span><span class="p">),</span>
</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Rand</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;RANDOM&quot;</span><span class="p">),</span>
</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpLike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~&quot;</span><span class="p">),</span>
</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpILike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~*&quot;</span><span class="p">),</span>
</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a> <span class="p">[</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_semi_and_anti_joins</span><span class="p">,</span>
</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a> <span class="p">]</span>
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a> <span class="p">),</span>
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrPosition</span><span class="p">:</span> <span class="n">str_position_sql</span><span class="p">,</span>
</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StructExtract</span><span class="p">:</span> <span class="n">struct_extract_sql</span><span class="p">,</span>
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">_substring_sql</span><span class="p">,</span>
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIME&quot;</span><span class="p">),</span>
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIMESTAMP&quot;</span><span class="p">),</span>
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampTrunc</span><span class="p">:</span> <span class="n">timestamptrunc_sql</span><span class="p">,</span>
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeStrToTime</span><span class="p">:</span> <span class="n">timestrtotime_sql</span><span class="p">,</span>
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">:</span> <span class="n">no_trycast_sql</span><span class="p">,</span>
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToUnix</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a> <span class="s2">&quot;DATE_PART&quot;</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">string</span><span class="p">(</span><span class="s2">&quot;epoch&quot;</span><span class="p">),</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a> <span class="p">),</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VariancePop</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_POP&quot;</span><span class="p">),</span>
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Variance</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_SAMP&quot;</span><span class="p">),</span>
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Xor</span><span class="p">:</span> <span class="n">bool_xor_sql</span><span class="p">,</span>
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="p">}</span>
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a>
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">POST_SCHEMA</span><span class="p">,</span>
</span><span id="L-525"><a href="#L-525"><span class="linenos">525</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TransientProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="L-527"><a href="#L-527"><span class="linenos">527</span></a> <span class="p">}</span>
</span><span id="L-528"><a href="#L-528"><span class="linenos">528</span></a>
</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-530"><a href="#L-530"><span class="linenos">530</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-531"><a href="#L-531"><span class="linenos">531</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a>
</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-534"><a href="#L-534"><span class="linenos">534</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="L-536"><a href="#L-536"><span class="linenos">536</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="L-537"><a href="#L-537"><span class="linenos">537</span></a>
</span><span id="L-538"><a href="#L-538"><span class="linenos">538</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="L-540"><a href="#L-540"><span class="linenos">540</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="L-541"><a href="#L-541"><span class="linenos">541</span></a>
</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a>
</span><span id="L-545"><a href="#L-545"><span class="linenos">545</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a>
</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a>
</span><span id="L-549"><a href="#L-549"><span class="linenos">549</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-550"><a href="#L-550"><span class="linenos">550</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="L-551"><a href="#L-551"><span class="linenos">551</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="L-552"><a href="#L-552"><span class="linenos">552</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="L-553"><a href="#L-553"><span class="linenos">553</span></a>
</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-555"><a href="#L-555"><span class="linenos">555</span></a>
</span><span id="L-556"><a href="#L-556"><span class="linenos">556</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="L-557"><a href="#L-557"><span class="linenos">557</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="L-558"><a href="#L-558"><span class="linenos">558</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="L-559"><a href="#L-559"><span class="linenos">559</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="L-560"><a href="#L-560"><span class="linenos">560</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
</span></pre></div>
@ -1107,132 +1108,133 @@
</span><span id="Postgres-432"><a href="#Postgres-432"><span class="linenos">432</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DOUBLE</span><span class="p">:</span> <span class="s2">&quot;DOUBLE PRECISION&quot;</span><span class="p">,</span>
</span><span id="Postgres-433"><a href="#Postgres-433"><span class="linenos">433</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">BINARY</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="Postgres-434"><a href="#Postgres-434"><span class="linenos">434</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">VARBINARY</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="Postgres-435"><a href="#Postgres-435"><span class="linenos">435</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres-436"><a href="#Postgres-436"><span class="linenos">436</span></a> <span class="p">}</span>
</span><span id="Postgres-437"><a href="#Postgres-437"><span class="linenos">437</span></a>
</span><span id="Postgres-438"><a href="#Postgres-438"><span class="linenos">438</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres-439"><a href="#Postgres-439"><span class="linenos">439</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Postgres-440"><a href="#Postgres-440"><span class="linenos">440</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">AnyValue</span><span class="p">:</span> <span class="n">any_value_to_max_sql</span><span class="p">,</span>
</span><span id="Postgres-441"><a href="#Postgres-441"><span class="linenos">441</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="p">(</span>
</span><span id="Postgres-442"><a href="#Postgres-442"><span class="linenos">442</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Postgres-443"><a href="#Postgres-443"><span class="linenos">443</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq_get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="mi">0</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="Postgres-444"><a href="#Postgres-444"><span class="linenos">444</span></a> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="Postgres-445"><a href="#Postgres-445"><span class="linenos">445</span></a> <span class="p">),</span>
</span><span id="Postgres-446"><a href="#Postgres-446"><span class="linenos">446</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayConcat</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;ARRAY_CAT&quot;</span><span class="p">),</span>
</span><span id="Postgres-447"><a href="#Postgres-447"><span class="linenos">447</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContained</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&lt;@&quot;</span><span class="p">),</span>
</span><span id="Postgres-448"><a href="#Postgres-448"><span class="linenos">448</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;@&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-449"><a href="#Postgres-449"><span class="linenos">449</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayOverlaps</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&amp;&amp;&quot;</span><span class="p">),</span>
</span><span id="Postgres-450"><a href="#Postgres-450"><span class="linenos">450</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayFilter</span><span class="p">:</span> <span class="n">filter_array_using_unnest</span><span class="p">,</span>
</span><span id="Postgres-451"><a href="#Postgres-451"><span class="linenos">451</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;ARRAY_LENGTH&quot;</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="n">e</span><span class="o">.</span><span class="n">expression</span> <span class="ow">or</span> <span class="s2">&quot;1&quot;</span><span class="p">),</span>
</span><span id="Postgres-452"><a href="#Postgres-452"><span class="linenos">452</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">BitwiseXor</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&quot;</span><span class="p">),</span>
</span><span id="Postgres-453"><a href="#Postgres-453"><span class="linenos">453</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">_auto_increment_to_serial</span><span class="p">,</span> <span class="n">_serial_to_generated</span><span class="p">]),</span>
</span><span id="Postgres-454"><a href="#Postgres-454"><span class="linenos">454</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentDate</span><span class="p">:</span> <span class="n">no_paren_current_date_sql</span><span class="p">,</span>
</span><span id="Postgres-455"><a href="#Postgres-455"><span class="linenos">455</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentTimestamp</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres-456"><a href="#Postgres-456"><span class="linenos">456</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentUser</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_USER&quot;</span><span class="p">,</span>
</span><span id="Postgres-457"><a href="#Postgres-457"><span class="linenos">457</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres-458"><a href="#Postgres-458"><span class="linenos">458</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres-459"><a href="#Postgres-459"><span class="linenos">459</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="n">datestrtodate_sql</span><span class="p">,</span>
</span><span id="Postgres-460"><a href="#Postgres-460"><span class="linenos">460</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">:</span> <span class="n">_datatype_sql</span><span class="p">,</span>
</span><span id="Postgres-461"><a href="#Postgres-461"><span class="linenos">461</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateSub</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">),</span>
</span><span id="Postgres-462"><a href="#Postgres-462"><span class="linenos">462</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;UNNEST&quot;</span><span class="p">),</span>
</span><span id="Postgres-463"><a href="#Postgres-463"><span class="linenos">463</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">GroupConcat</span><span class="p">:</span> <span class="n">_string_agg_sql</span><span class="p">,</span>
</span><span id="Postgres-464"><a href="#Postgres-464"><span class="linenos">464</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtract</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-465"><a href="#Postgres-465"><span class="linenos">465</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtractScalar</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH_TEXT&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-466"><a href="#Postgres-466"><span class="linenos">466</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtract</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-467"><a href="#Postgres-467"><span class="linenos">467</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtractScalar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-468"><a href="#Postgres-468"><span class="linenos">468</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">),</span>
</span><span id="Postgres-469"><a href="#Postgres-469"><span class="linenos">469</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ParseJSON</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</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="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">)),</span>
</span><span id="Postgres-470"><a href="#Postgres-470"><span class="linenos">470</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathKey</span><span class="p">:</span> <span class="n">json_path_key_only_name</span><span class="p">,</span>
</span><span id="Postgres-471"><a href="#Postgres-471"><span class="linenos">471</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="Postgres-472"><a href="#Postgres-472"><span class="linenos">472</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathSubscript</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">json_path_part</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres-473"><a href="#Postgres-473"><span class="linenos">473</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LastDay</span><span class="p">:</span> <span class="n">no_last_day_sql</span><span class="p">,</span>
</span><span id="Postgres-474"><a href="#Postgres-474"><span class="linenos">474</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalOr</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_OR&quot;</span><span class="p">),</span>
</span><span id="Postgres-475"><a href="#Postgres-475"><span class="linenos">475</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalAnd</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_AND&quot;</span><span class="p">),</span>
</span><span id="Postgres-476"><a href="#Postgres-476"><span class="linenos">476</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">:</span> <span class="n">max_or_greatest</span><span class="p">,</span>
</span><span id="Postgres-477"><a href="#Postgres-477"><span class="linenos">477</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">MapFromEntries</span><span class="p">:</span> <span class="n">no_map_from_entries_sql</span><span class="p">,</span>
</span><span id="Postgres-478"><a href="#Postgres-478"><span class="linenos">478</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Min</span><span class="p">:</span> <span class="n">min_or_least</span><span class="p">,</span>
</span><span id="Postgres-479"><a href="#Postgres-479"><span class="linenos">479</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">:</span> <span class="n">merge_without_target_sql</span><span class="p">,</span>
</span><span id="Postgres-480"><a href="#Postgres-480"><span class="linenos">480</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;PARTITION BY </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Postgres-481"><a href="#Postgres-481"><span class="linenos">481</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres-482"><a href="#Postgres-482"><span class="linenos">482</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres-483"><a href="#Postgres-483"><span class="linenos">483</span></a> <span class="p">),</span>
</span><span id="Postgres-484"><a href="#Postgres-484"><span class="linenos">484</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres-485"><a href="#Postgres-485"><span class="linenos">485</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres-486"><a href="#Postgres-486"><span class="linenos">486</span></a> <span class="p">),</span>
</span><span id="Postgres-487"><a href="#Postgres-487"><span class="linenos">487</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pivot</span><span class="p">:</span> <span class="n">no_pivot_sql</span><span class="p">,</span>
</span><span id="Postgres-488"><a href="#Postgres-488"><span class="linenos">488</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pow</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;^&quot;</span><span class="p">),</span>
</span><span id="Postgres-489"><a href="#Postgres-489"><span class="linenos">489</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Rand</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;RANDOM&quot;</span><span class="p">),</span>
</span><span id="Postgres-490"><a href="#Postgres-490"><span class="linenos">490</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpLike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~&quot;</span><span class="p">),</span>
</span><span id="Postgres-491"><a href="#Postgres-491"><span class="linenos">491</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpILike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~*&quot;</span><span class="p">),</span>
</span><span id="Postgres-492"><a href="#Postgres-492"><span class="linenos">492</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres-493"><a href="#Postgres-493"><span class="linenos">493</span></a> <span class="p">[</span>
</span><span id="Postgres-494"><a href="#Postgres-494"><span class="linenos">494</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_semi_and_anti_joins</span><span class="p">,</span>
</span><span id="Postgres-495"><a href="#Postgres-495"><span class="linenos">495</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Postgres-496"><a href="#Postgres-496"><span class="linenos">496</span></a> <span class="p">]</span>
</span><span id="Postgres-497"><a href="#Postgres-497"><span class="linenos">497</span></a> <span class="p">),</span>
</span><span id="Postgres-498"><a href="#Postgres-498"><span class="linenos">498</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrPosition</span><span class="p">:</span> <span class="n">str_position_sql</span><span class="p">,</span>
</span><span id="Postgres-499"><a href="#Postgres-499"><span class="linenos">499</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres-500"><a href="#Postgres-500"><span class="linenos">500</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres-501"><a href="#Postgres-501"><span class="linenos">501</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StructExtract</span><span class="p">:</span> <span class="n">struct_extract_sql</span><span class="p">,</span>
</span><span id="Postgres-502"><a href="#Postgres-502"><span class="linenos">502</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">_substring_sql</span><span class="p">,</span>
</span><span id="Postgres-503"><a href="#Postgres-503"><span class="linenos">503</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIME&quot;</span><span class="p">),</span>
</span><span id="Postgres-504"><a href="#Postgres-504"><span class="linenos">504</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIMESTAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres-505"><a href="#Postgres-505"><span class="linenos">505</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampTrunc</span><span class="p">:</span> <span class="n">timestamptrunc_sql</span><span class="p">,</span>
</span><span id="Postgres-506"><a href="#Postgres-506"><span class="linenos">506</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeStrToTime</span><span class="p">:</span> <span class="n">timestrtotime_sql</span><span class="p">,</span>
</span><span id="Postgres-507"><a href="#Postgres-507"><span class="linenos">507</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres-508"><a href="#Postgres-508"><span class="linenos">508</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Postgres-509"><a href="#Postgres-509"><span class="linenos">509</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Postgres-510"><a href="#Postgres-510"><span class="linenos">510</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">:</span> <span class="n">no_trycast_sql</span><span class="p">,</span>
</span><span id="Postgres-511"><a href="#Postgres-511"><span class="linenos">511</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres-512"><a href="#Postgres-512"><span class="linenos">512</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres-513"><a href="#Postgres-513"><span class="linenos">513</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres-514"><a href="#Postgres-514"><span class="linenos">514</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToUnix</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Postgres-515"><a href="#Postgres-515"><span class="linenos">515</span></a> <span class="s2">&quot;DATE_PART&quot;</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">string</span><span class="p">(</span><span class="s2">&quot;epoch&quot;</span><span class="p">),</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres-516"><a href="#Postgres-516"><span class="linenos">516</span></a> <span class="p">),</span>
</span><span id="Postgres-517"><a href="#Postgres-517"><span class="linenos">517</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VariancePop</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_POP&quot;</span><span class="p">),</span>
</span><span id="Postgres-518"><a href="#Postgres-518"><span class="linenos">518</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Variance</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_SAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres-519"><a href="#Postgres-519"><span class="linenos">519</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Xor</span><span class="p">:</span> <span class="n">bool_xor_sql</span><span class="p">,</span>
</span><span id="Postgres-520"><a href="#Postgres-520"><span class="linenos">520</span></a> <span class="p">}</span>
</span><span id="Postgres-521"><a href="#Postgres-521"><span class="linenos">521</span></a>
</span><span id="Postgres-522"><a href="#Postgres-522"><span class="linenos">522</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres-523"><a href="#Postgres-523"><span class="linenos">523</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Postgres-524"><a href="#Postgres-524"><span class="linenos">524</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">POST_SCHEMA</span><span class="p">,</span>
</span><span id="Postgres-525"><a href="#Postgres-525"><span class="linenos">525</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TransientProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres-526"><a href="#Postgres-526"><span class="linenos">526</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres-527"><a href="#Postgres-527"><span class="linenos">527</span></a> <span class="p">}</span>
</span><span id="Postgres-528"><a href="#Postgres-528"><span class="linenos">528</span></a>
</span><span id="Postgres-529"><a href="#Postgres-529"><span class="linenos">529</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres-530"><a href="#Postgres-530"><span class="linenos">530</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Postgres-531"><a href="#Postgres-531"><span class="linenos">531</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="Postgres-532"><a href="#Postgres-532"><span class="linenos">532</span></a>
</span><span id="Postgres-533"><a href="#Postgres-533"><span class="linenos">533</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="Postgres-534"><a href="#Postgres-534"><span class="linenos">534</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="Postgres-535"><a href="#Postgres-535"><span class="linenos">535</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="Postgres-536"><a href="#Postgres-536"><span class="linenos">536</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres-537"><a href="#Postgres-537"><span class="linenos">537</span></a>
</span><span id="Postgres-538"><a href="#Postgres-538"><span class="linenos">538</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="Postgres-539"><a href="#Postgres-539"><span class="linenos">539</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="Postgres-540"><a href="#Postgres-540"><span class="linenos">540</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Postgres-541"><a href="#Postgres-541"><span class="linenos">541</span></a>
</span><span id="Postgres-542"><a href="#Postgres-542"><span class="linenos">542</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="Postgres-543"><a href="#Postgres-543"><span class="linenos">543</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="Postgres-544"><a href="#Postgres-544"><span class="linenos">544</span></a>
</span><span id="Postgres-545"><a href="#Postgres-545"><span class="linenos">545</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Postgres-546"><a href="#Postgres-546"><span class="linenos">546</span></a>
</span><span id="Postgres-547"><a href="#Postgres-547"><span class="linenos">547</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres-548"><a href="#Postgres-548"><span class="linenos">548</span></a>
</span><span id="Postgres-549"><a href="#Postgres-549"><span class="linenos">549</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres-550"><a href="#Postgres-550"><span class="linenos">550</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="Postgres-551"><a href="#Postgres-551"><span class="linenos">551</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="Postgres-552"><a href="#Postgres-552"><span class="linenos">552</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="Postgres-553"><a href="#Postgres-553"><span class="linenos">553</span></a>
</span><span id="Postgres-554"><a href="#Postgres-554"><span class="linenos">554</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres-555"><a href="#Postgres-555"><span class="linenos">555</span></a>
</span><span id="Postgres-556"><a href="#Postgres-556"><span class="linenos">556</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres-557"><a href="#Postgres-557"><span class="linenos">557</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Postgres-558"><a href="#Postgres-558"><span class="linenos">558</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="Postgres-559"><a href="#Postgres-559"><span class="linenos">559</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="Postgres-560"><a href="#Postgres-560"><span class="linenos">560</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
</span><span id="Postgres-435"><a href="#Postgres-435"><span class="linenos">435</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ROWVERSION</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="Postgres-436"><a href="#Postgres-436"><span class="linenos">436</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres-437"><a href="#Postgres-437"><span class="linenos">437</span></a> <span class="p">}</span>
</span><span id="Postgres-438"><a href="#Postgres-438"><span class="linenos">438</span></a>
</span><span id="Postgres-439"><a href="#Postgres-439"><span class="linenos">439</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres-440"><a href="#Postgres-440"><span class="linenos">440</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Postgres-441"><a href="#Postgres-441"><span class="linenos">441</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">AnyValue</span><span class="p">:</span> <span class="n">any_value_to_max_sql</span><span class="p">,</span>
</span><span id="Postgres-442"><a href="#Postgres-442"><span class="linenos">442</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="p">(</span>
</span><span id="Postgres-443"><a href="#Postgres-443"><span class="linenos">443</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Postgres-444"><a href="#Postgres-444"><span class="linenos">444</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq_get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="mi">0</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="Postgres-445"><a href="#Postgres-445"><span class="linenos">445</span></a> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="Postgres-446"><a href="#Postgres-446"><span class="linenos">446</span></a> <span class="p">),</span>
</span><span id="Postgres-447"><a href="#Postgres-447"><span class="linenos">447</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayConcat</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;ARRAY_CAT&quot;</span><span class="p">),</span>
</span><span id="Postgres-448"><a href="#Postgres-448"><span class="linenos">448</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContained</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&lt;@&quot;</span><span class="p">),</span>
</span><span id="Postgres-449"><a href="#Postgres-449"><span class="linenos">449</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;@&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-450"><a href="#Postgres-450"><span class="linenos">450</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayOverlaps</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&amp;&amp;&quot;</span><span class="p">),</span>
</span><span id="Postgres-451"><a href="#Postgres-451"><span class="linenos">451</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayFilter</span><span class="p">:</span> <span class="n">filter_array_using_unnest</span><span class="p">,</span>
</span><span id="Postgres-452"><a href="#Postgres-452"><span class="linenos">452</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;ARRAY_LENGTH&quot;</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="n">e</span><span class="o">.</span><span class="n">expression</span> <span class="ow">or</span> <span class="s2">&quot;1&quot;</span><span class="p">),</span>
</span><span id="Postgres-453"><a href="#Postgres-453"><span class="linenos">453</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">BitwiseXor</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&quot;</span><span class="p">),</span>
</span><span id="Postgres-454"><a href="#Postgres-454"><span class="linenos">454</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">_auto_increment_to_serial</span><span class="p">,</span> <span class="n">_serial_to_generated</span><span class="p">]),</span>
</span><span id="Postgres-455"><a href="#Postgres-455"><span class="linenos">455</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentDate</span><span class="p">:</span> <span class="n">no_paren_current_date_sql</span><span class="p">,</span>
</span><span id="Postgres-456"><a href="#Postgres-456"><span class="linenos">456</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentTimestamp</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres-457"><a href="#Postgres-457"><span class="linenos">457</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentUser</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_USER&quot;</span><span class="p">,</span>
</span><span id="Postgres-458"><a href="#Postgres-458"><span class="linenos">458</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres-459"><a href="#Postgres-459"><span class="linenos">459</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres-460"><a href="#Postgres-460"><span class="linenos">460</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="n">datestrtodate_sql</span><span class="p">,</span>
</span><span id="Postgres-461"><a href="#Postgres-461"><span class="linenos">461</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">:</span> <span class="n">_datatype_sql</span><span class="p">,</span>
</span><span id="Postgres-462"><a href="#Postgres-462"><span class="linenos">462</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateSub</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">),</span>
</span><span id="Postgres-463"><a href="#Postgres-463"><span class="linenos">463</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;UNNEST&quot;</span><span class="p">),</span>
</span><span id="Postgres-464"><a href="#Postgres-464"><span class="linenos">464</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">GroupConcat</span><span class="p">:</span> <span class="n">_string_agg_sql</span><span class="p">,</span>
</span><span id="Postgres-465"><a href="#Postgres-465"><span class="linenos">465</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtract</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-466"><a href="#Postgres-466"><span class="linenos">466</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtractScalar</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH_TEXT&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-467"><a href="#Postgres-467"><span class="linenos">467</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtract</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-468"><a href="#Postgres-468"><span class="linenos">468</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtractScalar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres-469"><a href="#Postgres-469"><span class="linenos">469</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">),</span>
</span><span id="Postgres-470"><a href="#Postgres-470"><span class="linenos">470</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ParseJSON</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</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="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">)),</span>
</span><span id="Postgres-471"><a href="#Postgres-471"><span class="linenos">471</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathKey</span><span class="p">:</span> <span class="n">json_path_key_only_name</span><span class="p">,</span>
</span><span id="Postgres-472"><a href="#Postgres-472"><span class="linenos">472</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="Postgres-473"><a href="#Postgres-473"><span class="linenos">473</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathSubscript</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">json_path_part</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres-474"><a href="#Postgres-474"><span class="linenos">474</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LastDay</span><span class="p">:</span> <span class="n">no_last_day_sql</span><span class="p">,</span>
</span><span id="Postgres-475"><a href="#Postgres-475"><span class="linenos">475</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalOr</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_OR&quot;</span><span class="p">),</span>
</span><span id="Postgres-476"><a href="#Postgres-476"><span class="linenos">476</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalAnd</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_AND&quot;</span><span class="p">),</span>
</span><span id="Postgres-477"><a href="#Postgres-477"><span class="linenos">477</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">:</span> <span class="n">max_or_greatest</span><span class="p">,</span>
</span><span id="Postgres-478"><a href="#Postgres-478"><span class="linenos">478</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">MapFromEntries</span><span class="p">:</span> <span class="n">no_map_from_entries_sql</span><span class="p">,</span>
</span><span id="Postgres-479"><a href="#Postgres-479"><span class="linenos">479</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Min</span><span class="p">:</span> <span class="n">min_or_least</span><span class="p">,</span>
</span><span id="Postgres-480"><a href="#Postgres-480"><span class="linenos">480</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">:</span> <span class="n">merge_without_target_sql</span><span class="p">,</span>
</span><span id="Postgres-481"><a href="#Postgres-481"><span class="linenos">481</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;PARTITION BY </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Postgres-482"><a href="#Postgres-482"><span class="linenos">482</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres-483"><a href="#Postgres-483"><span class="linenos">483</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres-484"><a href="#Postgres-484"><span class="linenos">484</span></a> <span class="p">),</span>
</span><span id="Postgres-485"><a href="#Postgres-485"><span class="linenos">485</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres-486"><a href="#Postgres-486"><span class="linenos">486</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres-487"><a href="#Postgres-487"><span class="linenos">487</span></a> <span class="p">),</span>
</span><span id="Postgres-488"><a href="#Postgres-488"><span class="linenos">488</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pivot</span><span class="p">:</span> <span class="n">no_pivot_sql</span><span class="p">,</span>
</span><span id="Postgres-489"><a href="#Postgres-489"><span class="linenos">489</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pow</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;^&quot;</span><span class="p">),</span>
</span><span id="Postgres-490"><a href="#Postgres-490"><span class="linenos">490</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Rand</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;RANDOM&quot;</span><span class="p">),</span>
</span><span id="Postgres-491"><a href="#Postgres-491"><span class="linenos">491</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpLike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~&quot;</span><span class="p">),</span>
</span><span id="Postgres-492"><a href="#Postgres-492"><span class="linenos">492</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpILike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~*&quot;</span><span class="p">),</span>
</span><span id="Postgres-493"><a href="#Postgres-493"><span class="linenos">493</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres-494"><a href="#Postgres-494"><span class="linenos">494</span></a> <span class="p">[</span>
</span><span id="Postgres-495"><a href="#Postgres-495"><span class="linenos">495</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_semi_and_anti_joins</span><span class="p">,</span>
</span><span id="Postgres-496"><a href="#Postgres-496"><span class="linenos">496</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Postgres-497"><a href="#Postgres-497"><span class="linenos">497</span></a> <span class="p">]</span>
</span><span id="Postgres-498"><a href="#Postgres-498"><span class="linenos">498</span></a> <span class="p">),</span>
</span><span id="Postgres-499"><a href="#Postgres-499"><span class="linenos">499</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrPosition</span><span class="p">:</span> <span class="n">str_position_sql</span><span class="p">,</span>
</span><span id="Postgres-500"><a href="#Postgres-500"><span class="linenos">500</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres-501"><a href="#Postgres-501"><span class="linenos">501</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres-502"><a href="#Postgres-502"><span class="linenos">502</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StructExtract</span><span class="p">:</span> <span class="n">struct_extract_sql</span><span class="p">,</span>
</span><span id="Postgres-503"><a href="#Postgres-503"><span class="linenos">503</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">_substring_sql</span><span class="p">,</span>
</span><span id="Postgres-504"><a href="#Postgres-504"><span class="linenos">504</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIME&quot;</span><span class="p">),</span>
</span><span id="Postgres-505"><a href="#Postgres-505"><span class="linenos">505</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIMESTAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres-506"><a href="#Postgres-506"><span class="linenos">506</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampTrunc</span><span class="p">:</span> <span class="n">timestamptrunc_sql</span><span class="p">,</span>
</span><span id="Postgres-507"><a href="#Postgres-507"><span class="linenos">507</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeStrToTime</span><span class="p">:</span> <span class="n">timestrtotime_sql</span><span class="p">,</span>
</span><span id="Postgres-508"><a href="#Postgres-508"><span class="linenos">508</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres-509"><a href="#Postgres-509"><span class="linenos">509</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Postgres-510"><a href="#Postgres-510"><span class="linenos">510</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Postgres-511"><a href="#Postgres-511"><span class="linenos">511</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">:</span> <span class="n">no_trycast_sql</span><span class="p">,</span>
</span><span id="Postgres-512"><a href="#Postgres-512"><span class="linenos">512</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres-513"><a href="#Postgres-513"><span class="linenos">513</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres-514"><a href="#Postgres-514"><span class="linenos">514</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres-515"><a href="#Postgres-515"><span class="linenos">515</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToUnix</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Postgres-516"><a href="#Postgres-516"><span class="linenos">516</span></a> <span class="s2">&quot;DATE_PART&quot;</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">string</span><span class="p">(</span><span class="s2">&quot;epoch&quot;</span><span class="p">),</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres-517"><a href="#Postgres-517"><span class="linenos">517</span></a> <span class="p">),</span>
</span><span id="Postgres-518"><a href="#Postgres-518"><span class="linenos">518</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VariancePop</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_POP&quot;</span><span class="p">),</span>
</span><span id="Postgres-519"><a href="#Postgres-519"><span class="linenos">519</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Variance</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_SAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres-520"><a href="#Postgres-520"><span class="linenos">520</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Xor</span><span class="p">:</span> <span class="n">bool_xor_sql</span><span class="p">,</span>
</span><span id="Postgres-521"><a href="#Postgres-521"><span class="linenos">521</span></a> <span class="p">}</span>
</span><span id="Postgres-522"><a href="#Postgres-522"><span class="linenos">522</span></a>
</span><span id="Postgres-523"><a href="#Postgres-523"><span class="linenos">523</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres-524"><a href="#Postgres-524"><span class="linenos">524</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Postgres-525"><a href="#Postgres-525"><span class="linenos">525</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">POST_SCHEMA</span><span class="p">,</span>
</span><span id="Postgres-526"><a href="#Postgres-526"><span class="linenos">526</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TransientProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres-527"><a href="#Postgres-527"><span class="linenos">527</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres-528"><a href="#Postgres-528"><span class="linenos">528</span></a> <span class="p">}</span>
</span><span id="Postgres-529"><a href="#Postgres-529"><span class="linenos">529</span></a>
</span><span id="Postgres-530"><a href="#Postgres-530"><span class="linenos">530</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres-531"><a href="#Postgres-531"><span class="linenos">531</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Postgres-532"><a href="#Postgres-532"><span class="linenos">532</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="Postgres-533"><a href="#Postgres-533"><span class="linenos">533</span></a>
</span><span id="Postgres-534"><a href="#Postgres-534"><span class="linenos">534</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="Postgres-535"><a href="#Postgres-535"><span class="linenos">535</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="Postgres-536"><a href="#Postgres-536"><span class="linenos">536</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="Postgres-537"><a href="#Postgres-537"><span class="linenos">537</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres-538"><a href="#Postgres-538"><span class="linenos">538</span></a>
</span><span id="Postgres-539"><a href="#Postgres-539"><span class="linenos">539</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="Postgres-540"><a href="#Postgres-540"><span class="linenos">540</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="Postgres-541"><a href="#Postgres-541"><span class="linenos">541</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Postgres-542"><a href="#Postgres-542"><span class="linenos">542</span></a>
</span><span id="Postgres-543"><a href="#Postgres-543"><span class="linenos">543</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="Postgres-544"><a href="#Postgres-544"><span class="linenos">544</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="Postgres-545"><a href="#Postgres-545"><span class="linenos">545</span></a>
</span><span id="Postgres-546"><a href="#Postgres-546"><span class="linenos">546</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Postgres-547"><a href="#Postgres-547"><span class="linenos">547</span></a>
</span><span id="Postgres-548"><a href="#Postgres-548"><span class="linenos">548</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres-549"><a href="#Postgres-549"><span class="linenos">549</span></a>
</span><span id="Postgres-550"><a href="#Postgres-550"><span class="linenos">550</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres-551"><a href="#Postgres-551"><span class="linenos">551</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="Postgres-552"><a href="#Postgres-552"><span class="linenos">552</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="Postgres-553"><a href="#Postgres-553"><span class="linenos">553</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="Postgres-554"><a href="#Postgres-554"><span class="linenos">554</span></a>
</span><span id="Postgres-555"><a href="#Postgres-555"><span class="linenos">555</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres-556"><a href="#Postgres-556"><span class="linenos">556</span></a>
</span><span id="Postgres-557"><a href="#Postgres-557"><span class="linenos">557</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres-558"><a href="#Postgres-558"><span class="linenos">558</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Postgres-559"><a href="#Postgres-559"><span class="linenos">559</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="Postgres-560"><a href="#Postgres-560"><span class="linenos">560</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="Postgres-561"><a href="#Postgres-561"><span class="linenos">561</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
</span></pre></div>
@ -2188,6 +2190,7 @@ Default: 3</li>
<dd id="Postgres.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="../parser.html#Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
<dd id="Postgres.Parser.SUPPORTS_IMPLICIT_UNNEST" class="variable"><a href="../parser.html#Parser.SUPPORTS_IMPLICIT_UNNEST">SUPPORTS_IMPLICIT_UNNEST</a></dd>
<dd id="Postgres.Parser.INTERVAL_SPANS" class="variable"><a href="../parser.html#Parser.INTERVAL_SPANS">INTERVAL_SPANS</a></dd>
<dd id="Postgres.Parser.SUPPORTS_PARTITION_SELECTION" class="variable"><a href="../parser.html#Parser.SUPPORTS_PARTITION_SELECTION">SUPPORTS_PARTITION_SELECTION</a></dd>
<dd id="Postgres.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
<dd id="Postgres.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
<dd id="Postgres.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
@ -2248,132 +2251,133 @@ Default: 3</li>
</span><span id="Postgres.Generator-432"><a href="#Postgres.Generator-432"><span class="linenos">432</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DOUBLE</span><span class="p">:</span> <span class="s2">&quot;DOUBLE PRECISION&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-433"><a href="#Postgres.Generator-433"><span class="linenos">433</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">BINARY</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-434"><a href="#Postgres.Generator-434"><span class="linenos">434</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">VARBINARY</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-435"><a href="#Postgres.Generator-435"><span class="linenos">435</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-436"><a href="#Postgres.Generator-436"><span class="linenos">436</span></a> <span class="p">}</span>
</span><span id="Postgres.Generator-437"><a href="#Postgres.Generator-437"><span class="linenos">437</span></a>
</span><span id="Postgres.Generator-438"><a href="#Postgres.Generator-438"><span class="linenos">438</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres.Generator-439"><a href="#Postgres.Generator-439"><span class="linenos">439</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Postgres.Generator-440"><a href="#Postgres.Generator-440"><span class="linenos">440</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">AnyValue</span><span class="p">:</span> <span class="n">any_value_to_max_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-441"><a href="#Postgres.Generator-441"><span class="linenos">441</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="p">(</span>
</span><span id="Postgres.Generator-442"><a href="#Postgres.Generator-442"><span class="linenos">442</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Postgres.Generator-443"><a href="#Postgres.Generator-443"><span class="linenos">443</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq_get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="mi">0</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="Postgres.Generator-444"><a href="#Postgres.Generator-444"><span class="linenos">444</span></a> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="Postgres.Generator-445"><a href="#Postgres.Generator-445"><span class="linenos">445</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-446"><a href="#Postgres.Generator-446"><span class="linenos">446</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayConcat</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;ARRAY_CAT&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-447"><a href="#Postgres.Generator-447"><span class="linenos">447</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContained</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&lt;@&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-448"><a href="#Postgres.Generator-448"><span class="linenos">448</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;@&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-449"><a href="#Postgres.Generator-449"><span class="linenos">449</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayOverlaps</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&amp;&amp;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-450"><a href="#Postgres.Generator-450"><span class="linenos">450</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayFilter</span><span class="p">:</span> <span class="n">filter_array_using_unnest</span><span class="p">,</span>
</span><span id="Postgres.Generator-451"><a href="#Postgres.Generator-451"><span class="linenos">451</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;ARRAY_LENGTH&quot;</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="n">e</span><span class="o">.</span><span class="n">expression</span> <span class="ow">or</span> <span class="s2">&quot;1&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-452"><a href="#Postgres.Generator-452"><span class="linenos">452</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">BitwiseXor</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-453"><a href="#Postgres.Generator-453"><span class="linenos">453</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">_auto_increment_to_serial</span><span class="p">,</span> <span class="n">_serial_to_generated</span><span class="p">]),</span>
</span><span id="Postgres.Generator-454"><a href="#Postgres.Generator-454"><span class="linenos">454</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentDate</span><span class="p">:</span> <span class="n">no_paren_current_date_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-455"><a href="#Postgres.Generator-455"><span class="linenos">455</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentTimestamp</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-456"><a href="#Postgres.Generator-456"><span class="linenos">456</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentUser</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_USER&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-457"><a href="#Postgres.Generator-457"><span class="linenos">457</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-458"><a href="#Postgres.Generator-458"><span class="linenos">458</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-459"><a href="#Postgres.Generator-459"><span class="linenos">459</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="n">datestrtodate_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-460"><a href="#Postgres.Generator-460"><span class="linenos">460</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">:</span> <span class="n">_datatype_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-461"><a href="#Postgres.Generator-461"><span class="linenos">461</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateSub</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-462"><a href="#Postgres.Generator-462"><span class="linenos">462</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;UNNEST&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-463"><a href="#Postgres.Generator-463"><span class="linenos">463</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">GroupConcat</span><span class="p">:</span> <span class="n">_string_agg_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-464"><a href="#Postgres.Generator-464"><span class="linenos">464</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtract</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-465"><a href="#Postgres.Generator-465"><span class="linenos">465</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtractScalar</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH_TEXT&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-466"><a href="#Postgres.Generator-466"><span class="linenos">466</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtract</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-467"><a href="#Postgres.Generator-467"><span class="linenos">467</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtractScalar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-468"><a href="#Postgres.Generator-468"><span class="linenos">468</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-469"><a href="#Postgres.Generator-469"><span class="linenos">469</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ParseJSON</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</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="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">)),</span>
</span><span id="Postgres.Generator-470"><a href="#Postgres.Generator-470"><span class="linenos">470</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathKey</span><span class="p">:</span> <span class="n">json_path_key_only_name</span><span class="p">,</span>
</span><span id="Postgres.Generator-471"><a href="#Postgres.Generator-471"><span class="linenos">471</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-472"><a href="#Postgres.Generator-472"><span class="linenos">472</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathSubscript</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">json_path_part</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres.Generator-473"><a href="#Postgres.Generator-473"><span class="linenos">473</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LastDay</span><span class="p">:</span> <span class="n">no_last_day_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-474"><a href="#Postgres.Generator-474"><span class="linenos">474</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalOr</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_OR&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-475"><a href="#Postgres.Generator-475"><span class="linenos">475</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalAnd</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_AND&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-476"><a href="#Postgres.Generator-476"><span class="linenos">476</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">:</span> <span class="n">max_or_greatest</span><span class="p">,</span>
</span><span id="Postgres.Generator-477"><a href="#Postgres.Generator-477"><span class="linenos">477</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">MapFromEntries</span><span class="p">:</span> <span class="n">no_map_from_entries_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-478"><a href="#Postgres.Generator-478"><span class="linenos">478</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Min</span><span class="p">:</span> <span class="n">min_or_least</span><span class="p">,</span>
</span><span id="Postgres.Generator-479"><a href="#Postgres.Generator-479"><span class="linenos">479</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">:</span> <span class="n">merge_without_target_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-480"><a href="#Postgres.Generator-480"><span class="linenos">480</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;PARTITION BY </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-481"><a href="#Postgres.Generator-481"><span class="linenos">481</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres.Generator-482"><a href="#Postgres.Generator-482"><span class="linenos">482</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres.Generator-483"><a href="#Postgres.Generator-483"><span class="linenos">483</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-484"><a href="#Postgres.Generator-484"><span class="linenos">484</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres.Generator-485"><a href="#Postgres.Generator-485"><span class="linenos">485</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres.Generator-486"><a href="#Postgres.Generator-486"><span class="linenos">486</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-487"><a href="#Postgres.Generator-487"><span class="linenos">487</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pivot</span><span class="p">:</span> <span class="n">no_pivot_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-488"><a href="#Postgres.Generator-488"><span class="linenos">488</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pow</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;^&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-489"><a href="#Postgres.Generator-489"><span class="linenos">489</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Rand</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;RANDOM&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-490"><a href="#Postgres.Generator-490"><span class="linenos">490</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpLike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-491"><a href="#Postgres.Generator-491"><span class="linenos">491</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpILike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~*&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-492"><a href="#Postgres.Generator-492"><span class="linenos">492</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres.Generator-493"><a href="#Postgres.Generator-493"><span class="linenos">493</span></a> <span class="p">[</span>
</span><span id="Postgres.Generator-494"><a href="#Postgres.Generator-494"><span class="linenos">494</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_semi_and_anti_joins</span><span class="p">,</span>
</span><span id="Postgres.Generator-495"><a href="#Postgres.Generator-495"><span class="linenos">495</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Postgres.Generator-496"><a href="#Postgres.Generator-496"><span class="linenos">496</span></a> <span class="p">]</span>
</span><span id="Postgres.Generator-497"><a href="#Postgres.Generator-497"><span class="linenos">497</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-498"><a href="#Postgres.Generator-498"><span class="linenos">498</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrPosition</span><span class="p">:</span> <span class="n">str_position_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-499"><a href="#Postgres.Generator-499"><span class="linenos">499</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres.Generator-500"><a href="#Postgres.Generator-500"><span class="linenos">500</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres.Generator-501"><a href="#Postgres.Generator-501"><span class="linenos">501</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StructExtract</span><span class="p">:</span> <span class="n">struct_extract_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-502"><a href="#Postgres.Generator-502"><span class="linenos">502</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">_substring_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-503"><a href="#Postgres.Generator-503"><span class="linenos">503</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIME&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-504"><a href="#Postgres.Generator-504"><span class="linenos">504</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIMESTAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-505"><a href="#Postgres.Generator-505"><span class="linenos">505</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampTrunc</span><span class="p">:</span> <span class="n">timestamptrunc_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-506"><a href="#Postgres.Generator-506"><span class="linenos">506</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeStrToTime</span><span class="p">:</span> <span class="n">timestrtotime_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-507"><a href="#Postgres.Generator-507"><span class="linenos">507</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres.Generator-508"><a href="#Postgres.Generator-508"><span class="linenos">508</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Postgres.Generator-509"><a href="#Postgres.Generator-509"><span class="linenos">509</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-510"><a href="#Postgres.Generator-510"><span class="linenos">510</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">:</span> <span class="n">no_trycast_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-511"><a href="#Postgres.Generator-511"><span class="linenos">511</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-512"><a href="#Postgres.Generator-512"><span class="linenos">512</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-513"><a href="#Postgres.Generator-513"><span class="linenos">513</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres.Generator-514"><a href="#Postgres.Generator-514"><span class="linenos">514</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToUnix</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Postgres.Generator-515"><a href="#Postgres.Generator-515"><span class="linenos">515</span></a> <span class="s2">&quot;DATE_PART&quot;</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">string</span><span class="p">(</span><span class="s2">&quot;epoch&quot;</span><span class="p">),</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres.Generator-516"><a href="#Postgres.Generator-516"><span class="linenos">516</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-517"><a href="#Postgres.Generator-517"><span class="linenos">517</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VariancePop</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_POP&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-518"><a href="#Postgres.Generator-518"><span class="linenos">518</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Variance</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_SAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-519"><a href="#Postgres.Generator-519"><span class="linenos">519</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Xor</span><span class="p">:</span> <span class="n">bool_xor_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-520"><a href="#Postgres.Generator-520"><span class="linenos">520</span></a> <span class="p">}</span>
</span><span id="Postgres.Generator-521"><a href="#Postgres.Generator-521"><span class="linenos">521</span></a>
</span><span id="Postgres.Generator-522"><a href="#Postgres.Generator-522"><span class="linenos">522</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres.Generator-523"><a href="#Postgres.Generator-523"><span class="linenos">523</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Postgres.Generator-524"><a href="#Postgres.Generator-524"><span class="linenos">524</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">POST_SCHEMA</span><span class="p">,</span>
</span><span id="Postgres.Generator-525"><a href="#Postgres.Generator-525"><span class="linenos">525</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TransientProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres.Generator-526"><a href="#Postgres.Generator-526"><span class="linenos">526</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres.Generator-527"><a href="#Postgres.Generator-527"><span class="linenos">527</span></a> <span class="p">}</span>
</span><span id="Postgres.Generator-528"><a href="#Postgres.Generator-528"><span class="linenos">528</span></a>
</span><span id="Postgres.Generator-529"><a href="#Postgres.Generator-529"><span class="linenos">529</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator-530"><a href="#Postgres.Generator-530"><span class="linenos">530</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Postgres.Generator-531"><a href="#Postgres.Generator-531"><span class="linenos">531</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="Postgres.Generator-532"><a href="#Postgres.Generator-532"><span class="linenos">532</span></a>
</span><span id="Postgres.Generator-533"><a href="#Postgres.Generator-533"><span class="linenos">533</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="Postgres.Generator-534"><a href="#Postgres.Generator-534"><span class="linenos">534</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator-535"><a href="#Postgres.Generator-535"><span class="linenos">535</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="Postgres.Generator-536"><a href="#Postgres.Generator-536"><span class="linenos">536</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres.Generator-537"><a href="#Postgres.Generator-537"><span class="linenos">537</span></a>
</span><span id="Postgres.Generator-538"><a href="#Postgres.Generator-538"><span class="linenos">538</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="Postgres.Generator-539"><a href="#Postgres.Generator-539"><span class="linenos">539</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator-540"><a href="#Postgres.Generator-540"><span class="linenos">540</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Postgres.Generator-541"><a href="#Postgres.Generator-541"><span class="linenos">541</span></a>
</span><span id="Postgres.Generator-542"><a href="#Postgres.Generator-542"><span class="linenos">542</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator-543"><a href="#Postgres.Generator-543"><span class="linenos">543</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator-544"><a href="#Postgres.Generator-544"><span class="linenos">544</span></a>
</span><span id="Postgres.Generator-545"><a href="#Postgres.Generator-545"><span class="linenos">545</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Postgres.Generator-546"><a href="#Postgres.Generator-546"><span class="linenos">546</span></a>
</span><span id="Postgres.Generator-547"><a href="#Postgres.Generator-547"><span class="linenos">547</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres.Generator-548"><a href="#Postgres.Generator-548"><span class="linenos">548</span></a>
</span><span id="Postgres.Generator-549"><a href="#Postgres.Generator-549"><span class="linenos">549</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator-550"><a href="#Postgres.Generator-550"><span class="linenos">550</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="Postgres.Generator-551"><a href="#Postgres.Generator-551"><span class="linenos">551</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="Postgres.Generator-552"><a href="#Postgres.Generator-552"><span class="linenos">552</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="Postgres.Generator-553"><a href="#Postgres.Generator-553"><span class="linenos">553</span></a>
</span><span id="Postgres.Generator-554"><a href="#Postgres.Generator-554"><span class="linenos">554</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres.Generator-555"><a href="#Postgres.Generator-555"><span class="linenos">555</span></a>
</span><span id="Postgres.Generator-556"><a href="#Postgres.Generator-556"><span class="linenos">556</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator-557"><a href="#Postgres.Generator-557"><span class="linenos">557</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator-558"><a href="#Postgres.Generator-558"><span class="linenos">558</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="Postgres.Generator-559"><a href="#Postgres.Generator-559"><span class="linenos">559</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="Postgres.Generator-560"><a href="#Postgres.Generator-560"><span class="linenos">560</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
</span><span id="Postgres.Generator-435"><a href="#Postgres.Generator-435"><span class="linenos">435</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">ROWVERSION</span><span class="p">:</span> <span class="s2">&quot;BYTEA&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-436"><a href="#Postgres.Generator-436"><span class="linenos">436</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">DATETIME</span><span class="p">:</span> <span class="s2">&quot;TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-437"><a href="#Postgres.Generator-437"><span class="linenos">437</span></a> <span class="p">}</span>
</span><span id="Postgres.Generator-438"><a href="#Postgres.Generator-438"><span class="linenos">438</span></a>
</span><span id="Postgres.Generator-439"><a href="#Postgres.Generator-439"><span class="linenos">439</span></a> <span class="n">TRANSFORMS</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres.Generator-440"><a href="#Postgres.Generator-440"><span class="linenos">440</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="p">,</span>
</span><span id="Postgres.Generator-441"><a href="#Postgres.Generator-441"><span class="linenos">441</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">AnyValue</span><span class="p">:</span> <span class="n">any_value_to_max_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-442"><a href="#Postgres.Generator-442"><span class="linenos">442</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="p">(</span>
</span><span id="Postgres.Generator-443"><a href="#Postgres.Generator-443"><span class="linenos">443</span></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">(</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span id="Postgres.Generator-444"><a href="#Postgres.Generator-444"><span class="linenos">444</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq_get</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">expressions</span><span class="p">,</span> <span class="mi">0</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="Postgres.Generator-445"><a href="#Postgres.Generator-445"><span class="linenos">445</span></a> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">normalize_func</span><span class="p">(</span><span class="s1">&#39;ARRAY&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">expressions</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="si">}</span><span class="s2">]&quot;</span>
</span><span id="Postgres.Generator-446"><a href="#Postgres.Generator-446"><span class="linenos">446</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-447"><a href="#Postgres.Generator-447"><span class="linenos">447</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayConcat</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;ARRAY_CAT&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-448"><a href="#Postgres.Generator-448"><span class="linenos">448</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContained</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&lt;@&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-449"><a href="#Postgres.Generator-449"><span class="linenos">449</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;@&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-450"><a href="#Postgres.Generator-450"><span class="linenos">450</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayOverlaps</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;&amp;&amp;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-451"><a href="#Postgres.Generator-451"><span class="linenos">451</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayFilter</span><span class="p">:</span> <span class="n">filter_array_using_unnest</span><span class="p">,</span>
</span><span id="Postgres.Generator-452"><a href="#Postgres.Generator-452"><span class="linenos">452</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ArraySize</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;ARRAY_LENGTH&quot;</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="n">e</span><span class="o">.</span><span class="n">expression</span> <span class="ow">or</span> <span class="s2">&quot;1&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-453"><a href="#Postgres.Generator-453"><span class="linenos">453</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">BitwiseXor</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-454"><a href="#Postgres.Generator-454"><span class="linenos">454</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ColumnDef</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">([</span><span class="n">_auto_increment_to_serial</span><span class="p">,</span> <span class="n">_serial_to_generated</span><span class="p">]),</span>
</span><span id="Postgres.Generator-455"><a href="#Postgres.Generator-455"><span class="linenos">455</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentDate</span><span class="p">:</span> <span class="n">no_paren_current_date_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-456"><a href="#Postgres.Generator-456"><span class="linenos">456</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentTimestamp</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_TIMESTAMP&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-457"><a href="#Postgres.Generator-457"><span class="linenos">457</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">CurrentUser</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;CURRENT_USER&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-458"><a href="#Postgres.Generator-458"><span class="linenos">458</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-459"><a href="#Postgres.Generator-459"><span class="linenos">459</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-460"><a href="#Postgres.Generator-460"><span class="linenos">460</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateStrToDate</span><span class="p">:</span> <span class="n">datestrtodate_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-461"><a href="#Postgres.Generator-461"><span class="linenos">461</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="p">:</span> <span class="n">_datatype_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-462"><a href="#Postgres.Generator-462"><span class="linenos">462</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">DateSub</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-463"><a href="#Postgres.Generator-463"><span class="linenos">463</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;UNNEST&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-464"><a href="#Postgres.Generator-464"><span class="linenos">464</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">GroupConcat</span><span class="p">:</span> <span class="n">_string_agg_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-465"><a href="#Postgres.Generator-465"><span class="linenos">465</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtract</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-466"><a href="#Postgres.Generator-466"><span class="linenos">466</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONExtractScalar</span><span class="p">:</span> <span class="n">_json_extract_sql</span><span class="p">(</span><span class="s2">&quot;JSON_EXTRACT_PATH_TEXT&quot;</span><span class="p">,</span> <span class="s2">&quot;-&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-467"><a href="#Postgres.Generator-467"><span class="linenos">467</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtract</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-468"><a href="#Postgres.Generator-468"><span class="linenos">468</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBExtractScalar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;#&gt;&gt;&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-469"><a href="#Postgres.Generator-469"><span class="linenos">469</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONBContains</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;?&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-470"><a href="#Postgres.Generator-470"><span class="linenos">470</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ParseJSON</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</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="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">)),</span>
</span><span id="Postgres.Generator-471"><a href="#Postgres.Generator-471"><span class="linenos">471</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathKey</span><span class="p">:</span> <span class="n">json_path_key_only_name</span><span class="p">,</span>
</span><span id="Postgres.Generator-472"><a href="#Postgres.Generator-472"><span class="linenos">472</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathRoot</span><span class="p">:</span> <span class="k">lambda</span> <span class="o">*</span><span class="n">_</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-473"><a href="#Postgres.Generator-473"><span class="linenos">473</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">JSONPathSubscript</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">json_path_part</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres.Generator-474"><a href="#Postgres.Generator-474"><span class="linenos">474</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LastDay</span><span class="p">:</span> <span class="n">no_last_day_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-475"><a href="#Postgres.Generator-475"><span class="linenos">475</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalOr</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_OR&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-476"><a href="#Postgres.Generator-476"><span class="linenos">476</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">LogicalAnd</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;BOOL_AND&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-477"><a href="#Postgres.Generator-477"><span class="linenos">477</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">:</span> <span class="n">max_or_greatest</span><span class="p">,</span>
</span><span id="Postgres.Generator-478"><a href="#Postgres.Generator-478"><span class="linenos">478</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">MapFromEntries</span><span class="p">:</span> <span class="n">no_map_from_entries_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-479"><a href="#Postgres.Generator-479"><span class="linenos">479</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Min</span><span class="p">:</span> <span class="n">min_or_least</span><span class="p">,</span>
</span><span id="Postgres.Generator-480"><a href="#Postgres.Generator-480"><span class="linenos">480</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">:</span> <span class="n">merge_without_target_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-481"><a href="#Postgres.Generator-481"><span class="linenos">481</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;PARTITION BY </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;this&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span id="Postgres.Generator-482"><a href="#Postgres.Generator-482"><span class="linenos">482</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres.Generator-483"><a href="#Postgres.Generator-483"><span class="linenos">483</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres.Generator-484"><a href="#Postgres.Generator-484"><span class="linenos">484</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-485"><a href="#Postgres.Generator-485"><span class="linenos">485</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres.Generator-486"><a href="#Postgres.Generator-486"><span class="linenos">486</span></a> <span class="p">[</span><span class="n">transforms</span><span class="o">.</span><span class="n">add_within_group_for_percentiles</span><span class="p">]</span>
</span><span id="Postgres.Generator-487"><a href="#Postgres.Generator-487"><span class="linenos">487</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-488"><a href="#Postgres.Generator-488"><span class="linenos">488</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pivot</span><span class="p">:</span> <span class="n">no_pivot_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-489"><a href="#Postgres.Generator-489"><span class="linenos">489</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Pow</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;^&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-490"><a href="#Postgres.Generator-490"><span class="linenos">490</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Rand</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;RANDOM&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-491"><a href="#Postgres.Generator-491"><span class="linenos">491</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpLike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-492"><a href="#Postgres.Generator-492"><span class="linenos">492</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">RegexpILike</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;~*&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-493"><a href="#Postgres.Generator-493"><span class="linenos">493</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">:</span> <span class="n">transforms</span><span class="o">.</span><span class="n">preprocess</span><span class="p">(</span>
</span><span id="Postgres.Generator-494"><a href="#Postgres.Generator-494"><span class="linenos">494</span></a> <span class="p">[</span>
</span><span id="Postgres.Generator-495"><a href="#Postgres.Generator-495"><span class="linenos">495</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_semi_and_anti_joins</span><span class="p">,</span>
</span><span id="Postgres.Generator-496"><a href="#Postgres.Generator-496"><span class="linenos">496</span></a> <span class="n">transforms</span><span class="o">.</span><span class="n">eliminate_qualify</span><span class="p">,</span>
</span><span id="Postgres.Generator-497"><a href="#Postgres.Generator-497"><span class="linenos">497</span></a> <span class="p">]</span>
</span><span id="Postgres.Generator-498"><a href="#Postgres.Generator-498"><span class="linenos">498</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-499"><a href="#Postgres.Generator-499"><span class="linenos">499</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrPosition</span><span class="p">:</span> <span class="n">str_position_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-500"><a href="#Postgres.Generator-500"><span class="linenos">500</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToDate</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_DATE&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres.Generator-501"><a href="#Postgres.Generator-501"><span class="linenos">501</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StrToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres.Generator-502"><a href="#Postgres.Generator-502"><span class="linenos">502</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">StructExtract</span><span class="p">:</span> <span class="n">struct_extract_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-503"><a href="#Postgres.Generator-503"><span class="linenos">503</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Substring</span><span class="p">:</span> <span class="n">_substring_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-504"><a href="#Postgres.Generator-504"><span class="linenos">504</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIME&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-505"><a href="#Postgres.Generator-505"><span class="linenos">505</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampFromParts</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;MAKE_TIMESTAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-506"><a href="#Postgres.Generator-506"><span class="linenos">506</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimestampTrunc</span><span class="p">:</span> <span class="n">timestamptrunc_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-507"><a href="#Postgres.Generator-507"><span class="linenos">507</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeStrToTime</span><span class="p">:</span> <span class="n">timestrtotime_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-508"><a href="#Postgres.Generator-508"><span class="linenos">508</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToStr</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_CHAR&quot;</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="bp">self</span><span class="o">.</span><span class="n">format_time</span><span class="p">(</span><span class="n">e</span><span class="p">)),</span>
</span><span id="Postgres.Generator-509"><a href="#Postgres.Generator-509"><span class="linenos">509</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">ToChar</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">function_fallback_sql</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="Postgres.Generator-510"><a href="#Postgres.Generator-510"><span class="linenos">510</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Trim</span><span class="p">:</span> <span class="n">trim_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-511"><a href="#Postgres.Generator-511"><span class="linenos">511</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">:</span> <span class="n">no_trycast_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-512"><a href="#Postgres.Generator-512"><span class="linenos">512</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsAdd</span><span class="p">:</span> <span class="n">_date_add_sql</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-513"><a href="#Postgres.Generator-513"><span class="linenos">513</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TsOrDsDiff</span><span class="p">:</span> <span class="n">_date_diff_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-514"><a href="#Postgres.Generator-514"><span class="linenos">514</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">UnixToTime</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">&quot;TO_TIMESTAMP&quot;</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span><span class="p">),</span>
</span><span id="Postgres.Generator-515"><a href="#Postgres.Generator-515"><span class="linenos">515</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TimeToUnix</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">func</span><span class="p">(</span>
</span><span id="Postgres.Generator-516"><a href="#Postgres.Generator-516"><span class="linenos">516</span></a> <span class="s2">&quot;DATE_PART&quot;</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">string</span><span class="p">(</span><span class="s2">&quot;epoch&quot;</span><span class="p">),</span> <span class="n">e</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres.Generator-517"><a href="#Postgres.Generator-517"><span class="linenos">517</span></a> <span class="p">),</span>
</span><span id="Postgres.Generator-518"><a href="#Postgres.Generator-518"><span class="linenos">518</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VariancePop</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_POP&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-519"><a href="#Postgres.Generator-519"><span class="linenos">519</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Variance</span><span class="p">:</span> <span class="n">rename_func</span><span class="p">(</span><span class="s2">&quot;VAR_SAMP&quot;</span><span class="p">),</span>
</span><span id="Postgres.Generator-520"><a href="#Postgres.Generator-520"><span class="linenos">520</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">Xor</span><span class="p">:</span> <span class="n">bool_xor_sql</span><span class="p">,</span>
</span><span id="Postgres.Generator-521"><a href="#Postgres.Generator-521"><span class="linenos">521</span></a> <span class="p">}</span>
</span><span id="Postgres.Generator-522"><a href="#Postgres.Generator-522"><span class="linenos">522</span></a>
</span><span id="Postgres.Generator-523"><a href="#Postgres.Generator-523"><span class="linenos">523</span></a> <span class="n">PROPERTIES_LOCATION</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="Postgres.Generator-524"><a href="#Postgres.Generator-524"><span class="linenos">524</span></a> <span class="o">**</span><span class="n">generator</span><span class="o">.</span><span class="n">Generator</span><span class="o">.</span><span class="n">PROPERTIES_LOCATION</span><span class="p">,</span>
</span><span id="Postgres.Generator-525"><a href="#Postgres.Generator-525"><span class="linenos">525</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">PartitionedByProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">POST_SCHEMA</span><span class="p">,</span>
</span><span id="Postgres.Generator-526"><a href="#Postgres.Generator-526"><span class="linenos">526</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">TransientProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres.Generator-527"><a href="#Postgres.Generator-527"><span class="linenos">527</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">VolatileProperty</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Properties</span><span class="o">.</span><span class="n">Location</span><span class="o">.</span><span class="n">UNSUPPORTED</span><span class="p">,</span>
</span><span id="Postgres.Generator-528"><a href="#Postgres.Generator-528"><span class="linenos">528</span></a> <span class="p">}</span>
</span><span id="Postgres.Generator-529"><a href="#Postgres.Generator-529"><span class="linenos">529</span></a>
</span><span id="Postgres.Generator-530"><a href="#Postgres.Generator-530"><span class="linenos">530</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator-531"><a href="#Postgres.Generator-531"><span class="linenos">531</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Postgres.Generator-532"><a href="#Postgres.Generator-532"><span class="linenos">532</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="Postgres.Generator-533"><a href="#Postgres.Generator-533"><span class="linenos">533</span></a>
</span><span id="Postgres.Generator-534"><a href="#Postgres.Generator-534"><span class="linenos">534</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="Postgres.Generator-535"><a href="#Postgres.Generator-535"><span class="linenos">535</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator-536"><a href="#Postgres.Generator-536"><span class="linenos">536</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="Postgres.Generator-537"><a href="#Postgres.Generator-537"><span class="linenos">537</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres.Generator-538"><a href="#Postgres.Generator-538"><span class="linenos">538</span></a>
</span><span id="Postgres.Generator-539"><a href="#Postgres.Generator-539"><span class="linenos">539</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="Postgres.Generator-540"><a href="#Postgres.Generator-540"><span class="linenos">540</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator-541"><a href="#Postgres.Generator-541"><span class="linenos">541</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Postgres.Generator-542"><a href="#Postgres.Generator-542"><span class="linenos">542</span></a>
</span><span id="Postgres.Generator-543"><a href="#Postgres.Generator-543"><span class="linenos">543</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator-544"><a href="#Postgres.Generator-544"><span class="linenos">544</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator-545"><a href="#Postgres.Generator-545"><span class="linenos">545</span></a>
</span><span id="Postgres.Generator-546"><a href="#Postgres.Generator-546"><span class="linenos">546</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Postgres.Generator-547"><a href="#Postgres.Generator-547"><span class="linenos">547</span></a>
</span><span id="Postgres.Generator-548"><a href="#Postgres.Generator-548"><span class="linenos">548</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres.Generator-549"><a href="#Postgres.Generator-549"><span class="linenos">549</span></a>
</span><span id="Postgres.Generator-550"><a href="#Postgres.Generator-550"><span class="linenos">550</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator-551"><a href="#Postgres.Generator-551"><span class="linenos">551</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="Postgres.Generator-552"><a href="#Postgres.Generator-552"><span class="linenos">552</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="Postgres.Generator-553"><a href="#Postgres.Generator-553"><span class="linenos">553</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="Postgres.Generator-554"><a href="#Postgres.Generator-554"><span class="linenos">554</span></a>
</span><span id="Postgres.Generator-555"><a href="#Postgres.Generator-555"><span class="linenos">555</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span><span id="Postgres.Generator-556"><a href="#Postgres.Generator-556"><span class="linenos">556</span></a>
</span><span id="Postgres.Generator-557"><a href="#Postgres.Generator-557"><span class="linenos">557</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator-558"><a href="#Postgres.Generator-558"><span class="linenos">558</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator-559"><a href="#Postgres.Generator-559"><span class="linenos">559</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="Postgres.Generator-560"><a href="#Postgres.Generator-560"><span class="linenos">560</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="Postgres.Generator-561"><a href="#Postgres.Generator-561"><span class="linenos">561</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
</span></pre></div>
@ -2614,7 +2618,7 @@ Default: True</li>
<div class="attr variable">
<span class="name">SUPPORTED_JSON_PATH_PARTS</span> =
<input id="Postgres.Generator.SUPPORTED_JSON_PATH_PARTS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="Postgres.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{&lt;class &#39;<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>&#39;&gt;}</span>
<label class="view-value-button pdoc-button" for="Postgres.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{&lt;class &#39;<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>&#39;&gt;}</span>
</div>
@ -2627,7 +2631,7 @@ Default: True</li>
<div class="attr variable">
<span class="name">TYPE_MAPPING</span> =
<input id="Postgres.Generator.TYPE_MAPPING-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="Postgres.Generator.TYPE_MAPPING-view-value"></label><span class="default_value">{&lt;Type.NCHAR: &#39;NCHAR&#39;&gt;: &#39;CHAR&#39;, &lt;Type.NVARCHAR: &#39;NVARCHAR&#39;&gt;: &#39;VARCHAR&#39;, &lt;Type.MEDIUMTEXT: &#39;MEDIUMTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.LONGTEXT: &#39;LONGTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.TINYTEXT: &#39;TINYTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.MEDIUMBLOB: &#39;MEDIUMBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.LONGBLOB: &#39;LONGBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.TINYBLOB: &#39;TINYBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.INET: &#39;INET&#39;&gt;: &#39;INET&#39;, &lt;Type.TINYINT: &#39;TINYINT&#39;&gt;: &#39;SMALLINT&#39;, &lt;Type.FLOAT: &#39;FLOAT&#39;&gt;: &#39;REAL&#39;, &lt;Type.DOUBLE: &#39;DOUBLE&#39;&gt;: &#39;DOUBLE PRECISION&#39;, &lt;Type.BINARY: &#39;BINARY&#39;&gt;: &#39;BYTEA&#39;, &lt;Type.VARBINARY: &#39;VARBINARY&#39;&gt;: &#39;BYTEA&#39;, &lt;Type.DATETIME: &#39;DATETIME&#39;&gt;: &#39;TIMESTAMP&#39;}</span>
<label class="view-value-button pdoc-button" for="Postgres.Generator.TYPE_MAPPING-view-value"></label><span class="default_value">{&lt;Type.NCHAR: &#39;NCHAR&#39;&gt;: &#39;CHAR&#39;, &lt;Type.NVARCHAR: &#39;NVARCHAR&#39;&gt;: &#39;VARCHAR&#39;, &lt;Type.MEDIUMTEXT: &#39;MEDIUMTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.LONGTEXT: &#39;LONGTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.TINYTEXT: &#39;TINYTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.MEDIUMBLOB: &#39;MEDIUMBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.LONGBLOB: &#39;LONGBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.TINYBLOB: &#39;TINYBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.INET: &#39;INET&#39;&gt;: &#39;INET&#39;, &lt;Type.ROWVERSION: &#39;ROWVERSION&#39;&gt;: &#39;BYTEA&#39;, &lt;Type.TINYINT: &#39;TINYINT&#39;&gt;: &#39;SMALLINT&#39;, &lt;Type.FLOAT: &#39;FLOAT&#39;&gt;: &#39;REAL&#39;, &lt;Type.DOUBLE: &#39;DOUBLE&#39;&gt;: &#39;DOUBLE PRECISION&#39;, &lt;Type.BINARY: &#39;BINARY&#39;&gt;: &#39;BYTEA&#39;, &lt;Type.VARBINARY: &#39;VARBINARY&#39;&gt;: &#39;BYTEA&#39;, &lt;Type.DATETIME: &#39;DATETIME&#39;&gt;: &#39;TIMESTAMP&#39;}</span>
</div>
@ -2673,25 +2677,25 @@ Default: True</li>
</div>
<a class="headerlink" href="#Postgres.Generator.unnest_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Postgres.Generator.unnest_sql-529"><a href="#Postgres.Generator.unnest_sql-529"><span class="linenos">529</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator.unnest_sql-530"><a href="#Postgres.Generator.unnest_sql-530"><span class="linenos">530</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Postgres.Generator.unnest_sql-531"><a href="#Postgres.Generator.unnest_sql-531"><span class="linenos">531</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="Postgres.Generator.unnest_sql-532"><a href="#Postgres.Generator.unnest_sql-532"><span class="linenos">532</span></a>
</span><span id="Postgres.Generator.unnest_sql-533"><a href="#Postgres.Generator.unnest_sql-533"><span class="linenos">533</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="Postgres.Generator.unnest_sql-534"><a href="#Postgres.Generator.unnest_sql-534"><span class="linenos">534</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator.unnest_sql-535"><a href="#Postgres.Generator.unnest_sql-535"><span class="linenos">535</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="Postgres.Generator.unnest_sql-536"><a href="#Postgres.Generator.unnest_sql-536"><span class="linenos">536</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres.Generator.unnest_sql-537"><a href="#Postgres.Generator.unnest_sql-537"><span class="linenos">537</span></a>
</span><span id="Postgres.Generator.unnest_sql-538"><a href="#Postgres.Generator.unnest_sql-538"><span class="linenos">538</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="Postgres.Generator.unnest_sql-539"><a href="#Postgres.Generator.unnest_sql-539"><span class="linenos">539</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator.unnest_sql-540"><a href="#Postgres.Generator.unnest_sql-540"><span class="linenos">540</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Postgres.Generator.unnest_sql-541"><a href="#Postgres.Generator.unnest_sql-541"><span class="linenos">541</span></a>
</span><span id="Postgres.Generator.unnest_sql-542"><a href="#Postgres.Generator.unnest_sql-542"><span class="linenos">542</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator.unnest_sql-543"><a href="#Postgres.Generator.unnest_sql-543"><span class="linenos">543</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator.unnest_sql-544"><a href="#Postgres.Generator.unnest_sql-544"><span class="linenos">544</span></a>
</span><span id="Postgres.Generator.unnest_sql-545"><a href="#Postgres.Generator.unnest_sql-545"><span class="linenos">545</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Postgres.Generator.unnest_sql-546"><a href="#Postgres.Generator.unnest_sql-546"><span class="linenos">546</span></a>
</span><span id="Postgres.Generator.unnest_sql-547"><a href="#Postgres.Generator.unnest_sql-547"><span class="linenos">547</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="Postgres.Generator.unnest_sql-530"><a href="#Postgres.Generator.unnest_sql-530"><span class="linenos">530</span></a> <span class="k">def</span> <span class="nf">unnest_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">Unnest</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator.unnest_sql-531"><a href="#Postgres.Generator.unnest_sql-531"><span class="linenos">531</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Postgres.Generator.unnest_sql-532"><a href="#Postgres.Generator.unnest_sql-532"><span class="linenos">532</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="Postgres.Generator.unnest_sql-533"><a href="#Postgres.Generator.unnest_sql-533"><span class="linenos">533</span></a>
</span><span id="Postgres.Generator.unnest_sql-534"><a href="#Postgres.Generator.unnest_sql-534"><span class="linenos">534</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">annotate_types</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="Postgres.Generator.unnest_sql-535"><a href="#Postgres.Generator.unnest_sql-535"><span class="linenos">535</span></a> <span class="k">if</span> <span class="n">this</span><span class="o">.</span><span class="n">is_type</span><span class="p">(</span><span class="s2">&quot;array&lt;json&gt;&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator.unnest_sql-536"><a href="#Postgres.Generator.unnest_sql-536"><span class="linenos">536</span></a> <span class="k">while</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">):</span>
</span><span id="Postgres.Generator.unnest_sql-537"><a href="#Postgres.Generator.unnest_sql-537"><span class="linenos">537</span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span><span class="o">.</span><span class="n">this</span>
</span><span id="Postgres.Generator.unnest_sql-538"><a href="#Postgres.Generator.unnest_sql-538"><span class="linenos">538</span></a>
</span><span id="Postgres.Generator.unnest_sql-539"><a href="#Postgres.Generator.unnest_sql-539"><span class="linenos">539</span></a> <span class="n">arg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">Type</span><span class="o">.</span><span class="n">JSON</span><span class="p">))</span>
</span><span id="Postgres.Generator.unnest_sql-540"><a href="#Postgres.Generator.unnest_sql-540"><span class="linenos">540</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator.unnest_sql-541"><a href="#Postgres.Generator.unnest_sql-541"><span class="linenos">541</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot; AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">alias</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
</span><span id="Postgres.Generator.unnest_sql-542"><a href="#Postgres.Generator.unnest_sql-542"><span class="linenos">542</span></a>
</span><span id="Postgres.Generator.unnest_sql-543"><a href="#Postgres.Generator.unnest_sql-543"><span class="linenos">543</span></a> <span class="k">if</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;offset&quot;</span><span class="p">):</span>
</span><span id="Postgres.Generator.unnest_sql-544"><a href="#Postgres.Generator.unnest_sql-544"><span class="linenos">544</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">unsupported</span><span class="p">(</span><span class="s2">&quot;Unsupported JSON_ARRAY_ELEMENTS with offset&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator.unnest_sql-545"><a href="#Postgres.Generator.unnest_sql-545"><span class="linenos">545</span></a>
</span><span id="Postgres.Generator.unnest_sql-546"><a href="#Postgres.Generator.unnest_sql-546"><span class="linenos">546</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;JSON_ARRAY_ELEMENTS(</span><span class="si">{</span><span class="n">arg</span><span class="si">}</span><span class="s2">)</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="Postgres.Generator.unnest_sql-547"><a href="#Postgres.Generator.unnest_sql-547"><span class="linenos">547</span></a>
</span><span id="Postgres.Generator.unnest_sql-548"><a href="#Postgres.Generator.unnest_sql-548"><span class="linenos">548</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">unnest_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span></pre></div>
@ -2709,12 +2713,12 @@ Default: True</li>
</div>
<a class="headerlink" href="#Postgres.Generator.bracket_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Postgres.Generator.bracket_sql-549"><a href="#Postgres.Generator.bracket_sql-549"><span class="linenos">549</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator.bracket_sql-550"><a href="#Postgres.Generator.bracket_sql-550"><span class="linenos">550</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="Postgres.Generator.bracket_sql-551"><a href="#Postgres.Generator.bracket_sql-551"><span class="linenos">551</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="Postgres.Generator.bracket_sql-552"><a href="#Postgres.Generator.bracket_sql-552"><span class="linenos">552</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="Postgres.Generator.bracket_sql-553"><a href="#Postgres.Generator.bracket_sql-553"><span class="linenos">553</span></a>
</span><span id="Postgres.Generator.bracket_sql-554"><a href="#Postgres.Generator.bracket_sql-554"><span class="linenos">554</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="Postgres.Generator.bracket_sql-550"><a href="#Postgres.Generator.bracket_sql-550"><span class="linenos">550</span></a> <span class="k">def</span> <span class="nf">bracket_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">Bracket</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator.bracket_sql-551"><a href="#Postgres.Generator.bracket_sql-551"><span class="linenos">551</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Forms like ARRAY[1, 2, 3][3] aren&#39;t allowed; we need to wrap the ARRAY.&quot;&quot;&quot;</span>
</span><span id="Postgres.Generator.bracket_sql-552"><a href="#Postgres.Generator.bracket_sql-552"><span class="linenos">552</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Array</span><span class="p">):</span>
</span><span id="Postgres.Generator.bracket_sql-553"><a href="#Postgres.Generator.bracket_sql-553"><span class="linenos">553</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;this&quot;</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">paren</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</span><span id="Postgres.Generator.bracket_sql-554"><a href="#Postgres.Generator.bracket_sql-554"><span class="linenos">554</span></a>
</span><span id="Postgres.Generator.bracket_sql-555"><a href="#Postgres.Generator.bracket_sql-555"><span class="linenos">555</span></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">bracket_sql</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
</span></pre></div>
@ -2734,11 +2738,11 @@ Default: True</li>
</div>
<a class="headerlink" href="#Postgres.Generator.matchagainst_sql"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="Postgres.Generator.matchagainst_sql-556"><a href="#Postgres.Generator.matchagainst_sql-556"><span class="linenos">556</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator.matchagainst_sql-557"><a href="#Postgres.Generator.matchagainst_sql-557"><span class="linenos">557</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator.matchagainst_sql-558"><a href="#Postgres.Generator.matchagainst_sql-558"><span class="linenos">558</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="Postgres.Generator.matchagainst_sql-559"><a href="#Postgres.Generator.matchagainst_sql-559"><span class="linenos">559</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="Postgres.Generator.matchagainst_sql-560"><a href="#Postgres.Generator.matchagainst_sql-560"><span class="linenos">560</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="Postgres.Generator.matchagainst_sql-557"><a href="#Postgres.Generator.matchagainst_sql-557"><span class="linenos">557</span></a> <span class="k">def</span> <span class="nf">matchagainst_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">MatchAgainst</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="Postgres.Generator.matchagainst_sql-558"><a href="#Postgres.Generator.matchagainst_sql-558"><span class="linenos">558</span></a> <span class="n">this</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="s2">&quot;this&quot;</span><span class="p">)</span>
</span><span id="Postgres.Generator.matchagainst_sql-559"><a href="#Postgres.Generator.matchagainst_sql-559"><span class="linenos">559</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">sql</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> @@ </span><span class="si">{</span><span class="n">this</span><span class="si">}</span><span class="s2">&quot;</span> <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 class="p">]</span>
</span><span id="Postgres.Generator.matchagainst_sql-560"><a href="#Postgres.Generator.matchagainst_sql-560"><span class="linenos">560</span></a> <span class="n">sql</span> <span class="o">=</span> <span class="s2">&quot; OR &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span>
</span><span id="Postgres.Generator.matchagainst_sql-561"><a href="#Postgres.Generator.matchagainst_sql-561"><span class="linenos">561</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;(</span><span class="si">{</span><span class="n">sql</span><span class="si">}</span><span class="s2">)&quot;</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">expressions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">sql</span>
</span></pre></div>
@ -2857,6 +2861,7 @@ Default: True</li>
<dd id="Postgres.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Postgres.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Postgres.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Postgres.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Postgres.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Postgres.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Postgres.Generator.columndef_sql" class="function"><a href="../generator.html#Generator.columndef_sql">columndef_sql</a></dd>
@ -3108,7 +3113,7 @@ Default: True</li>
<dd id="Postgres.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Postgres.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Postgres.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Postgres.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Postgres.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Postgres.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Postgres.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Postgres.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>

File diff suppressed because one or more lines are too long

View file

@ -215,99 +215,114 @@
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="s2">&quot;SORT&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_order_by</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="p">}</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">def</span> <span class="nf">_parse_equality</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">eq</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_tokens</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_comparison</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">EQUALITY</span><span class="p">)</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">NEQ</span><span class="p">)):</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">return</span> <span class="n">eq</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">query</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="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</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-70"><a href="#L-70"><span class="linenos"> 70</span></a>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="k">return</span> <span class="n">query</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="c1"># https://prql-lang.org/book/reference/spec/null.html</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</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">Null</span><span class="p">):</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="n">is_exp</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="k">return</span> <span class="n">is_exp</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">is_exp</span><span class="p">)</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Null</span><span class="p">):</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="n">is_exp</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="k">return</span> <span class="n">is_exp</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">is_exp</span><span class="p">)</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="k">return</span> <span class="n">eq</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</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">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</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">expression</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</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="n">projections</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</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="k">else</span> <span class="n">select</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="p">}</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</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="nb">isinstance</span><span class="p">(</span><span class="n">s</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-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><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">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="p">]</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</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-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">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</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="o">=</span> <span class="kc">None</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;nulls_first&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">return</span> <span class="n">term</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</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">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</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">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</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-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">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">return</span> <span class="bp">self</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">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">return</span> <span class="kc">None</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="n">query</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="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</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-84"><a href="#L-84"><span class="linenos"> 84</span></a>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">return</span> <span class="n">query</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</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="k">else</span> <span class="n">select</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="p">}</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</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-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="p">)</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="p">]</span>
</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="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</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-116"><a href="#L-116"><span class="linenos">116</span></a>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</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="o">=</span> <span class="kc">None</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;nulls_first&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="n">term</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</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">Optional</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-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">return</span> <span class="kc">None</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="p">)</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</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">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</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-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 class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">return</span> <span class="bp">self</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">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">parse_partition</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="p">)</span>
</span></pre></div>
@ -367,99 +382,114 @@
</span><span id="PRQL-56"><a href="#PRQL-56"><span class="linenos"> 56</span></a> <span class="s2">&quot;SORT&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_order_by</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
</span><span id="PRQL-57"><a href="#PRQL-57"><span class="linenos"> 57</span></a> <span class="p">}</span>
</span><span id="PRQL-58"><a href="#PRQL-58"><span class="linenos"> 58</span></a>
</span><span id="PRQL-59"><a href="#PRQL-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL-60"><a href="#PRQL-60"><span class="linenos"> 60</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL-61"><a href="#PRQL-61"><span class="linenos"> 61</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
</span><span id="PRQL-62"><a href="#PRQL-62"><span class="linenos"> 62</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="PRQL-59"><a href="#PRQL-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">_parse_equality</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL-60"><a href="#PRQL-60"><span class="linenos"> 60</span></a> <span class="n">eq</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_tokens</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_comparison</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">EQUALITY</span><span class="p">)</span>
</span><span id="PRQL-61"><a href="#PRQL-61"><span class="linenos"> 61</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">NEQ</span><span class="p">)):</span>
</span><span id="PRQL-62"><a href="#PRQL-62"><span class="linenos"> 62</span></a> <span class="k">return</span> <span class="n">eq</span>
</span><span id="PRQL-63"><a href="#PRQL-63"><span class="linenos"> 63</span></a>
</span><span id="PRQL-64"><a href="#PRQL-64"><span class="linenos"> 64</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL-65"><a href="#PRQL-65"><span class="linenos"> 65</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
</span><span id="PRQL-66"><a href="#PRQL-66"><span class="linenos"> 66</span></a>
</span><span id="PRQL-67"><a href="#PRQL-67"><span class="linenos"> 67</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
</span><span id="PRQL-68"><a href="#PRQL-68"><span class="linenos"> 68</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL-69"><a href="#PRQL-69"><span class="linenos"> 69</span></a>
</span><span id="PRQL-70"><a href="#PRQL-70"><span class="linenos"> 70</span></a> <span class="n">query</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="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</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="PRQL-71"><a href="#PRQL-71"><span class="linenos"> 71</span></a>
</span><span id="PRQL-72"><a href="#PRQL-72"><span class="linenos"> 72</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
</span><span id="PRQL-73"><a href="#PRQL-73"><span class="linenos"> 73</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
</span><span id="PRQL-74"><a href="#PRQL-74"><span class="linenos"> 74</span></a>
</span><span id="PRQL-75"><a href="#PRQL-75"><span class="linenos"> 75</span></a> <span class="k">return</span> <span class="n">query</span>
</span><span id="PRQL-76"><a href="#PRQL-76"><span class="linenos"> 76</span></a>
</span><span id="PRQL-77"><a href="#PRQL-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
</span><span id="PRQL-78"><a href="#PRQL-78"><span class="linenos"> 78</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
</span><span id="PRQL-79"><a href="#PRQL-79"><span class="linenos"> 79</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
</span><span id="PRQL-64"><a href="#PRQL-64"><span class="linenos"> 64</span></a> <span class="c1"># https://prql-lang.org/book/reference/spec/null.html</span>
</span><span id="PRQL-65"><a href="#PRQL-65"><span class="linenos"> 65</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</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">Null</span><span class="p">):</span>
</span><span id="PRQL-66"><a href="#PRQL-66"><span class="linenos"> 66</span></a> <span class="n">is_exp</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
</span><span id="PRQL-67"><a href="#PRQL-67"><span class="linenos"> 67</span></a> <span class="k">return</span> <span class="n">is_exp</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">is_exp</span><span class="p">)</span>
</span><span id="PRQL-68"><a href="#PRQL-68"><span class="linenos"> 68</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Null</span><span class="p">):</span>
</span><span id="PRQL-69"><a href="#PRQL-69"><span class="linenos"> 69</span></a> <span class="n">is_exp</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
</span><span id="PRQL-70"><a href="#PRQL-70"><span class="linenos"> 70</span></a> <span class="k">return</span> <span class="n">is_exp</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">is_exp</span><span class="p">)</span>
</span><span id="PRQL-71"><a href="#PRQL-71"><span class="linenos"> 71</span></a> <span class="k">return</span> <span class="n">eq</span>
</span><span id="PRQL-72"><a href="#PRQL-72"><span class="linenos"> 72</span></a>
</span><span id="PRQL-73"><a href="#PRQL-73"><span class="linenos"> 73</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL-74"><a href="#PRQL-74"><span class="linenos"> 74</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL-75"><a href="#PRQL-75"><span class="linenos"> 75</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
</span><span id="PRQL-76"><a href="#PRQL-76"><span class="linenos"> 76</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="PRQL-77"><a href="#PRQL-77"><span class="linenos"> 77</span></a>
</span><span id="PRQL-78"><a href="#PRQL-78"><span class="linenos"> 78</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL-79"><a href="#PRQL-79"><span class="linenos"> 79</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
</span><span id="PRQL-80"><a href="#PRQL-80"><span class="linenos"> 80</span></a>
</span><span id="PRQL-81"><a href="#PRQL-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
</span><span id="PRQL-82"><a href="#PRQL-82"><span class="linenos"> 82</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL-83"><a href="#PRQL-83"><span class="linenos"> 83</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="PRQL-84"><a href="#PRQL-84"><span class="linenos"> 84</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL-85"><a href="#PRQL-85"><span class="linenos"> 85</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
</span><span id="PRQL-86"><a href="#PRQL-86"><span class="linenos"> 86</span></a>
</span><span id="PRQL-87"><a href="#PRQL-87"><span class="linenos"> 87</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="PRQL-88"><a href="#PRQL-88"><span class="linenos"> 88</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</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="k">else</span> <span class="n">select</span>
</span><span id="PRQL-89"><a href="#PRQL-89"><span class="linenos"> 89</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
</span><span id="PRQL-90"><a href="#PRQL-90"><span class="linenos"> 90</span></a> <span class="p">}</span>
</span><span id="PRQL-91"><a href="#PRQL-91"><span class="linenos"> 91</span></a>
</span><span id="PRQL-92"><a href="#PRQL-92"><span class="linenos"> 92</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="PRQL-93"><a href="#PRQL-93"><span class="linenos"> 93</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="PRQL-94"><a href="#PRQL-94"><span class="linenos"> 94</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
</span><span id="PRQL-95"><a href="#PRQL-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</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="PRQL-96"><a href="#PRQL-96"><span class="linenos"> 96</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
</span><span id="PRQL-97"><a href="#PRQL-97"><span class="linenos"> 97</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-98"><a href="#PRQL-98"><span class="linenos"> 98</span></a> <span class="p">)</span>
</span><span id="PRQL-99"><a href="#PRQL-99"><span class="linenos"> 99</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
</span><span id="PRQL-100"><a href="#PRQL-100"><span class="linenos">100</span></a> <span class="p">]</span>
</span><span id="PRQL-101"><a href="#PRQL-101"><span class="linenos">101</span></a>
</span><span id="PRQL-102"><a href="#PRQL-102"><span class="linenos">102</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</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="PRQL-103"><a href="#PRQL-103"><span class="linenos">103</span></a>
</span><span id="PRQL-104"><a href="#PRQL-104"><span class="linenos">104</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL-105"><a href="#PRQL-105"><span class="linenos">105</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
</span><span id="PRQL-106"><a href="#PRQL-106"><span class="linenos">106</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="PRQL-107"><a href="#PRQL-107"><span class="linenos">107</span></a>
</span><span id="PRQL-108"><a href="#PRQL-108"><span class="linenos">108</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
</span><span id="PRQL-109"><a href="#PRQL-109"><span class="linenos">109</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</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="o">=</span> <span class="kc">None</span>
</span><span id="PRQL-110"><a href="#PRQL-110"><span class="linenos">110</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
</span><span id="PRQL-111"><a href="#PRQL-111"><span class="linenos">111</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
</span><span id="PRQL-112"><a href="#PRQL-112"><span class="linenos">112</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL-113"><a href="#PRQL-113"><span class="linenos">113</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
</span><span id="PRQL-114"><a href="#PRQL-114"><span class="linenos">114</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
</span><span id="PRQL-115"><a href="#PRQL-115"><span class="linenos">115</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL-116"><a href="#PRQL-116"><span class="linenos">116</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;nulls_first&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL-117"><a href="#PRQL-117"><span class="linenos">117</span></a> <span class="k">return</span> <span class="n">term</span>
</span><span id="PRQL-118"><a href="#PRQL-118"><span class="linenos">118</span></a>
</span><span id="PRQL-119"><a href="#PRQL-119"><span class="linenos">119</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL-120"><a href="#PRQL-120"><span class="linenos">120</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
</span><span id="PRQL-121"><a href="#PRQL-121"><span class="linenos">121</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
</span><span id="PRQL-122"><a href="#PRQL-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
</span><span id="PRQL-123"><a href="#PRQL-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL-124"><a href="#PRQL-124"><span class="linenos">124</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</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">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</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="PRQL-125"><a href="#PRQL-125"><span class="linenos">125</span></a>
</span><span id="PRQL-126"><a href="#PRQL-126"><span class="linenos">126</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL-127"><a href="#PRQL-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
</span><span id="PRQL-128"><a href="#PRQL-128"><span class="linenos">128</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL-129"><a href="#PRQL-129"><span class="linenos">129</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
</span><span id="PRQL-130"><a href="#PRQL-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="bp">self</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">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
</span><span id="PRQL-131"><a href="#PRQL-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
</span><span id="PRQL-81"><a href="#PRQL-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
</span><span id="PRQL-82"><a href="#PRQL-82"><span class="linenos"> 82</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL-83"><a href="#PRQL-83"><span class="linenos"> 83</span></a>
</span><span id="PRQL-84"><a href="#PRQL-84"><span class="linenos"> 84</span></a> <span class="n">query</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="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</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="PRQL-85"><a href="#PRQL-85"><span class="linenos"> 85</span></a>
</span><span id="PRQL-86"><a href="#PRQL-86"><span class="linenos"> 86</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
</span><span id="PRQL-87"><a href="#PRQL-87"><span class="linenos"> 87</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
</span><span id="PRQL-88"><a href="#PRQL-88"><span class="linenos"> 88</span></a>
</span><span id="PRQL-89"><a href="#PRQL-89"><span class="linenos"> 89</span></a> <span class="k">return</span> <span class="n">query</span>
</span><span id="PRQL-90"><a href="#PRQL-90"><span class="linenos"> 90</span></a>
</span><span id="PRQL-91"><a href="#PRQL-91"><span class="linenos"> 91</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
</span><span id="PRQL-92"><a href="#PRQL-92"><span class="linenos"> 92</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
</span><span id="PRQL-93"><a href="#PRQL-93"><span class="linenos"> 93</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
</span><span id="PRQL-94"><a href="#PRQL-94"><span class="linenos"> 94</span></a>
</span><span id="PRQL-95"><a href="#PRQL-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
</span><span id="PRQL-96"><a href="#PRQL-96"><span class="linenos"> 96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL-97"><a href="#PRQL-97"><span class="linenos"> 97</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="PRQL-98"><a href="#PRQL-98"><span class="linenos"> 98</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL-99"><a href="#PRQL-99"><span class="linenos"> 99</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
</span><span id="PRQL-100"><a href="#PRQL-100"><span class="linenos">100</span></a>
</span><span id="PRQL-101"><a href="#PRQL-101"><span class="linenos">101</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="PRQL-102"><a href="#PRQL-102"><span class="linenos">102</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</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="k">else</span> <span class="n">select</span>
</span><span id="PRQL-103"><a href="#PRQL-103"><span class="linenos">103</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
</span><span id="PRQL-104"><a href="#PRQL-104"><span class="linenos">104</span></a> <span class="p">}</span>
</span><span id="PRQL-105"><a href="#PRQL-105"><span class="linenos">105</span></a>
</span><span id="PRQL-106"><a href="#PRQL-106"><span class="linenos">106</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="PRQL-107"><a href="#PRQL-107"><span class="linenos">107</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="PRQL-108"><a href="#PRQL-108"><span class="linenos">108</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
</span><span id="PRQL-109"><a href="#PRQL-109"><span class="linenos">109</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</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="PRQL-110"><a href="#PRQL-110"><span class="linenos">110</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
</span><span id="PRQL-111"><a href="#PRQL-111"><span class="linenos">111</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-112"><a href="#PRQL-112"><span class="linenos">112</span></a> <span class="p">)</span>
</span><span id="PRQL-113"><a href="#PRQL-113"><span class="linenos">113</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
</span><span id="PRQL-114"><a href="#PRQL-114"><span class="linenos">114</span></a> <span class="p">]</span>
</span><span id="PRQL-115"><a href="#PRQL-115"><span class="linenos">115</span></a>
</span><span id="PRQL-116"><a href="#PRQL-116"><span class="linenos">116</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</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="PRQL-117"><a href="#PRQL-117"><span class="linenos">117</span></a>
</span><span id="PRQL-118"><a href="#PRQL-118"><span class="linenos">118</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL-119"><a href="#PRQL-119"><span class="linenos">119</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
</span><span id="PRQL-120"><a href="#PRQL-120"><span class="linenos">120</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="PRQL-121"><a href="#PRQL-121"><span class="linenos">121</span></a>
</span><span id="PRQL-122"><a href="#PRQL-122"><span class="linenos">122</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
</span><span id="PRQL-123"><a href="#PRQL-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</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="o">=</span> <span class="kc">None</span>
</span><span id="PRQL-124"><a href="#PRQL-124"><span class="linenos">124</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
</span><span id="PRQL-125"><a href="#PRQL-125"><span class="linenos">125</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
</span><span id="PRQL-126"><a href="#PRQL-126"><span class="linenos">126</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL-127"><a href="#PRQL-127"><span class="linenos">127</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
</span><span id="PRQL-128"><a href="#PRQL-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
</span><span id="PRQL-129"><a href="#PRQL-129"><span class="linenos">129</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL-130"><a href="#PRQL-130"><span class="linenos">130</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;nulls_first&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL-131"><a href="#PRQL-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="n">term</span>
</span><span id="PRQL-132"><a href="#PRQL-132"><span class="linenos">132</span></a>
</span><span id="PRQL-133"><a href="#PRQL-133"><span class="linenos">133</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
</span><span id="PRQL-134"><a href="#PRQL-134"><span class="linenos">134</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="PRQL-135"><a href="#PRQL-135"><span class="linenos">135</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-136"><a href="#PRQL-136"><span class="linenos">136</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-137"><a href="#PRQL-137"><span class="linenos">137</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="PRQL-138"><a href="#PRQL-138"><span class="linenos">138</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-139"><a href="#PRQL-139"><span class="linenos">139</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-140"><a href="#PRQL-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">Optional</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="PRQL-141"><a href="#PRQL-141"><span class="linenos">141</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
</span><span id="PRQL-142"><a href="#PRQL-142"><span class="linenos">142</span></a>
</span><span id="PRQL-143"><a href="#PRQL-143"><span class="linenos">143</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
</span><span id="PRQL-144"><a href="#PRQL-144"><span class="linenos">144</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="PRQL-145"><a href="#PRQL-145"><span class="linenos">145</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
</span><span id="PRQL-146"><a href="#PRQL-146"><span class="linenos">146</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
</span><span id="PRQL-147"><a href="#PRQL-147"><span class="linenos">147</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL-148"><a href="#PRQL-148"><span class="linenos">148</span></a>
</span><span id="PRQL-149"><a href="#PRQL-149"><span class="linenos">149</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
</span><span id="PRQL-150"><a href="#PRQL-150"><span class="linenos">150</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
</span><span id="PRQL-151"><a href="#PRQL-151"><span class="linenos">151</span></a> <span class="p">)</span>
</span><span id="PRQL-133"><a href="#PRQL-133"><span class="linenos">133</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL-134"><a href="#PRQL-134"><span class="linenos">134</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
</span><span id="PRQL-135"><a href="#PRQL-135"><span class="linenos">135</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
</span><span id="PRQL-136"><a href="#PRQL-136"><span class="linenos">136</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
</span><span id="PRQL-137"><a href="#PRQL-137"><span class="linenos">137</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL-138"><a href="#PRQL-138"><span class="linenos">138</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</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">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</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="PRQL-139"><a href="#PRQL-139"><span class="linenos">139</span></a>
</span><span id="PRQL-140"><a href="#PRQL-140"><span class="linenos">140</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL-141"><a href="#PRQL-141"><span class="linenos">141</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
</span><span id="PRQL-142"><a href="#PRQL-142"><span class="linenos">142</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL-143"><a href="#PRQL-143"><span class="linenos">143</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
</span><span id="PRQL-144"><a href="#PRQL-144"><span class="linenos">144</span></a> <span class="k">return</span> <span class="bp">self</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">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
</span><span id="PRQL-145"><a href="#PRQL-145"><span class="linenos">145</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
</span><span id="PRQL-146"><a href="#PRQL-146"><span class="linenos">146</span></a>
</span><span id="PRQL-147"><a href="#PRQL-147"><span class="linenos">147</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
</span><span id="PRQL-148"><a href="#PRQL-148"><span class="linenos">148</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="PRQL-149"><a href="#PRQL-149"><span class="linenos">149</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-150"><a href="#PRQL-150"><span class="linenos">150</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-151"><a href="#PRQL-151"><span class="linenos">151</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="PRQL-152"><a href="#PRQL-152"><span class="linenos">152</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-153"><a href="#PRQL-153"><span class="linenos">153</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-154"><a href="#PRQL-154"><span class="linenos">154</span></a> <span class="n">parse_partition</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL-155"><a href="#PRQL-155"><span class="linenos">155</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL-156"><a href="#PRQL-156"><span class="linenos">156</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
</span><span id="PRQL-157"><a href="#PRQL-157"><span class="linenos">157</span></a>
</span><span id="PRQL-158"><a href="#PRQL-158"><span class="linenos">158</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
</span><span id="PRQL-159"><a href="#PRQL-159"><span class="linenos">159</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="PRQL-160"><a href="#PRQL-160"><span class="linenos">160</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
</span><span id="PRQL-161"><a href="#PRQL-161"><span class="linenos">161</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
</span><span id="PRQL-162"><a href="#PRQL-162"><span class="linenos">162</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL-163"><a href="#PRQL-163"><span class="linenos">163</span></a>
</span><span id="PRQL-164"><a href="#PRQL-164"><span class="linenos">164</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
</span><span id="PRQL-165"><a href="#PRQL-165"><span class="linenos">165</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
</span><span id="PRQL-166"><a href="#PRQL-166"><span class="linenos">166</span></a> <span class="p">)</span>
</span></pre></div>
@ -918,99 +948,114 @@
</span><span id="PRQL.Parser-56"><a href="#PRQL.Parser-56"><span class="linenos"> 56</span></a> <span class="s2">&quot;SORT&quot;</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_order_by</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
</span><span id="PRQL.Parser-57"><a href="#PRQL.Parser-57"><span class="linenos"> 57</span></a> <span class="p">}</span>
</span><span id="PRQL.Parser-58"><a href="#PRQL.Parser-58"><span class="linenos"> 58</span></a>
</span><span id="PRQL.Parser-59"><a href="#PRQL.Parser-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL.Parser-60"><a href="#PRQL.Parser-60"><span class="linenos"> 60</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL.Parser-61"><a href="#PRQL.Parser-61"><span class="linenos"> 61</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
</span><span id="PRQL.Parser-62"><a href="#PRQL.Parser-62"><span class="linenos"> 62</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="PRQL.Parser-59"><a href="#PRQL.Parser-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">_parse_equality</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL.Parser-60"><a href="#PRQL.Parser-60"><span class="linenos"> 60</span></a> <span class="n">eq</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_tokens</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_comparison</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">EQUALITY</span><span class="p">)</span>
</span><span id="PRQL.Parser-61"><a href="#PRQL.Parser-61"><span class="linenos"> 61</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">NEQ</span><span class="p">)):</span>
</span><span id="PRQL.Parser-62"><a href="#PRQL.Parser-62"><span class="linenos"> 62</span></a> <span class="k">return</span> <span class="n">eq</span>
</span><span id="PRQL.Parser-63"><a href="#PRQL.Parser-63"><span class="linenos"> 63</span></a>
</span><span id="PRQL.Parser-64"><a href="#PRQL.Parser-64"><span class="linenos"> 64</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL.Parser-65"><a href="#PRQL.Parser-65"><span class="linenos"> 65</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
</span><span id="PRQL.Parser-66"><a href="#PRQL.Parser-66"><span class="linenos"> 66</span></a>
</span><span id="PRQL.Parser-67"><a href="#PRQL.Parser-67"><span class="linenos"> 67</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
</span><span id="PRQL.Parser-68"><a href="#PRQL.Parser-68"><span class="linenos"> 68</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-69"><a href="#PRQL.Parser-69"><span class="linenos"> 69</span></a>
</span><span id="PRQL.Parser-70"><a href="#PRQL.Parser-70"><span class="linenos"> 70</span></a> <span class="n">query</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="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</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="PRQL.Parser-71"><a href="#PRQL.Parser-71"><span class="linenos"> 71</span></a>
</span><span id="PRQL.Parser-72"><a href="#PRQL.Parser-72"><span class="linenos"> 72</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
</span><span id="PRQL.Parser-73"><a href="#PRQL.Parser-73"><span class="linenos"> 73</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
</span><span id="PRQL.Parser-74"><a href="#PRQL.Parser-74"><span class="linenos"> 74</span></a>
</span><span id="PRQL.Parser-75"><a href="#PRQL.Parser-75"><span class="linenos"> 75</span></a> <span class="k">return</span> <span class="n">query</span>
</span><span id="PRQL.Parser-76"><a href="#PRQL.Parser-76"><span class="linenos"> 76</span></a>
</span><span id="PRQL.Parser-77"><a href="#PRQL.Parser-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
</span><span id="PRQL.Parser-78"><a href="#PRQL.Parser-78"><span class="linenos"> 78</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
</span><span id="PRQL.Parser-79"><a href="#PRQL.Parser-79"><span class="linenos"> 79</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
</span><span id="PRQL.Parser-64"><a href="#PRQL.Parser-64"><span class="linenos"> 64</span></a> <span class="c1"># https://prql-lang.org/book/reference/spec/null.html</span>
</span><span id="PRQL.Parser-65"><a href="#PRQL.Parser-65"><span class="linenos"> 65</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</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">Null</span><span class="p">):</span>
</span><span id="PRQL.Parser-66"><a href="#PRQL.Parser-66"><span class="linenos"> 66</span></a> <span class="n">is_exp</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
</span><span id="PRQL.Parser-67"><a href="#PRQL.Parser-67"><span class="linenos"> 67</span></a> <span class="k">return</span> <span class="n">is_exp</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">is_exp</span><span class="p">)</span>
</span><span id="PRQL.Parser-68"><a href="#PRQL.Parser-68"><span class="linenos"> 68</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Null</span><span class="p">):</span>
</span><span id="PRQL.Parser-69"><a href="#PRQL.Parser-69"><span class="linenos"> 69</span></a> <span class="n">is_exp</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Is</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">eq</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
</span><span id="PRQL.Parser-70"><a href="#PRQL.Parser-70"><span class="linenos"> 70</span></a> <span class="k">return</span> <span class="n">is_exp</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">eq</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">Not</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">is_exp</span><span class="p">)</span>
</span><span id="PRQL.Parser-71"><a href="#PRQL.Parser-71"><span class="linenos"> 71</span></a> <span class="k">return</span> <span class="n">eq</span>
</span><span id="PRQL.Parser-72"><a href="#PRQL.Parser-72"><span class="linenos"> 72</span></a>
</span><span id="PRQL.Parser-73"><a href="#PRQL.Parser-73"><span class="linenos"> 73</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL.Parser-74"><a href="#PRQL.Parser-74"><span class="linenos"> 74</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL.Parser-75"><a href="#PRQL.Parser-75"><span class="linenos"> 75</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
</span><span id="PRQL.Parser-76"><a href="#PRQL.Parser-76"><span class="linenos"> 76</span></a> <span class="k">return</span> <span class="n">expression</span>
</span><span id="PRQL.Parser-77"><a href="#PRQL.Parser-77"><span class="linenos"> 77</span></a>
</span><span id="PRQL.Parser-78"><a href="#PRQL.Parser-78"><span class="linenos"> 78</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL.Parser-79"><a href="#PRQL.Parser-79"><span class="linenos"> 79</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
</span><span id="PRQL.Parser-80"><a href="#PRQL.Parser-80"><span class="linenos"> 80</span></a>
</span><span id="PRQL.Parser-81"><a href="#PRQL.Parser-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
</span><span id="PRQL.Parser-82"><a href="#PRQL.Parser-82"><span class="linenos"> 82</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL.Parser-83"><a href="#PRQL.Parser-83"><span class="linenos"> 83</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="PRQL.Parser-84"><a href="#PRQL.Parser-84"><span class="linenos"> 84</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL.Parser-85"><a href="#PRQL.Parser-85"><span class="linenos"> 85</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
</span><span id="PRQL.Parser-86"><a href="#PRQL.Parser-86"><span class="linenos"> 86</span></a>
</span><span id="PRQL.Parser-87"><a href="#PRQL.Parser-87"><span class="linenos"> 87</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="PRQL.Parser-88"><a href="#PRQL.Parser-88"><span class="linenos"> 88</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</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="k">else</span> <span class="n">select</span>
</span><span id="PRQL.Parser-89"><a href="#PRQL.Parser-89"><span class="linenos"> 89</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
</span><span id="PRQL.Parser-90"><a href="#PRQL.Parser-90"><span class="linenos"> 90</span></a> <span class="p">}</span>
</span><span id="PRQL.Parser-91"><a href="#PRQL.Parser-91"><span class="linenos"> 91</span></a>
</span><span id="PRQL.Parser-92"><a href="#PRQL.Parser-92"><span class="linenos"> 92</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="PRQL.Parser-93"><a href="#PRQL.Parser-93"><span class="linenos"> 93</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="PRQL.Parser-94"><a href="#PRQL.Parser-94"><span class="linenos"> 94</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
</span><span id="PRQL.Parser-95"><a href="#PRQL.Parser-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</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="PRQL.Parser-96"><a href="#PRQL.Parser-96"><span class="linenos"> 96</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
</span><span id="PRQL.Parser-97"><a href="#PRQL.Parser-97"><span class="linenos"> 97</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-98"><a href="#PRQL.Parser-98"><span class="linenos"> 98</span></a> <span class="p">)</span>
</span><span id="PRQL.Parser-99"><a href="#PRQL.Parser-99"><span class="linenos"> 99</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
</span><span id="PRQL.Parser-100"><a href="#PRQL.Parser-100"><span class="linenos">100</span></a> <span class="p">]</span>
</span><span id="PRQL.Parser-101"><a href="#PRQL.Parser-101"><span class="linenos">101</span></a>
</span><span id="PRQL.Parser-102"><a href="#PRQL.Parser-102"><span class="linenos">102</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</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="PRQL.Parser-103"><a href="#PRQL.Parser-103"><span class="linenos">103</span></a>
</span><span id="PRQL.Parser-104"><a href="#PRQL.Parser-104"><span class="linenos">104</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL.Parser-105"><a href="#PRQL.Parser-105"><span class="linenos">105</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
</span><span id="PRQL.Parser-106"><a href="#PRQL.Parser-106"><span class="linenos">106</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-107"><a href="#PRQL.Parser-107"><span class="linenos">107</span></a>
</span><span id="PRQL.Parser-108"><a href="#PRQL.Parser-108"><span class="linenos">108</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
</span><span id="PRQL.Parser-109"><a href="#PRQL.Parser-109"><span class="linenos">109</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</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="o">=</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-110"><a href="#PRQL.Parser-110"><span class="linenos">110</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
</span><span id="PRQL.Parser-111"><a href="#PRQL.Parser-111"><span class="linenos">111</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
</span><span id="PRQL.Parser-112"><a href="#PRQL.Parser-112"><span class="linenos">112</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL.Parser-113"><a href="#PRQL.Parser-113"><span class="linenos">113</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
</span><span id="PRQL.Parser-114"><a href="#PRQL.Parser-114"><span class="linenos">114</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
</span><span id="PRQL.Parser-115"><a href="#PRQL.Parser-115"><span class="linenos">115</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL.Parser-116"><a href="#PRQL.Parser-116"><span class="linenos">116</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;nulls_first&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL.Parser-117"><a href="#PRQL.Parser-117"><span class="linenos">117</span></a> <span class="k">return</span> <span class="n">term</span>
</span><span id="PRQL.Parser-118"><a href="#PRQL.Parser-118"><span class="linenos">118</span></a>
</span><span id="PRQL.Parser-119"><a href="#PRQL.Parser-119"><span class="linenos">119</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL.Parser-120"><a href="#PRQL.Parser-120"><span class="linenos">120</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
</span><span id="PRQL.Parser-121"><a href="#PRQL.Parser-121"><span class="linenos">121</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
</span><span id="PRQL.Parser-122"><a href="#PRQL.Parser-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
</span><span id="PRQL.Parser-123"><a href="#PRQL.Parser-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL.Parser-124"><a href="#PRQL.Parser-124"><span class="linenos">124</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</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">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</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="PRQL.Parser-125"><a href="#PRQL.Parser-125"><span class="linenos">125</span></a>
</span><span id="PRQL.Parser-126"><a href="#PRQL.Parser-126"><span class="linenos">126</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL.Parser-127"><a href="#PRQL.Parser-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
</span><span id="PRQL.Parser-128"><a href="#PRQL.Parser-128"><span class="linenos">128</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL.Parser-129"><a href="#PRQL.Parser-129"><span class="linenos">129</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
</span><span id="PRQL.Parser-130"><a href="#PRQL.Parser-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="bp">self</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">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
</span><span id="PRQL.Parser-131"><a href="#PRQL.Parser-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
</span><span id="PRQL.Parser-81"><a href="#PRQL.Parser-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
</span><span id="PRQL.Parser-82"><a href="#PRQL.Parser-82"><span class="linenos"> 82</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-83"><a href="#PRQL.Parser-83"><span class="linenos"> 83</span></a>
</span><span id="PRQL.Parser-84"><a href="#PRQL.Parser-84"><span class="linenos"> 84</span></a> <span class="n">query</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="s2">&quot;*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</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="PRQL.Parser-85"><a href="#PRQL.Parser-85"><span class="linenos"> 85</span></a>
</span><span id="PRQL.Parser-86"><a href="#PRQL.Parser-86"><span class="linenos"> 86</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
</span><span id="PRQL.Parser-87"><a href="#PRQL.Parser-87"><span class="linenos"> 87</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
</span><span id="PRQL.Parser-88"><a href="#PRQL.Parser-88"><span class="linenos"> 88</span></a>
</span><span id="PRQL.Parser-89"><a href="#PRQL.Parser-89"><span class="linenos"> 89</span></a> <span class="k">return</span> <span class="n">query</span>
</span><span id="PRQL.Parser-90"><a href="#PRQL.Parser-90"><span class="linenos"> 90</span></a>
</span><span id="PRQL.Parser-91"><a href="#PRQL.Parser-91"><span class="linenos"> 91</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
</span><span id="PRQL.Parser-92"><a href="#PRQL.Parser-92"><span class="linenos"> 92</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
</span><span id="PRQL.Parser-93"><a href="#PRQL.Parser-93"><span class="linenos"> 93</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
</span><span id="PRQL.Parser-94"><a href="#PRQL.Parser-94"><span class="linenos"> 94</span></a>
</span><span id="PRQL.Parser-95"><a href="#PRQL.Parser-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
</span><span id="PRQL.Parser-96"><a href="#PRQL.Parser-96"><span class="linenos"> 96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL.Parser-97"><a href="#PRQL.Parser-97"><span class="linenos"> 97</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="PRQL.Parser-98"><a href="#PRQL.Parser-98"><span class="linenos"> 98</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
</span><span id="PRQL.Parser-99"><a href="#PRQL.Parser-99"><span class="linenos"> 99</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
</span><span id="PRQL.Parser-100"><a href="#PRQL.Parser-100"><span class="linenos">100</span></a>
</span><span id="PRQL.Parser-101"><a href="#PRQL.Parser-101"><span class="linenos">101</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="PRQL.Parser-102"><a href="#PRQL.Parser-102"><span class="linenos">102</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</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="k">else</span> <span class="n">select</span>
</span><span id="PRQL.Parser-103"><a href="#PRQL.Parser-103"><span class="linenos">103</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
</span><span id="PRQL.Parser-104"><a href="#PRQL.Parser-104"><span class="linenos">104</span></a> <span class="p">}</span>
</span><span id="PRQL.Parser-105"><a href="#PRQL.Parser-105"><span class="linenos">105</span></a>
</span><span id="PRQL.Parser-106"><a href="#PRQL.Parser-106"><span class="linenos">106</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="PRQL.Parser-107"><a href="#PRQL.Parser-107"><span class="linenos">107</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
</span><span id="PRQL.Parser-108"><a href="#PRQL.Parser-108"><span class="linenos">108</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
</span><span id="PRQL.Parser-109"><a href="#PRQL.Parser-109"><span class="linenos">109</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</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="PRQL.Parser-110"><a href="#PRQL.Parser-110"><span class="linenos">110</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
</span><span id="PRQL.Parser-111"><a href="#PRQL.Parser-111"><span class="linenos">111</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-112"><a href="#PRQL.Parser-112"><span class="linenos">112</span></a> <span class="p">)</span>
</span><span id="PRQL.Parser-113"><a href="#PRQL.Parser-113"><span class="linenos">113</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
</span><span id="PRQL.Parser-114"><a href="#PRQL.Parser-114"><span class="linenos">114</span></a> <span class="p">]</span>
</span><span id="PRQL.Parser-115"><a href="#PRQL.Parser-115"><span class="linenos">115</span></a>
</span><span id="PRQL.Parser-116"><a href="#PRQL.Parser-116"><span class="linenos">116</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</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="PRQL.Parser-117"><a href="#PRQL.Parser-117"><span class="linenos">117</span></a>
</span><span id="PRQL.Parser-118"><a href="#PRQL.Parser-118"><span class="linenos">118</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL.Parser-119"><a href="#PRQL.Parser-119"><span class="linenos">119</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
</span><span id="PRQL.Parser-120"><a href="#PRQL.Parser-120"><span class="linenos">120</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-121"><a href="#PRQL.Parser-121"><span class="linenos">121</span></a>
</span><span id="PRQL.Parser-122"><a href="#PRQL.Parser-122"><span class="linenos">122</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
</span><span id="PRQL.Parser-123"><a href="#PRQL.Parser-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</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="o">=</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-124"><a href="#PRQL.Parser-124"><span class="linenos">124</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
</span><span id="PRQL.Parser-125"><a href="#PRQL.Parser-125"><span class="linenos">125</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
</span><span id="PRQL.Parser-126"><a href="#PRQL.Parser-126"><span class="linenos">126</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL.Parser-127"><a href="#PRQL.Parser-127"><span class="linenos">127</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
</span><span id="PRQL.Parser-128"><a href="#PRQL.Parser-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
</span><span id="PRQL.Parser-129"><a href="#PRQL.Parser-129"><span class="linenos">129</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;desc&quot;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL.Parser-130"><a href="#PRQL.Parser-130"><span class="linenos">130</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">&quot;nulls_first&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
</span><span id="PRQL.Parser-131"><a href="#PRQL.Parser-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="n">term</span>
</span><span id="PRQL.Parser-132"><a href="#PRQL.Parser-132"><span class="linenos">132</span></a>
</span><span id="PRQL.Parser-133"><a href="#PRQL.Parser-133"><span class="linenos">133</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
</span><span id="PRQL.Parser-134"><a href="#PRQL.Parser-134"><span class="linenos">134</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="PRQL.Parser-135"><a href="#PRQL.Parser-135"><span class="linenos">135</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-136"><a href="#PRQL.Parser-136"><span class="linenos">136</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-137"><a href="#PRQL.Parser-137"><span class="linenos">137</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="PRQL.Parser-138"><a href="#PRQL.Parser-138"><span class="linenos">138</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-139"><a href="#PRQL.Parser-139"><span class="linenos">139</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-140"><a href="#PRQL.Parser-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">Optional</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="PRQL.Parser-141"><a href="#PRQL.Parser-141"><span class="linenos">141</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
</span><span id="PRQL.Parser-142"><a href="#PRQL.Parser-142"><span class="linenos">142</span></a>
</span><span id="PRQL.Parser-143"><a href="#PRQL.Parser-143"><span class="linenos">143</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
</span><span id="PRQL.Parser-144"><a href="#PRQL.Parser-144"><span class="linenos">144</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="PRQL.Parser-145"><a href="#PRQL.Parser-145"><span class="linenos">145</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
</span><span id="PRQL.Parser-146"><a href="#PRQL.Parser-146"><span class="linenos">146</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
</span><span id="PRQL.Parser-147"><a href="#PRQL.Parser-147"><span class="linenos">147</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-148"><a href="#PRQL.Parser-148"><span class="linenos">148</span></a>
</span><span id="PRQL.Parser-149"><a href="#PRQL.Parser-149"><span class="linenos">149</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
</span><span id="PRQL.Parser-150"><a href="#PRQL.Parser-150"><span class="linenos">150</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
</span><span id="PRQL.Parser-151"><a href="#PRQL.Parser-151"><span class="linenos">151</span></a> <span class="p">)</span>
</span><span id="PRQL.Parser-133"><a href="#PRQL.Parser-133"><span class="linenos">133</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</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="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
</span><span id="PRQL.Parser-134"><a href="#PRQL.Parser-134"><span class="linenos">134</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
</span><span id="PRQL.Parser-135"><a href="#PRQL.Parser-135"><span class="linenos">135</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
</span><span id="PRQL.Parser-136"><a href="#PRQL.Parser-136"><span class="linenos">136</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
</span><span id="PRQL.Parser-137"><a href="#PRQL.Parser-137"><span class="linenos">137</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">&quot;Expecting }&quot;</span><span class="p">)</span>
</span><span id="PRQL.Parser-138"><a href="#PRQL.Parser-138"><span class="linenos">138</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</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">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</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="PRQL.Parser-139"><a href="#PRQL.Parser-139"><span class="linenos">139</span></a>
</span><span id="PRQL.Parser-140"><a href="#PRQL.Parser-140"><span class="linenos">140</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL.Parser-141"><a href="#PRQL.Parser-141"><span class="linenos">141</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
</span><span id="PRQL.Parser-142"><a href="#PRQL.Parser-142"><span class="linenos">142</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
</span><span id="PRQL.Parser-143"><a href="#PRQL.Parser-143"><span class="linenos">143</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
</span><span id="PRQL.Parser-144"><a href="#PRQL.Parser-144"><span class="linenos">144</span></a> <span class="k">return</span> <span class="bp">self</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">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
</span><span id="PRQL.Parser-145"><a href="#PRQL.Parser-145"><span class="linenos">145</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
</span><span id="PRQL.Parser-146"><a href="#PRQL.Parser-146"><span class="linenos">146</span></a>
</span><span id="PRQL.Parser-147"><a href="#PRQL.Parser-147"><span class="linenos">147</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
</span><span id="PRQL.Parser-148"><a href="#PRQL.Parser-148"><span class="linenos">148</span></a> <span class="bp">self</span><span class="p">,</span>
</span><span id="PRQL.Parser-149"><a href="#PRQL.Parser-149"><span class="linenos">149</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-150"><a href="#PRQL.Parser-150"><span class="linenos">150</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-151"><a href="#PRQL.Parser-151"><span class="linenos">151</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="PRQL.Parser-152"><a href="#PRQL.Parser-152"><span class="linenos">152</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-153"><a href="#PRQL.Parser-153"><span class="linenos">153</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-154"><a href="#PRQL.Parser-154"><span class="linenos">154</span></a> <span class="n">parse_partition</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="PRQL.Parser-155"><a href="#PRQL.Parser-155"><span class="linenos">155</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
</span><span id="PRQL.Parser-156"><a href="#PRQL.Parser-156"><span class="linenos">156</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
</span><span id="PRQL.Parser-157"><a href="#PRQL.Parser-157"><span class="linenos">157</span></a>
</span><span id="PRQL.Parser-158"><a href="#PRQL.Parser-158"><span class="linenos">158</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
</span><span id="PRQL.Parser-159"><a href="#PRQL.Parser-159"><span class="linenos">159</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="PRQL.Parser-160"><a href="#PRQL.Parser-160"><span class="linenos">160</span></a> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
</span><span id="PRQL.Parser-161"><a href="#PRQL.Parser-161"><span class="linenos">161</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
</span><span id="PRQL.Parser-162"><a href="#PRQL.Parser-162"><span class="linenos">162</span></a> <span class="k">return</span> <span class="kc">None</span>
</span><span id="PRQL.Parser-163"><a href="#PRQL.Parser-163"><span class="linenos">163</span></a>
</span><span id="PRQL.Parser-164"><a href="#PRQL.Parser-164"><span class="linenos">164</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
</span><span id="PRQL.Parser-165"><a href="#PRQL.Parser-165"><span class="linenos">165</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
</span><span id="PRQL.Parser-166"><a href="#PRQL.Parser-166"><span class="linenos">166</span></a> <span class="p">)</span>
</span></pre></div>
@ -1184,6 +1229,7 @@ Default: 3</li>
<dd id="PRQL.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="../parser.html#Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
<dd id="PRQL.Parser.SUPPORTS_IMPLICIT_UNNEST" class="variable"><a href="../parser.html#Parser.SUPPORTS_IMPLICIT_UNNEST">SUPPORTS_IMPLICIT_UNNEST</a></dd>
<dd id="PRQL.Parser.INTERVAL_SPANS" class="variable"><a href="../parser.html#Parser.INTERVAL_SPANS">INTERVAL_SPANS</a></dd>
<dd id="PRQL.Parser.SUPPORTS_PARTITION_SELECTION" class="variable"><a href="../parser.html#Parser.SUPPORTS_PARTITION_SELECTION">SUPPORTS_PARTITION_SELECTION</a></dd>
<dd id="PRQL.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
<dd id="PRQL.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
<dd id="PRQL.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -994,6 +994,7 @@ Default: 3</li>
<dd id="Spark.Parser.JSON_ARROWS_REQUIRE_JSON_TYPE" class="variable"><a href="../parser.html#Parser.JSON_ARROWS_REQUIRE_JSON_TYPE">JSON_ARROWS_REQUIRE_JSON_TYPE</a></dd>
<dd id="Spark.Parser.SUPPORTS_IMPLICIT_UNNEST" class="variable"><a href="../parser.html#Parser.SUPPORTS_IMPLICIT_UNNEST">SUPPORTS_IMPLICIT_UNNEST</a></dd>
<dd id="Spark.Parser.INTERVAL_SPANS" class="variable"><a href="../parser.html#Parser.INTERVAL_SPANS">INTERVAL_SPANS</a></dd>
<dd id="Spark.Parser.SUPPORTS_PARTITION_SELECTION" class="variable"><a href="../parser.html#Parser.SUPPORTS_PARTITION_SELECTION">SUPPORTS_PARTITION_SELECTION</a></dd>
<dd id="Spark.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
<dd id="Spark.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
<dd id="Spark.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
@ -1152,7 +1153,7 @@ Default: True</li>
<div class="attr variable">
<span class="name">TYPE_MAPPING</span> =
<input id="Spark.Generator.TYPE_MAPPING-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="Spark.Generator.TYPE_MAPPING-view-value"></label><span class="default_value">{&lt;Type.NCHAR: &#39;NCHAR&#39;&gt;: &#39;CHAR&#39;, &lt;Type.NVARCHAR: &#39;NVARCHAR&#39;&gt;: &#39;VARCHAR&#39;, &lt;Type.MEDIUMTEXT: &#39;MEDIUMTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.LONGTEXT: &#39;LONGTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.TINYTEXT: &#39;TINYTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.MEDIUMBLOB: &#39;MEDIUMBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.LONGBLOB: &#39;LONGBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.TINYBLOB: &#39;TINYBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.INET: &#39;INET&#39;&gt;: &#39;INET&#39;, &lt;Type.BIT: &#39;BIT&#39;&gt;: &#39;BOOLEAN&#39;, &lt;Type.DATETIME: &#39;DATETIME&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.TEXT: &#39;TEXT&#39;&gt;: &#39;STRING&#39;, &lt;Type.TIME: &#39;TIME&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.TIMESTAMPTZ: &#39;TIMESTAMPTZ&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.VARBINARY: &#39;VARBINARY&#39;&gt;: &#39;BINARY&#39;, &lt;Type.MONEY: &#39;MONEY&#39;&gt;: &#39;DECIMAL(15, 4)&#39;, &lt;Type.SMALLMONEY: &#39;SMALLMONEY&#39;&gt;: &#39;DECIMAL(6, 4)&#39;, &lt;Type.UNIQUEIDENTIFIER: &#39;UNIQUEIDENTIFIER&#39;&gt;: &#39;STRING&#39;}</span>
<label class="view-value-button pdoc-button" for="Spark.Generator.TYPE_MAPPING-view-value"></label><span class="default_value">{&lt;Type.NCHAR: &#39;NCHAR&#39;&gt;: &#39;CHAR&#39;, &lt;Type.NVARCHAR: &#39;NVARCHAR&#39;&gt;: &#39;VARCHAR&#39;, &lt;Type.MEDIUMTEXT: &#39;MEDIUMTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.LONGTEXT: &#39;LONGTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.TINYTEXT: &#39;TINYTEXT&#39;&gt;: &#39;TEXT&#39;, &lt;Type.MEDIUMBLOB: &#39;MEDIUMBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.LONGBLOB: &#39;LONGBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.TINYBLOB: &#39;TINYBLOB&#39;&gt;: &#39;BLOB&#39;, &lt;Type.INET: &#39;INET&#39;&gt;: &#39;INET&#39;, &lt;Type.ROWVERSION: &#39;ROWVERSION&#39;&gt;: &#39;BINARY&#39;, &lt;Type.BIT: &#39;BIT&#39;&gt;: &#39;BOOLEAN&#39;, &lt;Type.DATETIME: &#39;DATETIME&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.TEXT: &#39;TEXT&#39;&gt;: &#39;STRING&#39;, &lt;Type.TIME: &#39;TIME&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.TIMESTAMPTZ: &#39;TIMESTAMPTZ&#39;&gt;: &#39;TIMESTAMP&#39;, &lt;Type.VARBINARY: &#39;VARBINARY&#39;&gt;: &#39;BINARY&#39;, &lt;Type.MONEY: &#39;MONEY&#39;&gt;: &#39;DECIMAL(15, 4)&#39;, &lt;Type.SMALLMONEY: &#39;SMALLMONEY&#39;&gt;: &#39;DECIMAL(6, 4)&#39;, &lt;Type.UNIQUEIDENTIFIER: &#39;UNIQUEIDENTIFIER&#39;&gt;: &#39;STRING&#39;}</span>
</div>
@ -1362,6 +1363,7 @@ Default: True</li>
<dd id="Spark.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Spark.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Spark.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Spark.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Spark.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Spark.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Spark.Generator.columnconstraint_sql" class="function"><a href="../generator.html#Generator.columnconstraint_sql">columnconstraint_sql</a></dd>
@ -1606,7 +1608,7 @@ Default: True</li>
<dd id="Spark.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Spark.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Spark.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Spark.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Spark.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Spark.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Spark.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Spark.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>

View file

@ -1258,6 +1258,7 @@ Default: 3</li>
<dd id="Spark2.Parser.JSON_ARROWS_REQUIRE_JSON_TYPE" class="variable"><a href="../parser.html#Parser.JSON_ARROWS_REQUIRE_JSON_TYPE">JSON_ARROWS_REQUIRE_JSON_TYPE</a></dd>
<dd id="Spark2.Parser.SUPPORTS_IMPLICIT_UNNEST" class="variable"><a href="../parser.html#Parser.SUPPORTS_IMPLICIT_UNNEST">SUPPORTS_IMPLICIT_UNNEST</a></dd>
<dd id="Spark2.Parser.INTERVAL_SPANS" class="variable"><a href="../parser.html#Parser.INTERVAL_SPANS">INTERVAL_SPANS</a></dd>
<dd id="Spark2.Parser.SUPPORTS_PARTITION_SELECTION" class="variable"><a href="../parser.html#Parser.SUPPORTS_PARTITION_SELECTION">SUPPORTS_PARTITION_SELECTION</a></dd>
<dd id="Spark2.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
<dd id="Spark2.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
<dd id="Spark2.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
@ -1701,6 +1702,7 @@ Default: True</li>
<dd id="Spark2.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Spark2.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Spark2.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Spark2.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Spark2.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Spark2.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Spark2.Generator.columnconstraint_sql" class="function"><a href="../generator.html#Generator.columnconstraint_sql">columnconstraint_sql</a></dd>
@ -1947,7 +1949,7 @@ Default: True</li>
<dd id="Spark2.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Spark2.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Spark2.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Spark2.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Spark2.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Spark2.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Spark2.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Spark2.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -990,6 +990,7 @@ Default: True</li>
<dd id="Tableau.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Tableau.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Tableau.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Tableau.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Tableau.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Tableau.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Tableau.Generator.columndef_sql" class="function"><a href="../generator.html#Generator.columndef_sql">columndef_sql</a></dd>
@ -1243,7 +1244,7 @@ Default: True</li>
<dd id="Tableau.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Tableau.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Tableau.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Tableau.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Tableau.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Tableau.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Tableau.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Tableau.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>
@ -1481,6 +1482,7 @@ Default: 3</li>
<dd id="Tableau.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="../parser.html#Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
<dd id="Tableau.Parser.SUPPORTS_IMPLICIT_UNNEST" class="variable"><a href="../parser.html#Parser.SUPPORTS_IMPLICIT_UNNEST">SUPPORTS_IMPLICIT_UNNEST</a></dd>
<dd id="Tableau.Parser.INTERVAL_SPANS" class="variable"><a href="../parser.html#Parser.INTERVAL_SPANS">INTERVAL_SPANS</a></dd>
<dd id="Tableau.Parser.SUPPORTS_PARTITION_SELECTION" class="variable"><a href="../parser.html#Parser.SUPPORTS_PARTITION_SELECTION">SUPPORTS_PARTITION_SELECTION</a></dd>
<dd id="Tableau.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
<dd id="Tableau.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
<dd id="Tableau.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>

File diff suppressed because one or more lines are too long

View file

@ -629,7 +629,7 @@ Default: True</li>
<div class="attr variable">
<span class="name">SUPPORTED_JSON_PATH_PARTS</span> =
<input id="Trino.Generator.SUPPORTED_JSON_PATH_PARTS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="Trino.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{&lt;class &#39;<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>&#39;&gt;}</span>
<label class="view-value-button pdoc-button" for="Trino.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{&lt;class &#39;<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>&#39;&gt;, &lt;class &#39;<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>&#39;&gt;}</span>
</div>
@ -719,7 +719,6 @@ Default: True</li>
<dd id="Trino.Generator.TOKEN_MAPPING" class="variable"><a href="../generator.html#Generator.TOKEN_MAPPING">TOKEN_MAPPING</a></dd>
<dd id="Trino.Generator.PARAMETER_TOKEN" class="variable"><a href="../generator.html#Generator.PARAMETER_TOKEN">PARAMETER_TOKEN</a></dd>
<dd id="Trino.Generator.NAMED_PLACEHOLDER_TOKEN" class="variable"><a href="../generator.html#Generator.NAMED_PLACEHOLDER_TOKEN">NAMED_PLACEHOLDER_TOKEN</a></dd>
<dd id="Trino.Generator.RESERVED_KEYWORDS" class="variable"><a href="../generator.html#Generator.RESERVED_KEYWORDS">RESERVED_KEYWORDS</a></dd>
<dd id="Trino.Generator.WITH_SEPARATED_COMMENTS" class="variable"><a href="../generator.html#Generator.WITH_SEPARATED_COMMENTS">WITH_SEPARATED_COMMENTS</a></dd>
<dd id="Trino.Generator.EXCLUDE_COMMENTS" class="variable"><a href="../generator.html#Generator.EXCLUDE_COMMENTS">EXCLUDE_COMMENTS</a></dd>
<dd id="Trino.Generator.UNWRAPPED_INTERVAL_VALUES" class="variable"><a href="../generator.html#Generator.UNWRAPPED_INTERVAL_VALUES">UNWRAPPED_INTERVAL_VALUES</a></dd>
@ -753,6 +752,7 @@ Default: True</li>
<dd id="Trino.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Trino.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Trino.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Trino.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Trino.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Trino.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Trino.Generator.columndef_sql" class="function"><a href="../generator.html#Generator.columndef_sql">columndef_sql</a></dd>
@ -1002,7 +1002,7 @@ Default: True</li>
<dd id="Trino.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Trino.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Trino.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Trino.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Trino.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Trino.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Trino.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Trino.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>
@ -1063,6 +1063,7 @@ Default: True</li>
<dd id="Trino.Generator.SUPPORTS_TO_NUMBER" class="variable"><a href="presto.html#Presto.Generator.SUPPORTS_TO_NUMBER">SUPPORTS_TO_NUMBER</a></dd>
<dd id="Trino.Generator.PROPERTIES_LOCATION" class="variable"><a href="presto.html#Presto.Generator.PROPERTIES_LOCATION">PROPERTIES_LOCATION</a></dd>
<dd id="Trino.Generator.TYPE_MAPPING" class="variable"><a href="presto.html#Presto.Generator.TYPE_MAPPING">TYPE_MAPPING</a></dd>
<dd id="Trino.Generator.RESERVED_KEYWORDS" class="variable"><a href="presto.html#Presto.Generator.RESERVED_KEYWORDS">RESERVED_KEYWORDS</a></dd>
<dd id="Trino.Generator.strtounix_sql" class="function"><a href="presto.html#Presto.Generator.strtounix_sql">strtounix_sql</a></dd>
<dd id="Trino.Generator.bracket_sql" class="function"><a href="presto.html#Presto.Generator.bracket_sql">bracket_sql</a></dd>
<dd id="Trino.Generator.struct_sql" class="function"><a href="presto.html#Presto.Generator.struct_sql">struct_sql</a></dd>

File diff suppressed because one or more lines are too long

View file

@ -2301,6 +2301,7 @@ Default: True</li>
<dd id="Python.Generator.uncache_sql" class="function"><a href="../generator.html#Generator.uncache_sql">uncache_sql</a></dd>
<dd id="Python.Generator.cache_sql" class="function"><a href="../generator.html#Generator.cache_sql">cache_sql</a></dd>
<dd id="Python.Generator.characterset_sql" class="function"><a href="../generator.html#Generator.characterset_sql">characterset_sql</a></dd>
<dd id="Python.Generator.column_parts" class="function"><a href="../generator.html#Generator.column_parts">column_parts</a></dd>
<dd id="Python.Generator.column_sql" class="function"><a href="../generator.html#Generator.column_sql">column_sql</a></dd>
<dd id="Python.Generator.columnposition_sql" class="function"><a href="../generator.html#Generator.columnposition_sql">columnposition_sql</a></dd>
<dd id="Python.Generator.columndef_sql" class="function"><a href="../generator.html#Generator.columndef_sql">columndef_sql</a></dd>
@ -2555,7 +2556,7 @@ Default: True</li>
<dd id="Python.Generator.function_fallback_sql" class="function"><a href="../generator.html#Generator.function_fallback_sql">function_fallback_sql</a></dd>
<dd id="Python.Generator.func" class="function"><a href="../generator.html#Generator.func">func</a></dd>
<dd id="Python.Generator.format_args" class="function"><a href="../generator.html#Generator.format_args">format_args</a></dd>
<dd id="Python.Generator.text_width" class="function"><a href="../generator.html#Generator.text_width">text_width</a></dd>
<dd id="Python.Generator.too_wide" class="function"><a href="../generator.html#Generator.too_wide">too_wide</a></dd>
<dd id="Python.Generator.format_time" class="function"><a href="../generator.html#Generator.format_time">format_time</a></dd>
<dd id="Python.Generator.expressions" class="function"><a href="../generator.html#Generator.expressions">expressions</a></dd>
<dd id="Python.Generator.op_expressions" class="function"><a href="../generator.html#Generator.op_expressions">op_expressions</a></dd>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1893,7 +1893,7 @@ belong to some totally-ordered set.</p>
<section id="DATE_UNITS">
<div class="attr variable">
<span class="name">DATE_UNITS</span> =
<span class="default_value">{&#39;year_month&#39;, &#39;quarter&#39;, &#39;week&#39;, &#39;day&#39;, &#39;year&#39;, &#39;month&#39;}</span>
<span class="default_value">{&#39;year_month&#39;, &#39;month&#39;, &#39;quarter&#39;, &#39;year&#39;, &#39;week&#39;, &#39;day&#39;}</span>
</div>

File diff suppressed because one or more lines are too long

View file

@ -586,7 +586,7 @@ queries if it would result in multiple table selects in a single query:</p>
<div class="attr variable">
<span class="name">UNMERGABLE_ARGS</span> =
<input id="UNMERGABLE_ARGS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{&#39;into&#39;, &#39;prewhere&#39;, &#39;limit&#39;, &#39;distribute&#39;, &#39;kind&#39;, &#39;offset&#39;, &#39;cluster&#39;, &#39;match&#39;, &#39;settings&#39;, &#39;with&#39;, &#39;sort&#39;, &#39;connect&#39;, &#39;qualify&#39;, &#39;having&#39;, &#39;sample&#39;, &#39;distinct&#39;, &#39;locks&#39;, &#39;group&#39;, &#39;pivots&#39;, &#39;options&#39;, &#39;windows&#39;, &#39;format&#39;, &#39;laterals&#39;}</span>
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{&#39;limit&#39;, &#39;kind&#39;, &#39;locks&#39;, &#39;distribute&#39;, &#39;settings&#39;, &#39;with&#39;, &#39;format&#39;, &#39;sample&#39;, &#39;cluster&#39;, &#39;group&#39;, &#39;having&#39;, &#39;windows&#39;, &#39;distinct&#39;, &#39;match&#39;, &#39;prewhere&#39;, &#39;connect&#39;, &#39;qualify&#39;, &#39;into&#39;, &#39;offset&#39;, &#39;laterals&#39;, &#39;pivots&#39;, &#39;options&#39;, &#39;sort&#39;}</span>
</div>

View file

@ -61,98 +61,99 @@
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos"> 1</span></a><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
</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">import</span> <span class="nn">sqlglot</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</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">exp</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">sqlglot.dialects.dialect</span> <span class="kn">import</span> <span class="n">DialectType</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.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</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.optimizer.canonicalize</span> <span class="kn">import</span> <span class="n">canonicalize</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_ctes</span> <span class="kn">import</span> <span class="n">eliminate_ctes</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_joins</span> <span class="kn">import</span> <span class="n">eliminate_joins</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_subqueries</span> <span class="kn">import</span> <span class="n">eliminate_subqueries</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.merge_subqueries</span> <span class="kn">import</span> <span class="n">merge_subqueries</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.normalize</span> <span class="kn">import</span> <span class="n">normalize</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.optimize_joins</span> <span class="kn">import</span> <span class="n">optimize_joins</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_predicates</span> <span class="kn">import</span> <span class="n">pushdown_predicates</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_projections</span> <span class="kn">import</span> <span class="n">pushdown_projections</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify</span> <span class="kn">import</span> <span class="n">qualify</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify_columns</span> <span class="kn">import</span> <span class="n">quote_identifiers</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.simplify</span> <span class="kn">import</span> <span class="n">simplify</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.unnest_subqueries</span> <span class="kn">import</span> <span class="n">unnest_subqueries</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="kn">from</span> <span class="nn">sqlglot.schema</span> <span class="kn">import</span> <span class="n">ensure_schema</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="n">RULES</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a> <span class="n">qualify</span><span class="p">,</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="n">pushdown_projections</span><span class="p">,</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a> <span class="n">normalize</span><span class="p">,</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="n">unnest_subqueries</span><span class="p">,</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="n">pushdown_predicates</span><span class="p">,</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="n">optimize_joins</span><span class="p">,</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="n">eliminate_subqueries</span><span class="p">,</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="n">merge_subqueries</span><span class="p">,</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="n">eliminate_joins</span><span class="p">,</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="n">eliminate_ctes</span><span class="p">,</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="n">quote_identifiers</span><span class="p">,</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="n">annotate_types</span><span class="p">,</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="n">canonicalize</span><span class="p">,</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">simplify</span><span class="p">,</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><span id="L-3"><a href="#L-3"><span class="linenos"> 3</span></a><span class="kn">import</span> <span class="nn">inspect</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos"> 4</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-5"><a href="#L-5"><span class="linenos"> 5</span></a>
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">import</span> <span class="nn">sqlglot</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">exp</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.dialects.dialect</span> <span class="kn">import</span> <span class="n">DialectType</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.optimizer.annotate_types</span> <span class="kn">import</span> <span class="n">annotate_types</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.canonicalize</span> <span class="kn">import</span> <span class="n">canonicalize</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_ctes</span> <span class="kn">import</span> <span class="n">eliminate_ctes</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_joins</span> <span class="kn">import</span> <span class="n">eliminate_joins</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.eliminate_subqueries</span> <span class="kn">import</span> <span class="n">eliminate_subqueries</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.merge_subqueries</span> <span class="kn">import</span> <span class="n">merge_subqueries</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.normalize</span> <span class="kn">import</span> <span class="n">normalize</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.optimize_joins</span> <span class="kn">import</span> <span class="n">optimize_joins</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_predicates</span> <span class="kn">import</span> <span class="n">pushdown_predicates</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.pushdown_projections</span> <span class="kn">import</span> <span class="n">pushdown_projections</span>
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify</span> <span class="kn">import</span> <span class="n">qualify</span>
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.qualify_columns</span> <span class="kn">import</span> <span class="n">quote_identifiers</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.simplify</span> <span class="kn">import</span> <span class="n">simplify</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.unnest_subqueries</span> <span class="kn">import</span> <span class="n">unnest_subqueries</span>
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="kn">from</span> <span class="nn">sqlglot.schema</span> <span class="kn">import</span> <span class="n">ensure_schema</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="n">RULES</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a> <span class="n">qualify</span><span class="p">,</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a> <span class="n">pushdown_projections</span><span class="p">,</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="n">normalize</span><span class="p">,</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="n">unnest_subqueries</span><span class="p">,</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="n">pushdown_predicates</span><span class="p">,</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="n">optimize_joins</span><span class="p">,</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="n">eliminate_subqueries</span><span class="p">,</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a> <span class="n">merge_subqueries</span><span class="p">,</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="n">eliminate_joins</span><span class="p">,</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="n">eliminate_ctes</span><span class="p">,</span>
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a> <span class="n">quote_identifiers</span><span class="p">,</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="n">annotate_types</span><span class="p">,</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="n">canonicalize</span><span class="p">,</span>
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a> <span class="n">simplify</span><span class="p">,</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><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</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="o">=</span> <span class="n">RULES</span><span class="p">,</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a><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-51"><a href="#L-51"><span class="linenos">51</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</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"> Args:</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a><span class="sd"> expression: expression to optimize</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a><span class="sd"> schema: database schema.</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a><span class="sd"> the following forms:</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a><span class="sd"> 1. {table: {col: type}}</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you&#39;re doing!</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a>
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a><span class="sd"> Returns:</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a><span class="sd"> The optimized expression.</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span> <span class="ow">or</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos">75</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="s2">&quot;db&quot;</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos">77</span></a> <span class="s2">&quot;catalog&quot;</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a> <span class="s2">&quot;schema&quot;</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a> <span class="s2">&quot;dialect&quot;</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos">80</span></a> <span class="s2">&quot;isolate_tables&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos">81</span></a> <span class="s2">&quot;quote_identifiers&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos">82</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos">83</span></a> <span class="p">}</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos">84</span></a>
</span><span id="L-85"><a href="#L-85"><span class="linenos">85</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos">86</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos">87</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos">88</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">rule</span><span class="o">.</span><span class="vm">__code__</span><span class="o">.</span><span class="n">co_varnames</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos">89</span></a> <span class="n">rule_kwargs</span> <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="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos">91</span></a> <span class="p">}</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos">92</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos">93</span></a>
</span><span id="L-94"><a href="#L-94"><span class="linenos">94</span></a> <span class="k">return</span> <span class="n">optimized</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">def</span> <span class="nf">optimize</span><span class="p">(</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</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="o">=</span> <span class="n">RULES</span><span class="p">,</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a><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-52"><a href="#L-52"><span class="linenos">52</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</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"> Args:</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a><span class="sd"> expression: expression to optimize</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a><span class="sd"> schema: database schema.</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a><span class="sd"> the following forms:</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a><span class="sd"> 1. {table: {col: type}}</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos">65</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you&#39;re doing!</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a>
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a><span class="sd"> Returns:</span>
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a><span class="sd"> The optimized expression.</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos">75</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span> <span class="ow">or</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-77"><a href="#L-77"><span class="linenos">77</span></a> <span class="s2">&quot;db&quot;</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a> <span class="s2">&quot;catalog&quot;</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a> <span class="s2">&quot;schema&quot;</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos">80</span></a> <span class="s2">&quot;dialect&quot;</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
</span><span id="L-81"><a href="#L-81"><span class="linenos">81</span></a> <span class="s2">&quot;isolate_tables&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos">82</span></a> <span class="s2">&quot;quote_identifiers&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos">83</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos">84</span></a> <span class="p">}</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="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos">87</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
</span><span id="L-88"><a href="#L-88"><span class="linenos">88</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos">89</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getfullargspec</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span><span class="o">.</span><span class="n">args</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos">90</span></a> <span class="n">rule_kwargs</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="L-91"><a href="#L-91"><span class="linenos">91</span></a> <span class="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos">92</span></a> <span class="p">}</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos">93</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos">94</span></a>
</span><span id="L-95"><a href="#L-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="n">optimized</span>
</span></pre></div>
@ -181,59 +182,59 @@
</div>
<a class="headerlink" href="#optimize"></a>
<div class="pdoc-code codehilite"><pre><span></span><span id="optimize-43"><a href="#optimize-43"><span class="linenos">43</span></a><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span>
</span><span id="optimize-44"><a href="#optimize-44"><span class="linenos">44</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="optimize-45"><a href="#optimize-45"><span class="linenos">45</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-46"><a href="#optimize-46"><span class="linenos">46</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-47"><a href="#optimize-47"><span class="linenos">47</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-48"><a href="#optimize-48"><span class="linenos">48</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-49"><a href="#optimize-49"><span class="linenos">49</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</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="o">=</span> <span class="n">RULES</span><span class="p">,</span>
</span><span id="optimize-50"><a href="#optimize-50"><span class="linenos">50</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="optimize-51"><a href="#optimize-51"><span class="linenos">51</span></a><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="optimize-52"><a href="#optimize-52"><span class="linenos">52</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="optimize-53"><a href="#optimize-53"><span class="linenos">53</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</span>
</span><span id="optimize-54"><a href="#optimize-54"><span class="linenos">54</span></a>
</span><span id="optimize-55"><a href="#optimize-55"><span class="linenos">55</span></a><span class="sd"> Args:</span>
</span><span id="optimize-56"><a href="#optimize-56"><span class="linenos">56</span></a><span class="sd"> expression: expression to optimize</span>
</span><span id="optimize-57"><a href="#optimize-57"><span class="linenos">57</span></a><span class="sd"> schema: database schema.</span>
</span><span id="optimize-58"><a href="#optimize-58"><span class="linenos">58</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
</span><span id="optimize-59"><a href="#optimize-59"><span class="linenos">59</span></a><span class="sd"> the following forms:</span>
</span><span id="optimize-60"><a href="#optimize-60"><span class="linenos">60</span></a><span class="sd"> 1. {table: {col: type}}</span>
</span><span id="optimize-61"><a href="#optimize-61"><span class="linenos">61</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
</span><span id="optimize-62"><a href="#optimize-62"><span class="linenos">62</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
</span><span id="optimize-63"><a href="#optimize-63"><span class="linenos">63</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
</span><span id="optimize-64"><a href="#optimize-64"><span class="linenos">64</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
</span><span id="optimize-65"><a href="#optimize-65"><span class="linenos">65</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
</span><span id="optimize-66"><a href="#optimize-66"><span class="linenos">66</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
</span><span id="optimize-67"><a href="#optimize-67"><span class="linenos">67</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
</span><span id="optimize-68"><a href="#optimize-68"><span class="linenos">68</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
</span><span id="optimize-69"><a href="#optimize-69"><span class="linenos">69</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you&#39;re doing!</span>
</span><span id="optimize-70"><a href="#optimize-70"><span class="linenos">70</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
</span><span id="optimize-71"><a href="#optimize-71"><span class="linenos">71</span></a>
</span><span id="optimize-72"><a href="#optimize-72"><span class="linenos">72</span></a><span class="sd"> Returns:</span>
</span><span id="optimize-73"><a href="#optimize-73"><span class="linenos">73</span></a><span class="sd"> The optimized expression.</span>
</span><span id="optimize-74"><a href="#optimize-74"><span class="linenos">74</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="optimize-75"><a href="#optimize-75"><span class="linenos">75</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span> <span class="ow">or</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="optimize-76"><a href="#optimize-76"><span class="linenos">76</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="optimize-77"><a href="#optimize-77"><span class="linenos">77</span></a> <span class="s2">&quot;db&quot;</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
</span><span id="optimize-78"><a href="#optimize-78"><span class="linenos">78</span></a> <span class="s2">&quot;catalog&quot;</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
</span><span id="optimize-79"><a href="#optimize-79"><span class="linenos">79</span></a> <span class="s2">&quot;schema&quot;</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
</span><span id="optimize-80"><a href="#optimize-80"><span class="linenos">80</span></a> <span class="s2">&quot;dialect&quot;</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
</span><span id="optimize-81"><a href="#optimize-81"><span class="linenos">81</span></a> <span class="s2">&quot;isolate_tables&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
</span><span id="optimize-82"><a href="#optimize-82"><span class="linenos">82</span></a> <span class="s2">&quot;quote_identifiers&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="optimize-83"><a href="#optimize-83"><span class="linenos">83</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="optimize-84"><a href="#optimize-84"><span class="linenos">84</span></a> <span class="p">}</span>
</span><span id="optimize-85"><a href="#optimize-85"><span class="linenos">85</span></a>
</span><span id="optimize-86"><a href="#optimize-86"><span class="linenos">86</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="optimize-87"><a href="#optimize-87"><span class="linenos">87</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
</span><span id="optimize-88"><a href="#optimize-88"><span class="linenos">88</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
</span><span id="optimize-89"><a href="#optimize-89"><span class="linenos">89</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">rule</span><span class="o">.</span><span class="vm">__code__</span><span class="o">.</span><span class="n">co_varnames</span>
</span><span id="optimize-90"><a href="#optimize-90"><span class="linenos">90</span></a> <span class="n">rule_kwargs</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="optimize-91"><a href="#optimize-91"><span class="linenos">91</span></a> <span class="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
</span><span id="optimize-92"><a href="#optimize-92"><span class="linenos">92</span></a> <span class="p">}</span>
</span><span id="optimize-93"><a href="#optimize-93"><span class="linenos">93</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
</span><span id="optimize-94"><a href="#optimize-94"><span class="linenos">94</span></a>
</span><span id="optimize-95"><a href="#optimize-95"><span class="linenos">95</span></a> <span class="k">return</span> <span class="n">optimized</span>
<div class="pdoc-code codehilite"><pre><span></span><span id="optimize-44"><a href="#optimize-44"><span class="linenos">44</span></a><span class="k">def</span> <span class="nf">optimize</span><span class="p">(</span>
</span><span id="optimize-45"><a href="#optimize-45"><span class="linenos">45</span></a> <span class="n">expression</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">,</span>
</span><span id="optimize-46"><a href="#optimize-46"><span class="linenos">46</span></a> <span class="n">schema</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span> <span class="o">|</span> <span class="n">Schema</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-47"><a href="#optimize-47"><span class="linenos">47</span></a> <span class="n">db</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-48"><a href="#optimize-48"><span class="linenos">48</span></a> <span class="n">catalog</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span> <span class="o">|</span> <span class="n">exp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-49"><a href="#optimize-49"><span class="linenos">49</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="optimize-50"><a href="#optimize-50"><span class="linenos">50</span></a> <span class="n">rules</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</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="o">=</span> <span class="n">RULES</span><span class="p">,</span>
</span><span id="optimize-51"><a href="#optimize-51"><span class="linenos">51</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="optimize-52"><a href="#optimize-52"><span class="linenos">52</span></a><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="optimize-53"><a href="#optimize-53"><span class="linenos">53</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="optimize-54"><a href="#optimize-54"><span class="linenos">54</span></a><span class="sd"> Rewrite a sqlglot AST into an optimized form.</span>
</span><span id="optimize-55"><a href="#optimize-55"><span class="linenos">55</span></a>
</span><span id="optimize-56"><a href="#optimize-56"><span class="linenos">56</span></a><span class="sd"> Args:</span>
</span><span id="optimize-57"><a href="#optimize-57"><span class="linenos">57</span></a><span class="sd"> expression: expression to optimize</span>
</span><span id="optimize-58"><a href="#optimize-58"><span class="linenos">58</span></a><span class="sd"> schema: database schema.</span>
</span><span id="optimize-59"><a href="#optimize-59"><span class="linenos">59</span></a><span class="sd"> This can either be an instance of `sqlglot.optimizer.Schema` or a mapping in one of</span>
</span><span id="optimize-60"><a href="#optimize-60"><span class="linenos">60</span></a><span class="sd"> the following forms:</span>
</span><span id="optimize-61"><a href="#optimize-61"><span class="linenos">61</span></a><span class="sd"> 1. {table: {col: type}}</span>
</span><span id="optimize-62"><a href="#optimize-62"><span class="linenos">62</span></a><span class="sd"> 2. {db: {table: {col: type}}}</span>
</span><span id="optimize-63"><a href="#optimize-63"><span class="linenos">63</span></a><span class="sd"> 3. {catalog: {db: {table: {col: type}}}}</span>
</span><span id="optimize-64"><a href="#optimize-64"><span class="linenos">64</span></a><span class="sd"> If no schema is provided then the default schema defined at `sqlgot.schema` will be used</span>
</span><span id="optimize-65"><a href="#optimize-65"><span class="linenos">65</span></a><span class="sd"> db: specify the default database, as might be set by a `USE DATABASE db` statement</span>
</span><span id="optimize-66"><a href="#optimize-66"><span class="linenos">66</span></a><span class="sd"> catalog: specify the default catalog, as might be set by a `USE CATALOG c` statement</span>
</span><span id="optimize-67"><a href="#optimize-67"><span class="linenos">67</span></a><span class="sd"> dialect: The dialect to parse the sql string.</span>
</span><span id="optimize-68"><a href="#optimize-68"><span class="linenos">68</span></a><span class="sd"> rules: sequence of optimizer rules to use.</span>
</span><span id="optimize-69"><a href="#optimize-69"><span class="linenos">69</span></a><span class="sd"> Many of the rules require tables and columns to be qualified.</span>
</span><span id="optimize-70"><a href="#optimize-70"><span class="linenos">70</span></a><span class="sd"> Do not remove `qualify` from the sequence of rules unless you know what you&#39;re doing!</span>
</span><span id="optimize-71"><a href="#optimize-71"><span class="linenos">71</span></a><span class="sd"> **kwargs: If a rule has a keyword argument with a same name in **kwargs, it will be passed in.</span>
</span><span id="optimize-72"><a href="#optimize-72"><span class="linenos">72</span></a>
</span><span id="optimize-73"><a href="#optimize-73"><span class="linenos">73</span></a><span class="sd"> Returns:</span>
</span><span id="optimize-74"><a href="#optimize-74"><span class="linenos">74</span></a><span class="sd"> The optimized expression.</span>
</span><span id="optimize-75"><a href="#optimize-75"><span class="linenos">75</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="optimize-76"><a href="#optimize-76"><span class="linenos">76</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span> <span class="ow">or</span> <span class="n">sqlglot</span><span class="o">.</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="optimize-77"><a href="#optimize-77"><span class="linenos">77</span></a> <span class="n">possible_kwargs</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="optimize-78"><a href="#optimize-78"><span class="linenos">78</span></a> <span class="s2">&quot;db&quot;</span><span class="p">:</span> <span class="n">db</span><span class="p">,</span>
</span><span id="optimize-79"><a href="#optimize-79"><span class="linenos">79</span></a> <span class="s2">&quot;catalog&quot;</span><span class="p">:</span> <span class="n">catalog</span><span class="p">,</span>
</span><span id="optimize-80"><a href="#optimize-80"><span class="linenos">80</span></a> <span class="s2">&quot;schema&quot;</span><span class="p">:</span> <span class="n">schema</span><span class="p">,</span>
</span><span id="optimize-81"><a href="#optimize-81"><span class="linenos">81</span></a> <span class="s2">&quot;dialect&quot;</span><span class="p">:</span> <span class="n">dialect</span><span class="p">,</span>
</span><span id="optimize-82"><a href="#optimize-82"><span class="linenos">82</span></a> <span class="s2">&quot;isolate_tables&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># needed for other optimizations to perform well</span>
</span><span id="optimize-83"><a href="#optimize-83"><span class="linenos">83</span></a> <span class="s2">&quot;quote_identifiers&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
</span><span id="optimize-84"><a href="#optimize-84"><span class="linenos">84</span></a> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
</span><span id="optimize-85"><a href="#optimize-85"><span class="linenos">85</span></a> <span class="p">}</span>
</span><span id="optimize-86"><a href="#optimize-86"><span class="linenos">86</span></a>
</span><span id="optimize-87"><a href="#optimize-87"><span class="linenos">87</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">maybe_parse</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="optimize-88"><a href="#optimize-88"><span class="linenos">88</span></a> <span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
</span><span id="optimize-89"><a href="#optimize-89"><span class="linenos">89</span></a> <span class="c1"># Find any additional rule parameters, beyond `expression`</span>
</span><span id="optimize-90"><a href="#optimize-90"><span class="linenos">90</span></a> <span class="n">rule_params</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getfullargspec</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span><span class="o">.</span><span class="n">args</span>
</span><span id="optimize-91"><a href="#optimize-91"><span class="linenos">91</span></a> <span class="n">rule_kwargs</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="optimize-92"><a href="#optimize-92"><span class="linenos">92</span></a> <span class="n">param</span><span class="p">:</span> <span class="n">possible_kwargs</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">rule_params</span> <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">possible_kwargs</span>
</span><span id="optimize-93"><a href="#optimize-93"><span class="linenos">93</span></a> <span class="p">}</span>
</span><span id="optimize-94"><a href="#optimize-94"><span class="linenos">94</span></a> <span class="n">optimized</span> <span class="o">=</span> <span class="n">rule</span><span class="p">(</span><span class="n">optimized</span><span class="p">,</span> <span class="o">**</span><span class="n">rule_kwargs</span><span class="p">)</span>
</span><span id="optimize-95"><a href="#optimize-95"><span class="linenos">95</span></a>
</span><span id="optimize-96"><a href="#optimize-96"><span class="linenos">96</span></a> <span class="k">return</span> <span class="n">optimized</span>
</span></pre></div>

View file

@ -124,7 +124,7 @@
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">normalize_identifiers</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">qualify_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">db</span><span class="o">=</span><span class="n">db</span><span class="p">,</span> <span class="n">catalog</span><span class="o">=</span><span class="n">catalog</span><span class="p">,</span> <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">)</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">qualify_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">db</span><span class="o">=</span><span class="n">db</span><span class="p">,</span> <span class="n">catalog</span><span class="o">=</span><span class="n">catalog</span><span class="p">,</span> <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a>
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a> <span class="k">if</span> <span class="n">isolate_tables</span><span class="p">:</span>
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">isolate_table_selects</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">)</span>
@ -213,7 +213,7 @@
</span><span id="qualify-67"><a href="#qualify-67"><span class="linenos">67</span></a><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="qualify-68"><a href="#qualify-68"><span class="linenos">68</span></a> <span class="n">schema</span> <span class="o">=</span> <span class="n">ensure_schema</span><span class="p">(</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="qualify-69"><a href="#qualify-69"><span class="linenos">69</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">normalize_identifiers</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="qualify-70"><a href="#qualify-70"><span class="linenos">70</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">qualify_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">db</span><span class="o">=</span><span class="n">db</span><span class="p">,</span> <span class="n">catalog</span><span class="o">=</span><span class="n">catalog</span><span class="p">,</span> <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">)</span>
</span><span id="qualify-70"><a href="#qualify-70"><span class="linenos">70</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">qualify_tables</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">db</span><span class="o">=</span><span class="n">db</span><span class="p">,</span> <span class="n">catalog</span><span class="o">=</span><span class="n">catalog</span><span class="p">,</span> <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">,</span> <span class="n">dialect</span><span class="o">=</span><span class="n">dialect</span><span class="p">)</span>
</span><span id="qualify-71"><a href="#qualify-71"><span class="linenos">71</span></a>
</span><span id="qualify-72"><a href="#qualify-72"><span class="linenos">72</span></a> <span class="k">if</span> <span class="n">isolate_tables</span><span class="p">:</span>
</span><span id="qualify-73"><a href="#qualify-73"><span class="linenos">73</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">isolate_table_selects</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">)</span>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -8545,7 +8545,7 @@
<div id="Tokenizer.COMMAND_PREFIX_TOKENS" class="classattr">
<div class="attr variable">
<span class="name">COMMAND_PREFIX_TOKENS</span> =
<span class="default_value">{&lt;<a href="#TokenType.SEMICOLON">TokenType.SEMICOLON</a>: &#39;SEMICOLON&#39;&gt;, &lt;<a href="#TokenType.BEGIN">TokenType.BEGIN</a>: &#39;BEGIN&#39;&gt;}</span>
<span class="default_value">{&lt;<a href="#TokenType.BEGIN">TokenType.BEGIN</a>: &#39;BEGIN&#39;&gt;, &lt;<a href="#TokenType.SEMICOLON">TokenType.SEMICOLON</a>: &#39;SEMICOLON&#39;&gt;}</span>
</div>

File diff suppressed because it is too large Load diff