Merging upstream version 16.7.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
331a760a3d
commit
088f137198
75 changed files with 33866 additions and 31988 deletions
81
CHANGELOG.md
81
CHANGELOG.md
|
@ -1,6 +1,82 @@
|
||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
## [v16.7.1] - 2023-06-28
|
||||||
|
### :sparkles: New Features
|
||||||
|
- [`95a4b70`](https://github.com/tobymao/sqlglot/commit/95a4b70146bfb82ef2beca263a6dd6612994d224) - **bigquery**: pushdown CTE column names *(PR [#1847](https://github.com/tobymao/sqlglot/pull/1847) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
- [`f81dd26`](https://github.com/tobymao/sqlglot/commit/f81dd26df3dc00a511f6d4d461d83c2e844d9476) - **bigquery**: add support for casting to string w/ format *(PR [#1848](https://github.com/tobymao/sqlglot/pull/1848) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
|
||||||
|
### :wrench: Chores
|
||||||
|
- [`898f1a2`](https://github.com/tobymao/sqlglot/commit/898f1a2ed4f575d11f7d8680c2d642c3d5b8320c) - add test case for bigquery table normalization *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
|
||||||
|
|
||||||
|
## [v16.7.0] - 2023-06-28
|
||||||
|
### :boom: BREAKING CHANGES
|
||||||
|
- due to [`d72caf4`](https://github.com/tobymao/sqlglot/commit/d72caf49d1d2f516142d84ca12b4e3fc616a71a4) - bigquery udfs are case sensitive *(commit by [@tobymao](https://github.com/tobymao))*:
|
||||||
|
|
||||||
|
bigquery udfs are case sensitive
|
||||||
|
|
||||||
|
|
||||||
|
### :bug: Bug Fixes
|
||||||
|
- [`ebe04bb`](https://github.com/tobymao/sqlglot/commit/ebe04bbbe1c039c9067cd461a5c57d6e66f4469e) - table name with dots *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`e3c43f2`](https://github.com/tobymao/sqlglot/commit/e3c43f2b88deba0b1a0c41b91fb0ad6f3e0be0da) - redshift to ast incorrect *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`d72caf4`](https://github.com/tobymao/sqlglot/commit/d72caf49d1d2f516142d84ca12b4e3fc616a71a4) - bigquery udfs are case sensitive *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`7cb01a0`](https://github.com/tobymao/sqlglot/commit/7cb01a09c1897357905428b46f095f80cdfe4804) - **bigquery**: transpile explode projection to cross join unnest, clean up tests *(PR [#1844](https://github.com/tobymao/sqlglot/pull/1844) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
- [`abdf34b`](https://github.com/tobymao/sqlglot/commit/abdf34b273acd0f1a33648912059dfd42104cc2f) - **bigquery**: STRING_AGG parsing bug *(PR [#1846](https://github.com/tobymao/sqlglot/pull/1846) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
|
||||||
|
|
||||||
|
## [v16.6.0] - 2023-06-27
|
||||||
|
### :boom: BREAKING CHANGES
|
||||||
|
- due to [`71818f9`](https://github.com/tobymao/sqlglot/commit/71818f948b083f87c691a9b3b7cf38ffd6f34007) - bigquery normalize dot tables and aliases *(commit by [@tobymao](https://github.com/tobymao))*:
|
||||||
|
|
||||||
|
bigquery normalize dot tables and aliases
|
||||||
|
|
||||||
|
|
||||||
|
### :bug: Bug Fixes
|
||||||
|
- [`b60e19b`](https://github.com/tobymao/sqlglot/commit/b60e19b7f1464f727cadfd8f51fc27c6bfd2e0a9) - spark clustered by dml *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`40928b7`](https://github.com/tobymao/sqlglot/commit/40928b720dcc61cec29731e7530104fbfe696d3a) - full support for spark clustered by *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`71818f9`](https://github.com/tobymao/sqlglot/commit/71818f948b083f87c691a9b3b7cf38ffd6f34007) - bigquery normalize dot tables and aliases *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
|
||||||
|
|
||||||
|
## [v16.5.0] - 2023-06-27
|
||||||
|
### :boom: BREAKING CHANGES
|
||||||
|
- due to [`451dad2`](https://github.com/tobymao/sqlglot/commit/451dad22e7c7b6ca8f6ed5cd5cd17d350c22f8e4) - use alias for order by after group by closes [#1822](https://github.com/tobymao/sqlglot/pull/1822) *(commit by [@tobymao](https://github.com/tobymao))*:
|
||||||
|
|
||||||
|
use alias for order by after group by closes #1822
|
||||||
|
|
||||||
|
- due to [`9de9667`](https://github.com/tobymao/sqlglot/commit/9de9667126a32826b7be4e905c60c7c5b038e0f3) - group by having closes [#1831](https://github.com/tobymao/sqlglot/pull/1831) *(commit by [@tobymao](https://github.com/tobymao))*:
|
||||||
|
|
||||||
|
group by having closes #1831
|
||||||
|
|
||||||
|
|
||||||
|
### :sparkles: New Features
|
||||||
|
- [`5d5795d`](https://github.com/tobymao/sqlglot/commit/5d5795d5ac7812790e95befa54b5c2bc10757934) - **postgres**: improve transpilation of ELEMENT_AT *(PR [#1830](https://github.com/tobymao/sqlglot/pull/1830) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
- :arrow_lower_right: *addresses issue [#1829](undefined) opened by [@SudarshanVS](https://github.com/SudarshanVS)*
|
||||||
|
- [`763d25b`](https://github.com/tobymao/sqlglot/commit/763d25bca6d823c5f80e91eb53e86a0b6d52c9a9) - **mysql**: add support for SIGNED [INTEGER] and UNSIGNED [INTEGER] types *(PR [#1828](https://github.com/tobymao/sqlglot/pull/1828) by [@brosoul](https://github.com/brosoul))*
|
||||||
|
|
||||||
|
### :bug: Bug Fixes
|
||||||
|
- [`451dad2`](https://github.com/tobymao/sqlglot/commit/451dad22e7c7b6ca8f6ed5cd5cd17d350c22f8e4) - use alias for order by after group by closes [#1822](https://github.com/tobymao/sqlglot/pull/1822) *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`8aef4c3`](https://github.com/tobymao/sqlglot/commit/8aef4c3687637149a13c50bde5eeee36a518796c) - dont expand bq pseudocolumns in optimizer star expansion *(PR [#1826](https://github.com/tobymao/sqlglot/pull/1826) by [@z3z1ma](https://github.com/z3z1ma))*
|
||||||
|
- [`f7abc28`](https://github.com/tobymao/sqlglot/commit/f7abc2887d48808edd96a972f537a0232f2c635e) - **mysql**: convert (U)BIGINT to (UN)SIGNED in CAST expressions *(PR [#1832](https://github.com/tobymao/sqlglot/pull/1832) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
- [`9de9667`](https://github.com/tobymao/sqlglot/commit/9de9667126a32826b7be4e905c60c7c5b038e0f3) - group by having closes [#1831](https://github.com/tobymao/sqlglot/pull/1831) *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`cb0ac10`](https://github.com/tobymao/sqlglot/commit/cb0ac10bdb3fc5b071f7b46259b60de9d9553525) - unnest subqueries in executor closes [#1835](https://github.com/tobymao/sqlglot/pull/1835) *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
- [`32a86aa`](https://github.com/tobymao/sqlglot/commit/32a86aab329a7c62e914e0039354c6973cecc919) - **bigquery**: handle reserved keywords *(PR [#1839](https://github.com/tobymao/sqlglot/pull/1839) by [@serkef](https://github.com/serkef))*
|
||||||
|
- [`4de255c`](https://github.com/tobymao/sqlglot/commit/4de255c7f3ffd6218d234b32165cc2f40d0967e4) - interval precedence parsing bug *(PR [#1837](https://github.com/tobymao/sqlglot/pull/1837) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
- :arrow_lower_right: *fixes issue [#1834](undefined) opened by [@WSKINGS](https://github.com/WSKINGS)*
|
||||||
|
- [`e4d6ba5`](https://github.com/tobymao/sqlglot/commit/e4d6ba555d4b7de23a8ca0f4b8acd90d70b7342e) - remove group alias for spark 3 *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
|
||||||
|
### :wrench: Chores
|
||||||
|
- [`19295cc`](https://github.com/tobymao/sqlglot/commit/19295cc5d0080883af183771512f8e8a4050eecd) - fix test *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
|
||||||
|
|
||||||
|
## [v16.4.2] - 2023-06-23
|
||||||
|
### :sparkles: New Features
|
||||||
|
- [`91ebaf5`](https://github.com/tobymao/sqlglot/commit/91ebaf5c36780e68bed26dec5f57b63d831634ea) - **snowflake**: add support for BYTEINT type *(PR [#1819](https://github.com/tobymao/sqlglot/pull/1819) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
- :arrow_lower_right: *addresses issue [#1818](undefined) opened by [@criccomini](https://github.com/criccomini)*
|
||||||
|
- [`2367bfc`](https://github.com/tobymao/sqlglot/commit/2367bfc2d9e0a43ebf37e37cfc4711c9e243cb89) - make table_name more robust by quoting unsafe parts *(PR [#1820](https://github.com/tobymao/sqlglot/pull/1820) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
- [`5572e76`](https://github.com/tobymao/sqlglot/commit/5572e768ac1af31f743fb4a0fae5a1e73569f167) - execute LEFT and RIGHT *(PR [#1821](https://github.com/tobymao/sqlglot/pull/1821) by [@barakalon](https://github.com/barakalon))*
|
||||||
|
|
||||||
|
|
||||||
## [v16.4.1] - 2023-06-23
|
## [v16.4.1] - 2023-06-23
|
||||||
### :sparkles: New Features
|
### :sparkles: New Features
|
||||||
- [`088e745`](https://github.com/tobymao/sqlglot/commit/088e745b83358080dacda2ade79ede5cbb09c99d) - **databricks**: add support for REPLACE WHERE in INSERT statement *(PR [#1817](https://github.com/tobymao/sqlglot/pull/1817) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
- [`088e745`](https://github.com/tobymao/sqlglot/commit/088e745b83358080dacda2ade79ede5cbb09c99d) - **databricks**: add support for REPLACE WHERE in INSERT statement *(PR [#1817](https://github.com/tobymao/sqlglot/pull/1817) by [@GeorgeSittas](https://github.com/GeorgeSittas))*
|
||||||
|
@ -615,3 +691,8 @@ Changelog
|
||||||
[v16.3.1]: https://github.com/tobymao/sqlglot/compare/v16.3.0...v16.3.1
|
[v16.3.1]: https://github.com/tobymao/sqlglot/compare/v16.3.0...v16.3.1
|
||||||
[v16.4.0]: https://github.com/tobymao/sqlglot/compare/v16.3.1...v16.4.0
|
[v16.4.0]: https://github.com/tobymao/sqlglot/compare/v16.3.1...v16.4.0
|
||||||
[v16.4.1]: https://github.com/tobymao/sqlglot/compare/v16.4.0...v16.4.1
|
[v16.4.1]: https://github.com/tobymao/sqlglot/compare/v16.4.0...v16.4.1
|
||||||
|
[v16.4.2]: https://github.com/tobymao/sqlglot/compare/v16.4.1...v16.4.2
|
||||||
|
[v16.5.0]: https://github.com/tobymao/sqlglot/compare/v16.4.2...v16.5.0
|
||||||
|
[v16.6.0]: https://github.com/tobymao/sqlglot/compare/v16.5.0...v16.6.0
|
||||||
|
[v16.7.0]: https://github.com/tobymao/sqlglot/compare/v16.6.0...v16.7.0
|
||||||
|
[v16.7.1]: https://github.com/tobymao/sqlglot/compare/v16.7.0...v16.7.1
|
File diff suppressed because one or more lines are too long
|
@ -51,8 +51,8 @@
|
||||||
|
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos">1</span></a><span class="c1"># file generated by setuptools_scm</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos">1</span></a><span class="c1"># file generated by setuptools_scm</span>
|
||||||
</span><span id="L-2"><a href="#L-2"><span class="linenos">2</span></a><span class="c1"># don't change, don't track in version control</span>
|
</span><span id="L-2"><a href="#L-2"><span class="linenos">2</span></a><span class="c1"># don't change, don't track in version control</span>
|
||||||
</span><span id="L-3"><a href="#L-3"><span class="linenos">3</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'16.4.1'</span>
|
</span><span id="L-3"><a href="#L-3"><span class="linenos">3</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'16.7.1'</span>
|
||||||
</span><span id="L-4"><a href="#L-4"><span class="linenos">4</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">16</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
</span><span id="L-4"><a href="#L-4"><span class="linenos">4</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">16</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -777,7 +777,7 @@
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430583414944'</span><span class="o">></span><span class="p">],</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430583414944'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430585007696'</span><span class="o">></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">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576645952'</span><span class="o">></span><span class="p">],</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576645952'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576934912'</span><span class="o">></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">sqlglot.dataframe.sql.DataFrame</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="SparkSession.createDataFrame-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="SparkSession.createDataFrame-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -1681,7 +1681,7 @@
|
||||||
<input id="DataFrame.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
<input id="DataFrame.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
<div class="attr function">
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430588014224'</span><span class="o">></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"><</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">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430588117776'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390580206272'</span><span class="o">></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"><</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">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390581504272'</span><span class="o">></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>
|
<label class="view-source-button" for="DataFrame.__init__-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -2611,7 +2611,7 @@ is unlikely to come up.</p>
|
||||||
<div class="decorator">@operation(Operation.FROM)</div>
|
<div class="decorator">@operation(Operation.FROM)</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430583371888'</span><span class="o">></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">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390577230112'</span><span class="o">></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">sqlglot.dataframe.sql.DataFrame</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="DataFrame.fillna-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="DataFrame.fillna-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -2680,7 +2680,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>
|
<div class="decorator">@operation(Operation.FROM)</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430583980064'</span><span class="o">></span><span class="p">],</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430583980064'</span><span class="o">></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">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390577626688'</span><span class="o">></span><span class="p">],</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390577626688'</span><span class="o">></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">sqlglot.dataframe.sql.DataFrame</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="DataFrame.replace-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="DataFrame.replace-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -2885,7 +2885,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>
|
<div class="decorator">@operation(Operation.NO_OP)</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430581926688'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430581982224'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575593968'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575726912'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">sqlglot.dataframe.sql.DataFrame</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="DataFrame.repartition-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="DataFrame.repartition-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3590,7 +3590,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">
|
<input id="Column.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
<div class="attr function">
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430586079424'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390579709424'</span><span class="o">></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>
|
<label class="view-source-button" for="Column.__init__-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3633,7 +3633,7 @@ and check if it matches the type of the value provided. If not then make it null
|
||||||
<div class="decorator">@classmethod</div>
|
<div class="decorator">@classmethod</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582454624'</span><span class="o">></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></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575838912'</span><span class="o">></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></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.ensure_col-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.ensure_col-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3654,7 +3654,7 @@ and check if it matches the type of the value provided. If not then make it null
|
||||||
<div class="decorator">@classmethod</div>
|
<div class="decorator">@classmethod</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582612608'</span><span class="o">></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">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576275808'</span><span class="o">></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">sqlglot.dataframe.sql.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>
|
<label class="view-source-button" for="Column.ensure_cols-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3675,7 +3675,7 @@ and check if it matches the type of the value provided. If not then make it null
|
||||||
<div class="decorator">@classmethod</div>
|
<div class="decorator">@classmethod</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582366016'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582236640'</span><span class="o">></span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575995968'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575937744'</span><span class="o">></span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">sqlglot.dataframe.sql.Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.invoke_anonymous_function-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.invoke_anonymous_function-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3702,7 +3702,7 @@ and check if it matches the type of the value provided. If not then make it null
|
||||||
<div class="decorator">@classmethod</div>
|
<div class="decorator">@classmethod</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582194784'</span><span class="o">></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">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575821424'</span><span class="o">></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">sqlglot.dataframe.sql.Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.invoke_expression_over_column-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.invoke_expression_over_column-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3739,7 +3739,7 @@ and check if it matches the type of the value provided. If not then make it null
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582382656'</span><span class="o">></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">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576157744'</span><span class="o">></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">sqlglot.dataframe.sql.Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.binary_op-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.binary_op-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3760,7 +3760,7 @@ and check if it matches the type of the value provided. If not then make it null
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582392304'</span><span class="o">></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">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576186144'</span><span class="o">></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">sqlglot.dataframe.sql.Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.inverse_binary_op-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.inverse_binary_op-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4314,7 +4314,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582714512'</span><span class="o">></span><span class="p">,</span> <span class="n">Iterable</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582714512'</span><span class="o">></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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576427056'</span><span class="o">></span><span class="p">,</span> <span class="n">Iterable</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576427056'</span><span class="o">></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>
|
<label class="view-source-button" for="Column.isin-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4335,7 +4335,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582771536'</span><span class="o">></span>,</span><span class="param"> <span class="n">upperBound</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582832176'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576500800'</span><span class="o">></span>,</span><span class="param"> <span class="n">upperBound</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390576560480'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">sqlglot.dataframe.sql.Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.between-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.between-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4370,7 +4370,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582891472'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390574572400'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">sqlglot.dataframe.sql.Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.over-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.over-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4615,7 +4615,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
||||||
<div class="decorator">@classmethod</div>
|
<div class="decorator">@classmethod</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430579900976'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430579900976'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575106192'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575106192'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Window.partitionBy-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Window.partitionBy-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4636,7 +4636,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
||||||
<div class="decorator">@classmethod</div>
|
<div class="decorator">@classmethod</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582923168'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430582923168'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575443248'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390575443248'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Window.orderBy-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Window.orderBy-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4872,7 +4872,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430580080384'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430580080384'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390574710528'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390574710528'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="WindowSpec.partitionBy-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="WindowSpec.partitionBy-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4899,7 +4899,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430580145632'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140430580145632'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.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"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390574884704'</span><span class="o">></span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'140390574884704'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">sqlglot.dataframe.sql.WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="WindowSpec.orderBy-view-source"><span>View Source</span></label>
|
<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
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
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 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 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 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 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
|
@ -116,98 +116,96 @@
|
||||||
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">TYPE_CHECKING</span><span class="p">:</span>
|
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">TYPE_CHECKING</span><span class="p">:</span>
|
||||||
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a> <span class="kn">from</span> <span class="nn">sqlglot.executor.table</span> <span class="kn">import</span> <span class="n">Table</span><span class="p">,</span> <span class="n">TableIter</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.executor.table</span> <span class="kn">import</span> <span class="n">Table</span><span class="p">,</span> <span class="n">TableIter</span>
|
||||||
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a>
|
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a>
|
||||||
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a>
|
</span><span id="L-10"><a href="#L-10"><span class="linenos">10</span></a>
|
||||||
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="k">class</span> <span class="nc">Context</span><span class="p">:</span>
|
</span><span id="L-11"><a href="#L-11"><span class="linenos">11</span></a><span class="k">class</span> <span class="nc">Context</span><span class="p">:</span>
|
||||||
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="sd"> Execution context for sql expressions.</span>
|
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="sd"> Execution context for sql expressions.</span>
|
||||||
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a>
|
</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="sd"> Context is used to hold relevant data tables which can then be queried on with eval.</span>
|
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="sd"> Context is used to hold relevant data tables which can then be queried on with eval.</span>
|
||||||
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
|
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a>
|
||||||
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="sd"> References to columns can either be scalar or vectors. When set_row is used, column references</span>
|
</span><span id="L-17"><a href="#L-17"><span class="linenos">17</span></a><span class="sd"> References to columns can either be scalar or vectors. When set_row is used, column references</span>
|
||||||
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a><span class="sd"> evaluate to scalars while set_range evaluates to vectors. This allows convenient and efficient</span>
|
</span><span id="L-18"><a href="#L-18"><span class="linenos">18</span></a><span class="sd"> evaluate to scalars while set_range evaluates to vectors. This allows convenient and efficient</span>
|
||||||
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a><span class="sd"> evaluation of aggregation functions.</span>
|
</span><span id="L-19"><a href="#L-19"><span class="linenos">19</span></a><span class="sd"> evaluation of aggregation functions.</span>
|
||||||
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="sd"> """</span>
|
</span><span id="L-20"><a href="#L-20"><span class="linenos">20</span></a><span class="sd"> """</span>
|
||||||
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a>
|
</span><span id="L-21"><a href="#L-21"><span class="linenos">21</span></a>
|
||||||
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tables</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Table</span><span class="p">],</span> <span class="n">env</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">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-22"><a href="#L-22"><span class="linenos">22</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tables</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Table</span><span class="p">],</span> <span class="n">env</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">Dict</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="L-23"><a href="#L-23"><span class="linenos">23</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd"> Args</span>
|
</span><span id="L-24"><a href="#L-24"><span class="linenos">24</span></a><span class="sd"> Args</span>
|
||||||
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd"> tables: representing the scope of the current execution context.</span>
|
</span><span id="L-25"><a href="#L-25"><span class="linenos">25</span></a><span class="sd"> tables: representing the scope of the current execution context.</span>
|
||||||
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> env: dictionary of functions within the execution context.</span>
|
</span><span id="L-26"><a href="#L-26"><span class="linenos">26</span></a><span class="sd"> env: dictionary of functions within the execution context.</span>
|
||||||
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd"> """</span>
|
</span><span id="L-27"><a href="#L-27"><span class="linenos">27</span></a><span class="sd"> """</span>
|
||||||
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span> <span class="o">=</span> <span class="n">tables</span>
|
</span><span id="L-28"><a href="#L-28"><span class="linenos">28</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span> <span class="o">=</span> <span class="n">tables</span>
|
||||||
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_table</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">Table</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
</span><span id="L-29"><a href="#L-29"><span class="linenos">29</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_table</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">Table</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
||||||
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">table</span><span class="o">.</span><span class="n">range_reader</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
|
</span><span id="L-30"><a href="#L-30"><span class="linenos">30</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">table</span><span class="o">.</span><span class="n">range_reader</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
|
||||||
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">table</span><span class="o">.</span><span class="n">reader</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">tables</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
|
</span><span id="L-31"><a href="#L-31"><span class="linenos">31</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">table</span><span class="o">.</span><span class="n">reader</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">tables</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
|
||||||
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">ENV</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">env</span> <span class="ow">or</span> <span class="p">{}),</span> <span class="s2">"scope"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span><span class="p">}</span>
|
</span><span id="L-32"><a href="#L-32"><span class="linenos">32</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">ENV</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">env</span> <span class="ow">or</span> <span class="p">{}),</span> <span class="s2">"scope"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span><span class="p">}</span>
|
||||||
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a>
|
</span><span id="L-33"><a href="#L-33"><span class="linenos">33</span></a>
|
||||||
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="k">def</span> <span class="nf">eval</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code</span><span class="p">):</span>
|
</span><span id="L-34"><a href="#L-34"><span class="linenos">34</span></a> <span class="k">def</span> <span class="nf">eval</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code</span><span class="p">):</span>
|
||||||
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="k">return</span> <span class="nb">eval</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">)</span>
|
</span><span id="L-35"><a href="#L-35"><span class="linenos">35</span></a> <span class="k">return</span> <span class="nb">eval</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">)</span>
|
||||||
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a>
|
</span><span id="L-36"><a href="#L-36"><span class="linenos">36</span></a>
|
||||||
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="k">def</span> <span class="nf">eval_tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">codes</span><span class="p">):</span>
|
</span><span id="L-37"><a href="#L-37"><span class="linenos">37</span></a> <span class="k">def</span> <span class="nf">eval_tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">codes</span><span class="p">):</span>
|
||||||
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">code</span><span class="p">)</span> <span class="k">for</span> <span class="n">code</span> <span class="ow">in</span> <span class="n">codes</span><span class="p">)</span>
|
</span><span id="L-38"><a href="#L-38"><span class="linenos">38</span></a> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">code</span><span class="p">)</span> <span class="k">for</span> <span class="n">code</span> <span class="ow">in</span> <span class="n">codes</span><span class="p">)</span>
|
||||||
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a>
|
</span><span id="L-39"><a href="#L-39"><span class="linenos">39</span></a>
|
||||||
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="nd">@property</span>
|
</span><span id="L-40"><a href="#L-40"><span class="linenos">40</span></a> <span class="nd">@property</span>
|
||||||
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="k">def</span> <span class="nf">table</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">Table</span><span class="p">:</span>
|
</span><span id="L-41"><a href="#L-41"><span class="linenos">41</span></a> <span class="k">def</span> <span class="nf">table</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">Table</span><span class="p">:</span>
|
||||||
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-42"><a href="#L-42"><span class="linenos">42</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">())[</span><span class="mi">0</span><span class="p">]</span>
|
</span><span id="L-43"><a href="#L-43"><span class="linenos">43</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">())[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="k">for</span> <span class="n">other</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="L-44"><a href="#L-44"><span class="linenos">44</span></a> <span class="k">for</span> <span class="n">other</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span><span class="o">.</span><span class="n">columns</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
</span><span id="L-45"><a href="#L-45"><span class="linenos">45</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span><span class="o">.</span><span class="n">columns</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||||
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Columns are different."</span><span class="p">)</span>
|
</span><span id="L-46"><a href="#L-46"><span class="linenos">46</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Columns are different."</span><span class="p">)</span>
|
||||||
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_table</span><span class="o">.</span><span class="n">rows</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">rows</span><span class="p">):</span>
|
</span><span id="L-47"><a href="#L-47"><span class="linenos">47</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_table</span><span class="o">.</span><span class="n">rows</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">rows</span><span class="p">):</span>
|
||||||
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Rows are different."</span><span class="p">)</span>
|
</span><span id="L-48"><a href="#L-48"><span class="linenos">48</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Rows are different."</span><span class="p">)</span>
|
||||||
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span>
|
</span><span id="L-49"><a href="#L-49"><span class="linenos">49</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_table</span>
|
||||||
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a>
|
</span><span id="L-50"><a href="#L-50"><span class="linenos">50</span></a>
|
||||||
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">def</span> <span class="nf">add_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">columns</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-51"><a href="#L-51"><span class="linenos">51</span></a> <span class="k">def</span> <span class="nf">add_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">columns</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="L-52"><a href="#L-52"><span class="linenos">52</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="n">table</span><span class="o">.</span><span class="n">add_columns</span><span class="p">(</span><span class="o">*</span><span class="n">columns</span><span class="p">)</span>
|
</span><span id="L-53"><a href="#L-53"><span class="linenos">53</span></a> <span class="n">table</span><span class="o">.</span><span class="n">add_columns</span><span class="p">(</span><span class="o">*</span><span class="n">columns</span><span class="p">)</span>
|
||||||
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a>
|
</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="nd">@property</span>
|
</span><span id="L-55"><a href="#L-55"><span class="linenos">55</span></a> <span class="nd">@property</span>
|
||||||
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="k">def</span> <span class="nf">columns</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
</span><span id="L-56"><a href="#L-56"><span class="linenos">56</span></a> <span class="k">def</span> <span class="nf">columns</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
||||||
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">columns</span>
|
</span><span id="L-57"><a href="#L-57"><span class="linenos">57</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">columns</span>
|
||||||
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>
|
</span><span id="L-58"><a href="#L-58"><span class="linenos">58</span></a>
|
||||||
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
</span><span id="L-59"><a href="#L-59"><span class="linenos">59</span></a> <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||||
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">rows</span><span class="p">)):</span>
|
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">rows</span><span class="p">)):</span>
|
||||||
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="n">reader</span> <span class="o">=</span> <span class="n">table</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
</span><span id="L-63"><a href="#L-63"><span class="linenos">63</span></a> <span class="n">reader</span> <span class="o">=</span> <span class="n">table</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
||||||
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="k">yield</span> <span class="n">reader</span><span class="p">,</span> <span class="bp">self</span>
|
</span><span id="L-64"><a href="#L-64"><span class="linenos">64</span></a> <span class="k">yield</span> <span class="n">reader</span><span class="p">,</span> <span class="bp">self</span>
|
||||||
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a>
|
</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">def</span> <span class="nf">table_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">TableIter</span><span class="p">,</span> <span class="n">Context</span><span class="p">]]:</span>
|
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a> <span class="k">def</span> <span class="nf">table_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">TableIter</span><span class="p">:</span>
|
||||||
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a>
|
</span><span id="L-68"><a href="#L-68"><span class="linenos">68</span></a> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">[</span><span class="n">table</span><span class="p">])</span>
|
||||||
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="k">for</span> <span class="n">reader</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">[</span><span class="n">table</span><span class="p">]:</span>
|
</span><span id="L-69"><a href="#L-69"><span class="linenos">69</span></a>
|
||||||
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="k">yield</span> <span class="n">reader</span><span class="p">,</span> <span class="bp">self</span>
|
</span><span id="L-70"><a href="#L-70"><span class="linenos">70</span></a> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
|
</span><span id="L-71"><a href="#L-71"><span class="linenos">71</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="k">for</span> <span class="n">reader</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">condition</span><span class="p">)]</span>
|
||||||
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-72"><a href="#L-72"><span class="linenos">72</span></a>
|
||||||
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="k">for</span> <span class="n">reader</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">condition</span><span class="p">)]</span>
|
</span><span id="L-73"><a href="#L-73"><span class="linenos">73</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a>
|
</span><span id="L-74"><a href="#L-74"><span class="linenos">74</span></a> <span class="n">table</span><span class="o">.</span><span class="n">rows</span> <span class="o">=</span> <span class="n">rows</span>
|
||||||
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</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="n">table</span><span class="o">.</span><span class="n">rows</span> <span class="o">=</span> <span class="n">rows</span>
|
</span><span id="L-76"><a href="#L-76"><span class="linenos">76</span></a> <span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</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">sort_key</span><span class="p">(</span><span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
||||||
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-78"><a href="#L-78"><span class="linenos">78</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||||||
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">def</span> <span class="nf">sort_key</span><span class="p">(</span><span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
</span><span id="L-79"><a href="#L-79"><span class="linenos">79</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval_tuple</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||||
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
</span><span id="L-80"><a href="#L-80"><span class="linenos">80</span></a>
|
||||||
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval_tuple</span><span class="p">(</span><span class="n">key</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">table</span><span class="o">.</span><span class="n">rows</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">sort_key</span><span class="p">)</span>
|
||||||
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a>
|
</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="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">rows</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">sort_key</span><span class="p">)</span>
|
</span><span id="L-83"><a href="#L-83"><span class="linenos">83</span></a> <span class="k">def</span> <span class="nf">set_row</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a>
|
</span><span id="L-84"><a href="#L-84"><span class="linenos">84</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">def</span> <span class="nf">set_row</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-85"><a href="#L-85"><span class="linenos">85</span></a> <span class="n">table</span><span class="o">.</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">row</span>
|
||||||
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="L-86"><a href="#L-86"><span class="linenos">86</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">table</span><span class="o">.</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">row</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="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="L-88"><a href="#L-88"><span class="linenos">88</span></a> <span class="k">def</span> <span class="nf">set_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
|
</span><span id="L-89"><a href="#L-89"><span class="linenos">89</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="k">def</span> <span class="nf">set_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-90"><a href="#L-90"><span class="linenos">90</span></a> <span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
||||||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="L-91"><a href="#L-91"><span class="linenos">91</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
</span><span id="L-92"><a href="#L-92"><span class="linenos">92</span></a>
|
||||||
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="L-93"><a href="#L-93"><span class="linenos">93</span></a> <span class="k">def</span> <span class="nf">set_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a>
|
</span><span id="L-94"><a href="#L-94"><span class="linenos">94</span></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">:</span>
|
||||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">def</span> <span class="nf">set_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</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">range_readers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
||||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">:</span>
|
</span><span id="L-96"><a href="#L-96"><span class="linenos">96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span>
|
||||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
</span><span id="L-97"><a href="#L-97"><span class="linenos">97</span></a>
|
||||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span>
|
</span><span id="L-98"><a href="#L-98"><span class="linenos">98</span></a> <span class="k">def</span> <span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
|
</span><span id="L-99"><a href="#L-99"><span class="linenos">99</span></a> <span class="k">return</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span>
|
||||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">def</span> <span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
|
||||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="k">return</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span>
|
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -278,42 +276,40 @@
|
||||||
</span><span id="Context-64"><a href="#Context-64"><span class="linenos"> 64</span></a> <span class="n">reader</span> <span class="o">=</span> <span class="n">table</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
</span><span id="Context-64"><a href="#Context-64"><span class="linenos"> 64</span></a> <span class="n">reader</span> <span class="o">=</span> <span class="n">table</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
||||||
</span><span id="Context-65"><a href="#Context-65"><span class="linenos"> 65</span></a> <span class="k">yield</span> <span class="n">reader</span><span class="p">,</span> <span class="bp">self</span>
|
</span><span id="Context-65"><a href="#Context-65"><span class="linenos"> 65</span></a> <span class="k">yield</span> <span class="n">reader</span><span class="p">,</span> <span class="bp">self</span>
|
||||||
</span><span id="Context-66"><a href="#Context-66"><span class="linenos"> 66</span></a>
|
</span><span id="Context-66"><a href="#Context-66"><span class="linenos"> 66</span></a>
|
||||||
</span><span id="Context-67"><a href="#Context-67"><span class="linenos"> 67</span></a> <span class="k">def</span> <span class="nf">table_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">TableIter</span><span class="p">,</span> <span class="n">Context</span><span class="p">]]:</span>
|
</span><span id="Context-67"><a href="#Context-67"><span class="linenos"> 67</span></a> <span class="k">def</span> <span class="nf">table_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">TableIter</span><span class="p">:</span>
|
||||||
</span><span id="Context-68"><a href="#Context-68"><span class="linenos"> 68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="Context-68"><a href="#Context-68"><span class="linenos"> 68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="Context-69"><a href="#Context-69"><span class="linenos"> 69</span></a>
|
</span><span id="Context-69"><a href="#Context-69"><span class="linenos"> 69</span></a> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">[</span><span class="n">table</span><span class="p">])</span>
|
||||||
</span><span id="Context-70"><a href="#Context-70"><span class="linenos"> 70</span></a> <span class="k">for</span> <span class="n">reader</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">[</span><span class="n">table</span><span class="p">]:</span>
|
</span><span id="Context-70"><a href="#Context-70"><span class="linenos"> 70</span></a>
|
||||||
</span><span id="Context-71"><a href="#Context-71"><span class="linenos"> 71</span></a> <span class="k">yield</span> <span class="n">reader</span><span class="p">,</span> <span class="bp">self</span>
|
</span><span id="Context-71"><a href="#Context-71"><span class="linenos"> 71</span></a> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context-72"><a href="#Context-72"><span class="linenos"> 72</span></a>
|
</span><span id="Context-72"><a href="#Context-72"><span class="linenos"> 72</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="k">for</span> <span class="n">reader</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">condition</span><span class="p">)]</span>
|
||||||
</span><span id="Context-73"><a href="#Context-73"><span class="linenos"> 73</span></a> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="Context-73"><a href="#Context-73"><span class="linenos"> 73</span></a>
|
||||||
</span><span id="Context-74"><a href="#Context-74"><span class="linenos"> 74</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="k">for</span> <span class="n">reader</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">condition</span><span class="p">)]</span>
|
</span><span id="Context-74"><a href="#Context-74"><span class="linenos"> 74</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="Context-75"><a href="#Context-75"><span class="linenos"> 75</span></a>
|
</span><span id="Context-75"><a href="#Context-75"><span class="linenos"> 75</span></a> <span class="n">table</span><span class="o">.</span><span class="n">rows</span> <span class="o">=</span> <span class="n">rows</span>
|
||||||
</span><span id="Context-76"><a href="#Context-76"><span class="linenos"> 76</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="Context-76"><a href="#Context-76"><span class="linenos"> 76</span></a>
|
||||||
</span><span id="Context-77"><a href="#Context-77"><span class="linenos"> 77</span></a> <span class="n">table</span><span class="o">.</span><span class="n">rows</span> <span class="o">=</span> <span class="n">rows</span>
|
</span><span id="Context-77"><a href="#Context-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context-78"><a href="#Context-78"><span class="linenos"> 78</span></a>
|
</span><span id="Context-78"><a href="#Context-78"><span class="linenos"> 78</span></a> <span class="k">def</span> <span class="nf">sort_key</span><span class="p">(</span><span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
||||||
</span><span id="Context-79"><a href="#Context-79"><span class="linenos"> 79</span></a> <span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="Context-79"><a href="#Context-79"><span class="linenos"> 79</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||||||
</span><span id="Context-80"><a href="#Context-80"><span class="linenos"> 80</span></a> <span class="k">def</span> <span class="nf">sort_key</span><span class="p">(</span><span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
</span><span id="Context-80"><a href="#Context-80"><span class="linenos"> 80</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval_tuple</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||||
</span><span id="Context-81"><a href="#Context-81"><span class="linenos"> 81</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
</span><span id="Context-81"><a href="#Context-81"><span class="linenos"> 81</span></a>
|
||||||
</span><span id="Context-82"><a href="#Context-82"><span class="linenos"> 82</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval_tuple</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
</span><span id="Context-82"><a href="#Context-82"><span class="linenos"> 82</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">rows</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">sort_key</span><span class="p">)</span>
|
||||||
</span><span id="Context-83"><a href="#Context-83"><span class="linenos"> 83</span></a>
|
</span><span id="Context-83"><a href="#Context-83"><span class="linenos"> 83</span></a>
|
||||||
</span><span id="Context-84"><a href="#Context-84"><span class="linenos"> 84</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">rows</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">sort_key</span><span class="p">)</span>
|
</span><span id="Context-84"><a href="#Context-84"><span class="linenos"> 84</span></a> <span class="k">def</span> <span class="nf">set_row</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context-85"><a href="#Context-85"><span class="linenos"> 85</span></a>
|
</span><span id="Context-85"><a href="#Context-85"><span class="linenos"> 85</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="Context-86"><a href="#Context-86"><span class="linenos"> 86</span></a> <span class="k">def</span> <span class="nf">set_row</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="Context-86"><a href="#Context-86"><span class="linenos"> 86</span></a> <span class="n">table</span><span class="o">.</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">row</span>
|
||||||
</span><span id="Context-87"><a href="#Context-87"><span class="linenos"> 87</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="Context-87"><a href="#Context-87"><span class="linenos"> 87</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="Context-88"><a href="#Context-88"><span class="linenos"> 88</span></a> <span class="n">table</span><span class="o">.</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">row</span>
|
</span><span id="Context-88"><a href="#Context-88"><span class="linenos"> 88</span></a>
|
||||||
</span><span id="Context-89"><a href="#Context-89"><span class="linenos"> 89</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="Context-89"><a href="#Context-89"><span class="linenos"> 89</span></a> <span class="k">def</span> <span class="nf">set_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context-90"><a href="#Context-90"><span class="linenos"> 90</span></a>
|
</span><span id="Context-90"><a href="#Context-90"><span class="linenos"> 90</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="Context-91"><a href="#Context-91"><span class="linenos"> 91</span></a> <span class="k">def</span> <span class="nf">set_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="Context-91"><a href="#Context-91"><span class="linenos"> 91</span></a> <span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
||||||
</span><span id="Context-92"><a href="#Context-92"><span class="linenos"> 92</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="Context-92"><a href="#Context-92"><span class="linenos"> 92</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="Context-93"><a href="#Context-93"><span class="linenos"> 93</span></a> <span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
</span><span id="Context-93"><a href="#Context-93"><span class="linenos"> 93</span></a>
|
||||||
</span><span id="Context-94"><a href="#Context-94"><span class="linenos"> 94</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="Context-94"><a href="#Context-94"><span class="linenos"> 94</span></a> <span class="k">def</span> <span class="nf">set_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context-95"><a href="#Context-95"><span class="linenos"> 95</span></a>
|
</span><span id="Context-95"><a href="#Context-95"><span class="linenos"> 95</span></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">:</span>
|
||||||
</span><span id="Context-96"><a href="#Context-96"><span class="linenos"> 96</span></a> <span class="k">def</span> <span class="nf">set_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="Context-96"><a href="#Context-96"><span class="linenos"> 96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
||||||
</span><span id="Context-97"><a href="#Context-97"><span class="linenos"> 97</span></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">:</span>
|
</span><span id="Context-97"><a href="#Context-97"><span class="linenos"> 97</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span>
|
||||||
</span><span id="Context-98"><a href="#Context-98"><span class="linenos"> 98</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
</span><span id="Context-98"><a href="#Context-98"><span class="linenos"> 98</span></a>
|
||||||
</span><span id="Context-99"><a href="#Context-99"><span class="linenos"> 99</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span>
|
</span><span id="Context-99"><a href="#Context-99"><span class="linenos"> 99</span></a> <span class="k">def</span> <span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||||||
</span><span id="Context-100"><a href="#Context-100"><span class="linenos">100</span></a>
|
</span><span id="Context-100"><a href="#Context-100"><span class="linenos">100</span></a> <span class="k">return</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span>
|
||||||
</span><span id="Context-101"><a href="#Context-101"><span class="linenos">101</span></a> <span class="k">def</span> <span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
|
||||||
</span><span id="Context-102"><a href="#Context-102"><span class="linenos">102</span></a> <span class="k">return</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span>
|
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -487,17 +483,15 @@ evaluation of aggregation functions.</p>
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<span class="def">def</span>
|
||||||
<span class="name">table_iter</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n">Iterator</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="n"><a href="table.html#TableIter">sqlglot.executor.table.TableIter</a></span><span class="p">,</span> <span class="n"><a href="#Context">sqlglot.executor.context.Context</a></span><span class="p">]]</span>:</span></span>
|
<span class="name">table_iter</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">table</span><span class="p">:</span> <span class="nb">str</span></span><span class="return-annotation">) -> <span class="n"><a href="table.html#TableIter">sqlglot.executor.table.TableIter</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Context.table_iter-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Context.table_iter-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#Context.table_iter"></a>
|
<a class="headerlink" href="#Context.table_iter"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.table_iter-67"><a href="#Context.table_iter-67"><span class="linenos">67</span></a> <span class="k">def</span> <span class="nf">table_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">[</span><span class="n">TableIter</span><span class="p">,</span> <span class="n">Context</span><span class="p">]]:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.table_iter-67"><a href="#Context.table_iter-67"><span class="linenos">67</span></a> <span class="k">def</span> <span class="nf">table_iter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">TableIter</span><span class="p">:</span>
|
||||||
</span><span id="Context.table_iter-68"><a href="#Context.table_iter-68"><span class="linenos">68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="Context.table_iter-68"><a href="#Context.table_iter-68"><span class="linenos">68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span><span id="Context.table_iter-69"><a href="#Context.table_iter-69"><span class="linenos">69</span></a>
|
</span><span id="Context.table_iter-69"><a href="#Context.table_iter-69"><span class="linenos">69</span></a> <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">[</span><span class="n">table</span><span class="p">])</span>
|
||||||
</span><span id="Context.table_iter-70"><a href="#Context.table_iter-70"><span class="linenos">70</span></a> <span class="k">for</span> <span class="n">reader</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">[</span><span class="n">table</span><span class="p">]:</span>
|
|
||||||
</span><span id="Context.table_iter-71"><a href="#Context.table_iter-71"><span class="linenos">71</span></a> <span class="k">yield</span> <span class="n">reader</span><span class="p">,</span> <span class="bp">self</span>
|
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -515,11 +509,11 @@ evaluation of aggregation functions.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#Context.filter"></a>
|
<a class="headerlink" href="#Context.filter"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.filter-73"><a href="#Context.filter-73"><span class="linenos">73</span></a> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.filter-71"><a href="#Context.filter-71"><span class="linenos">71</span></a> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">condition</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context.filter-74"><a href="#Context.filter-74"><span class="linenos">74</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="k">for</span> <span class="n">reader</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">condition</span><span class="p">)]</span>
|
</span><span id="Context.filter-72"><a href="#Context.filter-72"><span class="linenos">72</span></a> <span class="n">rows</span> <span class="o">=</span> <span class="p">[</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="k">for</span> <span class="n">reader</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">condition</span><span class="p">)]</span>
|
||||||
</span><span id="Context.filter-75"><a href="#Context.filter-75"><span class="linenos">75</span></a>
|
</span><span id="Context.filter-73"><a href="#Context.filter-73"><span class="linenos">73</span></a>
|
||||||
</span><span id="Context.filter-76"><a href="#Context.filter-76"><span class="linenos">76</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="Context.filter-74"><a href="#Context.filter-74"><span class="linenos">74</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="Context.filter-77"><a href="#Context.filter-77"><span class="linenos">77</span></a> <span class="n">table</span><span class="o">.</span><span class="n">rows</span> <span class="o">=</span> <span class="n">rows</span>
|
</span><span id="Context.filter-75"><a href="#Context.filter-75"><span class="linenos">75</span></a> <span class="n">table</span><span class="o">.</span><span class="n">rows</span> <span class="o">=</span> <span class="n">rows</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -537,12 +531,12 @@ evaluation of aggregation functions.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#Context.sort"></a>
|
<a class="headerlink" href="#Context.sort"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.sort-79"><a href="#Context.sort-79"><span class="linenos">79</span></a> <span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.sort-77"><a href="#Context.sort-77"><span class="linenos">77</span></a> <span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context.sort-80"><a href="#Context.sort-80"><span class="linenos">80</span></a> <span class="k">def</span> <span class="nf">sort_key</span><span class="p">(</span><span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
</span><span id="Context.sort-78"><a href="#Context.sort-78"><span class="linenos">78</span></a> <span class="k">def</span> <span class="nf">sort_key</span><span class="p">(</span><span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">:</span>
|
||||||
</span><span id="Context.sort-81"><a href="#Context.sort-81"><span class="linenos">81</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
</span><span id="Context.sort-79"><a href="#Context.sort-79"><span class="linenos">79</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">set_row</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
||||||
</span><span id="Context.sort-82"><a href="#Context.sort-82"><span class="linenos">82</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval_tuple</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
</span><span id="Context.sort-80"><a href="#Context.sort-80"><span class="linenos">80</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval_tuple</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||||
</span><span id="Context.sort-83"><a href="#Context.sort-83"><span class="linenos">83</span></a>
|
</span><span id="Context.sort-81"><a href="#Context.sort-81"><span class="linenos">81</span></a>
|
||||||
</span><span id="Context.sort-84"><a href="#Context.sort-84"><span class="linenos">84</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">rows</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">sort_key</span><span class="p">)</span>
|
</span><span id="Context.sort-82"><a href="#Context.sort-82"><span class="linenos">82</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">rows</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">sort_key</span><span class="p">)</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -560,10 +554,10 @@ evaluation of aggregation functions.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#Context.set_row"></a>
|
<a class="headerlink" href="#Context.set_row"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.set_row-86"><a href="#Context.set_row-86"><span class="linenos">86</span></a> <span class="k">def</span> <span class="nf">set_row</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.set_row-84"><a href="#Context.set_row-84"><span class="linenos">84</span></a> <span class="k">def</span> <span class="nf">set_row</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Tuple</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context.set_row-87"><a href="#Context.set_row-87"><span class="linenos">87</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="Context.set_row-85"><a href="#Context.set_row-85"><span class="linenos">85</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="Context.set_row-88"><a href="#Context.set_row-88"><span class="linenos">88</span></a> <span class="n">table</span><span class="o">.</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">row</span>
|
</span><span id="Context.set_row-86"><a href="#Context.set_row-86"><span class="linenos">86</span></a> <span class="n">table</span><span class="o">.</span><span class="n">reader</span><span class="o">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">row</span>
|
||||||
</span><span id="Context.set_row-89"><a href="#Context.set_row-89"><span class="linenos">89</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="Context.set_row-87"><a href="#Context.set_row-87"><span class="linenos">87</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -581,10 +575,10 @@ evaluation of aggregation functions.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#Context.set_index"></a>
|
<a class="headerlink" href="#Context.set_index"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.set_index-91"><a href="#Context.set_index-91"><span class="linenos">91</span></a> <span class="k">def</span> <span class="nf">set_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.set_index-89"><a href="#Context.set_index-89"><span class="linenos">89</span></a> <span class="k">def</span> <span class="nf">set_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context.set_index-92"><a href="#Context.set_index-92"><span class="linenos">92</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
</span><span id="Context.set_index-90"><a href="#Context.set_index-90"><span class="linenos">90</span></a> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
|
||||||
</span><span id="Context.set_index-93"><a href="#Context.set_index-93"><span class="linenos">93</span></a> <span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
</span><span id="Context.set_index-91"><a href="#Context.set_index-91"><span class="linenos">91</span></a> <span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
||||||
</span><span id="Context.set_index-94"><a href="#Context.set_index-94"><span class="linenos">94</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
</span><span id="Context.set_index-92"><a href="#Context.set_index-92"><span class="linenos">92</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">row_readers</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -602,10 +596,10 @@ evaluation of aggregation functions.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#Context.set_range"></a>
|
<a class="headerlink" href="#Context.set_range"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.set_range-96"><a href="#Context.set_range-96"><span class="linenos">96</span></a> <span class="k">def</span> <span class="nf">set_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Context.set_range-94"><a href="#Context.set_range-94"><span class="linenos">94</span></a> <span class="k">def</span> <span class="nf">set_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">end</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Context.set_range-97"><a href="#Context.set_range-97"><span class="linenos">97</span></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">:</span>
|
</span><span id="Context.set_range-95"><a href="#Context.set_range-95"><span class="linenos">95</span></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tables</span><span class="p">:</span>
|
||||||
</span><span id="Context.set_range-98"><a href="#Context.set_range-98"><span class="linenos">98</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
</span><span id="Context.set_range-96"><a href="#Context.set_range-96"><span class="linenos">96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span>
|
||||||
</span><span id="Context.set_range-99"><a href="#Context.set_range-99"><span class="linenos">99</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span>
|
</span><span id="Context.set_range-97"><a href="#Context.set_range-97"><span class="linenos">97</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s2">"scope"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range_readers</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -254,33 +254,35 @@
|
||||||
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="s2">"IF"</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">predicate</span><span class="p">,</span> <span class="n">true</span><span class="p">,</span> <span class="n">false</span><span class="p">:</span> <span class="n">true</span> <span class="k">if</span> <span class="n">predicate</span> <span class="k">else</span> <span class="n">false</span><span class="p">,</span>
|
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="s2">"IF"</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">predicate</span><span class="p">,</span> <span class="n">true</span><span class="p">,</span> <span class="n">false</span><span class="p">:</span> <span class="n">true</span> <span class="k">if</span> <span class="n">predicate</span> <span class="k">else</span> <span class="n">false</span><span class="p">,</span>
|
||||||
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="s2">"INTDIV"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="s2">"INTDIV"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="s2">"INTERVAL"</span><span class="p">:</span> <span class="n">interval</span><span class="p">,</span>
|
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="s2">"INTERVAL"</span><span class="p">:</span> <span class="n">interval</span><span class="p">,</span>
|
||||||
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="s2">"LIKE"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span>
|
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="s2">"LEFT"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span><span class="p">[:</span><span class="n">e</span><span class="p">]),</span>
|
||||||
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"_"</span><span class="p">,</span> <span class="s2">"."</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"%"</span><span class="p">,</span> <span class="s2">".*"</span><span class="p">),</span> <span class="n">this</span><span class="p">))</span>
|
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="s2">"LIKE"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span>
|
||||||
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="p">),</span>
|
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="nb">bool</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"_"</span><span class="p">,</span> <span class="s2">"."</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"%"</span><span class="p">,</span> <span class="s2">".*"</span><span class="p">),</span> <span class="n">this</span><span class="p">))</span>
|
||||||
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="s2">"LOWER"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">lower</span><span class="p">()),</span>
|
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="p">),</span>
|
||||||
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="s2">"LT"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span> <span class="o"><</span> <span class="n">e</span><span class="p">),</span>
|
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="s2">"LOWER"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">lower</span><span class="p">()),</span>
|
||||||
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="s2">"LTE"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span> <span class="o"><=</span> <span class="n">e</span><span class="p">),</span>
|
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="s2">"LT"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span> <span class="o"><</span> <span class="n">e</span><span class="p">),</span>
|
||||||
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="s2">"MAP"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))),</span> <span class="c1"># type: ignore</span>
|
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="s2">"LTE"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span> <span class="o"><=</span> <span class="n">e</span><span class="p">),</span>
|
||||||
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="s2">"MOD"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="s2">"MAP"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))),</span> <span class="c1"># type: ignore</span>
|
||||||
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="s2">"MUL"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="s2">"MOD"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="s2">"NEQ"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span> <span class="o">!=</span> <span class="n">e</span><span class="p">),</span>
|
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="s2">"MUL"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="s2">"ORD"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="nb">ord</span><span class="p">),</span>
|
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="s2">"NEQ"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span> <span class="o">!=</span> <span class="n">e</span><span class="p">),</span>
|
||||||
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="s2">"ORDERED"</span><span class="p">:</span> <span class="n">ordered</span><span class="p">,</span>
|
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="s2">"ORD"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="nb">ord</span><span class="p">),</span>
|
||||||
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="s2">"POW"</span><span class="p">:</span> <span class="nb">pow</span><span class="p">,</span>
|
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="s2">"ORDERED"</span><span class="p">:</span> <span class="n">ordered</span><span class="p">,</span>
|
||||||
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="s2">"STRPOSITION"</span><span class="p">:</span> <span class="n">str_position</span><span class="p">,</span>
|
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="s2">"POW"</span><span class="p">:</span> <span class="nb">pow</span><span class="p">,</span>
|
||||||
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="s2">"SUB"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="s2">"RIGHT"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">this</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">this</span><span class="p">[</span><span class="o">-</span><span class="n">e</span><span class="p">:]),</span>
|
||||||
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="s2">"SUBSTRING"</span><span class="p">:</span> <span class="n">substring</span><span class="p">,</span>
|
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="s2">"STRPOSITION"</span><span class="p">:</span> <span class="n">str_position</span><span class="p">,</span>
|
||||||
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="s2">"TIMESTRTOTIME"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">arg</span><span class="p">)),</span>
|
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="s2">"SUB"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">e</span><span class="p">,</span> <span class="n">this</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-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="s2">"UPPER"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">upper</span><span class="p">()),</span>
|
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="s2">"SUBSTRING"</span><span class="p">:</span> <span class="n">substring</span><span class="p">,</span>
|
||||||
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="s2">"YEAR"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">year</span><span class="p">),</span>
|
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="s2">"TIMESTRTOTIME"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">arg</span><span class="p">)),</span>
|
||||||
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="s2">"MONTH"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">month</span><span class="p">),</span>
|
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="s2">"UPPER"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">upper</span><span class="p">()),</span>
|
||||||
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="s2">"DAY"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">day</span><span class="p">),</span>
|
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="s2">"YEAR"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">year</span><span class="p">),</span>
|
||||||
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="s2">"CURRENTDATETIME"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">,</span>
|
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="s2">"MONTH"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">month</span><span class="p">),</span>
|
||||||
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="s2">"CURRENTTIMESTAMP"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">,</span>
|
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="s2">"DAY"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">arg</span><span class="p">:</span> <span class="n">arg</span><span class="o">.</span><span class="n">day</span><span class="p">),</span>
|
||||||
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="s2">"CURRENTTIME"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">,</span>
|
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="s2">"CURRENTDATETIME"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">,</span>
|
||||||
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="s2">"CURRENTDATE"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">,</span>
|
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="s2">"CURRENTTIMESTAMP"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">,</span>
|
||||||
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="s2">"STRFTIME"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">arg</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">fmt</span><span class="p">)),</span>
|
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="s2">"CURRENTTIME"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">,</span>
|
||||||
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a><span class="p">}</span>
|
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="s2">"CURRENTDATE"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">,</span>
|
||||||
|
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="s2">"STRFTIME"</span><span class="p">:</span> <span class="n">null_if_any</span><span class="p">(</span><span class="k">lambda</span> <span class="n">fmt</span><span class="p">,</span> <span class="n">arg</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">fmt</span><span class="p">)),</span>
|
||||||
|
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a><span class="p">}</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -572,7 +574,7 @@ def foo(a, b): ...
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">ENV</span> =
|
<span class="name">ENV</span> =
|
||||||
<input id="ENV-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
<input id="ENV-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
<label class="view-value-button pdoc-button" for="ENV-view-value"></label><span class="default_value">{'exp': <module '<a href="../expressions.html">sqlglot.expressions</a>' from '/home/runner/work/sqlglot/sqlglot/sqlglot/expressions.py'>, 'ARRAYAGG': <class 'list'>, 'AVG': <function fmean>, 'COUNT': <function <lambda>>, 'MAX': <function max>, 'MIN': <function min>, 'SUM': <function sum>, 'ABS': <function <lambda>>, 'ADD': <function <lambda>>, 'ARRAYANY': <function <lambda>>, 'BETWEEN': <function <lambda>>, 'BITWISEAND': <function <lambda>>, 'BITWISELEFTSHIFT': <function <lambda>>, 'BITWISEOR': <function <lambda>>, 'BITWISERIGHTSHIFT': <function <lambda>>, 'BITWISEXOR': <function <lambda>>, 'CAST': <function cast>, 'COALESCE': <function <lambda>>, 'CONCAT': <function <lambda>>, 'SAFECONCAT': <function <lambda>>, 'CONCATWS': <function <lambda>>, 'DATESTRTODATE': <function <lambda>>, 'DIV': <function <lambda>>, 'DOT': <function <lambda>>, 'EQ': <function <lambda>>, 'EXTRACT': <function <lambda>>, 'GT': <function <lambda>>, 'GTE': <function <lambda>>, 'IF': <function <lambda>>, 'INTDIV': <function <lambda>>, 'INTERVAL': <function interval>, 'LIKE': <function <lambda>>, 'LOWER': <function <lambda>>, 'LT': <function <lambda>>, 'LTE': <function <lambda>>, 'MAP': <function <lambda>>, 'MOD': <function <lambda>>, 'MUL': <function <lambda>>, 'NEQ': <function <lambda>>, 'ORD': <function ord>, 'ORDERED': <function ordered>, 'POW': <built-in function pow>, 'STRPOSITION': <function str_position>, 'SUB': <function <lambda>>, 'SUBSTRING': <function substring>, 'TIMESTRTOTIME': <function <lambda>>, 'UPPER': <function <lambda>>, 'YEAR': <function <lambda>>, 'MONTH': <function <lambda>>, 'DAY': <function <lambda>>, 'CURRENTDATETIME': <built-in method now of type object>, 'CURRENTTIMESTAMP': <built-in method now of type object>, 'CURRENTTIME': <built-in method now of type object>, 'CURRENTDATE': <built-in method today of type object>, 'STRFTIME': <function <lambda>>}</span>
|
<label class="view-value-button pdoc-button" for="ENV-view-value"></label><span class="default_value">{'exp': <module '<a href="../expressions.html">sqlglot.expressions</a>' from '/home/runner/work/sqlglot/sqlglot/sqlglot/expressions.py'>, 'ARRAYAGG': <class 'list'>, 'AVG': <function fmean>, 'COUNT': <function <lambda>>, 'MAX': <function max>, 'MIN': <function min>, 'SUM': <function sum>, 'ABS': <function <lambda>>, 'ADD': <function <lambda>>, 'ARRAYANY': <function <lambda>>, 'BETWEEN': <function <lambda>>, 'BITWISEAND': <function <lambda>>, 'BITWISELEFTSHIFT': <function <lambda>>, 'BITWISEOR': <function <lambda>>, 'BITWISERIGHTSHIFT': <function <lambda>>, 'BITWISEXOR': <function <lambda>>, 'CAST': <function cast>, 'COALESCE': <function <lambda>>, 'CONCAT': <function <lambda>>, 'SAFECONCAT': <function <lambda>>, 'CONCATWS': <function <lambda>>, 'DATESTRTODATE': <function <lambda>>, 'DIV': <function <lambda>>, 'DOT': <function <lambda>>, 'EQ': <function <lambda>>, 'EXTRACT': <function <lambda>>, 'GT': <function <lambda>>, 'GTE': <function <lambda>>, 'IF': <function <lambda>>, 'INTDIV': <function <lambda>>, 'INTERVAL': <function interval>, 'LEFT': <function <lambda>>, 'LIKE': <function <lambda>>, 'LOWER': <function <lambda>>, 'LT': <function <lambda>>, 'LTE': <function <lambda>>, 'MAP': <function <lambda>>, 'MOD': <function <lambda>>, 'MUL': <function <lambda>>, 'NEQ': <function <lambda>>, 'ORD': <function ord>, 'ORDERED': <function ordered>, 'POW': <built-in function pow>, 'RIGHT': <function <lambda>>, 'STRPOSITION': <function str_position>, 'SUB': <function <lambda>>, 'SUBSTRING': <function substring>, 'TIMESTRTOTIME': <function <lambda>>, 'UPPER': <function <lambda>>, 'YEAR': <function <lambda>>, 'MONTH': <function <lambda>>, 'DAY': <function <lambda>>, 'CURRENTDATETIME': <built-in method now of type object>, 'CURRENTTIMESTAMP': <built-in method now of type object>, 'CURRENTTIME': <built-in method now of type object>, 'CURRENTDATE': <built-in method today of type object>, 'STRFTIME': <function <lambda>>}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</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 one or more lines are too long
|
@ -542,7 +542,7 @@ queries if it would result in multiple table selects in a single query:</p>
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">UNMERGABLE_ARGS</span> =
|
<span class="name">UNMERGABLE_ARGS</span> =
|
||||||
<input id="UNMERGABLE_ARGS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
<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">{'match', 'sample', 'having', 'settings', 'into', 'offset', 'group', 'pivots', 'with', 'laterals', 'kind', 'locks', 'distinct', 'cluster', 'format', 'limit', 'sort', 'windows', 'distribute', 'qualify'}</span>
|
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'into', 'sample', 'limit', 'settings', 'windows', 'with', 'qualify', 'distinct', 'format', 'locks', 'offset', 'laterals', 'cluster', 'group', 'pivots', 'having', 'match', 'kind', 'distribute', 'sort'}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -118,8 +118,8 @@
|
||||||
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a><span class="sd"> The qualified expression.</span>
|
</span><span id="L-60"><a href="#L-60"><span class="linenos">60</span></a><span class="sd"> The qualified expression.</span>
|
||||||
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a><span class="sd"> """</span>
|
</span><span id="L-61"><a href="#L-61"><span class="linenos">61</span></a><span class="sd"> """</span>
|
||||||
</span><span id="L-62"><a href="#L-62"><span class="linenos">62</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-62"><a href="#L-62"><span class="linenos">62</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-63"><a href="#L-63"><span class="linenos">63</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-63"><a href="#L-63"><span class="linenos">63</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-64"><a href="#L-64"><span class="linenos">64</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-64"><a href="#L-64"><span class="linenos">64</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-65"><a href="#L-65"><span class="linenos">65</span></a>
|
</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="n">isolate_tables</span><span class="p">:</span>
|
</span><span id="L-66"><a href="#L-66"><span class="linenos">66</span></a> <span class="k">if</span> <span class="n">isolate_tables</span><span class="p">:</span>
|
||||||
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</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>
|
</span><span id="L-67"><a href="#L-67"><span class="linenos">67</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>
|
||||||
|
@ -196,8 +196,8 @@
|
||||||
</span><span id="qualify-61"><a href="#qualify-61"><span class="linenos">61</span></a><span class="sd"> The qualified expression.</span>
|
</span><span id="qualify-61"><a href="#qualify-61"><span class="linenos">61</span></a><span class="sd"> The qualified expression.</span>
|
||||||
</span><span id="qualify-62"><a href="#qualify-62"><span class="linenos">62</span></a><span class="sd"> """</span>
|
</span><span id="qualify-62"><a href="#qualify-62"><span class="linenos">62</span></a><span class="sd"> """</span>
|
||||||
</span><span id="qualify-63"><a href="#qualify-63"><span class="linenos">63</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-63"><a href="#qualify-63"><span class="linenos">63</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-64"><a href="#qualify-64"><span class="linenos">64</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-64"><a href="#qualify-64"><span class="linenos">64</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-65"><a href="#qualify-65"><span class="linenos">65</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-65"><a href="#qualify-65"><span class="linenos">65</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-66"><a href="#qualify-66"><span class="linenos">66</span></a>
|
</span><span id="qualify-66"><a href="#qualify-66"><span class="linenos">66</span></a>
|
||||||
</span><span id="qualify-67"><a href="#qualify-67"><span class="linenos">67</span></a> <span class="k">if</span> <span class="n">isolate_tables</span><span class="p">:</span>
|
</span><span id="qualify-67"><a href="#qualify-67"><span class="linenos">67</span></a> <span class="k">if</span> <span class="n">isolate_tables</span><span class="p">:</span>
|
||||||
</span><span id="qualify-68"><a href="#qualify-68"><span class="linenos">68</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>
|
</span><span id="qualify-68"><a href="#qualify-68"><span class="linenos">68</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
16331
docs/sqlglot/parser.html
16331
docs/sqlglot/parser.html
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
|
@ -7295,7 +7295,7 @@
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">COMMANDS</span> =
|
<span class="name">COMMANDS</span> =
|
||||||
<input id="Tokenizer.COMMANDS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
<input id="Tokenizer.COMMANDS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
<label class="view-value-button pdoc-button" for="Tokenizer.COMMANDS-view-value"></label><span class="default_value">{<<a href="#TokenType.FETCH">TokenType.FETCH</a>: 'FETCH'>, <<a href="#TokenType.SHOW">TokenType.SHOW</a>: 'SHOW'>, <<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: 'EXECUTE'>, <<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: 'COMMAND'>}</span>
|
<label class="view-value-button pdoc-button" for="Tokenizer.COMMANDS-view-value"></label><span class="default_value">{<<a href="#TokenType.SHOW">TokenType.SHOW</a>: 'SHOW'>, <<a href="#TokenType.FETCH">TokenType.FETCH</a>: 'FETCH'>, <<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: 'COMMAND'>, <<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: 'EXECUTE'>}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -7307,7 +7307,7 @@
|
||||||
<div id="Tokenizer.COMMAND_PREFIX_TOKENS" class="classattr">
|
<div id="Tokenizer.COMMAND_PREFIX_TOKENS" class="classattr">
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">COMMAND_PREFIX_TOKENS</span> =
|
<span class="name">COMMAND_PREFIX_TOKENS</span> =
|
||||||
<span class="default_value">{<<a href="#TokenType.BEGIN">TokenType.BEGIN</a>: 'BEGIN'>, <<a href="#TokenType.SEMICOLON">TokenType.SEMICOLON</a>: 'SEMICOLON'>}</span>
|
<span class="default_value">{<<a href="#TokenType.SEMICOLON">TokenType.SEMICOLON</a>: 'SEMICOLON'>, <<a href="#TokenType.BEGIN">TokenType.BEGIN</a>: 'BEGIN'>}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -247,167 +247,168 @@
|
||||||
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
|
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
|
||||||
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.scope</span> <span class="kn">import</span> <span class="n">build_scope</span>
|
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.scope</span> <span class="kn">import</span> <span class="n">build_scope</span>
|
||||||
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a>
|
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a>
|
||||||
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="n">taken_select_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
|
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="n">scope</span> <span class="o">=</span> <span class="n">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="n">scope</span> <span class="o">=</span> <span class="n">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">scope</span><span class="p">:</span>
|
||||||
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">scope</span><span class="p">:</span>
|
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a>
|
||||||
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">taken_source_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span>
|
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">taken_select_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
|
||||||
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a>
|
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="n">taken_source_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span>
|
||||||
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
|
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a>
|
||||||
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">to_replace</span> <span class="o">=</span> <span class="n">select</span>
|
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
|
||||||
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a>
|
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="n">to_replace</span> <span class="o">=</span> <span class="n">select</span>
|
||||||
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a>
|
||||||
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
||||||
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a>
|
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
||||||
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <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><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a>
|
||||||
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">alias</span>
|
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <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><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">alias</span>
|
||||||
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">elif</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">Aliases</span><span class="p">):</span>
|
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="k">elif</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">Aliases</span><span class="p">):</span>
|
||||||
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
||||||
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
||||||
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a>
|
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span><span class="p">)):</span>
|
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a>
|
||||||
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="n">is_posexplode</span> <span class="o">=</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">Posexplode</span><span class="p">)</span>
|
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span><span class="p">)):</span>
|
||||||
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a>
|
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="n">is_posexplode</span> <span class="o">=</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">Posexplode</span><span class="p">)</span>
|
||||||
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a>
|
||||||
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">()],</span> <span class="n">ordinality</span><span class="o">=</span><span class="n">is_posexplode</span><span class="p">)</span>
|
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a>
|
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">()],</span> <span class="n">ordinality</span><span class="o">=</span><span class="n">is_posexplode</span><span class="p">)</span>
|
||||||
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="c1"># This ensures that we won't use [POS]EXPLODE's argument as a new selection</span>
|
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a>
|
||||||
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode_arg</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-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="c1"># This ensures that we won't use [POS]EXPLODE's argument as a new selection</span>
|
||||||
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
|
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode_arg</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-191"><a href="#L-191"><span class="linenos">191</span></a>
|
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
|
||||||
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="n">unnest_source_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">"_u"</span><span class="p">)</span>
|
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a>
|
||||||
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="n">taken_source_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">unnest_source_alias</span><span class="p">)</span>
|
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="n">unnest_source_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">"_u"</span><span class="p">)</span>
|
||||||
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a>
|
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="n">taken_source_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">unnest_source_alias</span><span class="p">)</span>
|
||||||
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">explode_alias</span><span class="p">:</span>
|
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a>
|
||||||
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"col"</span><span class="p">)</span>
|
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">explode_alias</span><span class="p">:</span>
|
||||||
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">)</span>
|
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"col"</span><span class="p">)</span>
|
||||||
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a>
|
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">)</span>
|
||||||
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a>
|
||||||
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"pos"</span><span class="p">)</span>
|
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
||||||
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">)</span>
|
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"pos"</span><span class="p">)</span>
|
||||||
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a>
|
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">)</span>
|
||||||
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a>
|
||||||
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">,</span> <span class="n">pos_alias</span><span class="p">]</span>
|
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
||||||
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">,</span> <span class="n">pos_alias</span><span class="p">]</span>
|
||||||
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">explode_alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
||||||
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="k">else</span><span class="p">:</span>
|
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">explode_alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||||
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">]</span>
|
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="k">else</span><span class="p">:</span>
|
||||||
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">))</span>
|
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">]</span>
|
||||||
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a>
|
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">))</span>
|
||||||
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">unnest_source_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">column_names</span><span class="p">)</span>
|
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a>
|
||||||
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a>
|
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">unnest_source_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">column_names</span><span class="p">)</span>
|
||||||
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="k">if</span> <span class="ow">not</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">"from"</span><span class="p">):</span>
|
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a>
|
||||||
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">unnest</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-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="k">if</span> <span class="ow">not</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">"from"</span><span class="p">):</span>
|
||||||
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="k">else</span><span class="p">:</span>
|
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">unnest</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-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</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-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="k">else</span><span class="p">:</span>
|
||||||
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a>
|
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</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-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a>
|
||||||
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a>
|
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a>
|
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a>
|
||||||
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a><span class="k">def</span> <span class="nf">remove_target_from_merge</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a>
|
||||||
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a><span class="w"> </span><span class="sd">"""Remove table refs from columns in when statements."""</span>
|
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a><span class="k">def</span> <span class="nf">remove_target_from_merge</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">):</span>
|
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a><span class="w"> </span><span class="sd">"""Remove table refs from columns in when statements."""</span>
|
||||||
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</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">"alias"</span><span class="p">)</span>
|
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">):</span>
|
||||||
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="n">targets</span> <span class="o">=</span> <span class="p">{</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span><span class="p">}</span>
|
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</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">"alias"</span><span class="p">)</span>
|
||||||
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a> <span class="k">if</span> <span class="n">alias</span><span class="p">:</span>
|
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a> <span class="n">targets</span> <span class="o">=</span> <span class="p">{</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span><span class="p">}</span>
|
||||||
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a> <span class="n">targets</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a> <span class="k">if</span> <span class="n">alias</span><span class="p">:</span>
|
||||||
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a>
|
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="n">targets</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||||
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="k">for</span> <span class="n">when</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-229"><a href="#L-229"><span class="linenos">229</span></a>
|
||||||
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="n">when</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="k">for</span> <span class="n">when</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-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="n">when</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||||
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"table"</span><span class="p">)</span> <span class="ow">in</span> <span class="n">targets</span>
|
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||||||
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
|
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"table"</span><span class="p">)</span> <span class="ow">in</span> <span class="n">targets</span>
|
||||||
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
|
||||||
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="p">)</span>
|
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a>
|
</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="k">return</span> <span class="n">expression</span>
|
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a>
|
||||||
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a>
|
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a>
|
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a>
|
||||||
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a><span class="k">def</span> <span class="nf">remove_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a>
|
||||||
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="k">if</span> <span class="p">(</span>
|
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a><span class="k">def</span> <span class="nf">remove_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
|
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||||
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">))</span>
|
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
|
||||||
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">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><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">))</span>
|
||||||
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="p">):</span>
|
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">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><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="n">quantile</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="p">):</span>
|
||||||
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="n">input_value</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">))</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="n">quantile</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">ApproxQuantile</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">input_value</span><span class="p">,</span> <span class="n">quantile</span><span class="o">=</span><span class="n">quantile</span><span class="p">))</span>
|
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="n">input_value</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">))</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a>
|
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">ApproxQuantile</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">input_value</span><span class="p">,</span> <span class="n">quantile</span><span class="o">=</span><span class="n">quantile</span><span class="p">))</span>
|
||||||
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a>
|
||||||
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a>
|
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a>
|
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a>
|
||||||
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a><span class="k">def</span> <span class="nf">add_recursive_cte_column_names</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a>
|
||||||
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
|
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a><span class="k">def</span> <span class="nf">add_recursive_cte_column_names</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="n">next_name</span> <span class="o">=</span> <span class="n">name_sequence</span><span class="p">(</span><span class="s2">"_c_"</span><span class="p">)</span>
|
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
|
||||||
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a>
|
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="n">next_name</span> <span class="o">=</span> <span class="n">name_sequence</span><span class="p">(</span><span class="s2">"_c_"</span><span class="p">)</span>
|
||||||
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="k">for</span> <span class="n">cte</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-257"><a href="#L-257"><span class="linenos">257</span></a>
|
||||||
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="k">for</span> <span class="n">cte</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-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||||
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="k">if</span> <span class="nb">isinstance</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">Union</span><span class="p">):</span>
|
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="k">if</span> <span class="nb">isinstance</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">Union</span><span class="p">):</span>
|
||||||
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a>
|
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">query</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="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a>
|
||||||
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="s2">"columns"</span><span class="p">,</span>
|
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
||||||
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">or</span> <span class="n">next_name</span><span class="p">())</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span><span class="p">],</span>
|
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="s2">"columns"</span><span class="p">,</span>
|
||||||
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="p">)</span>
|
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">or</span> <span class="n">next_name</span><span class="p">())</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span><span class="p">],</span>
|
||||||
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a>
|
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="p">)</span>
|
||||||
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="k">return</span> <span class="n">expression</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><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a>
|
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a>
|
||||||
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a><span class="k">def</span> <span class="nf">epoch_cast_to_ts</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a>
|
||||||
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="k">if</span> <span class="p">(</span>
|
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a><span class="k">def</span> <span class="nf">epoch_cast_to_ts</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">))</span>
|
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||||
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"epoch"</span>
|
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">))</span>
|
||||||
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">TEMPORAL_TYPES</span>
|
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"epoch"</span>
|
||||||
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="p">):</span>
|
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">TEMPORAL_TYPES</span>
|
||||||
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">"1970-01-01 00:00:00"</span><span class="p">))</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><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">"1970-01-01 00:00:00"</span><span class="p">))</span>
|
||||||
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a> <span class="k">return</span> <span class="n">expression</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><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a>
|
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a>
|
||||||
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
|
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a>
|
||||||
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
|
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
|
||||||
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="nb">str</span><span class="p">]:</span>
|
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
|
||||||
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
|
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a><span class="sd"> expression to SQL, using either the "_sql" method corresponding to the resulting expression,</span>
|
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
|
||||||
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
|
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a><span class="sd"> expression to SQL, using either the "_sql" method corresponding to the resulting expression,</span>
|
||||||
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a>
|
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
|
||||||
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a><span class="sd"> Args:</span>
|
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a>
|
||||||
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
|
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a><span class="sd"> Args:</span>
|
||||||
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a>
|
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
|
||||||
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a><span class="sd"> Returns:</span>
|
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a>
|
||||||
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a><span class="sd"> Function that can be used as a generator transform.</span>
|
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a><span class="sd"> Returns:</span>
|
||||||
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a><span class="sd"> """</span>
|
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a><span class="sd"> Function that can be used as a generator transform.</span>
|
||||||
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a>
|
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a><span class="sd"> """</span>
|
||||||
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a>
|
||||||
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
||||||
</span><span id="L-299"><a href="#L-299"><span class="linenos">299</span></a>
|
</span><span id="L-299"><a href="#L-299"><span class="linenos">299</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
|
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a>
|
||||||
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
|
||||||
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
||||||
</span><span id="L-303"><a href="#L-303"><span class="linenos">303</span></a>
|
</span><span id="L-303"><a href="#L-303"><span class="linenos">303</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="L-304"><a href="#L-304"><span class="linenos">304</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">"_sql"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
</span><span id="L-304"><a href="#L-304"><span class="linenos">304</span></a>
|
||||||
</span><span id="L-305"><a href="#L-305"><span class="linenos">305</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
|
</span><span id="L-305"><a href="#L-305"><span class="linenos">305</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">"_sql"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||||
</span><span id="L-306"><a href="#L-306"><span class="linenos">306</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="L-306"><a href="#L-306"><span class="linenos">306</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
|
||||||
</span><span id="L-307"><a href="#L-307"><span class="linenos">307</span></a>
|
</span><span id="L-307"><a href="#L-307"><span class="linenos">307</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="L-308"><a href="#L-308"><span class="linenos">308</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
|
</span><span id="L-308"><a href="#L-308"><span class="linenos">308</span></a>
|
||||||
</span><span id="L-309"><a href="#L-309"><span class="linenos">309</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
|
</span><span id="L-309"><a href="#L-309"><span class="linenos">309</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
|
||||||
</span><span id="L-310"><a href="#L-310"><span class="linenos">310</span></a> <span class="c1"># Ensures we don't enter an infinite loop. This can happen when the original expression</span>
|
</span><span id="L-310"><a href="#L-310"><span class="linenos">310</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
|
||||||
</span><span id="L-311"><a href="#L-311"><span class="linenos">311</span></a> <span class="c1"># has the same type as the final expression and there's no _sql method available for it,</span>
|
</span><span id="L-311"><a href="#L-311"><span class="linenos">311</span></a> <span class="c1"># Ensures we don't enter an infinite loop. This can happen when the original expression</span>
|
||||||
</span><span id="L-312"><a href="#L-312"><span class="linenos">312</span></a> <span class="c1"># because then it'd re-enter _to_sql.</span>
|
</span><span id="L-312"><a href="#L-312"><span class="linenos">312</span></a> <span class="c1"># has the same type as the final expression and there's no _sql method available for it,</span>
|
||||||
</span><span id="L-313"><a href="#L-313"><span class="linenos">313</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
</span><span id="L-313"><a href="#L-313"><span class="linenos">313</span></a> <span class="c1"># because then it'd re-enter _to_sql.</span>
|
||||||
</span><span id="L-314"><a href="#L-314"><span class="linenos">314</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
</span><span id="L-314"><a href="#L-314"><span class="linenos">314</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||||
</span><span id="L-315"><a href="#L-315"><span class="linenos">315</span></a> <span class="sa">f</span><span class="s2">"Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed."</span>
|
</span><span id="L-315"><a href="#L-315"><span class="linenos">315</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||||||
</span><span id="L-316"><a href="#L-316"><span class="linenos">316</span></a> <span class="p">)</span>
|
</span><span id="L-316"><a href="#L-316"><span class="linenos">316</span></a> <span class="sa">f</span><span class="s2">"Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed."</span>
|
||||||
</span><span id="L-317"><a href="#L-317"><span class="linenos">317</span></a>
|
</span><span id="L-317"><a href="#L-317"><span class="linenos">317</span></a> <span class="p">)</span>
|
||||||
</span><span id="L-318"><a href="#L-318"><span class="linenos">318</span></a> <span class="k">return</span> <span class="n">transforms_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
|
</span><span id="L-318"><a href="#L-318"><span class="linenos">318</span></a>
|
||||||
</span><span id="L-319"><a href="#L-319"><span class="linenos">319</span></a>
|
</span><span id="L-319"><a href="#L-319"><span class="linenos">319</span></a> <span class="k">return</span> <span class="n">transforms_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="L-320"><a href="#L-320"><span class="linenos">320</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">."</span><span class="p">)</span>
|
</span><span id="L-320"><a href="#L-320"><span class="linenos">320</span></a>
|
||||||
</span><span id="L-321"><a href="#L-321"><span class="linenos">321</span></a>
|
</span><span id="L-321"><a href="#L-321"><span class="linenos">321</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">."</span><span class="p">)</span>
|
||||||
</span><span id="L-322"><a href="#L-322"><span class="linenos">322</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
|
</span><span id="L-322"><a href="#L-322"><span class="linenos">322</span></a>
|
||||||
|
</span><span id="L-323"><a href="#L-323"><span class="linenos">323</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -704,63 +705,64 @@ other expressions. This transforms removes the precision from parameterized type
|
||||||
</span><span id="explode_to_unnest-160"><a href="#explode_to_unnest-160"><span class="linenos">160</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
|
</span><span id="explode_to_unnest-160"><a href="#explode_to_unnest-160"><span class="linenos">160</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
|
||||||
</span><span id="explode_to_unnest-161"><a href="#explode_to_unnest-161"><span class="linenos">161</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.scope</span> <span class="kn">import</span> <span class="n">build_scope</span>
|
</span><span id="explode_to_unnest-161"><a href="#explode_to_unnest-161"><span class="linenos">161</span></a> <span class="kn">from</span> <span class="nn">sqlglot.optimizer.scope</span> <span class="kn">import</span> <span class="n">build_scope</span>
|
||||||
</span><span id="explode_to_unnest-162"><a href="#explode_to_unnest-162"><span class="linenos">162</span></a>
|
</span><span id="explode_to_unnest-162"><a href="#explode_to_unnest-162"><span class="linenos">162</span></a>
|
||||||
</span><span id="explode_to_unnest-163"><a href="#explode_to_unnest-163"><span class="linenos">163</span></a> <span class="n">taken_select_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-163"><a href="#explode_to_unnest-163"><span class="linenos">163</span></a> <span class="n">scope</span> <span class="o">=</span> <span class="n">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-164"><a href="#explode_to_unnest-164"><span class="linenos">164</span></a> <span class="n">scope</span> <span class="o">=</span> <span class="n">build_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-164"><a href="#explode_to_unnest-164"><span class="linenos">164</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">scope</span><span class="p">:</span>
|
||||||
</span><span id="explode_to_unnest-165"><a href="#explode_to_unnest-165"><span class="linenos">165</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">scope</span><span class="p">:</span>
|
</span><span id="explode_to_unnest-165"><a href="#explode_to_unnest-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span><span id="explode_to_unnest-166"><a href="#explode_to_unnest-166"><span class="linenos">166</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="explode_to_unnest-166"><a href="#explode_to_unnest-166"><span class="linenos">166</span></a>
|
||||||
</span><span id="explode_to_unnest-167"><a href="#explode_to_unnest-167"><span class="linenos">167</span></a> <span class="n">taken_source_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-167"><a href="#explode_to_unnest-167"><span class="linenos">167</span></a> <span class="n">taken_select_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">named_selects</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-168"><a href="#explode_to_unnest-168"><span class="linenos">168</span></a>
|
</span><span id="explode_to_unnest-168"><a href="#explode_to_unnest-168"><span class="linenos">168</span></a> <span class="n">taken_source_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">selected_sources</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-169"><a href="#explode_to_unnest-169"><span class="linenos">169</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
|
</span><span id="explode_to_unnest-169"><a href="#explode_to_unnest-169"><span class="linenos">169</span></a>
|
||||||
</span><span id="explode_to_unnest-170"><a href="#explode_to_unnest-170"><span class="linenos">170</span></a> <span class="n">to_replace</span> <span class="o">=</span> <span class="n">select</span>
|
</span><span id="explode_to_unnest-170"><a href="#explode_to_unnest-170"><span class="linenos">170</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">selects</span><span class="p">:</span>
|
||||||
</span><span id="explode_to_unnest-171"><a href="#explode_to_unnest-171"><span class="linenos">171</span></a>
|
</span><span id="explode_to_unnest-171"><a href="#explode_to_unnest-171"><span class="linenos">171</span></a> <span class="n">to_replace</span> <span class="o">=</span> <span class="n">select</span>
|
||||||
</span><span id="explode_to_unnest-172"><a href="#explode_to_unnest-172"><span class="linenos">172</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
</span><span id="explode_to_unnest-172"><a href="#explode_to_unnest-172"><span class="linenos">172</span></a>
|
||||||
</span><span id="explode_to_unnest-173"><a href="#explode_to_unnest-173"><span class="linenos">173</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
</span><span id="explode_to_unnest-173"><a href="#explode_to_unnest-173"><span class="linenos">173</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
||||||
</span><span id="explode_to_unnest-174"><a href="#explode_to_unnest-174"><span class="linenos">174</span></a>
|
</span><span id="explode_to_unnest-174"><a href="#explode_to_unnest-174"><span class="linenos">174</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="s2">""</span>
|
||||||
</span><span id="explode_to_unnest-175"><a href="#explode_to_unnest-175"><span class="linenos">175</span></a> <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><span id="explode_to_unnest-175"><a href="#explode_to_unnest-175"><span class="linenos">175</span></a>
|
||||||
</span><span id="explode_to_unnest-176"><a href="#explode_to_unnest-176"><span class="linenos">176</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">alias</span>
|
</span><span id="explode_to_unnest-176"><a href="#explode_to_unnest-176"><span class="linenos">176</span></a> <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><span id="explode_to_unnest-177"><a href="#explode_to_unnest-177"><span class="linenos">177</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="explode_to_unnest-177"><a href="#explode_to_unnest-177"><span class="linenos">177</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">alias</span>
|
||||||
</span><span id="explode_to_unnest-178"><a href="#explode_to_unnest-178"><span class="linenos">178</span></a> <span class="k">elif</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">Aliases</span><span class="p">):</span>
|
</span><span id="explode_to_unnest-178"><a href="#explode_to_unnest-178"><span class="linenos">178</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="explode_to_unnest-179"><a href="#explode_to_unnest-179"><span class="linenos">179</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
</span><span id="explode_to_unnest-179"><a href="#explode_to_unnest-179"><span class="linenos">179</span></a> <span class="k">elif</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">Aliases</span><span class="p">):</span>
|
||||||
</span><span id="explode_to_unnest-180"><a href="#explode_to_unnest-180"><span class="linenos">180</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
</span><span id="explode_to_unnest-180"><a href="#explode_to_unnest-180"><span class="linenos">180</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
||||||
</span><span id="explode_to_unnest-181"><a href="#explode_to_unnest-181"><span class="linenos">181</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="explode_to_unnest-181"><a href="#explode_to_unnest-181"><span class="linenos">181</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">aliases</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
||||||
</span><span id="explode_to_unnest-182"><a href="#explode_to_unnest-182"><span class="linenos">182</span></a>
|
</span><span id="explode_to_unnest-182"><a href="#explode_to_unnest-182"><span class="linenos">182</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="explode_to_unnest-183"><a href="#explode_to_unnest-183"><span class="linenos">183</span></a> <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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span><span class="p">)):</span>
|
</span><span id="explode_to_unnest-183"><a href="#explode_to_unnest-183"><span class="linenos">183</span></a>
|
||||||
</span><span id="explode_to_unnest-184"><a href="#explode_to_unnest-184"><span class="linenos">184</span></a> <span class="n">is_posexplode</span> <span class="o">=</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">Posexplode</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-184"><a href="#explode_to_unnest-184"><span class="linenos">184</span></a> <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="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Explode</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Posexplode</span><span class="p">)):</span>
|
||||||
</span><span id="explode_to_unnest-185"><a href="#explode_to_unnest-185"><span class="linenos">185</span></a>
|
</span><span id="explode_to_unnest-185"><a href="#explode_to_unnest-185"><span class="linenos">185</span></a> <span class="n">is_posexplode</span> <span class="o">=</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">Posexplode</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-186"><a href="#explode_to_unnest-186"><span class="linenos">186</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="explode_to_unnest-186"><a href="#explode_to_unnest-186"><span class="linenos">186</span></a>
|
||||||
</span><span id="explode_to_unnest-187"><a href="#explode_to_unnest-187"><span class="linenos">187</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">()],</span> <span class="n">ordinality</span><span class="o">=</span><span class="n">is_posexplode</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-187"><a href="#explode_to_unnest-187"><span class="linenos">187</span></a> <span class="n">explode_arg</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="explode_to_unnest-188"><a href="#explode_to_unnest-188"><span class="linenos">188</span></a>
|
</span><span id="explode_to_unnest-188"><a href="#explode_to_unnest-188"><span class="linenos">188</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">(</span><span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">copy</span><span class="p">()],</span> <span class="n">ordinality</span><span class="o">=</span><span class="n">is_posexplode</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-189"><a href="#explode_to_unnest-189"><span class="linenos">189</span></a> <span class="c1"># This ensures that we won't use [POS]EXPLODE's argument as a new selection</span>
|
</span><span id="explode_to_unnest-189"><a href="#explode_to_unnest-189"><span class="linenos">189</span></a>
|
||||||
</span><span id="explode_to_unnest-190"><a href="#explode_to_unnest-190"><span class="linenos">190</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode_arg</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="explode_to_unnest-190"><a href="#explode_to_unnest-190"><span class="linenos">190</span></a> <span class="c1"># This ensures that we won't use [POS]EXPLODE's argument as a new selection</span>
|
||||||
</span><span id="explode_to_unnest-191"><a href="#explode_to_unnest-191"><span class="linenos">191</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-191"><a href="#explode_to_unnest-191"><span class="linenos">191</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">explode_arg</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="explode_to_unnest-192"><a href="#explode_to_unnest-192"><span class="linenos">192</span></a>
|
</span><span id="explode_to_unnest-192"><a href="#explode_to_unnest-192"><span class="linenos">192</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_arg</span><span class="o">.</span><span class="n">output_name</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-193"><a href="#explode_to_unnest-193"><span class="linenos">193</span></a> <span class="n">unnest_source_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">"_u"</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-193"><a href="#explode_to_unnest-193"><span class="linenos">193</span></a>
|
||||||
</span><span id="explode_to_unnest-194"><a href="#explode_to_unnest-194"><span class="linenos">194</span></a> <span class="n">taken_source_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">unnest_source_alias</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-194"><a href="#explode_to_unnest-194"><span class="linenos">194</span></a> <span class="n">unnest_source_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_source_names</span><span class="p">,</span> <span class="s2">"_u"</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-195"><a href="#explode_to_unnest-195"><span class="linenos">195</span></a>
|
</span><span id="explode_to_unnest-195"><a href="#explode_to_unnest-195"><span class="linenos">195</span></a> <span class="n">taken_source_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">unnest_source_alias</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-196"><a href="#explode_to_unnest-196"><span class="linenos">196</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">explode_alias</span><span class="p">:</span>
|
</span><span id="explode_to_unnest-196"><a href="#explode_to_unnest-196"><span class="linenos">196</span></a>
|
||||||
</span><span id="explode_to_unnest-197"><a href="#explode_to_unnest-197"><span class="linenos">197</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"col"</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-197"><a href="#explode_to_unnest-197"><span class="linenos">197</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">explode_alias</span><span class="p">:</span>
|
||||||
</span><span id="explode_to_unnest-198"><a href="#explode_to_unnest-198"><span class="linenos">198</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-198"><a href="#explode_to_unnest-198"><span class="linenos">198</span></a> <span class="n">explode_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"col"</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-199"><a href="#explode_to_unnest-199"><span class="linenos">199</span></a>
|
</span><span id="explode_to_unnest-199"><a href="#explode_to_unnest-199"><span class="linenos">199</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-200"><a href="#explode_to_unnest-200"><span class="linenos">200</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
</span><span id="explode_to_unnest-200"><a href="#explode_to_unnest-200"><span class="linenos">200</span></a>
|
||||||
</span><span id="explode_to_unnest-201"><a href="#explode_to_unnest-201"><span class="linenos">201</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"pos"</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-201"><a href="#explode_to_unnest-201"><span class="linenos">201</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
||||||
</span><span id="explode_to_unnest-202"><a href="#explode_to_unnest-202"><span class="linenos">202</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-202"><a href="#explode_to_unnest-202"><span class="linenos">202</span></a> <span class="n">pos_alias</span> <span class="o">=</span> <span class="n">find_new_name</span><span class="p">(</span><span class="n">taken_select_names</span><span class="p">,</span> <span class="s2">"pos"</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-203"><a href="#explode_to_unnest-203"><span class="linenos">203</span></a>
|
</span><span id="explode_to_unnest-203"><a href="#explode_to_unnest-203"><span class="linenos">203</span></a> <span class="n">taken_select_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-204"><a href="#explode_to_unnest-204"><span class="linenos">204</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
</span><span id="explode_to_unnest-204"><a href="#explode_to_unnest-204"><span class="linenos">204</span></a>
|
||||||
</span><span id="explode_to_unnest-205"><a href="#explode_to_unnest-205"><span class="linenos">205</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">,</span> <span class="n">pos_alias</span><span class="p">]</span>
|
</span><span id="explode_to_unnest-205"><a href="#explode_to_unnest-205"><span class="linenos">205</span></a> <span class="k">if</span> <span class="n">is_posexplode</span><span class="p">:</span>
|
||||||
</span><span id="explode_to_unnest-206"><a href="#explode_to_unnest-206"><span class="linenos">206</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
</span><span id="explode_to_unnest-206"><a href="#explode_to_unnest-206"><span class="linenos">206</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">,</span> <span class="n">pos_alias</span><span class="p">]</span>
|
||||||
</span><span id="explode_to_unnest-207"><a href="#explode_to_unnest-207"><span class="linenos">207</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">explode_alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-207"><a href="#explode_to_unnest-207"><span class="linenos">207</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
||||||
</span><span id="explode_to_unnest-208"><a href="#explode_to_unnest-208"><span class="linenos">208</span></a> <span class="k">else</span><span class="p">:</span>
|
</span><span id="explode_to_unnest-208"><a href="#explode_to_unnest-208"><span class="linenos">208</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">pos_alias</span><span class="p">,</span> <span class="n">explode_alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-209"><a href="#explode_to_unnest-209"><span class="linenos">209</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">]</span>
|
</span><span id="explode_to_unnest-209"><a href="#explode_to_unnest-209"><span class="linenos">209</span></a> <span class="k">else</span><span class="p">:</span>
|
||||||
</span><span id="explode_to_unnest-210"><a href="#explode_to_unnest-210"><span class="linenos">210</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">))</span>
|
</span><span id="explode_to_unnest-210"><a href="#explode_to_unnest-210"><span class="linenos">210</span></a> <span class="n">column_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">explode_alias</span><span class="p">]</span>
|
||||||
</span><span id="explode_to_unnest-211"><a href="#explode_to_unnest-211"><span class="linenos">211</span></a>
|
</span><span id="explode_to_unnest-211"><a href="#explode_to_unnest-211"><span class="linenos">211</span></a> <span class="n">to_replace</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">explode_alias</span><span class="p">))</span>
|
||||||
</span><span id="explode_to_unnest-212"><a href="#explode_to_unnest-212"><span class="linenos">212</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">unnest_source_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">column_names</span><span class="p">)</span>
|
</span><span id="explode_to_unnest-212"><a href="#explode_to_unnest-212"><span class="linenos">212</span></a>
|
||||||
</span><span id="explode_to_unnest-213"><a href="#explode_to_unnest-213"><span class="linenos">213</span></a>
|
</span><span id="explode_to_unnest-213"><a href="#explode_to_unnest-213"><span class="linenos">213</span></a> <span class="n">unnest</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">unnest_source_alias</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="n">column_names</span><span class="p">)</span>
|
||||||
</span><span id="explode_to_unnest-214"><a href="#explode_to_unnest-214"><span class="linenos">214</span></a> <span class="k">if</span> <span class="ow">not</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">"from"</span><span class="p">):</span>
|
</span><span id="explode_to_unnest-214"><a href="#explode_to_unnest-214"><span class="linenos">214</span></a>
|
||||||
</span><span id="explode_to_unnest-215"><a href="#explode_to_unnest-215"><span class="linenos">215</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">unnest</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="explode_to_unnest-215"><a href="#explode_to_unnest-215"><span class="linenos">215</span></a> <span class="k">if</span> <span class="ow">not</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">"from"</span><span class="p">):</span>
|
||||||
</span><span id="explode_to_unnest-216"><a href="#explode_to_unnest-216"><span class="linenos">216</span></a> <span class="k">else</span><span class="p">:</span>
|
</span><span id="explode_to_unnest-216"><a href="#explode_to_unnest-216"><span class="linenos">216</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">unnest</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="explode_to_unnest-217"><a href="#explode_to_unnest-217"><span class="linenos">217</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</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="explode_to_unnest-217"><a href="#explode_to_unnest-217"><span class="linenos">217</span></a> <span class="k">else</span><span class="p">:</span>
|
||||||
</span><span id="explode_to_unnest-218"><a href="#explode_to_unnest-218"><span class="linenos">218</span></a>
|
</span><span id="explode_to_unnest-218"><a href="#explode_to_unnest-218"><span class="linenos">218</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">unnest</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</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="explode_to_unnest-219"><a href="#explode_to_unnest-219"><span class="linenos">219</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="explode_to_unnest-219"><a href="#explode_to_unnest-219"><span class="linenos">219</span></a>
|
||||||
|
</span><span id="explode_to_unnest-220"><a href="#explode_to_unnest-220"><span class="linenos">220</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -780,23 +782,23 @@ other expressions. This transforms removes the precision from parameterized type
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#remove_target_from_merge"></a>
|
<a class="headerlink" href="#remove_target_from_merge"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_target_from_merge-222"><a href="#remove_target_from_merge-222"><span class="linenos">222</span></a><span class="k">def</span> <span class="nf">remove_target_from_merge</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_target_from_merge-223"><a href="#remove_target_from_merge-223"><span class="linenos">223</span></a><span class="k">def</span> <span class="nf">remove_target_from_merge</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="remove_target_from_merge-223"><a href="#remove_target_from_merge-223"><span class="linenos">223</span></a><span class="w"> </span><span class="sd">"""Remove table refs from columns in when statements."""</span>
|
</span><span id="remove_target_from_merge-224"><a href="#remove_target_from_merge-224"><span class="linenos">224</span></a><span class="w"> </span><span class="sd">"""Remove table refs from columns in when statements."""</span>
|
||||||
</span><span id="remove_target_from_merge-224"><a href="#remove_target_from_merge-224"><span class="linenos">224</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">):</span>
|
</span><span id="remove_target_from_merge-225"><a href="#remove_target_from_merge-225"><span class="linenos">225</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Merge</span><span class="p">):</span>
|
||||||
</span><span id="remove_target_from_merge-225"><a href="#remove_target_from_merge-225"><span class="linenos">225</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</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">"alias"</span><span class="p">)</span>
|
</span><span id="remove_target_from_merge-226"><a href="#remove_target_from_merge-226"><span class="linenos">226</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</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">"alias"</span><span class="p">)</span>
|
||||||
</span><span id="remove_target_from_merge-226"><a href="#remove_target_from_merge-226"><span class="linenos">226</span></a> <span class="n">targets</span> <span class="o">=</span> <span class="p">{</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span><span class="p">}</span>
|
</span><span id="remove_target_from_merge-227"><a href="#remove_target_from_merge-227"><span class="linenos">227</span></a> <span class="n">targets</span> <span class="o">=</span> <span class="p">{</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span><span class="p">}</span>
|
||||||
</span><span id="remove_target_from_merge-227"><a href="#remove_target_from_merge-227"><span class="linenos">227</span></a> <span class="k">if</span> <span class="n">alias</span><span class="p">:</span>
|
</span><span id="remove_target_from_merge-228"><a href="#remove_target_from_merge-228"><span class="linenos">228</span></a> <span class="k">if</span> <span class="n">alias</span><span class="p">:</span>
|
||||||
</span><span id="remove_target_from_merge-228"><a href="#remove_target_from_merge-228"><span class="linenos">228</span></a> <span class="n">targets</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
</span><span id="remove_target_from_merge-229"><a href="#remove_target_from_merge-229"><span class="linenos">229</span></a> <span class="n">targets</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">alias</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||||
</span><span id="remove_target_from_merge-229"><a href="#remove_target_from_merge-229"><span class="linenos">229</span></a>
|
</span><span id="remove_target_from_merge-230"><a href="#remove_target_from_merge-230"><span class="linenos">230</span></a>
|
||||||
</span><span id="remove_target_from_merge-230"><a href="#remove_target_from_merge-230"><span class="linenos">230</span></a> <span class="k">for</span> <span class="n">when</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="remove_target_from_merge-231"><a href="#remove_target_from_merge-231"><span class="linenos">231</span></a> <span class="k">for</span> <span class="n">when</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="remove_target_from_merge-231"><a href="#remove_target_from_merge-231"><span class="linenos">231</span></a> <span class="n">when</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
</span><span id="remove_target_from_merge-232"><a href="#remove_target_from_merge-232"><span class="linenos">232</span></a> <span class="n">when</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||||
</span><span id="remove_target_from_merge-232"><a href="#remove_target_from_merge-232"><span class="linenos">232</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
</span><span id="remove_target_from_merge-233"><a href="#remove_target_from_merge-233"><span class="linenos">233</span></a> <span class="k">lambda</span> <span class="n">node</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||||||
</span><span id="remove_target_from_merge-233"><a href="#remove_target_from_merge-233"><span class="linenos">233</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"table"</span><span class="p">)</span> <span class="ow">in</span> <span class="n">targets</span>
|
</span><span id="remove_target_from_merge-234"><a href="#remove_target_from_merge-234"><span class="linenos">234</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span> <span class="ow">and</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"table"</span><span class="p">)</span> <span class="ow">in</span> <span class="n">targets</span>
|
||||||
</span><span id="remove_target_from_merge-234"><a href="#remove_target_from_merge-234"><span class="linenos">234</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
|
</span><span id="remove_target_from_merge-235"><a href="#remove_target_from_merge-235"><span class="linenos">235</span></a> <span class="k">else</span> <span class="n">node</span><span class="p">,</span>
|
||||||
</span><span id="remove_target_from_merge-235"><a href="#remove_target_from_merge-235"><span class="linenos">235</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
</span><span id="remove_target_from_merge-236"><a href="#remove_target_from_merge-236"><span class="linenos">236</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="remove_target_from_merge-236"><a href="#remove_target_from_merge-236"><span class="linenos">236</span></a> <span class="p">)</span>
|
</span><span id="remove_target_from_merge-237"><a href="#remove_target_from_merge-237"><span class="linenos">237</span></a> <span class="p">)</span>
|
||||||
</span><span id="remove_target_from_merge-237"><a href="#remove_target_from_merge-237"><span class="linenos">237</span></a>
|
</span><span id="remove_target_from_merge-238"><a href="#remove_target_from_merge-238"><span class="linenos">238</span></a>
|
||||||
</span><span id="remove_target_from_merge-238"><a href="#remove_target_from_merge-238"><span class="linenos">238</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="remove_target_from_merge-239"><a href="#remove_target_from_merge-239"><span class="linenos">239</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -816,17 +818,17 @@ other expressions. This transforms removes the precision from parameterized type
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#remove_within_group_for_percentiles"></a>
|
<a class="headerlink" href="#remove_within_group_for_percentiles"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_within_group_for_percentiles-241"><a href="#remove_within_group_for_percentiles-241"><span class="linenos">241</span></a><span class="k">def</span> <span class="nf">remove_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="remove_within_group_for_percentiles-242"><a href="#remove_within_group_for_percentiles-242"><span class="linenos">242</span></a><span class="k">def</span> <span class="nf">remove_within_group_for_percentiles</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-242"><a href="#remove_within_group_for_percentiles-242"><span class="linenos">242</span></a> <span class="k">if</span> <span class="p">(</span>
|
</span><span id="remove_within_group_for_percentiles-243"><a href="#remove_within_group_for_percentiles-243"><span class="linenos">243</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-243"><a href="#remove_within_group_for_percentiles-243"><span class="linenos">243</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
|
</span><span id="remove_within_group_for_percentiles-244"><a href="#remove_within_group_for_percentiles-244"><span class="linenos">244</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">WithinGroup</span><span class="p">)</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-244"><a href="#remove_within_group_for_percentiles-244"><span class="linenos">244</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">))</span>
|
</span><span id="remove_within_group_for_percentiles-245"><a href="#remove_within_group_for_percentiles-245"><span class="linenos">245</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">PercentileCont</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">PercentileDisc</span><span class="p">))</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-245"><a href="#remove_within_group_for_percentiles-245"><span class="linenos">245</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">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><span id="remove_within_group_for_percentiles-246"><a href="#remove_within_group_for_percentiles-246"><span class="linenos">246</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">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><span id="remove_within_group_for_percentiles-246"><a href="#remove_within_group_for_percentiles-246"><span class="linenos">246</span></a> <span class="p">):</span>
|
</span><span id="remove_within_group_for_percentiles-247"><a href="#remove_within_group_for_percentiles-247"><span class="linenos">247</span></a> <span class="p">):</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-247"><a href="#remove_within_group_for_percentiles-247"><span class="linenos">247</span></a> <span class="n">quantile</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="remove_within_group_for_percentiles-248"><a href="#remove_within_group_for_percentiles-248"><span class="linenos">248</span></a> <span class="n">quantile</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-248"><a href="#remove_within_group_for_percentiles-248"><span class="linenos">248</span></a> <span class="n">input_value</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">))</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="remove_within_group_for_percentiles-249"><a href="#remove_within_group_for_percentiles-249"><span class="linenos">249</span></a> <span class="n">input_value</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">))</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-249"><a href="#remove_within_group_for_percentiles-249"><span class="linenos">249</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">ApproxQuantile</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">input_value</span><span class="p">,</span> <span class="n">quantile</span><span class="o">=</span><span class="n">quantile</span><span class="p">))</span>
|
</span><span id="remove_within_group_for_percentiles-250"><a href="#remove_within_group_for_percentiles-250"><span class="linenos">250</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">ApproxQuantile</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">input_value</span><span class="p">,</span> <span class="n">quantile</span><span class="o">=</span><span class="n">quantile</span><span class="p">))</span>
|
||||||
</span><span id="remove_within_group_for_percentiles-250"><a href="#remove_within_group_for_percentiles-250"><span class="linenos">250</span></a>
|
</span><span id="remove_within_group_for_percentiles-251"><a href="#remove_within_group_for_percentiles-251"><span class="linenos">251</span></a>
|
||||||
</span><span id="remove_within_group_for_percentiles-251"><a href="#remove_within_group_for_percentiles-251"><span class="linenos">251</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="remove_within_group_for_percentiles-252"><a href="#remove_within_group_for_percentiles-252"><span class="linenos">252</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -844,22 +846,22 @@ other expressions. This transforms removes the precision from parameterized type
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#add_recursive_cte_column_names"></a>
|
<a class="headerlink" href="#add_recursive_cte_column_names"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="add_recursive_cte_column_names-254"><a href="#add_recursive_cte_column_names-254"><span class="linenos">254</span></a><span class="k">def</span> <span class="nf">add_recursive_cte_column_names</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="add_recursive_cte_column_names-255"><a href="#add_recursive_cte_column_names-255"><span class="linenos">255</span></a><span class="k">def</span> <span class="nf">add_recursive_cte_column_names</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="add_recursive_cte_column_names-255"><a href="#add_recursive_cte_column_names-255"><span class="linenos">255</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
|
</span><span id="add_recursive_cte_column_names-256"><a href="#add_recursive_cte_column_names-256"><span class="linenos">256</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">With</span><span class="p">)</span> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">recursive</span><span class="p">:</span>
|
||||||
</span><span id="add_recursive_cte_column_names-256"><a href="#add_recursive_cte_column_names-256"><span class="linenos">256</span></a> <span class="n">next_name</span> <span class="o">=</span> <span class="n">name_sequence</span><span class="p">(</span><span class="s2">"_c_"</span><span class="p">)</span>
|
</span><span id="add_recursive_cte_column_names-257"><a href="#add_recursive_cte_column_names-257"><span class="linenos">257</span></a> <span class="n">next_name</span> <span class="o">=</span> <span class="n">name_sequence</span><span class="p">(</span><span class="s2">"_c_"</span><span class="p">)</span>
|
||||||
</span><span id="add_recursive_cte_column_names-257"><a href="#add_recursive_cte_column_names-257"><span class="linenos">257</span></a>
|
</span><span id="add_recursive_cte_column_names-258"><a href="#add_recursive_cte_column_names-258"><span class="linenos">258</span></a>
|
||||||
</span><span id="add_recursive_cte_column_names-258"><a href="#add_recursive_cte_column_names-258"><span class="linenos">258</span></a> <span class="k">for</span> <span class="n">cte</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="add_recursive_cte_column_names-259"><a href="#add_recursive_cte_column_names-259"><span class="linenos">259</span></a> <span class="k">for</span> <span class="n">cte</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="add_recursive_cte_column_names-259"><a href="#add_recursive_cte_column_names-259"><span class="linenos">259</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
</span><span id="add_recursive_cte_column_names-260"><a href="#add_recursive_cte_column_names-260"><span class="linenos">260</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||||
</span><span id="add_recursive_cte_column_names-260"><a href="#add_recursive_cte_column_names-260"><span class="linenos">260</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="add_recursive_cte_column_names-261"><a href="#add_recursive_cte_column_names-261"><span class="linenos">261</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="add_recursive_cte_column_names-261"><a href="#add_recursive_cte_column_names-261"><span class="linenos">261</span></a> <span class="k">if</span> <span class="nb">isinstance</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">Union</span><span class="p">):</span>
|
</span><span id="add_recursive_cte_column_names-262"><a href="#add_recursive_cte_column_names-262"><span class="linenos">262</span></a> <span class="k">if</span> <span class="nb">isinstance</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">Union</span><span class="p">):</span>
|
||||||
</span><span id="add_recursive_cte_column_names-262"><a href="#add_recursive_cte_column_names-262"><span class="linenos">262</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">this</span>
|
</span><span id="add_recursive_cte_column_names-263"><a href="#add_recursive_cte_column_names-263"><span class="linenos">263</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">this</span>
|
||||||
</span><span id="add_recursive_cte_column_names-263"><a href="#add_recursive_cte_column_names-263"><span class="linenos">263</span></a>
|
</span><span id="add_recursive_cte_column_names-264"><a href="#add_recursive_cte_column_names-264"><span class="linenos">264</span></a>
|
||||||
</span><span id="add_recursive_cte_column_names-264"><a href="#add_recursive_cte_column_names-264"><span class="linenos">264</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
</span><span id="add_recursive_cte_column_names-265"><a href="#add_recursive_cte_column_names-265"><span class="linenos">265</span></a> <span class="n">cte</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"alias"</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
||||||
</span><span id="add_recursive_cte_column_names-265"><a href="#add_recursive_cte_column_names-265"><span class="linenos">265</span></a> <span class="s2">"columns"</span><span class="p">,</span>
|
</span><span id="add_recursive_cte_column_names-266"><a href="#add_recursive_cte_column_names-266"><span class="linenos">266</span></a> <span class="s2">"columns"</span><span class="p">,</span>
|
||||||
</span><span id="add_recursive_cte_column_names-266"><a href="#add_recursive_cte_column_names-266"><span class="linenos">266</span></a> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">or</span> <span class="n">next_name</span><span class="p">())</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span><span class="p">],</span>
|
</span><span id="add_recursive_cte_column_names-267"><a href="#add_recursive_cte_column_names-267"><span class="linenos">267</span></a> <span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">alias_or_name</span> <span class="ow">or</span> <span class="n">next_name</span><span class="p">())</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span><span class="p">],</span>
|
||||||
</span><span id="add_recursive_cte_column_names-267"><a href="#add_recursive_cte_column_names-267"><span class="linenos">267</span></a> <span class="p">)</span>
|
</span><span id="add_recursive_cte_column_names-268"><a href="#add_recursive_cte_column_names-268"><span class="linenos">268</span></a> <span class="p">)</span>
|
||||||
</span><span id="add_recursive_cte_column_names-268"><a href="#add_recursive_cte_column_names-268"><span class="linenos">268</span></a>
|
</span><span id="add_recursive_cte_column_names-269"><a href="#add_recursive_cte_column_names-269"><span class="linenos">269</span></a>
|
||||||
</span><span id="add_recursive_cte_column_names-269"><a href="#add_recursive_cte_column_names-269"><span class="linenos">269</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="add_recursive_cte_column_names-270"><a href="#add_recursive_cte_column_names-270"><span class="linenos">270</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -877,15 +879,15 @@ other expressions. This transforms removes the precision from parameterized type
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#epoch_cast_to_ts"></a>
|
<a class="headerlink" href="#epoch_cast_to_ts"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="epoch_cast_to_ts-272"><a href="#epoch_cast_to_ts-272"><span class="linenos">272</span></a><span class="k">def</span> <span class="nf">epoch_cast_to_ts</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="epoch_cast_to_ts-273"><a href="#epoch_cast_to_ts-273"><span class="linenos">273</span></a><span class="k">def</span> <span class="nf">epoch_cast_to_ts</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">:</span>
|
||||||
</span><span id="epoch_cast_to_ts-273"><a href="#epoch_cast_to_ts-273"><span class="linenos">273</span></a> <span class="k">if</span> <span class="p">(</span>
|
</span><span id="epoch_cast_to_ts-274"><a href="#epoch_cast_to_ts-274"><span class="linenos">274</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||||
</span><span id="epoch_cast_to_ts-274"><a href="#epoch_cast_to_ts-274"><span class="linenos">274</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">))</span>
|
</span><span id="epoch_cast_to_ts-275"><a href="#epoch_cast_to_ts-275"><span class="linenos">275</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Cast</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TryCast</span><span class="p">))</span>
|
||||||
</span><span id="epoch_cast_to_ts-275"><a href="#epoch_cast_to_ts-275"><span class="linenos">275</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"epoch"</span>
|
</span><span id="epoch_cast_to_ts-276"><a href="#epoch_cast_to_ts-276"><span class="linenos">276</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"epoch"</span>
|
||||||
</span><span id="epoch_cast_to_ts-276"><a href="#epoch_cast_to_ts-276"><span class="linenos">276</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">TEMPORAL_TYPES</span>
|
</span><span id="epoch_cast_to_ts-277"><a href="#epoch_cast_to_ts-277"><span class="linenos">277</span></a> <span class="ow">and</span> <span class="n">expression</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">DataType</span><span class="o">.</span><span class="n">TEMPORAL_TYPES</span>
|
||||||
</span><span id="epoch_cast_to_ts-277"><a href="#epoch_cast_to_ts-277"><span class="linenos">277</span></a> <span class="p">):</span>
|
</span><span id="epoch_cast_to_ts-278"><a href="#epoch_cast_to_ts-278"><span class="linenos">278</span></a> <span class="p">):</span>
|
||||||
</span><span id="epoch_cast_to_ts-278"><a href="#epoch_cast_to_ts-278"><span class="linenos">278</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">"1970-01-01 00:00:00"</span><span class="p">))</span>
|
</span><span id="epoch_cast_to_ts-279"><a href="#epoch_cast_to_ts-279"><span class="linenos">279</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">string</span><span class="p">(</span><span class="s2">"1970-01-01 00:00:00"</span><span class="p">))</span>
|
||||||
</span><span id="epoch_cast_to_ts-279"><a href="#epoch_cast_to_ts-279"><span class="linenos">279</span></a>
|
</span><span id="epoch_cast_to_ts-280"><a href="#epoch_cast_to_ts-280"><span class="linenos">280</span></a>
|
||||||
</span><span id="epoch_cast_to_ts-280"><a href="#epoch_cast_to_ts-280"><span class="linenos">280</span></a> <span class="k">return</span> <span class="n">expression</span>
|
</span><span id="epoch_cast_to_ts-281"><a href="#epoch_cast_to_ts-281"><span class="linenos">281</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -903,47 +905,47 @@ other expressions. This transforms removes the precision from parameterized type
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#preprocess"></a>
|
<a class="headerlink" href="#preprocess"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="preprocess-283"><a href="#preprocess-283"><span class="linenos">283</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="preprocess-284"><a href="#preprocess-284"><span class="linenos">284</span></a><span class="k">def</span> <span class="nf">preprocess</span><span class="p">(</span>
|
||||||
</span><span id="preprocess-284"><a href="#preprocess-284"><span class="linenos">284</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
|
</span><span id="preprocess-285"><a href="#preprocess-285"><span class="linenos">285</span></a> <span class="n">transforms</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]],</span>
|
||||||
</span><span id="preprocess-285"><a href="#preprocess-285"><span class="linenos">285</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="nb">str</span><span class="p">]:</span>
|
</span><span id="preprocess-286"><a href="#preprocess-286"><span class="linenos">286</span></a><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">[[</span><span class="n">Generator</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">],</span> <span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="preprocess-286"><a href="#preprocess-286"><span class="linenos">286</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="preprocess-287"><a href="#preprocess-287"><span class="linenos">287</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="preprocess-287"><a href="#preprocess-287"><span class="linenos">287</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
|
</span><span id="preprocess-288"><a href="#preprocess-288"><span class="linenos">288</span></a><span class="sd"> Creates a new transform by chaining a sequence of transformations and converts the resulting</span>
|
||||||
</span><span id="preprocess-288"><a href="#preprocess-288"><span class="linenos">288</span></a><span class="sd"> expression to SQL, using either the "_sql" method corresponding to the resulting expression,</span>
|
</span><span id="preprocess-289"><a href="#preprocess-289"><span class="linenos">289</span></a><span class="sd"> expression to SQL, using either the "_sql" method corresponding to the resulting expression,</span>
|
||||||
</span><span id="preprocess-289"><a href="#preprocess-289"><span class="linenos">289</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
|
</span><span id="preprocess-290"><a href="#preprocess-290"><span class="linenos">290</span></a><span class="sd"> or the appropriate `Generator.TRANSFORMS` function (when applicable -- see below).</span>
|
||||||
</span><span id="preprocess-290"><a href="#preprocess-290"><span class="linenos">290</span></a>
|
</span><span id="preprocess-291"><a href="#preprocess-291"><span class="linenos">291</span></a>
|
||||||
</span><span id="preprocess-291"><a href="#preprocess-291"><span class="linenos">291</span></a><span class="sd"> Args:</span>
|
</span><span id="preprocess-292"><a href="#preprocess-292"><span class="linenos">292</span></a><span class="sd"> Args:</span>
|
||||||
</span><span id="preprocess-292"><a href="#preprocess-292"><span class="linenos">292</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
|
</span><span id="preprocess-293"><a href="#preprocess-293"><span class="linenos">293</span></a><span class="sd"> transforms: sequence of transform functions. These will be called in order.</span>
|
||||||
</span><span id="preprocess-293"><a href="#preprocess-293"><span class="linenos">293</span></a>
|
</span><span id="preprocess-294"><a href="#preprocess-294"><span class="linenos">294</span></a>
|
||||||
</span><span id="preprocess-294"><a href="#preprocess-294"><span class="linenos">294</span></a><span class="sd"> Returns:</span>
|
</span><span id="preprocess-295"><a href="#preprocess-295"><span class="linenos">295</span></a><span class="sd"> Returns:</span>
|
||||||
</span><span id="preprocess-295"><a href="#preprocess-295"><span class="linenos">295</span></a><span class="sd"> Function that can be used as a generator transform.</span>
|
</span><span id="preprocess-296"><a href="#preprocess-296"><span class="linenos">296</span></a><span class="sd"> Function that can be used as a generator transform.</span>
|
||||||
</span><span id="preprocess-296"><a href="#preprocess-296"><span class="linenos">296</span></a><span class="sd"> """</span>
|
</span><span id="preprocess-297"><a href="#preprocess-297"><span class="linenos">297</span></a><span class="sd"> """</span>
|
||||||
</span><span id="preprocess-297"><a href="#preprocess-297"><span class="linenos">297</span></a>
|
</span><span id="preprocess-298"><a href="#preprocess-298"><span class="linenos">298</span></a>
|
||||||
</span><span id="preprocess-298"><a href="#preprocess-298"><span class="linenos">298</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
</span><span id="preprocess-299"><a href="#preprocess-299"><span class="linenos">299</span></a> <span class="k">def</span> <span class="nf">_to_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
||||||
</span><span id="preprocess-299"><a href="#preprocess-299"><span class="linenos">299</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="preprocess-300"><a href="#preprocess-300"><span class="linenos">300</span></a> <span class="n">expression_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="preprocess-300"><a href="#preprocess-300"><span class="linenos">300</span></a>
|
</span><span id="preprocess-301"><a href="#preprocess-301"><span class="linenos">301</span></a>
|
||||||
</span><span id="preprocess-301"><a href="#preprocess-301"><span class="linenos">301</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
|
</span><span id="preprocess-302"><a href="#preprocess-302"><span class="linenos">302</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">expression</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
|
||||||
</span><span id="preprocess-302"><a href="#preprocess-302"><span class="linenos">302</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
</span><span id="preprocess-303"><a href="#preprocess-303"><span class="linenos">303</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">transforms</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
||||||
</span><span id="preprocess-303"><a href="#preprocess-303"><span class="linenos">303</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="preprocess-304"><a href="#preprocess-304"><span class="linenos">304</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">t</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="preprocess-304"><a href="#preprocess-304"><span class="linenos">304</span></a>
|
</span><span id="preprocess-305"><a href="#preprocess-305"><span class="linenos">305</span></a>
|
||||||
</span><span id="preprocess-305"><a href="#preprocess-305"><span class="linenos">305</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">"_sql"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
</span><span id="preprocess-306"><a href="#preprocess-306"><span class="linenos">306</span></a> <span class="n">_sql_handler</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="o">.</span><span class="n">key</span> <span class="o">+</span> <span class="s2">"_sql"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||||
</span><span id="preprocess-306"><a href="#preprocess-306"><span class="linenos">306</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
|
</span><span id="preprocess-307"><a href="#preprocess-307"><span class="linenos">307</span></a> <span class="k">if</span> <span class="n">_sql_handler</span><span class="p">:</span>
|
||||||
</span><span id="preprocess-307"><a href="#preprocess-307"><span class="linenos">307</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
</span><span id="preprocess-308"><a href="#preprocess-308"><span class="linenos">308</span></a> <span class="k">return</span> <span class="n">_sql_handler</span><span class="p">(</span><span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="preprocess-308"><a href="#preprocess-308"><span class="linenos">308</span></a>
|
</span><span id="preprocess-309"><a href="#preprocess-309"><span class="linenos">309</span></a>
|
||||||
</span><span id="preprocess-309"><a href="#preprocess-309"><span class="linenos">309</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
|
</span><span id="preprocess-310"><a href="#preprocess-310"><span class="linenos">310</span></a> <span class="n">transforms_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORMS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">))</span>
|
||||||
</span><span id="preprocess-310"><a href="#preprocess-310"><span class="linenos">310</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
|
</span><span id="preprocess-311"><a href="#preprocess-311"><span class="linenos">311</span></a> <span class="k">if</span> <span class="n">transforms_handler</span><span class="p">:</span>
|
||||||
</span><span id="preprocess-311"><a href="#preprocess-311"><span class="linenos">311</span></a> <span class="c1"># Ensures we don't enter an infinite loop. This can happen when the original expression</span>
|
</span><span id="preprocess-312"><a href="#preprocess-312"><span class="linenos">312</span></a> <span class="c1"># Ensures we don't enter an infinite loop. This can happen when the original expression</span>
|
||||||
</span><span id="preprocess-312"><a href="#preprocess-312"><span class="linenos">312</span></a> <span class="c1"># has the same type as the final expression and there's no _sql method available for it,</span>
|
</span><span id="preprocess-313"><a href="#preprocess-313"><span class="linenos">313</span></a> <span class="c1"># has the same type as the final expression and there's no _sql method available for it,</span>
|
||||||
</span><span id="preprocess-313"><a href="#preprocess-313"><span class="linenos">313</span></a> <span class="c1"># because then it'd re-enter _to_sql.</span>
|
</span><span id="preprocess-314"><a href="#preprocess-314"><span class="linenos">314</span></a> <span class="c1"># because then it'd re-enter _to_sql.</span>
|
||||||
</span><span id="preprocess-314"><a href="#preprocess-314"><span class="linenos">314</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
</span><span id="preprocess-315"><a href="#preprocess-315"><span class="linenos">315</span></a> <span class="k">if</span> <span class="n">expression_type</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||||
</span><span id="preprocess-315"><a href="#preprocess-315"><span class="linenos">315</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
</span><span id="preprocess-316"><a href="#preprocess-316"><span class="linenos">316</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||||||
</span><span id="preprocess-316"><a href="#preprocess-316"><span class="linenos">316</span></a> <span class="sa">f</span><span class="s2">"Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed."</span>
|
</span><span id="preprocess-317"><a href="#preprocess-317"><span class="linenos">317</span></a> <span class="sa">f</span><span class="s2">"Expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> requires a _sql method in order to be transformed."</span>
|
||||||
</span><span id="preprocess-317"><a href="#preprocess-317"><span class="linenos">317</span></a> <span class="p">)</span>
|
</span><span id="preprocess-318"><a href="#preprocess-318"><span class="linenos">318</span></a> <span class="p">)</span>
|
||||||
</span><span id="preprocess-318"><a href="#preprocess-318"><span class="linenos">318</span></a>
|
</span><span id="preprocess-319"><a href="#preprocess-319"><span class="linenos">319</span></a>
|
||||||
</span><span id="preprocess-319"><a href="#preprocess-319"><span class="linenos">319</span></a> <span class="k">return</span> <span class="n">transforms_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
|
</span><span id="preprocess-320"><a href="#preprocess-320"><span class="linenos">320</span></a> <span class="k">return</span> <span class="n">transforms_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">)</span>
|
||||||
</span><span id="preprocess-320"><a href="#preprocess-320"><span class="linenos">320</span></a>
|
</span><span id="preprocess-321"><a href="#preprocess-321"><span class="linenos">321</span></a>
|
||||||
</span><span id="preprocess-321"><a href="#preprocess-321"><span class="linenos">321</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">."</span><span class="p">)</span>
|
</span><span id="preprocess-322"><a href="#preprocess-322"><span class="linenos">322</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unsupported expression type </span><span class="si">{</span><span class="n">expression</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">."</span><span class="p">)</span>
|
||||||
</span><span id="preprocess-322"><a href="#preprocess-322"><span class="linenos">322</span></a>
|
</span><span id="preprocess-323"><a href="#preprocess-323"><span class="linenos">323</span></a>
|
||||||
</span><span id="preprocess-323"><a href="#preprocess-323"><span class="linenos">323</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
|
</span><span id="preprocess-324"><a href="#preprocess-324"><span class="linenos">324</span></a> <span class="k">return</span> <span class="n">_to_sql</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1119,7 +1119,7 @@ def map_entries(col: ColumnOrName) -> Column:
|
||||||
|
|
||||||
|
|
||||||
def map_from_entries(col: ColumnOrName) -> Column:
|
def map_from_entries(col: ColumnOrName) -> Column:
|
||||||
return Column.invoke_anonymous_function(col, "MAP_FROM_ENTRIES")
|
return Column.invoke_expression_over_column(col, expression.MapFromEntries)
|
||||||
|
|
||||||
|
|
||||||
def array_repeat(col: ColumnOrName, count: t.Union[ColumnOrName, int]) -> Column:
|
def array_repeat(col: ColumnOrName, count: t.Union[ColumnOrName, int]) -> Column:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
import re
|
import re
|
||||||
import typing as t
|
import typing as t
|
||||||
|
|
||||||
|
@ -21,6 +22,8 @@ from sqlglot.dialects.dialect import (
|
||||||
from sqlglot.helper import seq_get, split_num_words
|
from sqlglot.helper import seq_get, split_num_words
|
||||||
from sqlglot.tokens import TokenType
|
from sqlglot.tokens import TokenType
|
||||||
|
|
||||||
|
logger = logging.getLogger("sqlglot")
|
||||||
|
|
||||||
|
|
||||||
def _date_add_sql(
|
def _date_add_sql(
|
||||||
data_type: str, kind: str
|
data_type: str, kind: str
|
||||||
|
@ -104,12 +107,70 @@ def _unqualify_unnest(expression: exp.Expression) -> exp.Expression:
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
|
||||||
|
# https://issuetracker.google.com/issues/162294746
|
||||||
|
# workaround for bigquery bug when grouping by an expression and then ordering
|
||||||
|
# WITH x AS (SELECT 1 y)
|
||||||
|
# SELECT y + 1 z
|
||||||
|
# FROM x
|
||||||
|
# GROUP BY x + 1
|
||||||
|
# ORDER by z
|
||||||
|
def _alias_ordered_group(expression: exp.Expression) -> exp.Expression:
|
||||||
|
if isinstance(expression, exp.Select):
|
||||||
|
group = expression.args.get("group")
|
||||||
|
order = expression.args.get("order")
|
||||||
|
|
||||||
|
if group and order:
|
||||||
|
aliases = {
|
||||||
|
select.this: select.args["alias"]
|
||||||
|
for select in expression.selects
|
||||||
|
if isinstance(select, exp.Alias)
|
||||||
|
}
|
||||||
|
|
||||||
|
for e in group.expressions:
|
||||||
|
alias = aliases.get(e)
|
||||||
|
|
||||||
|
if alias:
|
||||||
|
e.replace(exp.column(alias))
|
||||||
|
|
||||||
|
return expression
|
||||||
|
|
||||||
|
|
||||||
|
def _pushdown_cte_column_names(expression: exp.Expression) -> exp.Expression:
|
||||||
|
"""BigQuery doesn't allow column names when defining a CTE, so we try to push them down."""
|
||||||
|
if isinstance(expression, exp.CTE) and expression.alias_column_names:
|
||||||
|
cte_query = expression.this
|
||||||
|
|
||||||
|
if cte_query.is_star:
|
||||||
|
logger.warning(
|
||||||
|
"Can't push down CTE column names for star queries. Run the query through"
|
||||||
|
" the optimizer or use 'qualify' to expand the star projections first."
|
||||||
|
)
|
||||||
|
return expression
|
||||||
|
|
||||||
|
column_names = expression.alias_column_names
|
||||||
|
expression.args["alias"].set("columns", None)
|
||||||
|
|
||||||
|
for name, select in zip(column_names, cte_query.selects):
|
||||||
|
to_replace = select
|
||||||
|
|
||||||
|
if isinstance(select, exp.Alias):
|
||||||
|
select = select.this
|
||||||
|
|
||||||
|
# Inner aliases are shadowed by the CTE column names
|
||||||
|
to_replace.replace(exp.alias_(select, name))
|
||||||
|
|
||||||
|
return expression
|
||||||
|
|
||||||
|
|
||||||
class BigQuery(Dialect):
|
class BigQuery(Dialect):
|
||||||
UNNEST_COLUMN_ONLY = True
|
UNNEST_COLUMN_ONLY = True
|
||||||
|
|
||||||
# https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#case_sensitivity
|
# https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#case_sensitivity
|
||||||
RESOLVES_IDENTIFIERS_AS_UPPERCASE = None
|
RESOLVES_IDENTIFIERS_AS_UPPERCASE = None
|
||||||
|
|
||||||
|
# bigquery udfs are case sensitive
|
||||||
|
NORMALIZE_FUNCTIONS = False
|
||||||
|
|
||||||
TIME_MAPPING = {
|
TIME_MAPPING = {
|
||||||
"%D": "%m/%d/%y",
|
"%D": "%m/%d/%y",
|
||||||
}
|
}
|
||||||
|
@ -135,10 +196,14 @@ class BigQuery(Dialect):
|
||||||
# In BigQuery, CTEs aren't case-sensitive, but table names are (by default, at least).
|
# In BigQuery, CTEs aren't case-sensitive, but table names are (by default, at least).
|
||||||
# The following check is essentially a heuristic to detect tables based on whether or
|
# The following check is essentially a heuristic to detect tables based on whether or
|
||||||
# not they're qualified.
|
# not they're qualified.
|
||||||
if (
|
if isinstance(expression, exp.Identifier):
|
||||||
isinstance(expression, exp.Identifier)
|
parent = expression.parent
|
||||||
and not (isinstance(expression.parent, exp.Table) and expression.parent.db)
|
|
||||||
and not expression.meta.get("is_table")
|
while isinstance(parent, exp.Dot):
|
||||||
|
parent = parent.parent
|
||||||
|
|
||||||
|
if not (isinstance(parent, exp.Table) and parent.db) and not expression.meta.get(
|
||||||
|
"is_table"
|
||||||
):
|
):
|
||||||
expression.set("this", expression.this.lower())
|
expression.set("this", expression.this.lower())
|
||||||
|
|
||||||
|
@ -298,10 +363,8 @@ class BigQuery(Dialect):
|
||||||
**generator.Generator.TRANSFORMS,
|
**generator.Generator.TRANSFORMS,
|
||||||
exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
|
exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
|
||||||
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
||||||
exp.AtTimeZone: lambda self, e: self.func(
|
|
||||||
"TIMESTAMP", self.func("DATETIME", e.this, e.args.get("zone"))
|
|
||||||
),
|
|
||||||
exp.Cast: transforms.preprocess([transforms.remove_precision_parameterized_types]),
|
exp.Cast: transforms.preprocess([transforms.remove_precision_parameterized_types]),
|
||||||
|
exp.CTE: transforms.preprocess([_pushdown_cte_column_names]),
|
||||||
exp.DateAdd: _date_add_sql("DATE", "ADD"),
|
exp.DateAdd: _date_add_sql("DATE", "ADD"),
|
||||||
exp.DateSub: _date_add_sql("DATE", "SUB"),
|
exp.DateSub: _date_add_sql("DATE", "SUB"),
|
||||||
exp.DatetimeAdd: _date_add_sql("DATETIME", "ADD"),
|
exp.DatetimeAdd: _date_add_sql("DATETIME", "ADD"),
|
||||||
|
@ -325,7 +388,12 @@ class BigQuery(Dialect):
|
||||||
),
|
),
|
||||||
exp.RegexpLike: rename_func("REGEXP_CONTAINS"),
|
exp.RegexpLike: rename_func("REGEXP_CONTAINS"),
|
||||||
exp.Select: transforms.preprocess(
|
exp.Select: transforms.preprocess(
|
||||||
[_unqualify_unnest, transforms.eliminate_distinct_on]
|
[
|
||||||
|
transforms.explode_to_unnest,
|
||||||
|
_unqualify_unnest,
|
||||||
|
transforms.eliminate_distinct_on,
|
||||||
|
_alias_ordered_group,
|
||||||
|
]
|
||||||
),
|
),
|
||||||
exp.StrToDate: lambda self, e: f"PARSE_DATE({self.format_time(e)}, {self.sql(e, 'this')})",
|
exp.StrToDate: lambda self, e: f"PARSE_DATE({self.format_time(e)}, {self.sql(e, 'this')})",
|
||||||
exp.StrToTime: lambda self, e: f"PARSE_TIMESTAMP({self.format_time(e)}, {self.sql(e, 'this')})",
|
exp.StrToTime: lambda self, e: f"PARSE_TIMESTAMP({self.format_time(e)}, {self.sql(e, 'this')})",
|
||||||
|
@ -334,7 +402,6 @@ class BigQuery(Dialect):
|
||||||
exp.TimestampAdd: _date_add_sql("TIMESTAMP", "ADD"),
|
exp.TimestampAdd: _date_add_sql("TIMESTAMP", "ADD"),
|
||||||
exp.TimestampSub: _date_add_sql("TIMESTAMP", "SUB"),
|
exp.TimestampSub: _date_add_sql("TIMESTAMP", "SUB"),
|
||||||
exp.TimeStrToTime: timestrtotime_sql,
|
exp.TimeStrToTime: timestrtotime_sql,
|
||||||
exp.TryCast: lambda self, e: f"SAFE_CAST({self.sql(e, 'this')} AS {self.sql(e, 'to')})",
|
|
||||||
exp.TsOrDsToDate: ts_or_ds_to_date_sql("bigquery"),
|
exp.TsOrDsToDate: ts_or_ds_to_date_sql("bigquery"),
|
||||||
exp.TsOrDsAdd: _date_add_sql("DATE", "ADD"),
|
exp.TsOrDsAdd: _date_add_sql("DATE", "ADD"),
|
||||||
exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
|
exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
|
||||||
|
@ -378,7 +445,121 @@ class BigQuery(Dialect):
|
||||||
exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
|
exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
|
||||||
}
|
}
|
||||||
|
|
||||||
RESERVED_KEYWORDS = {*generator.Generator.RESERVED_KEYWORDS, "hash"}
|
# from: https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#reserved_keywords
|
||||||
|
RESERVED_KEYWORDS = {
|
||||||
|
*generator.Generator.RESERVED_KEYWORDS,
|
||||||
|
"all",
|
||||||
|
"and",
|
||||||
|
"any",
|
||||||
|
"array",
|
||||||
|
"as",
|
||||||
|
"asc",
|
||||||
|
"assert_rows_modified",
|
||||||
|
"at",
|
||||||
|
"between",
|
||||||
|
"by",
|
||||||
|
"case",
|
||||||
|
"cast",
|
||||||
|
"collate",
|
||||||
|
"contains",
|
||||||
|
"create",
|
||||||
|
"cross",
|
||||||
|
"cube",
|
||||||
|
"current",
|
||||||
|
"default",
|
||||||
|
"define",
|
||||||
|
"desc",
|
||||||
|
"distinct",
|
||||||
|
"else",
|
||||||
|
"end",
|
||||||
|
"enum",
|
||||||
|
"escape",
|
||||||
|
"except",
|
||||||
|
"exclude",
|
||||||
|
"exists",
|
||||||
|
"extract",
|
||||||
|
"false",
|
||||||
|
"fetch",
|
||||||
|
"following",
|
||||||
|
"for",
|
||||||
|
"from",
|
||||||
|
"full",
|
||||||
|
"group",
|
||||||
|
"grouping",
|
||||||
|
"groups",
|
||||||
|
"hash",
|
||||||
|
"having",
|
||||||
|
"if",
|
||||||
|
"ignore",
|
||||||
|
"in",
|
||||||
|
"inner",
|
||||||
|
"intersect",
|
||||||
|
"interval",
|
||||||
|
"into",
|
||||||
|
"is",
|
||||||
|
"join",
|
||||||
|
"lateral",
|
||||||
|
"left",
|
||||||
|
"like",
|
||||||
|
"limit",
|
||||||
|
"lookup",
|
||||||
|
"merge",
|
||||||
|
"natural",
|
||||||
|
"new",
|
||||||
|
"no",
|
||||||
|
"not",
|
||||||
|
"null",
|
||||||
|
"nulls",
|
||||||
|
"of",
|
||||||
|
"on",
|
||||||
|
"or",
|
||||||
|
"order",
|
||||||
|
"outer",
|
||||||
|
"over",
|
||||||
|
"partition",
|
||||||
|
"preceding",
|
||||||
|
"proto",
|
||||||
|
"qualify",
|
||||||
|
"range",
|
||||||
|
"recursive",
|
||||||
|
"respect",
|
||||||
|
"right",
|
||||||
|
"rollup",
|
||||||
|
"rows",
|
||||||
|
"select",
|
||||||
|
"set",
|
||||||
|
"some",
|
||||||
|
"struct",
|
||||||
|
"tablesample",
|
||||||
|
"then",
|
||||||
|
"to",
|
||||||
|
"treat",
|
||||||
|
"true",
|
||||||
|
"unbounded",
|
||||||
|
"union",
|
||||||
|
"unnest",
|
||||||
|
"using",
|
||||||
|
"when",
|
||||||
|
"where",
|
||||||
|
"window",
|
||||||
|
"with",
|
||||||
|
"within",
|
||||||
|
}
|
||||||
|
|
||||||
|
def attimezone_sql(self, expression: exp.AtTimeZone) -> str:
|
||||||
|
if not isinstance(expression.parent, exp.Cast):
|
||||||
|
return self.func(
|
||||||
|
"TIMESTAMP", self.func("DATETIME", expression.this, expression.args.get("zone"))
|
||||||
|
)
|
||||||
|
return super().attimezone_sql(expression)
|
||||||
|
|
||||||
|
def trycast_sql(self, expression: exp.TryCast) -> str:
|
||||||
|
return self.cast_sql(expression, safe_prefix="SAFE_")
|
||||||
|
|
||||||
|
def cte_sql(self, expression: exp.CTE) -> str:
|
||||||
|
if expression.alias_column_names:
|
||||||
|
self.unsupported("Column names in CTE definition are not supported.")
|
||||||
|
return super().cte_sql(expression)
|
||||||
|
|
||||||
def array_sql(self, expression: exp.Array) -> str:
|
def array_sql(self, expression: exp.Array) -> str:
|
||||||
first_arg = seq_get(expression.expressions, 0)
|
first_arg = seq_get(expression.expressions, 0)
|
||||||
|
|
|
@ -388,6 +388,11 @@ def no_comment_column_constraint_sql(
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def no_map_from_entries_sql(self: Generator, expression: exp.MapFromEntries) -> str:
|
||||||
|
self.unsupported("MAP_FROM_ENTRIES unsupported")
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
def str_position_sql(self: Generator, expression: exp.StrPosition) -> str:
|
def str_position_sql(self: Generator, expression: exp.StrPosition) -> str:
|
||||||
this = self.sql(expression, "this")
|
this = self.sql(expression, "this")
|
||||||
substr = self.sql(expression, "substr")
|
substr = self.sql(expression, "substr")
|
||||||
|
|
|
@ -132,6 +132,10 @@ class MySQL(Dialect):
|
||||||
"SEPARATOR": TokenType.SEPARATOR,
|
"SEPARATOR": TokenType.SEPARATOR,
|
||||||
"ENUM": TokenType.ENUM,
|
"ENUM": TokenType.ENUM,
|
||||||
"START": TokenType.BEGIN,
|
"START": TokenType.BEGIN,
|
||||||
|
"SIGNED": TokenType.BIGINT,
|
||||||
|
"SIGNED INTEGER": TokenType.BIGINT,
|
||||||
|
"UNSIGNED": TokenType.UBIGINT,
|
||||||
|
"UNSIGNED INTEGER": TokenType.UBIGINT,
|
||||||
"_ARMSCII8": TokenType.INTRODUCER,
|
"_ARMSCII8": TokenType.INTRODUCER,
|
||||||
"_ASCII": TokenType.INTRODUCER,
|
"_ASCII": TokenType.INTRODUCER,
|
||||||
"_BIG5": TokenType.INTRODUCER,
|
"_BIG5": TokenType.INTRODUCER,
|
||||||
|
@ -441,6 +445,17 @@ class MySQL(Dialect):
|
||||||
|
|
||||||
LIMIT_FETCH = "LIMIT"
|
LIMIT_FETCH = "LIMIT"
|
||||||
|
|
||||||
|
def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
|
||||||
|
"""(U)BIGINT is not allowed in a CAST expression, so we use (UN)SIGNED instead."""
|
||||||
|
if expression.to.this == exp.DataType.Type.BIGINT:
|
||||||
|
to = "SIGNED"
|
||||||
|
elif expression.to.this == exp.DataType.Type.UBIGINT:
|
||||||
|
to = "UNSIGNED"
|
||||||
|
else:
|
||||||
|
return super().cast_sql(expression)
|
||||||
|
|
||||||
|
return f"CAST({self.sql(expression, 'this')} AS {to})"
|
||||||
|
|
||||||
def show_sql(self, expression: exp.Show) -> str:
|
def show_sql(self, expression: exp.Show) -> str:
|
||||||
this = f" {expression.name}"
|
this = f" {expression.name}"
|
||||||
full = " FULL" if expression.args.get("full") else ""
|
full = " FULL" if expression.args.get("full") else ""
|
||||||
|
|
|
@ -11,6 +11,7 @@ from sqlglot.dialects.dialect import (
|
||||||
format_time_lambda,
|
format_time_lambda,
|
||||||
max_or_greatest,
|
max_or_greatest,
|
||||||
min_or_least,
|
min_or_least,
|
||||||
|
no_map_from_entries_sql,
|
||||||
no_paren_current_date_sql,
|
no_paren_current_date_sql,
|
||||||
no_pivot_sql,
|
no_pivot_sql,
|
||||||
no_tablesample_sql,
|
no_tablesample_sql,
|
||||||
|
@ -346,6 +347,7 @@ class Postgres(Dialect):
|
||||||
exp.LogicalOr: rename_func("BOOL_OR"),
|
exp.LogicalOr: rename_func("BOOL_OR"),
|
||||||
exp.LogicalAnd: rename_func("BOOL_AND"),
|
exp.LogicalAnd: rename_func("BOOL_AND"),
|
||||||
exp.Max: max_or_greatest,
|
exp.Max: max_or_greatest,
|
||||||
|
exp.MapFromEntries: no_map_from_entries_sql,
|
||||||
exp.Min: min_or_least,
|
exp.Min: min_or_least,
|
||||||
exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"),
|
exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"),
|
||||||
exp.ArrayContains: lambda self, e: self.binary(e, "@>"),
|
exp.ArrayContains: lambda self, e: self.binary(e, "@>"),
|
||||||
|
@ -378,3 +380,11 @@ class Postgres(Dialect):
|
||||||
exp.TransientProperty: exp.Properties.Location.UNSUPPORTED,
|
exp.TransientProperty: exp.Properties.Location.UNSUPPORTED,
|
||||||
exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
|
exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def bracket_sql(self, expression: exp.Bracket) -> str:
|
||||||
|
"""Forms like ARRAY[1, 2, 3][3] aren't allowed; we need to wrap the ARRAY."""
|
||||||
|
if isinstance(expression.this, exp.Array):
|
||||||
|
expression = expression.copy()
|
||||||
|
expression.set("this", exp.paren(expression.this, copy=False))
|
||||||
|
|
||||||
|
return super().bracket_sql(expression)
|
||||||
|
|
|
@ -20,7 +20,7 @@ from sqlglot.dialects.dialect import (
|
||||||
)
|
)
|
||||||
from sqlglot.dialects.mysql import MySQL
|
from sqlglot.dialects.mysql import MySQL
|
||||||
from sqlglot.errors import UnsupportedError
|
from sqlglot.errors import UnsupportedError
|
||||||
from sqlglot.helper import seq_get
|
from sqlglot.helper import apply_index_offset, seq_get
|
||||||
from sqlglot.tokens import TokenType
|
from sqlglot.tokens import TokenType
|
||||||
|
|
||||||
|
|
||||||
|
@ -154,6 +154,13 @@ def _from_unixtime(args: t.List) -> exp.Expression:
|
||||||
return exp.UnixToTime.from_arg_list(args)
|
return exp.UnixToTime.from_arg_list(args)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_element_at(args: t.List) -> exp.SafeBracket:
|
||||||
|
this = seq_get(args, 0)
|
||||||
|
index = seq_get(args, 1)
|
||||||
|
assert isinstance(this, exp.Expression) and isinstance(index, exp.Expression)
|
||||||
|
return exp.SafeBracket(this=this, expressions=apply_index_offset(this, [index], -1))
|
||||||
|
|
||||||
|
|
||||||
def _unnest_sequence(expression: exp.Expression) -> exp.Expression:
|
def _unnest_sequence(expression: exp.Expression) -> exp.Expression:
|
||||||
if isinstance(expression, exp.Table):
|
if isinstance(expression, exp.Table):
|
||||||
if isinstance(expression.this, exp.GenerateSeries):
|
if isinstance(expression.this, exp.GenerateSeries):
|
||||||
|
@ -201,6 +208,7 @@ class Presto(Dialect):
|
||||||
"DATE_FORMAT": format_time_lambda(exp.TimeToStr, "presto"),
|
"DATE_FORMAT": format_time_lambda(exp.TimeToStr, "presto"),
|
||||||
"DATE_PARSE": format_time_lambda(exp.StrToTime, "presto"),
|
"DATE_PARSE": format_time_lambda(exp.StrToTime, "presto"),
|
||||||
"DATE_TRUNC": date_trunc_to_time,
|
"DATE_TRUNC": date_trunc_to_time,
|
||||||
|
"ELEMENT_AT": _parse_element_at,
|
||||||
"FROM_HEX": exp.Unhex.from_arg_list,
|
"FROM_HEX": exp.Unhex.from_arg_list,
|
||||||
"FROM_UNIXTIME": _from_unixtime,
|
"FROM_UNIXTIME": _from_unixtime,
|
||||||
"FROM_UTF8": lambda args: exp.Decode(
|
"FROM_UTF8": lambda args: exp.Decode(
|
||||||
|
@ -285,6 +293,9 @@ class Presto(Dialect):
|
||||||
exp.Pivot: no_pivot_sql,
|
exp.Pivot: no_pivot_sql,
|
||||||
exp.Quantile: _quantile_sql,
|
exp.Quantile: _quantile_sql,
|
||||||
exp.Right: right_to_substring_sql,
|
exp.Right: right_to_substring_sql,
|
||||||
|
exp.SafeBracket: lambda self, e: self.func(
|
||||||
|
"ELEMENT_AT", e.this, seq_get(apply_index_offset(e.this, e.expressions, 1), 0)
|
||||||
|
),
|
||||||
exp.SafeDivide: no_safe_divide_sql,
|
exp.SafeDivide: no_safe_divide_sql,
|
||||||
exp.Schema: _schema_sql,
|
exp.Schema: _schema_sql,
|
||||||
exp.Select: transforms.preprocess(
|
exp.Select: transforms.preprocess(
|
||||||
|
|
|
@ -41,8 +41,6 @@ class Redshift(Postgres):
|
||||||
"STRTOL": exp.FromBase.from_arg_list,
|
"STRTOL": exp.FromBase.from_arg_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
CONVERT_TYPE_FIRST = True
|
|
||||||
|
|
||||||
def _parse_types(
|
def _parse_types(
|
||||||
self, check_func: bool = False, schema: bool = False
|
self, check_func: bool = False, schema: bool = False
|
||||||
) -> t.Optional[exp.Expression]:
|
) -> t.Optional[exp.Expression]:
|
||||||
|
@ -58,6 +56,12 @@ class Redshift(Postgres):
|
||||||
|
|
||||||
return this
|
return this
|
||||||
|
|
||||||
|
def _parse_convert(self, strict: bool) -> t.Optional[exp.Expression]:
|
||||||
|
to = self._parse_types()
|
||||||
|
self._match(TokenType.COMMA)
|
||||||
|
this = self._parse_bitwise()
|
||||||
|
return self.expression(exp.TryCast, this=this, to=to)
|
||||||
|
|
||||||
class Tokenizer(Postgres.Tokenizer):
|
class Tokenizer(Postgres.Tokenizer):
|
||||||
BIT_STRINGS = []
|
BIT_STRINGS = []
|
||||||
HEX_STRINGS = []
|
HEX_STRINGS = []
|
||||||
|
|
|
@ -258,14 +258,29 @@ class Snowflake(Dialect):
|
||||||
|
|
||||||
ALTER_PARSERS = {
|
ALTER_PARSERS = {
|
||||||
**parser.Parser.ALTER_PARSERS,
|
**parser.Parser.ALTER_PARSERS,
|
||||||
"UNSET": lambda self: self._parse_alter_table_set_tag(unset=True),
|
"SET": lambda self: self._parse_set(tag=self._match_text_seq("TAG")),
|
||||||
"SET": lambda self: self._parse_alter_table_set_tag(),
|
"UNSET": lambda self: self.expression(
|
||||||
|
exp.Set,
|
||||||
|
tag=self._match_text_seq("TAG"),
|
||||||
|
expressions=self._parse_csv(self._parse_id_var),
|
||||||
|
unset=True,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _parse_alter_table_set_tag(self, unset: bool = False) -> exp.Expression:
|
def _parse_id_var(
|
||||||
self._match_text_seq("TAG")
|
self,
|
||||||
parser = t.cast(t.Callable, self._parse_id_var if unset else self._parse_conjunction)
|
any_token: bool = True,
|
||||||
return self.expression(exp.SetTag, expressions=self._parse_csv(parser), unset=unset)
|
tokens: t.Optional[t.Collection[TokenType]] = None,
|
||||||
|
) -> t.Optional[exp.Expression]:
|
||||||
|
if self._match_text_seq("IDENTIFIER", "("):
|
||||||
|
identifier = (
|
||||||
|
super()._parse_id_var(any_token=any_token, tokens=tokens)
|
||||||
|
or self._parse_string()
|
||||||
|
)
|
||||||
|
self._match_r_paren()
|
||||||
|
return self.expression(exp.Anonymous, this="IDENTIFIER", expressions=[identifier])
|
||||||
|
|
||||||
|
return super()._parse_id_var(any_token=any_token, tokens=tokens)
|
||||||
|
|
||||||
class Tokenizer(tokens.Tokenizer):
|
class Tokenizer(tokens.Tokenizer):
|
||||||
QUOTES = ["'", "$$"]
|
QUOTES = ["'", "$$"]
|
||||||
|
@ -380,10 +395,6 @@ class Snowflake(Dialect):
|
||||||
self.unsupported("INTERSECT with All is not supported in Snowflake")
|
self.unsupported("INTERSECT with All is not supported in Snowflake")
|
||||||
return super().intersect_op(expression)
|
return super().intersect_op(expression)
|
||||||
|
|
||||||
def settag_sql(self, expression: exp.SetTag) -> str:
|
|
||||||
action = "UNSET" if expression.args.get("unset") else "SET"
|
|
||||||
return f"{action} TAG {self.expressions(expression)}"
|
|
||||||
|
|
||||||
def describe_sql(self, expression: exp.Describe) -> str:
|
def describe_sql(self, expression: exp.Describe) -> str:
|
||||||
# Default to table if kind is unknown
|
# Default to table if kind is unknown
|
||||||
kind_value = expression.args.get("kind") or "TABLE"
|
kind_value = expression.args.get("kind") or "TABLE"
|
||||||
|
|
|
@ -43,6 +43,7 @@ class Spark(Spark2):
|
||||||
class Generator(Spark2.Generator):
|
class Generator(Spark2.Generator):
|
||||||
TRANSFORMS = Spark2.Generator.TRANSFORMS.copy()
|
TRANSFORMS = Spark2.Generator.TRANSFORMS.copy()
|
||||||
TRANSFORMS.pop(exp.DateDiff)
|
TRANSFORMS.pop(exp.DateDiff)
|
||||||
|
TRANSFORMS.pop(exp.Group)
|
||||||
|
|
||||||
def datediff_sql(self, expression: exp.DateDiff) -> str:
|
def datediff_sql(self, expression: exp.DateDiff) -> str:
|
||||||
unit = self.sql(expression, "unit")
|
unit = self.sql(expression, "unit")
|
||||||
|
|
|
@ -231,14 +231,14 @@ class Spark2(Hive):
|
||||||
WRAP_DERIVED_VALUES = False
|
WRAP_DERIVED_VALUES = False
|
||||||
CREATE_FUNCTION_RETURN_AS = False
|
CREATE_FUNCTION_RETURN_AS = False
|
||||||
|
|
||||||
def cast_sql(self, expression: exp.Cast) -> str:
|
def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
|
||||||
if isinstance(expression.this, exp.Cast) and expression.this.is_type("json"):
|
if isinstance(expression.this, exp.Cast) and expression.this.is_type("json"):
|
||||||
schema = f"'{self.sql(expression, 'to')}'"
|
schema = f"'{self.sql(expression, 'to')}'"
|
||||||
return self.func("FROM_JSON", expression.this.this, schema)
|
return self.func("FROM_JSON", expression.this.this, schema)
|
||||||
if expression.is_type("json"):
|
if expression.is_type("json"):
|
||||||
return self.func("TO_JSON", expression.this)
|
return self.func("TO_JSON", expression.this)
|
||||||
|
|
||||||
return super(Hive.Generator, self).cast_sql(expression)
|
return super(Hive.Generator, self).cast_sql(expression, safe_prefix=safe_prefix)
|
||||||
|
|
||||||
def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str:
|
def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str:
|
||||||
return super().columndef_sql(
|
return super().columndef_sql(
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import typing as t
|
||||||
|
|
||||||
from sqlglot import exp, generator, parser, tokens, transforms
|
from sqlglot import exp, generator, parser, tokens, transforms
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
Dialect,
|
Dialect,
|
||||||
|
@ -133,7 +135,7 @@ class SQLite(Dialect):
|
||||||
|
|
||||||
LIMIT_FETCH = "LIMIT"
|
LIMIT_FETCH = "LIMIT"
|
||||||
|
|
||||||
def cast_sql(self, expression: exp.Cast) -> str:
|
def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
|
||||||
if expression.is_type("date"):
|
if expression.is_type("date"):
|
||||||
return self.func("DATE", expression.this)
|
return self.func("DATE", expression.this)
|
||||||
|
|
||||||
|
|
|
@ -166,6 +166,7 @@ def _string_agg_sql(self: generator.Generator, expression: exp.GroupConcat) -> s
|
||||||
|
|
||||||
|
|
||||||
class TSQL(Dialect):
|
class TSQL(Dialect):
|
||||||
|
RESOLVES_IDENTIFIERS_AS_UPPERCASE = None
|
||||||
NULL_ORDERING = "nulls_are_small"
|
NULL_ORDERING = "nulls_are_small"
|
||||||
TIME_FORMAT = "'yyyy-mm-dd hh:mm:ss'"
|
TIME_FORMAT = "'yyyy-mm-dd hh:mm:ss'"
|
||||||
|
|
||||||
|
|
|
@ -63,11 +63,9 @@ class Context:
|
||||||
reader = table[i]
|
reader = table[i]
|
||||||
yield reader, self
|
yield reader, self
|
||||||
|
|
||||||
def table_iter(self, table: str) -> t.Iterator[t.Tuple[TableIter, Context]]:
|
def table_iter(self, table: str) -> TableIter:
|
||||||
self.env["scope"] = self.row_readers
|
self.env["scope"] = self.row_readers
|
||||||
|
return iter(self.tables[table])
|
||||||
for reader in self.tables[table]:
|
|
||||||
yield reader, self
|
|
||||||
|
|
||||||
def filter(self, condition) -> None:
|
def filter(self, condition) -> None:
|
||||||
rows = [reader.row for reader, _ in self if self.eval(condition)]
|
rows = [reader.row for reader, _ in self if self.eval(condition)]
|
||||||
|
|
|
@ -276,10 +276,8 @@ class PythonExecutor:
|
||||||
end = 1
|
end = 1
|
||||||
length = len(context.table)
|
length = len(context.table)
|
||||||
table = self.table(list(step.group) + step.aggregations)
|
table = self.table(list(step.group) + step.aggregations)
|
||||||
condition = self.generate(step.condition)
|
|
||||||
|
|
||||||
def add_row():
|
def add_row():
|
||||||
if not condition or context.eval(condition):
|
|
||||||
table.append(group + context.eval_tuple(aggregations))
|
table.append(group + context.eval_tuple(aggregations))
|
||||||
|
|
||||||
if length:
|
if length:
|
||||||
|
@ -304,7 +302,7 @@ class PythonExecutor:
|
||||||
|
|
||||||
context = self.context({step.name: table, **{name: table for name in context.tables}})
|
context = self.context({step.name: table, **{name: table for name in context.tables}})
|
||||||
|
|
||||||
if step.projections:
|
if step.projections or step.condition:
|
||||||
return self.scan(step, context)
|
return self.scan(step, context)
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
|
@ -1013,7 +1013,7 @@ class Pragma(Expression):
|
||||||
|
|
||||||
|
|
||||||
class Set(Expression):
|
class Set(Expression):
|
||||||
arg_types = {"expressions": False}
|
arg_types = {"expressions": False, "unset": False, "tag": False}
|
||||||
|
|
||||||
|
|
||||||
class SetItem(Expression):
|
class SetItem(Expression):
|
||||||
|
@ -1168,10 +1168,6 @@ class RenameTable(Expression):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SetTag(Expression):
|
|
||||||
arg_types = {"expressions": True, "unset": False}
|
|
||||||
|
|
||||||
|
|
||||||
class Comment(Expression):
|
class Comment(Expression):
|
||||||
arg_types = {"this": True, "kind": True, "expression": True, "exists": False}
|
arg_types = {"this": True, "kind": True, "expression": True, "exists": False}
|
||||||
|
|
||||||
|
@ -1934,6 +1930,11 @@ class LanguageProperty(Property):
|
||||||
arg_types = {"this": True}
|
arg_types = {"this": True}
|
||||||
|
|
||||||
|
|
||||||
|
# spark ddl
|
||||||
|
class ClusteredByProperty(Property):
|
||||||
|
arg_types = {"expressions": True, "sorted_by": False, "buckets": True}
|
||||||
|
|
||||||
|
|
||||||
class DictProperty(Property):
|
class DictProperty(Property):
|
||||||
arg_types = {"this": True, "kind": True, "settings": False}
|
arg_types = {"this": True, "kind": True, "settings": False}
|
||||||
|
|
||||||
|
@ -2074,6 +2075,7 @@ class Properties(Expression):
|
||||||
"ALGORITHM": AlgorithmProperty,
|
"ALGORITHM": AlgorithmProperty,
|
||||||
"AUTO_INCREMENT": AutoIncrementProperty,
|
"AUTO_INCREMENT": AutoIncrementProperty,
|
||||||
"CHARACTER SET": CharacterSetProperty,
|
"CHARACTER SET": CharacterSetProperty,
|
||||||
|
"CLUSTERED_BY": ClusteredByProperty,
|
||||||
"COLLATE": CollateProperty,
|
"COLLATE": CollateProperty,
|
||||||
"COMMENT": SchemaCommentProperty,
|
"COMMENT": SchemaCommentProperty,
|
||||||
"DEFINER": DefinerProperty,
|
"DEFINER": DefinerProperty,
|
||||||
|
@ -2280,6 +2282,12 @@ class Table(Expression):
|
||||||
"system_time": False,
|
"system_time": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self) -> str:
|
||||||
|
if isinstance(self.this, Func):
|
||||||
|
return ""
|
||||||
|
return self.this.name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def db(self) -> str:
|
def db(self) -> str:
|
||||||
return self.text("db")
|
return self.text("db")
|
||||||
|
@ -3716,6 +3724,10 @@ class Bracket(Condition):
|
||||||
arg_types = {"this": True, "expressions": True}
|
arg_types = {"this": True, "expressions": True}
|
||||||
|
|
||||||
|
|
||||||
|
class SafeBracket(Bracket):
|
||||||
|
"""Represents array lookup where OOB index yields NULL instead of causing a failure."""
|
||||||
|
|
||||||
|
|
||||||
class Distinct(Expression):
|
class Distinct(Expression):
|
||||||
arg_types = {"expressions": False, "on": False}
|
arg_types = {"expressions": False, "on": False}
|
||||||
|
|
||||||
|
@ -3934,7 +3946,7 @@ class Case(Func):
|
||||||
|
|
||||||
|
|
||||||
class Cast(Func):
|
class Cast(Func):
|
||||||
arg_types = {"this": True, "to": True}
|
arg_types = {"this": True, "to": True, "format": False}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self) -> str:
|
def name(self) -> str:
|
||||||
|
@ -4292,6 +4304,10 @@ class Map(Func):
|
||||||
arg_types = {"keys": False, "values": False}
|
arg_types = {"keys": False, "values": False}
|
||||||
|
|
||||||
|
|
||||||
|
class MapFromEntries(Func):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class StarMap(Func):
|
class StarMap(Func):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -188,6 +188,7 @@ class Generator:
|
||||||
exp.CollateProperty: exp.Properties.Location.POST_SCHEMA,
|
exp.CollateProperty: exp.Properties.Location.POST_SCHEMA,
|
||||||
exp.CopyGrantsProperty: exp.Properties.Location.POST_SCHEMA,
|
exp.CopyGrantsProperty: exp.Properties.Location.POST_SCHEMA,
|
||||||
exp.Cluster: exp.Properties.Location.POST_SCHEMA,
|
exp.Cluster: exp.Properties.Location.POST_SCHEMA,
|
||||||
|
exp.ClusteredByProperty: exp.Properties.Location.POST_SCHEMA,
|
||||||
exp.DataBlocksizeProperty: exp.Properties.Location.POST_NAME,
|
exp.DataBlocksizeProperty: exp.Properties.Location.POST_NAME,
|
||||||
exp.DefinerProperty: exp.Properties.Location.POST_CREATE,
|
exp.DefinerProperty: exp.Properties.Location.POST_CREATE,
|
||||||
exp.DictRange: exp.Properties.Location.POST_SCHEMA,
|
exp.DictRange: exp.Properties.Location.POST_SCHEMA,
|
||||||
|
@ -1408,7 +1409,8 @@ class Generator:
|
||||||
expressions = (
|
expressions = (
|
||||||
f" {self.expressions(expression, flat=True)}" if expression.expressions else ""
|
f" {self.expressions(expression, flat=True)}" if expression.expressions else ""
|
||||||
)
|
)
|
||||||
return f"SET{expressions}"
|
tag = " TAG" if expression.args.get("tag") else ""
|
||||||
|
return f"{'UNSET' if expression.args.get('unset') else 'SET'}{tag}{expressions}"
|
||||||
|
|
||||||
def pragma_sql(self, expression: exp.Pragma) -> str:
|
def pragma_sql(self, expression: exp.Pragma) -> str:
|
||||||
return f"PRAGMA {self.sql(expression, 'this')}"
|
return f"PRAGMA {self.sql(expression, 'this')}"
|
||||||
|
@ -1749,6 +1751,9 @@ class Generator:
|
||||||
|
|
||||||
return f"{self.sql(expression, 'this')}[{expressions_sql}]"
|
return f"{self.sql(expression, 'this')}[{expressions_sql}]"
|
||||||
|
|
||||||
|
def safebracket_sql(self, expression: exp.SafeBracket) -> str:
|
||||||
|
return self.bracket_sql(expression)
|
||||||
|
|
||||||
def all_sql(self, expression: exp.All) -> str:
|
def all_sql(self, expression: exp.All) -> str:
|
||||||
return f"ALL {self.wrap(expression)}"
|
return f"ALL {self.wrap(expression)}"
|
||||||
|
|
||||||
|
@ -2000,8 +2005,10 @@ class Generator:
|
||||||
def bitwisexor_sql(self, expression: exp.BitwiseXor) -> str:
|
def bitwisexor_sql(self, expression: exp.BitwiseXor) -> str:
|
||||||
return self.binary(expression, "^")
|
return self.binary(expression, "^")
|
||||||
|
|
||||||
def cast_sql(self, expression: exp.Cast) -> str:
|
def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
|
||||||
return f"CAST({self.sql(expression, 'this')} AS {self.sql(expression, 'to')})"
|
format_sql = self.sql(expression, "format")
|
||||||
|
format_sql = f" FORMAT {format_sql}" if format_sql else ""
|
||||||
|
return f"{safe_prefix or ''}CAST({self.sql(expression, 'this')} AS {self.sql(expression, 'to')}{format_sql})"
|
||||||
|
|
||||||
def currentdate_sql(self, expression: exp.CurrentDate) -> str:
|
def currentdate_sql(self, expression: exp.CurrentDate) -> str:
|
||||||
zone = self.sql(expression, "this")
|
zone = self.sql(expression, "this")
|
||||||
|
@ -2227,7 +2234,7 @@ class Generator:
|
||||||
return self.binary(expression, "-")
|
return self.binary(expression, "-")
|
||||||
|
|
||||||
def trycast_sql(self, expression: exp.TryCast) -> str:
|
def trycast_sql(self, expression: exp.TryCast) -> str:
|
||||||
return f"TRY_CAST({self.sql(expression, 'this')} AS {self.sql(expression, 'to')})"
|
return self.cast_sql(expression, safe_prefix="TRY_")
|
||||||
|
|
||||||
def use_sql(self, expression: exp.Use) -> str:
|
def use_sql(self, expression: exp.Use) -> str:
|
||||||
kind = self.sql(expression, "kind")
|
kind = self.sql(expression, "kind")
|
||||||
|
@ -2409,6 +2416,13 @@ class Generator:
|
||||||
def oncluster_sql(self, expression: exp.OnCluster) -> str:
|
def oncluster_sql(self, expression: exp.OnCluster) -> str:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
def clusteredbyproperty_sql(self, expression: exp.ClusteredByProperty) -> str:
|
||||||
|
expressions = self.expressions(expression, key="expressions", flat=True)
|
||||||
|
sorted_by = self.expressions(expression, key="sorted_by", flat=True)
|
||||||
|
sorted_by = f" SORTED BY ({sorted_by})" if sorted_by else ""
|
||||||
|
buckets = self.sql(expression, "buckets")
|
||||||
|
return f"CLUSTERED BY ({expressions}){sorted_by} INTO {buckets} BUCKETS"
|
||||||
|
|
||||||
|
|
||||||
def cached_generator(
|
def cached_generator(
|
||||||
cache: t.Optional[t.Dict[int, str]] = None
|
cache: t.Optional[t.Dict[int, str]] = None
|
||||||
|
|
|
@ -60,8 +60,8 @@ def qualify(
|
||||||
The qualified expression.
|
The qualified expression.
|
||||||
"""
|
"""
|
||||||
schema = ensure_schema(schema, dialect=dialect)
|
schema = ensure_schema(schema, dialect=dialect)
|
||||||
expression = normalize_identifiers(expression, dialect=dialect)
|
|
||||||
expression = qualify_tables(expression, db=db, catalog=catalog, schema=schema)
|
expression = qualify_tables(expression, db=db, catalog=catalog, schema=schema)
|
||||||
|
expression = normalize_identifiers(expression, dialect=dialect)
|
||||||
|
|
||||||
if isolate_tables:
|
if isolate_tables:
|
||||||
expression = isolate_table_selects(expression, schema=schema)
|
expression = isolate_table_selects(expression, schema=schema)
|
||||||
|
|
|
@ -56,13 +56,13 @@ def qualify_columns(
|
||||||
if not isinstance(scope.expression, exp.UDTF):
|
if not isinstance(scope.expression, exp.UDTF):
|
||||||
_expand_stars(scope, resolver, using_column_tables)
|
_expand_stars(scope, resolver, using_column_tables)
|
||||||
_qualify_outputs(scope)
|
_qualify_outputs(scope)
|
||||||
_expand_group_by(scope, resolver)
|
_expand_group_by(scope)
|
||||||
_expand_order_by(scope)
|
_expand_order_by(scope, resolver)
|
||||||
|
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
|
||||||
def validate_qualify_columns(expression):
|
def validate_qualify_columns(expression: E) -> E:
|
||||||
"""Raise an `OptimizeError` if any columns aren't qualified"""
|
"""Raise an `OptimizeError` if any columns aren't qualified"""
|
||||||
unqualified_columns = []
|
unqualified_columns = []
|
||||||
for scope in traverse_scope(expression):
|
for scope in traverse_scope(expression):
|
||||||
|
@ -79,7 +79,7 @@ def validate_qualify_columns(expression):
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
|
||||||
def _pop_table_column_aliases(derived_tables):
|
def _pop_table_column_aliases(derived_tables: t.List[exp.CTE | exp.Subquery]) -> None:
|
||||||
"""
|
"""
|
||||||
Remove table column aliases.
|
Remove table column aliases.
|
||||||
|
|
||||||
|
@ -91,13 +91,13 @@ def _pop_table_column_aliases(derived_tables):
|
||||||
table_alias.args.pop("columns", None)
|
table_alias.args.pop("columns", None)
|
||||||
|
|
||||||
|
|
||||||
def _expand_using(scope, resolver):
|
def _expand_using(scope: Scope, resolver: Resolver) -> t.Dict[str, t.Any]:
|
||||||
joins = list(scope.find_all(exp.Join))
|
joins = list(scope.find_all(exp.Join))
|
||||||
names = {join.alias_or_name for join in joins}
|
names = {join.alias_or_name for join in joins}
|
||||||
ordered = [key for key in scope.selected_sources if key not in names]
|
ordered = [key for key in scope.selected_sources if key not in names]
|
||||||
|
|
||||||
# Mapping of automatically joined column names to an ordered set of source names (dict).
|
# Mapping of automatically joined column names to an ordered set of source names (dict).
|
||||||
column_tables = {}
|
column_tables: t.Dict[str, t.Dict[str, t.Any]] = {}
|
||||||
|
|
||||||
for join in joins:
|
for join in joins:
|
||||||
using = join.args.get("using")
|
using = join.args.get("using")
|
||||||
|
@ -172,20 +172,25 @@ def _expand_alias_refs(scope: Scope, resolver: Resolver) -> None:
|
||||||
|
|
||||||
alias_to_expression: t.Dict[str, exp.Expression] = {}
|
alias_to_expression: t.Dict[str, exp.Expression] = {}
|
||||||
|
|
||||||
def replace_columns(
|
def replace_columns(node: t.Optional[exp.Expression], resolve_table: bool = False) -> None:
|
||||||
node: t.Optional[exp.Expression], expand: bool = True, resolve_agg: bool = False
|
|
||||||
):
|
|
||||||
if not node:
|
if not node:
|
||||||
return
|
return
|
||||||
|
|
||||||
for column, *_ in walk_in_scope(node):
|
for column, *_ in walk_in_scope(node):
|
||||||
if not isinstance(column, exp.Column):
|
if not isinstance(column, exp.Column):
|
||||||
continue
|
continue
|
||||||
table = resolver.get_table(column.name) if resolve_agg and not column.table else None
|
table = resolver.get_table(column.name) if resolve_table and not column.table else None
|
||||||
if table and column.find_ancestor(exp.AggFunc):
|
alias_expr = alias_to_expression.get(column.name)
|
||||||
|
double_agg = (
|
||||||
|
(alias_expr.find(exp.AggFunc) and column.find_ancestor(exp.AggFunc))
|
||||||
|
if alias_expr
|
||||||
|
else False
|
||||||
|
)
|
||||||
|
|
||||||
|
if table and (not alias_expr or double_agg):
|
||||||
column.set("table", table)
|
column.set("table", table)
|
||||||
elif expand and not column.table and column.name in alias_to_expression:
|
elif not column.table and alias_expr and not double_agg:
|
||||||
column.replace(alias_to_expression[column.name].copy())
|
column.replace(alias_expr.copy())
|
||||||
|
|
||||||
for projection in scope.selects:
|
for projection in scope.selects:
|
||||||
replace_columns(projection)
|
replace_columns(projection)
|
||||||
|
@ -195,22 +200,41 @@ def _expand_alias_refs(scope: Scope, resolver: Resolver) -> None:
|
||||||
|
|
||||||
replace_columns(expression.args.get("where"))
|
replace_columns(expression.args.get("where"))
|
||||||
replace_columns(expression.args.get("group"))
|
replace_columns(expression.args.get("group"))
|
||||||
replace_columns(expression.args.get("having"), resolve_agg=True)
|
replace_columns(expression.args.get("having"), resolve_table=True)
|
||||||
replace_columns(expression.args.get("qualify"), resolve_agg=True)
|
replace_columns(expression.args.get("qualify"), resolve_table=True)
|
||||||
replace_columns(expression.args.get("order"), expand=False, resolve_agg=True)
|
|
||||||
scope.clear_cache()
|
scope.clear_cache()
|
||||||
|
|
||||||
|
|
||||||
def _expand_group_by(scope, resolver):
|
def _expand_group_by(scope: Scope):
|
||||||
group = scope.expression.args.get("group")
|
expression = scope.expression
|
||||||
|
group = expression.args.get("group")
|
||||||
if not group:
|
if not group:
|
||||||
return
|
return
|
||||||
|
|
||||||
group.set("expressions", _expand_positional_references(scope, group.expressions))
|
group.set("expressions", _expand_positional_references(scope, group.expressions))
|
||||||
scope.expression.set("group", group)
|
expression.set("group", group)
|
||||||
|
|
||||||
|
# group by expressions cannot be simplified, for example
|
||||||
|
# select x + 1 + 1 FROM y GROUP BY x + 1 + 1
|
||||||
|
# the projection must exactly match the group by key
|
||||||
|
groups = set(group.expressions)
|
||||||
|
group.meta["final"] = True
|
||||||
|
|
||||||
|
for e in expression.selects:
|
||||||
|
for node, *_ in e.walk():
|
||||||
|
if node in groups:
|
||||||
|
e.meta["final"] = True
|
||||||
|
break
|
||||||
|
|
||||||
|
having = expression.args.get("having")
|
||||||
|
if having:
|
||||||
|
for node, *_ in having.walk():
|
||||||
|
if node in groups:
|
||||||
|
having.meta["final"] = True
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
def _expand_order_by(scope):
|
def _expand_order_by(scope: Scope, resolver: Resolver):
|
||||||
order = scope.expression.args.get("order")
|
order = scope.expression.args.get("order")
|
||||||
if not order:
|
if not order:
|
||||||
return
|
return
|
||||||
|
@ -220,10 +244,21 @@ def _expand_order_by(scope):
|
||||||
ordereds,
|
ordereds,
|
||||||
_expand_positional_references(scope, (o.this for o in ordereds)),
|
_expand_positional_references(scope, (o.this for o in ordereds)),
|
||||||
):
|
):
|
||||||
|
for agg in ordered.find_all(exp.AggFunc):
|
||||||
|
for col in agg.find_all(exp.Column):
|
||||||
|
if not col.table:
|
||||||
|
col.set("table", resolver.get_table(col.name))
|
||||||
|
|
||||||
ordered.set("this", new_expression)
|
ordered.set("this", new_expression)
|
||||||
|
|
||||||
|
if scope.expression.args.get("group"):
|
||||||
|
selects = {s.this: exp.column(s.alias_or_name) for s in scope.selects}
|
||||||
|
|
||||||
def _expand_positional_references(scope, expressions):
|
for ordered in ordereds:
|
||||||
|
ordered.set("this", selects.get(ordered.this, ordered.this))
|
||||||
|
|
||||||
|
|
||||||
|
def _expand_positional_references(scope: Scope, expressions: t.Iterable[E]) -> t.List[E]:
|
||||||
new_nodes = []
|
new_nodes = []
|
||||||
for node in expressions:
|
for node in expressions:
|
||||||
if node.is_int:
|
if node.is_int:
|
||||||
|
@ -241,7 +276,7 @@ def _expand_positional_references(scope, expressions):
|
||||||
return new_nodes
|
return new_nodes
|
||||||
|
|
||||||
|
|
||||||
def _qualify_columns(scope, resolver):
|
def _qualify_columns(scope: Scope, resolver: Resolver) -> None:
|
||||||
"""Disambiguate columns, ensuring each column specifies a source"""
|
"""Disambiguate columns, ensuring each column specifies a source"""
|
||||||
for column in scope.columns:
|
for column in scope.columns:
|
||||||
column_table = column.table
|
column_table = column.table
|
||||||
|
@ -290,21 +325,23 @@ def _qualify_columns(scope, resolver):
|
||||||
column.set("table", column_table)
|
column.set("table", column_table)
|
||||||
|
|
||||||
|
|
||||||
def _expand_stars(scope, resolver, using_column_tables):
|
def _expand_stars(
|
||||||
|
scope: Scope, resolver: Resolver, using_column_tables: t.Dict[str, t.Any]
|
||||||
|
) -> None:
|
||||||
"""Expand stars to lists of column selections"""
|
"""Expand stars to lists of column selections"""
|
||||||
|
|
||||||
new_selections = []
|
new_selections = []
|
||||||
except_columns = {}
|
except_columns: t.Dict[int, t.Set[str]] = {}
|
||||||
replace_columns = {}
|
replace_columns: t.Dict[int, t.Dict[str, str]] = {}
|
||||||
coalesced_columns = set()
|
coalesced_columns = set()
|
||||||
|
|
||||||
# TODO: handle optimization of multiple PIVOTs (and possibly UNPIVOTs) in the future
|
# TODO: handle optimization of multiple PIVOTs (and possibly UNPIVOTs) in the future
|
||||||
pivot_columns = None
|
pivot_columns = None
|
||||||
pivot_output_columns = None
|
pivot_output_columns = None
|
||||||
pivot = seq_get(scope.pivots, 0)
|
pivot = t.cast(t.Optional[exp.Pivot], seq_get(scope.pivots, 0))
|
||||||
|
|
||||||
has_pivoted_source = pivot and not pivot.args.get("unpivot")
|
has_pivoted_source = pivot and not pivot.args.get("unpivot")
|
||||||
if has_pivoted_source:
|
if pivot and has_pivoted_source:
|
||||||
pivot_columns = set(col.output_name for col in pivot.find_all(exp.Column))
|
pivot_columns = set(col.output_name for col in pivot.find_all(exp.Column))
|
||||||
|
|
||||||
pivot_output_columns = [col.output_name for col in pivot.args.get("columns", [])]
|
pivot_output_columns = [col.output_name for col in pivot.args.get("columns", [])]
|
||||||
|
@ -330,8 +367,17 @@ def _expand_stars(scope, resolver, using_column_tables):
|
||||||
|
|
||||||
columns = resolver.get_source_columns(table, only_visible=True)
|
columns = resolver.get_source_columns(table, only_visible=True)
|
||||||
|
|
||||||
|
# The _PARTITIONTIME and _PARTITIONDATE pseudo-columns are not returned by a SELECT * statement
|
||||||
|
# https://cloud.google.com/bigquery/docs/querying-partitioned-tables#query_an_ingestion-time_partitioned_table
|
||||||
|
if resolver.schema.dialect == "bigquery":
|
||||||
|
columns = [
|
||||||
|
name
|
||||||
|
for name in columns
|
||||||
|
if name.upper() not in ("_PARTITIONTIME", "_PARTITIONDATE")
|
||||||
|
]
|
||||||
|
|
||||||
if columns and "*" not in columns:
|
if columns and "*" not in columns:
|
||||||
if has_pivoted_source:
|
if pivot and has_pivoted_source and pivot_columns and pivot_output_columns:
|
||||||
implicit_columns = [col for col in columns if col not in pivot_columns]
|
implicit_columns = [col for col in columns if col not in pivot_columns]
|
||||||
new_selections.extend(
|
new_selections.extend(
|
||||||
exp.alias_(exp.column(name, table=pivot.alias), name, copy=False)
|
exp.alias_(exp.column(name, table=pivot.alias), name, copy=False)
|
||||||
|
@ -368,7 +414,9 @@ def _expand_stars(scope, resolver, using_column_tables):
|
||||||
scope.expression.set("expressions", new_selections)
|
scope.expression.set("expressions", new_selections)
|
||||||
|
|
||||||
|
|
||||||
def _add_except_columns(expression, tables, except_columns):
|
def _add_except_columns(
|
||||||
|
expression: exp.Expression, tables, except_columns: t.Dict[int, t.Set[str]]
|
||||||
|
) -> None:
|
||||||
except_ = expression.args.get("except")
|
except_ = expression.args.get("except")
|
||||||
|
|
||||||
if not except_:
|
if not except_:
|
||||||
|
@ -380,7 +428,9 @@ def _add_except_columns(expression, tables, except_columns):
|
||||||
except_columns[id(table)] = columns
|
except_columns[id(table)] = columns
|
||||||
|
|
||||||
|
|
||||||
def _add_replace_columns(expression, tables, replace_columns):
|
def _add_replace_columns(
|
||||||
|
expression: exp.Expression, tables, replace_columns: t.Dict[int, t.Dict[str, str]]
|
||||||
|
) -> None:
|
||||||
replace = expression.args.get("replace")
|
replace = expression.args.get("replace")
|
||||||
|
|
||||||
if not replace:
|
if not replace:
|
||||||
|
@ -392,7 +442,7 @@ def _add_replace_columns(expression, tables, replace_columns):
|
||||||
replace_columns[id(table)] = columns
|
replace_columns[id(table)] = columns
|
||||||
|
|
||||||
|
|
||||||
def _qualify_outputs(scope):
|
def _qualify_outputs(scope: Scope):
|
||||||
"""Ensure all output columns are aliased"""
|
"""Ensure all output columns are aliased"""
|
||||||
new_selections = []
|
new_selections = []
|
||||||
|
|
||||||
|
@ -429,7 +479,7 @@ class Resolver:
|
||||||
This is a class so we can lazily load some things and easily share them across functions.
|
This is a class so we can lazily load some things and easily share them across functions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, scope, schema, infer_schema: bool = True):
|
def __init__(self, scope: Scope, schema: Schema, infer_schema: bool = True):
|
||||||
self.scope = scope
|
self.scope = scope
|
||||||
self.schema = schema
|
self.schema = schema
|
||||||
self._source_columns = None
|
self._source_columns = None
|
||||||
|
|
|
@ -28,6 +28,8 @@ def simplify(expression):
|
||||||
generate = cached_generator()
|
generate = cached_generator()
|
||||||
|
|
||||||
def _simplify(expression, root=True):
|
def _simplify(expression, root=True):
|
||||||
|
if expression.meta.get("final"):
|
||||||
|
return expression
|
||||||
node = expression
|
node = expression
|
||||||
node = rewrite_between(node)
|
node = rewrite_between(node)
|
||||||
node = uniq_sort(node, generate, root)
|
node = uniq_sort(node, generate, root)
|
||||||
|
|
|
@ -585,6 +585,7 @@ class Parser(metaclass=_Parser):
|
||||||
"CHARACTER SET": lambda self: self._parse_character_set(),
|
"CHARACTER SET": lambda self: self._parse_character_set(),
|
||||||
"CHECKSUM": lambda self: self._parse_checksum(),
|
"CHECKSUM": lambda self: self._parse_checksum(),
|
||||||
"CLUSTER BY": lambda self: self._parse_cluster(),
|
"CLUSTER BY": lambda self: self._parse_cluster(),
|
||||||
|
"CLUSTERED": lambda self: self._parse_clustered_by(),
|
||||||
"COLLATE": lambda self: self._parse_property_assignment(exp.CollateProperty),
|
"COLLATE": lambda self: self._parse_property_assignment(exp.CollateProperty),
|
||||||
"COMMENT": lambda self: self._parse_property_assignment(exp.SchemaCommentProperty),
|
"COMMENT": lambda self: self._parse_property_assignment(exp.SchemaCommentProperty),
|
||||||
"COPY": lambda self: self._parse_copy_property(),
|
"COPY": lambda self: self._parse_copy_property(),
|
||||||
|
@ -794,8 +795,6 @@ class Parser(metaclass=_Parser):
|
||||||
# A NULL arg in CONCAT yields NULL by default
|
# A NULL arg in CONCAT yields NULL by default
|
||||||
CONCAT_NULL_OUTPUTS_STRING = False
|
CONCAT_NULL_OUTPUTS_STRING = False
|
||||||
|
|
||||||
CONVERT_TYPE_FIRST = False
|
|
||||||
|
|
||||||
PREFIXED_PIVOT_COLUMNS = False
|
PREFIXED_PIVOT_COLUMNS = False
|
||||||
IDENTIFY_PIVOT_STRINGS = False
|
IDENTIFY_PIVOT_STRINGS = False
|
||||||
|
|
||||||
|
@ -1426,9 +1425,34 @@ class Parser(metaclass=_Parser):
|
||||||
|
|
||||||
return self.expression(exp.ChecksumProperty, on=on, default=self._match(TokenType.DEFAULT))
|
return self.expression(exp.ChecksumProperty, on=on, default=self._match(TokenType.DEFAULT))
|
||||||
|
|
||||||
def _parse_cluster(self) -> t.Optional[exp.Cluster]:
|
def _parse_cluster(self) -> exp.Cluster:
|
||||||
return self.expression(exp.Cluster, expressions=self._parse_csv(self._parse_ordered))
|
return self.expression(exp.Cluster, expressions=self._parse_csv(self._parse_ordered))
|
||||||
|
|
||||||
|
def _parse_clustered_by(self) -> exp.ClusteredByProperty:
|
||||||
|
self._match_text_seq("BY")
|
||||||
|
|
||||||
|
self._match_l_paren()
|
||||||
|
expressions = self._parse_csv(self._parse_column)
|
||||||
|
self._match_r_paren()
|
||||||
|
|
||||||
|
if self._match_text_seq("SORTED", "BY"):
|
||||||
|
self._match_l_paren()
|
||||||
|
sorted_by = self._parse_csv(self._parse_ordered)
|
||||||
|
self._match_r_paren()
|
||||||
|
else:
|
||||||
|
sorted_by = None
|
||||||
|
|
||||||
|
self._match(TokenType.INTO)
|
||||||
|
buckets = self._parse_number()
|
||||||
|
self._match_text_seq("BUCKETS")
|
||||||
|
|
||||||
|
return self.expression(
|
||||||
|
exp.ClusteredByProperty,
|
||||||
|
expressions=expressions,
|
||||||
|
sorted_by=sorted_by,
|
||||||
|
buckets=buckets,
|
||||||
|
)
|
||||||
|
|
||||||
def _parse_copy_property(self) -> t.Optional[exp.CopyGrantsProperty]:
|
def _parse_copy_property(self) -> t.Optional[exp.CopyGrantsProperty]:
|
||||||
if not self._match_text_seq("GRANTS"):
|
if not self._match_text_seq("GRANTS"):
|
||||||
self._retreat(self._index - 1)
|
self._retreat(self._index - 1)
|
||||||
|
@ -2863,7 +2887,11 @@ class Parser(metaclass=_Parser):
|
||||||
if not self._match(TokenType.INTERVAL):
|
if not self._match(TokenType.INTERVAL):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
this = self._parse_primary() or self._parse_term()
|
if self._match(TokenType.STRING, advance=False):
|
||||||
|
this = self._parse_primary()
|
||||||
|
else:
|
||||||
|
this = self._parse_term()
|
||||||
|
|
||||||
unit = self._parse_function() or self._parse_var()
|
unit = self._parse_function() or self._parse_var()
|
||||||
|
|
||||||
# Most dialects support, e.g., the form INTERVAL '5' day, thus we try to parse
|
# Most dialects support, e.g., the form INTERVAL '5' day, thus we try to parse
|
||||||
|
@ -3661,6 +3689,7 @@ class Parser(metaclass=_Parser):
|
||||||
else:
|
else:
|
||||||
self.raise_error("Expected AS after CAST")
|
self.raise_error("Expected AS after CAST")
|
||||||
|
|
||||||
|
fmt = None
|
||||||
to = self._parse_types()
|
to = self._parse_types()
|
||||||
|
|
||||||
if not to:
|
if not to:
|
||||||
|
@ -3668,9 +3697,10 @@ class Parser(metaclass=_Parser):
|
||||||
elif to.this == exp.DataType.Type.CHAR:
|
elif to.this == exp.DataType.Type.CHAR:
|
||||||
if self._match(TokenType.CHARACTER_SET):
|
if self._match(TokenType.CHARACTER_SET):
|
||||||
to = self.expression(exp.CharacterSet, this=self._parse_var_or_string())
|
to = self.expression(exp.CharacterSet, this=self._parse_var_or_string())
|
||||||
elif to.this in exp.DataType.TEMPORAL_TYPES and self._match(TokenType.FORMAT):
|
elif self._match(TokenType.FORMAT):
|
||||||
fmt = self._parse_string()
|
fmt = self._parse_at_time_zone(self._parse_string())
|
||||||
|
|
||||||
|
if to.this in exp.DataType.TEMPORAL_TYPES:
|
||||||
return self.expression(
|
return self.expression(
|
||||||
exp.StrToDate if to.this == exp.DataType.Type.DATE else exp.StrToTime,
|
exp.StrToDate if to.this == exp.DataType.Type.DATE else exp.StrToTime,
|
||||||
this=this,
|
this=this,
|
||||||
|
@ -3683,7 +3713,7 @@ class Parser(metaclass=_Parser):
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return self.expression(exp.Cast if strict else exp.TryCast, this=this, to=to)
|
return self.expression(exp.Cast if strict else exp.TryCast, this=this, to=to, format=fmt)
|
||||||
|
|
||||||
def _parse_concat(self) -> t.Optional[exp.Expression]:
|
def _parse_concat(self) -> t.Optional[exp.Expression]:
|
||||||
args = self._parse_csv(self._parse_conjunction)
|
args = self._parse_csv(self._parse_conjunction)
|
||||||
|
@ -3704,20 +3734,23 @@ class Parser(metaclass=_Parser):
|
||||||
)
|
)
|
||||||
|
|
||||||
def _parse_string_agg(self) -> exp.Expression:
|
def _parse_string_agg(self) -> exp.Expression:
|
||||||
expression: t.Optional[exp.Expression]
|
|
||||||
|
|
||||||
if self._match(TokenType.DISTINCT):
|
if self._match(TokenType.DISTINCT):
|
||||||
args = self._parse_csv(self._parse_conjunction)
|
args: t.List[t.Optional[exp.Expression]] = [
|
||||||
expression = self.expression(exp.Distinct, expressions=[seq_get(args, 0)])
|
self.expression(exp.Distinct, expressions=[self._parse_conjunction()])
|
||||||
|
]
|
||||||
|
if self._match(TokenType.COMMA):
|
||||||
|
args.extend(self._parse_csv(self._parse_conjunction))
|
||||||
else:
|
else:
|
||||||
args = self._parse_csv(self._parse_conjunction)
|
args = self._parse_csv(self._parse_conjunction)
|
||||||
expression = seq_get(args, 0)
|
|
||||||
|
|
||||||
index = self._index
|
index = self._index
|
||||||
if not self._match(TokenType.R_PAREN):
|
if not self._match(TokenType.R_PAREN):
|
||||||
# postgres: STRING_AGG([DISTINCT] expression, separator [ORDER BY expression1 {ASC | DESC} [, ...]])
|
# postgres: STRING_AGG([DISTINCT] expression, separator [ORDER BY expression1 {ASC | DESC} [, ...]])
|
||||||
order = self._parse_order(this=expression)
|
return self.expression(
|
||||||
return self.expression(exp.GroupConcat, this=order, separator=seq_get(args, 1))
|
exp.GroupConcat,
|
||||||
|
this=seq_get(args, 0),
|
||||||
|
separator=self._parse_order(this=seq_get(args, 1)),
|
||||||
|
)
|
||||||
|
|
||||||
# Checks if we can parse an order clause: WITHIN GROUP (ORDER BY <order_by_expression_list> [ASC | DESC]).
|
# Checks if we can parse an order clause: WITHIN GROUP (ORDER BY <order_by_expression_list> [ASC | DESC]).
|
||||||
# This is done "manually", instead of letting _parse_window parse it into an exp.WithinGroup node, so that
|
# This is done "manually", instead of letting _parse_window parse it into an exp.WithinGroup node, so that
|
||||||
|
@ -3727,24 +3760,21 @@ class Parser(metaclass=_Parser):
|
||||||
return self.validate_expression(exp.GroupConcat.from_arg_list(args), args)
|
return self.validate_expression(exp.GroupConcat.from_arg_list(args), args)
|
||||||
|
|
||||||
self._match_l_paren() # The corresponding match_r_paren will be called in parse_function (caller)
|
self._match_l_paren() # The corresponding match_r_paren will be called in parse_function (caller)
|
||||||
order = self._parse_order(this=expression)
|
order = self._parse_order(this=seq_get(args, 0))
|
||||||
return self.expression(exp.GroupConcat, this=order, separator=seq_get(args, 1))
|
return self.expression(exp.GroupConcat, this=order, separator=seq_get(args, 1))
|
||||||
|
|
||||||
def _parse_convert(self, strict: bool) -> t.Optional[exp.Expression]:
|
def _parse_convert(self, strict: bool) -> t.Optional[exp.Expression]:
|
||||||
to: t.Optional[exp.Expression]
|
|
||||||
this = self._parse_bitwise()
|
this = self._parse_bitwise()
|
||||||
|
|
||||||
if self._match(TokenType.USING):
|
if self._match(TokenType.USING):
|
||||||
to = self.expression(exp.CharacterSet, this=self._parse_var())
|
to: t.Optional[exp.Expression] = self.expression(
|
||||||
|
exp.CharacterSet, this=self._parse_var()
|
||||||
|
)
|
||||||
elif self._match(TokenType.COMMA):
|
elif self._match(TokenType.COMMA):
|
||||||
to = self._parse_bitwise()
|
to = self._parse_types()
|
||||||
else:
|
else:
|
||||||
to = None
|
to = None
|
||||||
|
|
||||||
# Swap the argument order if needed to produce the correct AST
|
|
||||||
if self.CONVERT_TYPE_FIRST:
|
|
||||||
this, to = to, this
|
|
||||||
|
|
||||||
return self.expression(exp.Cast if strict else exp.TryCast, this=this, to=to)
|
return self.expression(exp.Cast if strict else exp.TryCast, this=this, to=to)
|
||||||
|
|
||||||
def _parse_decode(self) -> t.Optional[exp.Decode | exp.Case]:
|
def _parse_decode(self) -> t.Optional[exp.Decode | exp.Case]:
|
||||||
|
@ -4394,8 +4424,8 @@ class Parser(metaclass=_Parser):
|
||||||
|
|
||||||
if self._next:
|
if self._next:
|
||||||
self._advance()
|
self._advance()
|
||||||
parser = self.ALTER_PARSERS.get(self._prev.text.upper()) if self._prev else None
|
|
||||||
|
|
||||||
|
parser = self.ALTER_PARSERS.get(self._prev.text.upper()) if self._prev else None
|
||||||
if parser:
|
if parser:
|
||||||
actions = ensure_list(parser(self))
|
actions = ensure_list(parser(self))
|
||||||
|
|
||||||
|
@ -4516,9 +4546,11 @@ class Parser(metaclass=_Parser):
|
||||||
parser = self._find_parser(self.SET_PARSERS, self.SET_TRIE)
|
parser = self._find_parser(self.SET_PARSERS, self.SET_TRIE)
|
||||||
return parser(self) if parser else self._parse_set_item_assignment(kind=None)
|
return parser(self) if parser else self._parse_set_item_assignment(kind=None)
|
||||||
|
|
||||||
def _parse_set(self) -> exp.Set | exp.Command:
|
def _parse_set(self, unset: bool = False, tag: bool = False) -> exp.Set | exp.Command:
|
||||||
index = self._index
|
index = self._index
|
||||||
set_ = self.expression(exp.Set, expressions=self._parse_csv(self._parse_set_item))
|
set_ = self.expression(
|
||||||
|
exp.Set, expressions=self._parse_csv(self._parse_set_item), unset=unset, tag=tag
|
||||||
|
)
|
||||||
|
|
||||||
if self._curr:
|
if self._curr:
|
||||||
self._retreat(index)
|
self._retreat(index)
|
||||||
|
@ -4683,12 +4715,8 @@ class Parser(metaclass=_Parser):
|
||||||
exp.replace_children(this, self._replace_columns_with_dots)
|
exp.replace_children(this, self._replace_columns_with_dots)
|
||||||
table = this.args.get("table")
|
table = this.args.get("table")
|
||||||
this = (
|
this = (
|
||||||
self.expression(exp.Dot, this=table, expression=this.this)
|
self.expression(exp.Dot, this=table, expression=this.this) if table else this.this
|
||||||
if table
|
|
||||||
else self.expression(exp.Var, this=this.name)
|
|
||||||
)
|
)
|
||||||
elif isinstance(this, exp.Identifier):
|
|
||||||
this = self.expression(exp.Var, this=this.name)
|
|
||||||
|
|
||||||
return this
|
return this
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,7 @@ class Step:
|
||||||
A Step DAG corresponding to `expression`.
|
A Step DAG corresponding to `expression`.
|
||||||
"""
|
"""
|
||||||
ctes = ctes or {}
|
ctes = ctes or {}
|
||||||
|
expression = expression.unnest()
|
||||||
with_ = expression.args.get("with")
|
with_ = expression.args.get("with")
|
||||||
|
|
||||||
# CTEs break the mold of scope and introduce themselves to all in the context.
|
# CTEs break the mold of scope and introduce themselves to all in the context.
|
||||||
|
@ -120,22 +121,25 @@ class Step:
|
||||||
|
|
||||||
projections = [] # final selects in this chain of steps representing a select
|
projections = [] # final selects in this chain of steps representing a select
|
||||||
operands = {} # intermediate computations of agg funcs eg x + 1 in SUM(x + 1)
|
operands = {} # intermediate computations of agg funcs eg x + 1 in SUM(x + 1)
|
||||||
aggregations = []
|
aggregations = set()
|
||||||
next_operand_name = name_sequence("_a_")
|
next_operand_name = name_sequence("_a_")
|
||||||
|
|
||||||
def extract_agg_operands(expression):
|
def extract_agg_operands(expression):
|
||||||
for agg in expression.find_all(exp.AggFunc):
|
agg_funcs = tuple(expression.find_all(exp.AggFunc))
|
||||||
|
if agg_funcs:
|
||||||
|
aggregations.add(expression)
|
||||||
|
for agg in agg_funcs:
|
||||||
for operand in agg.unnest_operands():
|
for operand in agg.unnest_operands():
|
||||||
if isinstance(operand, exp.Column):
|
if isinstance(operand, exp.Column):
|
||||||
continue
|
continue
|
||||||
if operand not in operands:
|
if operand not in operands:
|
||||||
operands[operand] = next_operand_name()
|
operands[operand] = next_operand_name()
|
||||||
operand.replace(exp.column(operands[operand], quoted=True))
|
operand.replace(exp.column(operands[operand], quoted=True))
|
||||||
|
return bool(agg_funcs)
|
||||||
|
|
||||||
for e in expression.expressions:
|
for e in expression.expressions:
|
||||||
if e.find(exp.AggFunc):
|
if e.find(exp.AggFunc):
|
||||||
projections.append(exp.column(e.alias_or_name, step.name, quoted=True))
|
projections.append(exp.column(e.alias_or_name, step.name, quoted=True))
|
||||||
aggregations.append(e)
|
|
||||||
extract_agg_operands(e)
|
extract_agg_operands(e)
|
||||||
else:
|
else:
|
||||||
projections.append(e)
|
projections.append(e)
|
||||||
|
@ -155,22 +159,38 @@ class Step:
|
||||||
having = expression.args.get("having")
|
having = expression.args.get("having")
|
||||||
|
|
||||||
if having:
|
if having:
|
||||||
extract_agg_operands(having)
|
if extract_agg_operands(exp.alias_(having.this, "_h", quoted=True)):
|
||||||
|
aggregate.condition = exp.column("_h", step.name, quoted=True)
|
||||||
|
else:
|
||||||
aggregate.condition = having.this
|
aggregate.condition = having.this
|
||||||
|
|
||||||
aggregate.operands = tuple(
|
aggregate.operands = tuple(
|
||||||
alias(operand, alias_) for operand, alias_ in operands.items()
|
alias(operand, alias_) for operand, alias_ in operands.items()
|
||||||
)
|
)
|
||||||
aggregate.aggregations = aggregations
|
aggregate.aggregations = list(aggregations)
|
||||||
|
|
||||||
# give aggregates names and replace projections with references to them
|
# give aggregates names and replace projections with references to them
|
||||||
aggregate.group = {
|
aggregate.group = {
|
||||||
f"_g{i}": e for i, e in enumerate(group.expressions if group else [])
|
f"_g{i}": e for i, e in enumerate(group.expressions if group else [])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
intermediate: t.Dict[str | exp.Expression, str] = {}
|
||||||
|
for k, v in aggregate.group.items():
|
||||||
|
intermediate[v] = k
|
||||||
|
if isinstance(v, exp.Column):
|
||||||
|
intermediate[v.alias_or_name] = k
|
||||||
|
|
||||||
for projection in projections:
|
for projection in projections:
|
||||||
for i, e in aggregate.group.items():
|
for node, *_ in projection.walk():
|
||||||
for child, *_ in projection.walk():
|
name = intermediate.get(node)
|
||||||
if child == e:
|
if name:
|
||||||
child.replace(exp.column(i, step.name))
|
node.replace(exp.column(name, step.name))
|
||||||
|
if aggregate.condition:
|
||||||
|
for node, *_ in aggregate.condition.walk():
|
||||||
|
name = intermediate.get(node) or intermediate.get(node.name)
|
||||||
|
if name:
|
||||||
|
node.replace(exp.column(name, step.name))
|
||||||
|
|
||||||
aggregate.add_dependency(step)
|
aggregate.add_dependency(step)
|
||||||
step = aggregate
|
step = aggregate
|
||||||
|
|
||||||
|
|
|
@ -159,10 +159,11 @@ def explode_to_unnest(expression: exp.Expression) -> exp.Expression:
|
||||||
if isinstance(expression, exp.Select):
|
if isinstance(expression, exp.Select):
|
||||||
from sqlglot.optimizer.scope import build_scope
|
from sqlglot.optimizer.scope import build_scope
|
||||||
|
|
||||||
taken_select_names = set(expression.named_selects)
|
|
||||||
scope = build_scope(expression)
|
scope = build_scope(expression)
|
||||||
if not scope:
|
if not scope:
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
taken_select_names = set(expression.named_selects)
|
||||||
taken_source_names = set(scope.selected_sources)
|
taken_source_names = set(scope.selected_sources)
|
||||||
|
|
||||||
for select in expression.selects:
|
for select in expression.selects:
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from sqlglot import ErrorLevel, ParseError, UnsupportedError, transpile
|
from sqlglot import ErrorLevel, ParseError, UnsupportedError, transpile
|
||||||
from tests.dialects.test_dialect import Validator
|
from tests.dialects.test_dialect import Validator
|
||||||
|
|
||||||
|
@ -6,6 +8,35 @@ class TestBigQuery(Validator):
|
||||||
dialect = "bigquery"
|
dialect = "bigquery"
|
||||||
|
|
||||||
def test_bigquery(self):
|
def test_bigquery(self):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
transpile("'\\'", read="bigquery")
|
||||||
|
|
||||||
|
# Reference: https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#set_operators
|
||||||
|
with self.assertRaises(UnsupportedError):
|
||||||
|
transpile(
|
||||||
|
"SELECT * FROM a INTERSECT ALL SELECT * FROM b",
|
||||||
|
write="bigquery",
|
||||||
|
unsupported_level=ErrorLevel.RAISE,
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(UnsupportedError):
|
||||||
|
transpile(
|
||||||
|
"SELECT * FROM a EXCEPT ALL SELECT * FROM b",
|
||||||
|
write="bigquery",
|
||||||
|
unsupported_level=ErrorLevel.RAISE,
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(ParseError):
|
||||||
|
transpile("SELECT * FROM UNNEST(x) AS x(y)", read="bigquery")
|
||||||
|
|
||||||
|
self.validate_identity("SELECT `project-id`.udfs.func(call.dir)")
|
||||||
|
self.validate_identity("SELECT CAST(CURRENT_DATE AS STRING FORMAT 'DAY') AS current_day")
|
||||||
|
self.validate_identity("SAFE_CAST(encrypted_value AS STRING FORMAT 'BASE64')")
|
||||||
|
self.validate_identity("CAST(encrypted_value AS STRING FORMAT 'BASE64')")
|
||||||
|
self.validate_identity("STRING_AGG(a)")
|
||||||
|
self.validate_identity("STRING_AGG(a, ' & ')")
|
||||||
|
self.validate_identity("STRING_AGG(DISTINCT a, ' & ')")
|
||||||
|
self.validate_identity("STRING_AGG(a, ' & ' ORDER BY LENGTH(a))")
|
||||||
self.validate_identity("DATE(2016, 12, 25)")
|
self.validate_identity("DATE(2016, 12, 25)")
|
||||||
self.validate_identity("DATE(CAST('2016-12-25 23:59:59' AS DATETIME))")
|
self.validate_identity("DATE(CAST('2016-12-25 23:59:59' AS DATETIME))")
|
||||||
self.validate_identity("SELECT foo IN UNNEST(bar) AS bla")
|
self.validate_identity("SELECT foo IN UNNEST(bar) AS bla")
|
||||||
|
@ -21,16 +52,8 @@ class TestBigQuery(Validator):
|
||||||
self.validate_identity("x <> ''")
|
self.validate_identity("x <> ''")
|
||||||
self.validate_identity("DATE_TRUNC(col, WEEK(MONDAY))")
|
self.validate_identity("DATE_TRUNC(col, WEEK(MONDAY))")
|
||||||
self.validate_identity("SELECT b'abc'")
|
self.validate_identity("SELECT b'abc'")
|
||||||
self.validate_identity("""SELECT * FROM UNNEST(ARRAY<STRUCT<x INT64>>[1, 2])""")
|
self.validate_identity("""SELECT * FROM UNNEST(ARRAY<STRUCT<x INT64>>[])""")
|
||||||
self.validate_identity("SELECT AS STRUCT 1 AS a, 2 AS b")
|
self.validate_identity("SELECT AS STRUCT 1 AS a, 2 AS b")
|
||||||
self.validate_all(
|
|
||||||
"SELECT AS STRUCT ARRAY(SELECT AS STRUCT b FROM x) AS y FROM z",
|
|
||||||
write={
|
|
||||||
"": "SELECT AS STRUCT ARRAY(SELECT AS STRUCT b FROM x) AS y FROM z",
|
|
||||||
"bigquery": "SELECT AS STRUCT ARRAY(SELECT AS STRUCT b FROM x) AS y FROM z",
|
|
||||||
"duckdb": "SELECT {'y': ARRAY(SELECT {'b': b} FROM x)} FROM z",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
self.validate_identity("SELECT DISTINCT AS STRUCT 1 AS a, 2 AS b")
|
self.validate_identity("SELECT DISTINCT AS STRUCT 1 AS a, 2 AS b")
|
||||||
self.validate_identity("SELECT AS VALUE STRUCT(1 AS a, 2 AS b)")
|
self.validate_identity("SELECT AS VALUE STRUCT(1 AS a, 2 AS b)")
|
||||||
self.validate_identity("SELECT STRUCT<ARRAY<STRING>>(['2023-01-17'])")
|
self.validate_identity("SELECT STRUCT<ARRAY<STRING>>(['2023-01-17'])")
|
||||||
|
@ -38,6 +61,13 @@ class TestBigQuery(Validator):
|
||||||
self.validate_identity("SELECT * FROM q UNPIVOT(values FOR quarter IN (b, c))")
|
self.validate_identity("SELECT * FROM q UNPIVOT(values FOR quarter IN (b, c))")
|
||||||
self.validate_identity("""CREATE TABLE x (a STRUCT<values ARRAY<INT64>>)""")
|
self.validate_identity("""CREATE TABLE x (a STRUCT<values ARRAY<INT64>>)""")
|
||||||
self.validate_identity("""CREATE TABLE x (a STRUCT<b STRING OPTIONS (description='b')>)""")
|
self.validate_identity("""CREATE TABLE x (a STRUCT<b STRING OPTIONS (description='b')>)""")
|
||||||
|
self.validate_identity("CAST(x AS TIMESTAMP)")
|
||||||
|
self.validate_identity("REGEXP_EXTRACT(`foo`, 'bar: (.+?)', 1, 1)")
|
||||||
|
self.validate_identity("BEGIN A B C D E F")
|
||||||
|
self.validate_identity("BEGIN TRANSACTION")
|
||||||
|
self.validate_identity("COMMIT TRANSACTION")
|
||||||
|
self.validate_identity("ROLLBACK TRANSACTION")
|
||||||
|
self.validate_identity("CAST(x AS BIGNUMERIC)")
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"DATE(CAST('2016-12-25 05:30:00+07' AS DATETIME), 'America/Los_Angeles')"
|
"DATE(CAST('2016-12-25 05:30:00+07' AS DATETIME), 'America/Los_Angeles')"
|
||||||
)
|
)
|
||||||
|
@ -50,8 +80,55 @@ class TestBigQuery(Validator):
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"CREATE TABLE IF NOT EXISTS foo AS SELECT * FROM bla EXCEPT DISTINCT (SELECT * FROM bar) LIMIT 0"
|
"CREATE TABLE IF NOT EXISTS foo AS SELECT * FROM bla EXCEPT DISTINCT (SELECT * FROM bar) LIMIT 0"
|
||||||
)
|
)
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT ROW() OVER (y ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM x WINDOW y AS (PARTITION BY CATEGORY)"
|
||||||
|
)
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT item, purchases, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popular FROM Produce WINDOW item_window AS (ORDER BY purchases)"
|
||||||
|
)
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT LAST_VALUE(a IGNORE NULLS) OVER y FROM x WINDOW y AS (PARTITION BY CATEGORY)",
|
||||||
|
)
|
||||||
|
|
||||||
self.validate_all("SELECT SPLIT(foo)", write={"bigquery": "SELECT SPLIT(foo, ',')"})
|
self.validate_all("SELECT SPLIT(foo)", write={"bigquery": "SELECT SPLIT(foo, ',')"})
|
||||||
|
self.validate_all("SELECT 1 AS hash", write={"bigquery": "SELECT 1 AS `hash`"})
|
||||||
|
self.validate_all("SELECT 1 AS at", write={"bigquery": "SELECT 1 AS `at`"})
|
||||||
|
self.validate_all('x <> ""', write={"bigquery": "x <> ''"})
|
||||||
|
self.validate_all('x <> """"""', write={"bigquery": "x <> ''"})
|
||||||
|
self.validate_all("x <> ''''''", write={"bigquery": "x <> ''"})
|
||||||
|
self.validate_all("CAST(x AS DATETIME)", read={"": "x::timestamp"})
|
||||||
|
self.validate_all("LEAST(x, y)", read={"sqlite": "MIN(x, y)"})
|
||||||
|
self.validate_all("CAST(x AS CHAR)", write={"bigquery": "CAST(x AS STRING)"})
|
||||||
|
self.validate_all("CAST(x AS NCHAR)", write={"bigquery": "CAST(x AS STRING)"})
|
||||||
|
self.validate_all("CAST(x AS NVARCHAR)", write={"bigquery": "CAST(x AS STRING)"})
|
||||||
|
self.validate_all("CAST(x AS TIMESTAMPTZ)", write={"bigquery": "CAST(x AS TIMESTAMP)"})
|
||||||
|
self.validate_all("CAST(x AS RECORD)", write={"bigquery": "CAST(x AS STRUCT)"})
|
||||||
|
self.validate_all(
|
||||||
|
"SELECT CAST(TIMESTAMP '2008-12-25 00:00:00+00:00' AS STRING FORMAT 'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS date_time_to_string",
|
||||||
|
write={
|
||||||
|
"bigquery": "SELECT CAST(CAST('2008-12-25 00:00:00+00:00' AS TIMESTAMP) AS STRING FORMAT 'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS date_time_to_string",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"SELECT CAST(TIMESTAMP '2008-12-25 00:00:00+00:00' AS STRING FORMAT 'YYYY-MM-DD HH24:MI:SS TZH:TZM' AT TIME ZONE 'Asia/Kolkata') AS date_time_to_string",
|
||||||
|
write={
|
||||||
|
"bigquery": "SELECT CAST(CAST('2008-12-25 00:00:00+00:00' AS TIMESTAMP) AS STRING FORMAT 'YYYY-MM-DD HH24:MI:SS TZH:TZM' AT TIME ZONE 'Asia/Kolkata') AS date_time_to_string",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"WITH cte AS (SELECT [1, 2, 3] AS arr) SELECT col FROM cte CROSS JOIN UNNEST(arr) AS col",
|
||||||
|
read={
|
||||||
|
"spark": "WITH cte AS (SELECT ARRAY(1, 2, 3) AS arr) SELECT EXPLODE(arr) FROM cte"
|
||||||
|
},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"SELECT AS STRUCT ARRAY(SELECT AS STRUCT b FROM x) AS y FROM z",
|
||||||
|
write={
|
||||||
|
"": "SELECT AS STRUCT ARRAY(SELECT AS STRUCT b FROM x) AS y FROM z",
|
||||||
|
"bigquery": "SELECT AS STRUCT ARRAY(SELECT AS STRUCT b FROM x) AS y FROM z",
|
||||||
|
"duckdb": "SELECT {'y': ARRAY(SELECT {'b': b} FROM x)} FROM z",
|
||||||
|
},
|
||||||
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"cast(x as date format 'MM/DD/YYYY')",
|
"cast(x as date format 'MM/DD/YYYY')",
|
||||||
write={
|
write={
|
||||||
|
@ -64,10 +141,6 @@ class TestBigQuery(Validator):
|
||||||
"bigquery": "PARSE_TIMESTAMP('%Y.%m.%d %I:%M:%S%z', x)",
|
"bigquery": "PARSE_TIMESTAMP('%Y.%m.%d %I:%M:%S%z', x)",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all("SELECT 1 AS hash", write={"bigquery": "SELECT 1 AS `hash`"})
|
|
||||||
self.validate_all('x <> ""', write={"bigquery": "x <> ''"})
|
|
||||||
self.validate_all('x <> """"""', write={"bigquery": "x <> ''"})
|
|
||||||
self.validate_all("x <> ''''''", write={"bigquery": "x <> ''"})
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"CREATE TEMP TABLE foo AS SELECT 1",
|
"CREATE TEMP TABLE foo AS SELECT 1",
|
||||||
write={"bigquery": "CREATE TEMPORARY TABLE foo AS SELECT 1"},
|
write={"bigquery": "CREATE TEMPORARY TABLE foo AS SELECT 1"},
|
||||||
|
@ -82,14 +155,6 @@ class TestBigQuery(Validator):
|
||||||
"SELECT * FROM `my-project.my-dataset.my-table`",
|
"SELECT * FROM `my-project.my-dataset.my-table`",
|
||||||
write={"bigquery": "SELECT * FROM `my-project`.`my-dataset`.`my-table`"},
|
write={"bigquery": "SELECT * FROM `my-project`.`my-dataset`.`my-table`"},
|
||||||
)
|
)
|
||||||
self.validate_all("CAST(x AS DATETIME)", read={"": "x::timestamp"})
|
|
||||||
self.validate_identity("CAST(x AS TIMESTAMP)")
|
|
||||||
self.validate_all("LEAST(x, y)", read={"sqlite": "MIN(x, y)"})
|
|
||||||
self.validate_all("CAST(x AS CHAR)", write={"bigquery": "CAST(x AS STRING)"})
|
|
||||||
self.validate_all("CAST(x AS NCHAR)", write={"bigquery": "CAST(x AS STRING)"})
|
|
||||||
self.validate_all("CAST(x AS NVARCHAR)", write={"bigquery": "CAST(x AS STRING)"})
|
|
||||||
self.validate_all("CAST(x AS TIMESTAMPTZ)", write={"bigquery": "CAST(x AS TIMESTAMP)"})
|
|
||||||
self.validate_all("CAST(x AS RECORD)", write={"bigquery": "CAST(x AS STRUCT)"})
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"SELECT ARRAY(SELECT AS STRUCT 1 a, 2 b)",
|
"SELECT ARRAY(SELECT AS STRUCT 1 a, 2 b)",
|
||||||
write={
|
write={
|
||||||
|
@ -121,9 +186,6 @@ class TestBigQuery(Validator):
|
||||||
"spark": "'x\\''",
|
"spark": "'x\\''",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
with self.assertRaises(ValueError):
|
|
||||||
transpile("'\\'", read="bigquery")
|
|
||||||
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"r'x\\''",
|
"r'x\\''",
|
||||||
write={
|
write={
|
||||||
|
@ -301,7 +363,6 @@ class TestBigQuery(Validator):
|
||||||
"spark": "CURRENT_TIMESTAMP()",
|
"spark": "CURRENT_TIMESTAMP()",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"DIV(x, y)",
|
"DIV(x, y)",
|
||||||
write={
|
write={
|
||||||
|
@ -309,19 +370,6 @@ class TestBigQuery(Validator):
|
||||||
"duckdb": "x // y",
|
"duckdb": "x // y",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
self.validate_identity(
|
|
||||||
"SELECT ROW() OVER (y ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM x WINDOW y AS (PARTITION BY CATEGORY)"
|
|
||||||
)
|
|
||||||
|
|
||||||
self.validate_identity(
|
|
||||||
"SELECT item, purchases, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popular FROM Produce WINDOW item_window AS (ORDER BY purchases)"
|
|
||||||
)
|
|
||||||
|
|
||||||
self.validate_identity(
|
|
||||||
"SELECT LAST_VALUE(a IGNORE NULLS) OVER y FROM x WINDOW y AS (PARTITION BY CATEGORY)",
|
|
||||||
)
|
|
||||||
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"CREATE TABLE db.example_table (col_a struct<struct_col_a:int, struct_col_b:string>)",
|
"CREATE TABLE db.example_table (col_a struct<struct_col_a:int, struct_col_b:string>)",
|
||||||
write={
|
write={
|
||||||
|
@ -358,25 +406,6 @@ class TestBigQuery(Validator):
|
||||||
"spark": "SELECT * FROM a WHERE b IN (SELECT UNNEST(ARRAY(1, 2, 3)))",
|
"spark": "SELECT * FROM a WHERE b IN (SELECT UNNEST(ARRAY(1, 2, 3)))",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
# Reference: https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#set_operators
|
|
||||||
with self.assertRaises(UnsupportedError):
|
|
||||||
transpile(
|
|
||||||
"SELECT * FROM a INTERSECT ALL SELECT * FROM b",
|
|
||||||
write="bigquery",
|
|
||||||
unsupported_level=ErrorLevel.RAISE,
|
|
||||||
)
|
|
||||||
|
|
||||||
with self.assertRaises(UnsupportedError):
|
|
||||||
transpile(
|
|
||||||
"SELECT * FROM a EXCEPT ALL SELECT * FROM b",
|
|
||||||
write="bigquery",
|
|
||||||
unsupported_level=ErrorLevel.RAISE,
|
|
||||||
)
|
|
||||||
|
|
||||||
with self.assertRaises(ParseError):
|
|
||||||
transpile("SELECT * FROM UNNEST(x) AS x(y)", read="bigquery")
|
|
||||||
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)",
|
"DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)",
|
||||||
write={
|
write={
|
||||||
|
@ -465,14 +494,6 @@ class TestBigQuery(Validator):
|
||||||
"duckdb": "SELECT REGEXP_EXTRACT(abc, 'pattern(group)', 1) FROM table",
|
"duckdb": "SELECT REGEXP_EXTRACT(abc, 'pattern(group)', 1) FROM table",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_identity("REGEXP_EXTRACT(`foo`, 'bar: (.+?)', 1, 1)")
|
|
||||||
self.validate_identity("BEGIN A B C D E F")
|
|
||||||
self.validate_identity("BEGIN TRANSACTION")
|
|
||||||
self.validate_identity("COMMIT TRANSACTION")
|
|
||||||
self.validate_identity("ROLLBACK TRANSACTION")
|
|
||||||
self.validate_identity("CAST(x AS BIGNUMERIC)")
|
|
||||||
|
|
||||||
self.validate_identity("SELECT * FROM UNNEST([1]) WITH ORDINALITY")
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"SELECT * FROM UNNEST([1]) WITH OFFSET",
|
"SELECT * FROM UNNEST([1]) WITH OFFSET",
|
||||||
write={"bigquery": "SELECT * FROM UNNEST([1]) WITH OFFSET AS offset"},
|
write={"bigquery": "SELECT * FROM UNNEST([1]) WITH OFFSET AS offset"},
|
||||||
|
@ -497,6 +518,16 @@ class TestBigQuery(Validator):
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT y + 1 z FROM x GROUP BY y + 1 ORDER BY z",
|
||||||
|
"SELECT y + 1 AS z FROM x GROUP BY z ORDER BY z",
|
||||||
|
)
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT y + 1 z FROM x GROUP BY y + 1",
|
||||||
|
"SELECT y + 1 AS z FROM x GROUP BY y + 1",
|
||||||
|
)
|
||||||
|
self.validate_identity("SELECT y + 1 FROM x GROUP BY y + 1 ORDER BY 1")
|
||||||
|
|
||||||
def test_user_defined_functions(self):
|
def test_user_defined_functions(self):
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"CREATE TEMPORARY FUNCTION a(x FLOAT64, y FLOAT64) RETURNS FLOAT64 NOT DETERMINISTIC LANGUAGE js AS 'return x*y;'"
|
"CREATE TEMPORARY FUNCTION a(x FLOAT64, y FLOAT64) RETURNS FLOAT64 NOT DETERMINISTIC LANGUAGE js AS 'return x*y;'"
|
||||||
|
@ -568,3 +599,34 @@ class TestBigQuery(Validator):
|
||||||
"bigquery": "ALTER TABLE db.t1 RENAME TO t2",
|
"bigquery": "ALTER TABLE db.t1 RENAME TO t2",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@mock.patch("sqlglot.dialects.bigquery.logger")
|
||||||
|
def test_pushdown_cte_column_names(self, mock_logger):
|
||||||
|
with self.assertRaises(UnsupportedError):
|
||||||
|
transpile(
|
||||||
|
"WITH cte(foo) AS (SELECT * FROM tbl) SELECT foo FROM cte",
|
||||||
|
read="spark",
|
||||||
|
write="bigquery",
|
||||||
|
unsupported_level=ErrorLevel.RAISE,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.validate_all(
|
||||||
|
"WITH cte AS (SELECT 1 AS foo) SELECT foo FROM cte",
|
||||||
|
read={"spark": "WITH cte(foo) AS (SELECT 1) SELECT foo FROM cte"},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"WITH cte AS (SELECT 1 AS foo) SELECT foo FROM cte",
|
||||||
|
read={"spark": "WITH cte(foo) AS (SELECT 1 AS bar) SELECT foo FROM cte"},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"WITH cte AS (SELECT 1 AS bar) SELECT bar FROM cte",
|
||||||
|
read={"spark": "WITH cte AS (SELECT 1 AS bar) SELECT bar FROM cte"},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"WITH cte AS (SELECT 1 AS foo, 2) SELECT foo FROM cte",
|
||||||
|
read={"postgres": "WITH cte(foo) AS (SELECT 1, 2) SELECT foo FROM cte"},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"WITH cte AS (SELECT 1 AS foo UNION ALL SELECT 2) SELECT foo FROM cte",
|
||||||
|
read={"postgres": "WITH cte(foo) AS (SELECT 1 UNION ALL SELECT 2) SELECT foo FROM cte"},
|
||||||
|
)
|
||||||
|
|
|
@ -1413,7 +1413,8 @@ class TestDialect(Validator):
|
||||||
"presto": "SELECT a AS b FROM x GROUP BY 1",
|
"presto": "SELECT a AS b FROM x GROUP BY 1",
|
||||||
"hive": "SELECT a AS b FROM x GROUP BY 1",
|
"hive": "SELECT a AS b FROM x GROUP BY 1",
|
||||||
"oracle": "SELECT a AS b FROM x GROUP BY 1",
|
"oracle": "SELECT a AS b FROM x GROUP BY 1",
|
||||||
"spark": "SELECT a AS b FROM x GROUP BY 1",
|
"spark": "SELECT a AS b FROM x GROUP BY b",
|
||||||
|
"spark2": "SELECT a AS b FROM x GROUP BY 1",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
|
|
|
@ -6,6 +6,7 @@ class TestMySQL(Validator):
|
||||||
dialect = "mysql"
|
dialect = "mysql"
|
||||||
|
|
||||||
def test_ddl(self):
|
def test_ddl(self):
|
||||||
|
self.validate_identity("CREATE TABLE foo (id BIGINT)")
|
||||||
self.validate_identity("UPDATE items SET items.price = 0 WHERE items.id >= 5 LIMIT 10")
|
self.validate_identity("UPDATE items SET items.price = 0 WHERE items.id >= 5 LIMIT 10")
|
||||||
self.validate_identity("DELETE FROM t WHERE a <= 10 LIMIT 10")
|
self.validate_identity("DELETE FROM t WHERE a <= 10 LIMIT 10")
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
|
@ -397,6 +398,16 @@ class TestMySQL(Validator):
|
||||||
self.validate_identity("TIME_STR_TO_UNIX(x)", "UNIX_TIMESTAMP(x)")
|
self.validate_identity("TIME_STR_TO_UNIX(x)", "UNIX_TIMESTAMP(x)")
|
||||||
|
|
||||||
def test_mysql(self):
|
def test_mysql(self):
|
||||||
|
self.validate_all("CAST(x AS SIGNED)", write={"mysql": "CAST(x AS SIGNED)"})
|
||||||
|
self.validate_all("CAST(x AS SIGNED INTEGER)", write={"mysql": "CAST(x AS SIGNED)"})
|
||||||
|
self.validate_all("CAST(x AS UNSIGNED)", write={"mysql": "CAST(x AS UNSIGNED)"})
|
||||||
|
self.validate_all("CAST(x AS UNSIGNED INTEGER)", write={"mysql": "CAST(x AS UNSIGNED)"})
|
||||||
|
self.validate_all(
|
||||||
|
"SELECT DATE_ADD('2023-06-23 12:00:00', INTERVAL 2 * 2 MONTH) FROM foo",
|
||||||
|
write={
|
||||||
|
"mysql": "SELECT DATE_ADD('2023-06-23 12:00:00', INTERVAL (2 * 2) MONTH) FROM foo",
|
||||||
|
},
|
||||||
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"SELECT * FROM t LOCK IN SHARE MODE", write={"mysql": "SELECT * FROM t FOR SHARE"}
|
"SELECT * FROM t LOCK IN SHARE MODE", write={"mysql": "SELECT * FROM t FOR SHARE"}
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from sqlglot import UnsupportedError
|
from sqlglot import UnsupportedError
|
||||||
from tests.dialects.test_dialect import Validator
|
from tests.dialects.test_dialect import Validator
|
||||||
|
|
||||||
|
@ -439,7 +441,8 @@ class TestPresto(Validator):
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_presto(self):
|
@mock.patch("sqlglot.helper.logger")
|
||||||
|
def test_presto(self, mock_logger):
|
||||||
self.validate_identity("SELECT * FROM x OFFSET 1 LIMIT 1")
|
self.validate_identity("SELECT * FROM x OFFSET 1 LIMIT 1")
|
||||||
self.validate_identity("SELECT * FROM x OFFSET 1 FETCH FIRST 1 ROWS ONLY")
|
self.validate_identity("SELECT * FROM x OFFSET 1 FETCH FIRST 1 ROWS ONLY")
|
||||||
self.validate_identity("SELECT BOOL_OR(a > 10) FROM asd AS T(a)")
|
self.validate_identity("SELECT BOOL_OR(a > 10) FROM asd AS T(a)")
|
||||||
|
@ -452,6 +455,21 @@ class TestPresto(Validator):
|
||||||
self.validate_all("INTERVAL '1 day'", write={"trino": "INTERVAL '1' day"})
|
self.validate_all("INTERVAL '1 day'", write={"trino": "INTERVAL '1' day"})
|
||||||
self.validate_all("(5 * INTERVAL '7' day)", read={"": "INTERVAL '5' week"})
|
self.validate_all("(5 * INTERVAL '7' day)", read={"": "INTERVAL '5' week"})
|
||||||
self.validate_all("(5 * INTERVAL '7' day)", read={"": "INTERVAL '5' WEEKS"})
|
self.validate_all("(5 * INTERVAL '7' day)", read={"": "INTERVAL '5' WEEKS"})
|
||||||
|
self.validate_all(
|
||||||
|
"SELECT COALESCE(ELEMENT_AT(MAP_FROM_ENTRIES(ARRAY[(51, '1')]), id), quantity) FROM my_table",
|
||||||
|
write={
|
||||||
|
"postgres": UnsupportedError,
|
||||||
|
"presto": "SELECT COALESCE(ELEMENT_AT(MAP_FROM_ENTRIES(ARRAY[(51, '1')]), id), quantity) FROM my_table",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"SELECT ELEMENT_AT(ARRAY[1, 2, 3], 4)",
|
||||||
|
write={
|
||||||
|
"": "SELECT ARRAY(1, 2, 3)[3]",
|
||||||
|
"postgres": "SELECT (ARRAY[1, 2, 3])[4]",
|
||||||
|
"presto": "SELECT ELEMENT_AT(ARRAY[1, 2, 3], 4)",
|
||||||
|
},
|
||||||
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"SELECT SUBSTRING(a, 1, 3), SUBSTRING(a, LENGTH(a) - (3 - 1))",
|
"SELECT SUBSTRING(a, 1, 3), SUBSTRING(a, LENGTH(a) - (3 - 1))",
|
||||||
read={
|
read={
|
||||||
|
|
|
@ -82,7 +82,7 @@ class TestRedshift(Validator):
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all("SELECT INTERVAL '5 days'", read={"": "SELECT INTERVAL '5' days"})
|
self.validate_all("SELECT INTERVAL '5 days'", read={"": "SELECT INTERVAL '5' days"})
|
||||||
self.validate_all("CONVERT(INTEGER, x)", write={"redshift": "CAST(x AS INTEGER)"})
|
self.validate_all("CONVERT(INT, x)", write={"redshift": "CAST(x AS INTEGER)"})
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"DATEADD('day', ndays, caldate)", write={"redshift": "DATEADD(day, ndays, caldate)"}
|
"DATEADD('day', ndays, caldate)", write={"redshift": "DATEADD(day, ndays, caldate)"}
|
||||||
)
|
)
|
||||||
|
@ -104,7 +104,7 @@ class TestRedshift(Validator):
|
||||||
"SELECT ST_AsEWKT(ST_GeomFromEWKT('SRID=4326;POINT(10 20)')::geography)",
|
"SELECT ST_AsEWKT(ST_GeomFromEWKT('SRID=4326;POINT(10 20)')::geography)",
|
||||||
write={
|
write={
|
||||||
"redshift": "SELECT ST_ASEWKT(CAST(ST_GEOMFROMEWKT('SRID=4326;POINT(10 20)') AS GEOGRAPHY))",
|
"redshift": "SELECT ST_ASEWKT(CAST(ST_GEOMFROMEWKT('SRID=4326;POINT(10 20)') AS GEOGRAPHY))",
|
||||||
"bigquery": "SELECT ST_ASEWKT(SAFE_CAST(ST_GEOMFROMEWKT('SRID=4326;POINT(10 20)') AS GEOGRAPHY))",
|
"bigquery": "SELECT ST_AsEWKT(SAFE_CAST(ST_GeomFromEWKT('SRID=4326;POINT(10 20)') AS GEOGRAPHY))",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
|
|
|
@ -6,6 +6,8 @@ class TestSnowflake(Validator):
|
||||||
dialect = "snowflake"
|
dialect = "snowflake"
|
||||||
|
|
||||||
def test_snowflake(self):
|
def test_snowflake(self):
|
||||||
|
self.validate_identity("WITH x AS (SELECT 1 AS foo) SELECT foo FROM IDENTIFIER('x')")
|
||||||
|
self.validate_identity("WITH x AS (SELECT 1 AS foo) SELECT IDENTIFIER('foo') FROM x")
|
||||||
self.validate_identity("INITCAP('iqamqinterestedqinqthisqtopic', 'q')")
|
self.validate_identity("INITCAP('iqamqinterestedqinqthisqtopic', 'q')")
|
||||||
self.validate_identity("CAST(x AS GEOMETRY)")
|
self.validate_identity("CAST(x AS GEOMETRY)")
|
||||||
self.validate_identity("OBJECT_CONSTRUCT(*)")
|
self.validate_identity("OBJECT_CONSTRUCT(*)")
|
||||||
|
@ -23,6 +25,9 @@ class TestSnowflake(Validator):
|
||||||
self.validate_identity("CREATE TABLE foo (bar FLOAT AUTOINCREMENT START 0 INCREMENT 1)")
|
self.validate_identity("CREATE TABLE foo (bar FLOAT AUTOINCREMENT START 0 INCREMENT 1)")
|
||||||
self.validate_identity("ALTER TABLE IF EXISTS foo SET TAG a = 'a', b = 'b', c = 'c'")
|
self.validate_identity("ALTER TABLE IF EXISTS foo SET TAG a = 'a', b = 'b', c = 'c'")
|
||||||
self.validate_identity("ALTER TABLE foo UNSET TAG a, b, c")
|
self.validate_identity("ALTER TABLE foo UNSET TAG a, b, c")
|
||||||
|
self.validate_identity("ALTER TABLE foo SET COMMENT = 'bar'")
|
||||||
|
self.validate_identity("ALTER TABLE foo SET CHANGE_TRACKING = FALSE")
|
||||||
|
self.validate_identity("ALTER TABLE foo UNSET DATA_RETENTION_TIME_IN_DAYS, CHANGE_TRACKING")
|
||||||
self.validate_identity("COMMENT IF EXISTS ON TABLE foo IS 'bar'")
|
self.validate_identity("COMMENT IF EXISTS ON TABLE foo IS 'bar'")
|
||||||
self.validate_identity("SELECT CONVERT_TIMEZONE('UTC', 'America/Los_Angeles', col)")
|
self.validate_identity("SELECT CONVERT_TIMEZONE('UTC', 'America/Los_Angeles', col)")
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
|
@ -582,6 +587,8 @@ class TestSnowflake(Validator):
|
||||||
self.validate_identity("CREATE DATABASE mytestdb_clone CLONE mytestdb")
|
self.validate_identity("CREATE DATABASE mytestdb_clone CLONE mytestdb")
|
||||||
self.validate_identity("CREATE SCHEMA mytestschema_clone CLONE testschema")
|
self.validate_identity("CREATE SCHEMA mytestschema_clone CLONE testschema")
|
||||||
self.validate_identity("CREATE TABLE orders_clone CLONE orders")
|
self.validate_identity("CREATE TABLE orders_clone CLONE orders")
|
||||||
|
self.validate_identity("CREATE TABLE IDENTIFIER('foo') (COLUMN1 VARCHAR, COLUMN2 VARCHAR)")
|
||||||
|
self.validate_identity("CREATE TABLE IDENTIFIER($foo) (col1 VARCHAR, col2 VARCHAR)")
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"CREATE TABLE orders_clone_restore CLONE orders AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'))"
|
"CREATE TABLE orders_clone_restore CLONE orders AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'))"
|
||||||
)
|
)
|
||||||
|
|
|
@ -7,6 +7,10 @@ class TestSpark(Validator):
|
||||||
def test_ddl(self):
|
def test_ddl(self):
|
||||||
self.validate_identity("CREATE TABLE foo (col VARCHAR(50))")
|
self.validate_identity("CREATE TABLE foo (col VARCHAR(50))")
|
||||||
self.validate_identity("CREATE TABLE foo (col STRUCT<struct_col_a: VARCHAR((50))>)")
|
self.validate_identity("CREATE TABLE foo (col STRUCT<struct_col_a: VARCHAR((50))>)")
|
||||||
|
self.validate_identity("CREATE TABLE foo (col STRING) CLUSTERED BY (col) INTO 10 BUCKETS")
|
||||||
|
self.validate_identity(
|
||||||
|
"CREATE TABLE foo (col STRING) CLUSTERED BY (col) SORTED BY (col) INTO 10 BUCKETS"
|
||||||
|
)
|
||||||
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"CREATE TABLE db.example_table (col_a struct<struct_col_a:int, struct_col_b:string>)",
|
"CREATE TABLE db.example_table (col_a struct<struct_col_a:int, struct_col_b:string>)",
|
||||||
|
|
|
@ -252,7 +252,7 @@ FROM
|
||||||
t1
|
t1
|
||||||
GROUP BY t1.row_num
|
GROUP BY t1.row_num
|
||||||
ORDER BY t1.row_num;
|
ORDER BY t1.row_num;
|
||||||
WITH t1 AS (SELECT x.a AS a, x.b AS b, ROW_NUMBER() OVER (PARTITION BY x.a ORDER BY x.a) AS row_num FROM x AS x) SELECT t1.row_num AS row_num, SUM(t1.a) AS total FROM t1 GROUP BY t1.row_num ORDER BY t1.row_num;
|
WITH t1 AS (SELECT x.a AS a, x.b AS b, ROW_NUMBER() OVER (PARTITION BY x.a ORDER BY x.a) AS row_num FROM x AS x) SELECT t1.row_num AS row_num, SUM(t1.a) AS total FROM t1 GROUP BY t1.row_num ORDER BY row_num;
|
||||||
|
|
||||||
# title: Test prevent merging of window if in order by func
|
# title: Test prevent merging of window if in order by func
|
||||||
with t1 as (
|
with t1 as (
|
||||||
|
|
38
tests/fixtures/optimizer/optimizer.sql
vendored
38
tests/fixtures/optimizer/optimizer.sql
vendored
|
@ -577,10 +577,10 @@ FROM `u_cte` AS `u_cte` PIVOT(SUM(`u_cte`.`f`) AS `sum` FOR `u_cte`.`h` IN ('x',
|
||||||
# dialect: snowflake
|
# dialect: snowflake
|
||||||
SELECT * FROM u PIVOT (SUM(f) FOR h IN ('x', 'y'));
|
SELECT * FROM u PIVOT (SUM(f) FOR h IN ('x', 'y'));
|
||||||
SELECT
|
SELECT
|
||||||
"_q_0"."G" AS "G",
|
"_Q_0"."G" AS "G",
|
||||||
"_q_0"."'x'" AS "'x'",
|
"_Q_0"."'x'" AS "'x'",
|
||||||
"_q_0"."'y'" AS "'y'"
|
"_Q_0"."'y'" AS "'y'"
|
||||||
FROM "U" AS "U" PIVOT(SUM("U"."F") FOR "U"."H" IN ('x', 'y')) AS "_q_0"
|
FROM "U" AS "U" PIVOT(SUM("U"."F") FOR "U"."H" IN ('x', 'y')) AS "_Q_0"
|
||||||
;
|
;
|
||||||
|
|
||||||
# title: selecting all columns from a pivoted source and generating spark
|
# title: selecting all columns from a pivoted source and generating spark
|
||||||
|
@ -668,16 +668,28 @@ WHERE
|
||||||
GROUP BY `dAy`, `top_term`, rank
|
GROUP BY `dAy`, `top_term`, rank
|
||||||
ORDER BY `DaY` DESC;
|
ORDER BY `DaY` DESC;
|
||||||
SELECT
|
SELECT
|
||||||
`TOp_TeRmS`.`refresh_date` AS `day`,
|
`top_terms`.`refresh_date` AS `day`,
|
||||||
`TOp_TeRmS`.`term` AS `top_term`,
|
`top_terms`.`term` AS `top_term`,
|
||||||
`TOp_TeRmS`.`rank` AS `rank`
|
`top_terms`.`rank` AS `rank`
|
||||||
FROM `bigquery-public-data`.`GooGle_tReNDs`.`TOp_TeRmS` AS `TOp_TeRmS`
|
FROM `bigquery-public-data`.`GooGle_tReNDs`.`TOp_TeRmS` AS `top_terms`
|
||||||
WHERE
|
WHERE
|
||||||
`TOp_TeRmS`.`rank` = 1
|
`top_terms`.`rank` = 1
|
||||||
AND CAST(`TOp_TeRmS`.`refresh_date` AS DATE) >= DATE_SUB(CURRENT_DATE, INTERVAL 2 WEEK)
|
AND CAST(`top_terms`.`refresh_date` AS DATE) >= DATE_SUB(CURRENT_DATE, INTERVAL 2 WEEK)
|
||||||
GROUP BY
|
GROUP BY
|
||||||
`TOp_TeRmS`.`refresh_date`,
|
`day`,
|
||||||
`TOp_TeRmS`.`term`,
|
`top_term`,
|
||||||
`TOp_TeRmS`.`rank`
|
`rank`
|
||||||
ORDER BY
|
ORDER BY
|
||||||
`day` DESC;
|
`day` DESC;
|
||||||
|
|
||||||
|
|
||||||
|
# title: group by keys cannot be simplified
|
||||||
|
SELECT a + 1 + 1 + 1 + 1 AS b, 2 + 1 AS c FROM x GROUP BY a + 1 + 1 HAVING a + 1 + 1 + 1 + 1 > 1;
|
||||||
|
SELECT
|
||||||
|
"x"."a" + 1 + 1 + 1 + 1 AS "b",
|
||||||
|
3 AS "c"
|
||||||
|
FROM "x" AS "x"
|
||||||
|
GROUP BY
|
||||||
|
"x"."a" + 1 + 1
|
||||||
|
HAVING
|
||||||
|
"x"."a" + 1 + 1 + 1 + 1 > 1;
|
||||||
|
|
34
tests/fixtures/optimizer/tpc-ds/tpc-ds.sql
vendored
34
tests/fixtures/optimizer/tpc-ds/tpc-ds.sql
vendored
|
@ -254,7 +254,7 @@ GROUP BY
|
||||||
"item"."i_brand",
|
"item"."i_brand",
|
||||||
"item"."i_brand_id"
|
"item"."i_brand_id"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
"dt"."d_year",
|
"d_year",
|
||||||
"sum_agg" DESC,
|
"sum_agg" DESC,
|
||||||
"brand_id"
|
"brand_id"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
@ -2767,8 +2767,8 @@ GROUP BY
|
||||||
"item"."i_manufact"
|
"item"."i_manufact"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
"ext_price" DESC,
|
"ext_price" DESC,
|
||||||
"item"."i_brand",
|
"brand",
|
||||||
"item"."i_brand_id",
|
"brand_id",
|
||||||
"i_manufact_id",
|
"i_manufact_id",
|
||||||
"i_manufact"
|
"i_manufact"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
@ -5112,10 +5112,10 @@ GROUP BY
|
||||||
"item"."i_category_id",
|
"item"."i_category_id",
|
||||||
"item"."i_category"
|
"item"."i_category"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
SUM("store_sales"."ss_ext_sales_price") DESC,
|
"_col_3" DESC,
|
||||||
"dt"."d_year",
|
"d_year",
|
||||||
"item"."i_category_id",
|
"i_category_id",
|
||||||
"item"."i_category"
|
"i_category"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
@ -6353,7 +6353,7 @@ GROUP BY
|
||||||
"item"."i_brand",
|
"item"."i_brand",
|
||||||
"item"."i_brand_id"
|
"item"."i_brand_id"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
"dt"."d_year",
|
"d_year",
|
||||||
"ext_price" DESC,
|
"ext_price" DESC,
|
||||||
"brand_id"
|
"brand_id"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
@ -6648,7 +6648,7 @@ GROUP BY
|
||||||
"item"."i_brand_id"
|
"item"."i_brand_id"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
"ext_price" DESC,
|
"ext_price" DESC,
|
||||||
"item"."i_brand_id"
|
"brand_id"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
@ -7770,7 +7770,7 @@ GROUP BY
|
||||||
"ship_mode"."sm_type",
|
"ship_mode"."sm_type",
|
||||||
"web_site"."web_name"
|
"web_site"."web_name"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
SUBSTR("warehouse"."w_warehouse_name", 1, 20),
|
"_col_0",
|
||||||
"sm_type",
|
"sm_type",
|
||||||
"web_name"
|
"web_name"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
@ -9668,7 +9668,7 @@ GROUP BY
|
||||||
"time_dim"."t_minute"
|
"time_dim"."t_minute"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
"ext_price" DESC,
|
"ext_price" DESC,
|
||||||
"item"."i_brand_id";
|
"brand_id";
|
||||||
|
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
-- TPC-DS 72
|
-- TPC-DS 72
|
||||||
|
@ -11692,10 +11692,10 @@ JOIN "customer_demographics" AS "cd1"
|
||||||
GROUP BY
|
GROUP BY
|
||||||
"reason"."r_reason_desc"
|
"reason"."r_reason_desc"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
SUBSTR("reason"."r_reason_desc", 1, 20),
|
"_col_0",
|
||||||
AVG("web_sales"."ws_quantity"),
|
"_col_1",
|
||||||
AVG("web_returns"."wr_refunded_cash"),
|
"_col_2",
|
||||||
AVG("web_returns"."wr_fee")
|
"_col_3"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
@ -12364,7 +12364,7 @@ GROUP BY
|
||||||
"customer_demographics"."cd_marital_status",
|
"customer_demographics"."cd_marital_status",
|
||||||
"customer_demographics"."cd_education_status"
|
"customer_demographics"."cd_education_status"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
SUM("catalog_returns"."cr_net_loss") DESC;
|
"returns_loss" DESC;
|
||||||
|
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
-- TPC-DS 92
|
-- TPC-DS 92
|
||||||
|
@ -12940,7 +12940,7 @@ GROUP BY
|
||||||
"ship_mode"."sm_type",
|
"ship_mode"."sm_type",
|
||||||
"call_center"."cc_name"
|
"call_center"."cc_name"
|
||||||
ORDER BY
|
ORDER BY
|
||||||
SUBSTR("warehouse"."w_warehouse_name", 1, 20),
|
"_col_0",
|
||||||
"sm_type",
|
"sm_type",
|
||||||
"cc_name"
|
"cc_name"
|
||||||
LIMIT 100;
|
LIMIT 100;
|
||||||
|
|
|
@ -253,6 +253,11 @@ class TestExecutor(unittest.TestCase):
|
||||||
["a"],
|
["a"],
|
||||||
[("a",)],
|
[("a",)],
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
"(SELECT a FROM x) EXCEPT (SELECT a FROM y)",
|
||||||
|
["a"],
|
||||||
|
[("a",)],
|
||||||
|
),
|
||||||
(
|
(
|
||||||
"SELECT a FROM x INTERSECT SELECT a FROM y",
|
"SELECT a FROM x INTERSECT SELECT a FROM y",
|
||||||
["a"],
|
["a"],
|
||||||
|
@ -646,3 +651,56 @@ class TestExecutor(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEqual(result.columns, ("id", "price"))
|
self.assertEqual(result.columns, ("id", "price"))
|
||||||
self.assertEqual(result.rows, [(1, 1.0), (2, 2.0), (3, 3.0)])
|
self.assertEqual(result.rows, [(1, 1.0), (2, 2.0), (3, 3.0)])
|
||||||
|
|
||||||
|
def test_group_by(self):
|
||||||
|
tables = {
|
||||||
|
"x": [
|
||||||
|
{"a": 1, "b": 10},
|
||||||
|
{"a": 2, "b": 20},
|
||||||
|
{"a": 3, "b": 28},
|
||||||
|
{"a": 2, "b": 25},
|
||||||
|
{"a": 1, "b": 40},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
for sql, expected, columns in (
|
||||||
|
(
|
||||||
|
"SELECT a, AVG(b) FROM x GROUP BY a ORDER BY AVG(b)",
|
||||||
|
[(2, 22.5), (1, 25.0), (3, 28.0)],
|
||||||
|
("a", "_col_1"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SELECT a, AVG(b) FROM x GROUP BY a having avg(b) > 23",
|
||||||
|
[(1, 25.0), (3, 28.0)],
|
||||||
|
("a", "_col_1"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SELECT a, AVG(b) FROM x GROUP BY a having avg(b + 1) > 23",
|
||||||
|
[(1, 25.0), (2, 22.5), (3, 28.0)],
|
||||||
|
("a", "_col_1"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SELECT a, AVG(b) FROM x GROUP BY a having sum(b) + 5 > 50",
|
||||||
|
[(1, 25.0)],
|
||||||
|
("a", "_col_1"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SELECT a + 1 AS a, AVG(b + 1) FROM x GROUP BY a + 1 having AVG(b + 1) > 26",
|
||||||
|
[(4, 29.0)],
|
||||||
|
("a", "_col_1"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SELECT a, avg(b) FROM x GROUP BY a HAVING a = 1",
|
||||||
|
[(1, 25.0)],
|
||||||
|
("a", "_col_1"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SELECT a + 1, avg(b) FROM x GROUP BY a + 1 HAVING a + 1 = 2",
|
||||||
|
[(2, 25.0)],
|
||||||
|
("_col_0", "_col_1"),
|
||||||
|
),
|
||||||
|
):
|
||||||
|
with self.subTest(sql):
|
||||||
|
result = execute(sql, tables=tables)
|
||||||
|
self.assertEqual(result.columns, columns)
|
||||||
|
self.assertEqual(result.rows, expected)
|
||||||
|
|
|
@ -216,6 +216,17 @@ class TestOptimizer(unittest.TestCase):
|
||||||
"SELECT y AS y FROM x",
|
"SELECT y AS y FROM x",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
optimizer.qualify.qualify(
|
||||||
|
parse_one(
|
||||||
|
"WITH X AS (SELECT Y.A FROM DB.Y CROSS JOIN a.b.INFORMATION_SCHEMA.COLUMNS) SELECT `A` FROM X",
|
||||||
|
read="bigquery",
|
||||||
|
),
|
||||||
|
dialect="bigquery",
|
||||||
|
).sql(),
|
||||||
|
'WITH "x" AS (SELECT "y"."a" AS "a" FROM "DB"."Y" AS "y" CROSS JOIN "a"."b"."INFORMATION_SCHEMA"."COLUMNS" AS "columns") SELECT "x"."a" AS "a" FROM "x"',
|
||||||
|
)
|
||||||
|
|
||||||
self.check_file("qualify_columns", qualify_columns, execute=True, schema=self.schema)
|
self.check_file("qualify_columns", qualify_columns, execute=True, schema=self.schema)
|
||||||
|
|
||||||
def test_qualify_columns__with_invisible(self):
|
def test_qualify_columns__with_invisible(self):
|
||||||
|
@ -262,7 +273,7 @@ class TestOptimizer(unittest.TestCase):
|
||||||
# check order of lateral expansion with no schema
|
# check order of lateral expansion with no schema
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
optimizer.optimize("SELECT a + 1 AS d, d + 1 AS e FROM x WHERE e > 1 GROUP BY e").sql(),
|
optimizer.optimize("SELECT a + 1 AS d, d + 1 AS e FROM x WHERE e > 1 GROUP BY e").sql(),
|
||||||
'SELECT "x"."a" + 1 AS "d", "x"."a" + 2 AS "e" FROM "x" AS "x" WHERE "x"."a" + 2 > 1 GROUP BY "x"."a" + 2',
|
'SELECT "x"."a" + 1 AS "d", "x"."a" + 1 + 1 AS "e" FROM "x" AS "x" WHERE "x"."a" + 2 > 1 GROUP BY "x"."a" + 1 + 1',
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -724,6 +735,23 @@ FROM READ_CSV('tests/fixtures/optimizer/tpc-h/nation.csv.gz', 'delimiter', '|')
|
||||||
).sql(pretty=True, dialect="snowflake")
|
).sql(pretty=True, dialect="snowflake")
|
||||||
|
|
||||||
for func in (optimizer.qualify.qualify, optimizer.optimize):
|
for func in (optimizer.qualify.qualify, optimizer.optimize):
|
||||||
source_query = parse_one('SELECT * FROM example."source"', read="snowflake")
|
source_query = parse_one('SELECT * FROM example."source" AS "source"', read="snowflake")
|
||||||
transformed = func(source_query, dialect="snowflake", schema=schema)
|
transformed = func(source_query, dialect="snowflake", schema=schema)
|
||||||
self.assertEqual(transformed.sql(pretty=True, dialect="snowflake"), expected)
|
self.assertEqual(transformed.sql(pretty=True, dialect="snowflake"), expected)
|
||||||
|
|
||||||
|
def test_no_pseudocolumn_expansion(self):
|
||||||
|
schema = {
|
||||||
|
"a": {
|
||||||
|
"a": "text",
|
||||||
|
"b": "text",
|
||||||
|
"_PARTITIONDATE": "date",
|
||||||
|
"_PARTITIONTIME": "timestamp",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
optimizer.optimize(
|
||||||
|
parse_one("SELECT * FROM a"), schema=MappingSchema(schema, dialect="bigquery")
|
||||||
|
),
|
||||||
|
parse_one('SELECT "a"."a" AS "a", "a"."b" AS "b" FROM "a" AS "a"'),
|
||||||
|
)
|
||||||
|
|
|
@ -227,12 +227,14 @@ class TestSchema(unittest.TestCase):
|
||||||
self.assertEqual(schema.column_names(exp.Table(this="x")), ["foo"])
|
self.assertEqual(schema.column_names(exp.Table(this="x")), ["foo"])
|
||||||
|
|
||||||
# Check that the correct dialect is used when calling schema methods
|
# Check that the correct dialect is used when calling schema methods
|
||||||
|
# Note: T-SQL is case-insensitive by default, so `fo` in clickhouse will match the normalized table name
|
||||||
schema = MappingSchema(schema={"[Fo]": {"x": "int"}}, dialect="tsql")
|
schema = MappingSchema(schema={"[Fo]": {"x": "int"}}, dialect="tsql")
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
schema.column_names("[Fo]"), schema.column_names("`Fo`", dialect="clickhouse")
|
schema.column_names("[Fo]"), schema.column_names("`fo`", dialect="clickhouse")
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check that all column identifiers are normalized to lowercase for BigQuery, even quoted
|
# Check that all column identifiers are normalized to lowercase for BigQuery, even quoted
|
||||||
# ones. Also, ensure that tables aren't normalized, since they're case-sensitive by default.
|
# ones. Also, ensure that tables aren't normalized, since they're case-sensitive by default.
|
||||||
schema = MappingSchema(schema={"Foo": {"`BaR`": "int"}}, dialect="bigquery")
|
schema = MappingSchema(schema={"Foo": {"`BaR`": "int"}}, dialect="bigquery")
|
||||||
self.assertEqual(schema.column_names("Foo"), ["bar"])
|
self.assertEqual(schema.column_names("Foo"), ["bar"])
|
||||||
|
self.assertEqual(schema.column_names("foo"), [])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue