Merging upstream version 21.1.2.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
d59261cf1f
commit
472d4a62ba
103 changed files with 18237 additions and 17794 deletions
15
CHANGELOG.md
15
CHANGELOG.md
|
@ -1,6 +1,20 @@
|
||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
## [v21.1.1] - 2024-02-14
|
||||||
|
### :sparkles: New Features
|
||||||
|
- [`1d0b3d3`](https://github.com/tobymao/sqlglot/commit/1d0b3d3a22ba5a8128505d636a2ff71d0ea03d03) - add support for multi-part interval addition syntax *(PR [#2970](https://github.com/tobymao/sqlglot/pull/2970) by [@georgesittas](https://github.com/georgesittas))*
|
||||||
|
- :arrow_lower_right: *addresses issue [#2969](https://github.com/tobymao/sqlglot/issues/2969) opened by [@aersam](https://github.com/aersam)*
|
||||||
|
|
||||||
|
### :bug: Bug Fixes
|
||||||
|
- [`1c67f03`](https://github.com/tobymao/sqlglot/commit/1c67f030cd9df530e26c620079b2298b1db97d50) - **parser**: enable parsing of values into Identifier for some dialects *(PR [#2962](https://github.com/tobymao/sqlglot/pull/2962) by [@georgesittas](https://github.com/georgesittas))*
|
||||||
|
- :arrow_lower_right: *fixes issue [#2957](https://github.com/tobymao/sqlglot/issues/2957) opened by [@hsheth2](https://github.com/hsheth2)*
|
||||||
|
- [`d8b0d4f`](https://github.com/tobymao/sqlglot/commit/d8b0d4fcc82662004056a68b05ca20f30996661f) - don't treat VALUES as a keyword in BigQuery, Redshift *(PR [#2965](https://github.com/tobymao/sqlglot/pull/2965) by [@georgesittas](https://github.com/georgesittas))*
|
||||||
|
- :arrow_lower_right: *fixes issue [#2963](https://github.com/tobymao/sqlglot/issues/2963) opened by [@sean-rose](https://github.com/sean-rose)*
|
||||||
|
- [`5b7fd10`](https://github.com/tobymao/sqlglot/commit/5b7fd107f279c2f83c9d66d4353032c6d830202c) - **optimizer**: more optimizations for qualifying wide tables *(PR [#2972](https://github.com/tobymao/sqlglot/pull/2972) by [@barakalon](https://github.com/barakalon))*
|
||||||
|
- [`6cb985a`](https://github.com/tobymao/sqlglot/commit/6cb985ae1346c1a912ed6f81be30310ee1c91dfa) - pass dialect in to_table call inside replace_tables *(PR [#2973](https://github.com/tobymao/sqlglot/pull/2973) by [@georgesittas](https://github.com/georgesittas))*
|
||||||
|
|
||||||
|
|
||||||
## [v21.1.0] - 2024-02-12
|
## [v21.1.0] - 2024-02-12
|
||||||
### :sparkles: New Features
|
### :sparkles: New Features
|
||||||
- [`e71d489`](https://github.com/tobymao/sqlglot/commit/e71d4899e6744812fdefc2704c66bbd6043b5bc9) - add array and tuple helpers *(commit by [@tobymao](https://github.com/tobymao))*
|
- [`e71d489`](https://github.com/tobymao/sqlglot/commit/e71d4899e6744812fdefc2704c66bbd6043b5bc9) - add array and tuple helpers *(commit by [@tobymao](https://github.com/tobymao))*
|
||||||
|
@ -2619,3 +2633,4 @@ Changelog
|
||||||
[v21.0.1]: https://github.com/tobymao/sqlglot/compare/v21.0.0...v21.0.1
|
[v21.0.1]: https://github.com/tobymao/sqlglot/compare/v21.0.0...v21.0.1
|
||||||
[v21.0.2]: https://github.com/tobymao/sqlglot/compare/v21.0.1...v21.0.2
|
[v21.0.2]: https://github.com/tobymao/sqlglot/compare/v21.0.1...v21.0.2
|
||||||
[v21.1.0]: https://github.com/tobymao/sqlglot/compare/v21.0.2...v21.1.0
|
[v21.1.0]: https://github.com/tobymao/sqlglot/compare/v21.0.2...v21.1.0
|
||||||
|
[v21.1.1]: https://github.com/tobymao/sqlglot/compare/v21.1.0...v21.1.1
|
|
@ -74,15 +74,15 @@ We'd love to hear from you. Join our community [Slack channel](https://tobikodat
|
||||||
|
|
||||||
I tried to parse SQL that should be valid but it failed, why did that happen?
|
I tried to parse SQL that should be valid but it failed, why did that happen?
|
||||||
|
|
||||||
* You need to specify the dialect to read the SQL properly, by default it is SQLGlot's dialect which is designed to be a superset of all dialects `parse_one(sql, dialect="spark")`. If you tried specifying the dialect and it still doesn't work, please file an issue.
|
* Most of the time, issues like this occur because the "source" dialect is omitted during parsing. For example, this is how to correctly parse a SQL query written in Spark SQL: `parse_one(sql, dialect="spark")` (alternatively: `read="spark"`). If no dialect is specified, `parse_one` will attempt to parse the query according to the "SQLGlot dialect", which is designed to be a superset of all supported dialects. If you tried specifying the dialect and it still doesn't work, please file an issue.
|
||||||
|
|
||||||
I tried to output SQL but it's not in the correct dialect!
|
I tried to output SQL but it's not in the correct dialect!
|
||||||
|
|
||||||
* You need to specify the dialect to write the sql properly, by default it is in SQLGlot's dialect `parse_one(sql, dialect="spark").sql(dialect="spark")`.
|
* Like parsing, generating SQL also requires the target dialect to be specified, otherwise the SQLGlot dialect will be used by default. For example, to transpile a query from Spark SQL to DuckDB, do `parse_one(sql, dialect="spark").sql(dialect="duckdb")` (alternatively: `transpile(sql, read="spark", write="duckdb")`).
|
||||||
|
|
||||||
I tried to parse invalid SQL and it should raise an error but it worked! Why didn't it validate my SQL.
|
I tried to parse invalid SQL and it worked, even though it should raise an error! Why didn't it validate my SQL?
|
||||||
|
|
||||||
* SQLGlot is not a validator and designed to be very forgiving, handling things like trailing commas.
|
* SQLGlot does not aim to be a SQL validator - it is designed to be very forgiving. This makes the codebase more comprehensive and also gives more flexibility to its users, e.g. by allowing them to include trailing commas in their projection lists.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -76,8 +76,8 @@
|
||||||
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="n">__version_tuple__</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="n">__version_tuple__</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
||||||
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="n">version_tuple</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="n">version_tuple</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
||||||
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
|
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
|
||||||
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'21.1.0'</span>
|
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'21.1.1'</span>
|
||||||
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">21</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">21</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@
|
||||||
<section id="version">
|
<section id="version">
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">version</span><span class="annotation">: str</span> =
|
<span class="name">version</span><span class="annotation">: str</span> =
|
||||||
<span class="default_value">'21.1.0'</span>
|
<span class="default_value">'21.1.1'</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -109,7 +109,7 @@
|
||||||
<section id="version_tuple">
|
<section id="version_tuple">
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">version_tuple</span><span class="annotation">: object</span> =
|
<span class="name">version_tuple</span><span class="annotation">: object</span> =
|
||||||
<span class="default_value">(21, 1, 0)</span>
|
<span class="default_value">(21, 1, 1)</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -784,7 +784,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">'139981980193248'</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">'139981980193248'</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">'139981978717392'</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">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">'139663034964704'</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">'139663034964704'</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">'139663034977728'</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">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>
|
||||||
|
|
||||||
|
@ -1840,7 +1840,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">'139981983176912'</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">'139981983444528'</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">'139663038364112'</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">'139663039727648'</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>
|
||||||
|
|
||||||
|
@ -2088,7 +2088,7 @@
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<span class="def">def</span>
|
||||||
<span class="name">sql</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">dialect</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139981979212416'</span><span class="o">></span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">optimize</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
|
<span class="name">sql</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">dialect</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663035688096'</span><span class="o">></span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">optimize</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>,</span><span class="param"> <span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="DataFrame.sql-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="DataFrame.sql-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -2837,7 +2837,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">'139981977951568'</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">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">'139663035617568'</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">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>
|
||||||
|
|
||||||
|
@ -2906,7 +2906,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">'139981977374288'</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">'139981977374288'</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">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">'139663033686128'</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">'139663033686128'</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">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>
|
||||||
|
|
||||||
|
@ -3111,7 +3111,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">'139981977374288'</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">'139981977374288'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
|
<span class="name">repartition</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">numPartitions</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663033686128'</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">'139663033686128'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#DataFrame">DataFrame</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="DataFrame.repartition-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="DataFrame.repartition-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3831,7 +3831,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">'139981981343056'</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">'139663036908736'</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>
|
||||||
|
|
||||||
|
@ -3875,7 +3875,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">'139981981343056'</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 class="n"><a href="#Column">Column</a></span>:</span></span>
|
<span class="name">ensure_col</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663036908736'</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 class="n"><a href="#Column">Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.ensure_col-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.ensure_col-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3896,7 +3896,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">'139981981343056'</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">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">'139663036908736'</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">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>
|
||||||
|
|
||||||
|
@ -3917,7 +3917,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">'139981981343056'</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">'139981981343056'</span><span class="o">></span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
|
<span class="name">invoke_anonymous_function</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">column</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663036908736'</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">'139663036908736'</span><span class="o">></span><span class="p">]</span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.invoke_anonymous_function-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.invoke_anonymous_function-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -3944,7 +3944,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">'139981981343056'</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">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">'139663036908736'</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">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>
|
||||||
|
|
||||||
|
@ -3983,7 +3983,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">'139981981343056'</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">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">'139663036908736'</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">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>
|
||||||
|
|
||||||
|
@ -4004,7 +4004,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">'139981981343056'</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">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">'139663036908736'</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">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>
|
||||||
|
|
||||||
|
@ -4598,7 +4598,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">'139981981343056'</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">'139981981343056'</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">'139663036908736'</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">'139663036908736'</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>
|
||||||
|
|
||||||
|
@ -4619,7 +4619,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">'139981981343056'</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">'139981981343056'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
|
<span class="name">between</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">lowerBound</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663036908736'</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">'139663036908736'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.between-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.between-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4654,7 +4654,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">'139981977905056'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
|
<span class="name">over</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">window</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663034172272'</span><span class="o">></span></span><span class="return-annotation">) -> <span class="n"><a href="#Column">Column</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Column.over-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Column.over-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="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">'139981978118480'</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">'139981978118480'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663034577728'</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">'139663034577728'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Window.partitionBy-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Window.partitionBy-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -4920,7 +4920,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">'139981978118480'</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">'139981978118480'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663034577728'</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">'139663034577728'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Window.orderBy-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Window.orderBy-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -5162,7 +5162,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">'139981978118480'</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">'139981978118480'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663034577728'</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">'139663034577728'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="WindowSpec.partitionBy-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="WindowSpec.partitionBy-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -5189,7 +5189,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">'139981978118480'</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">'139981978118480'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139663034577728'</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">'139663034577728'</span><span class="o">></span><span class="p">]]</span></span><span class="return-annotation">) -> <span class="n"><a href="#WindowSpec">WindowSpec</a></span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="WindowSpec.orderBy-view-source"><span>View Source</span></label>
|
<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
|
@ -892,6 +892,7 @@ Default: 3</li>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div><dt><a href="hive.html#Hive.Parser">sqlglot.dialects.hive.Hive.Parser</a></dt>
|
<div><dt><a href="hive.html#Hive.Parser">sqlglot.dialects.hive.Hive.Parser</a></dt>
|
||||||
|
<dd id="Databricks.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="hive.html#Hive.Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
|
||||||
<dd id="Databricks.Parser.NO_PAREN_FUNCTION_PARSERS" class="variable"><a href="hive.html#Hive.Parser.NO_PAREN_FUNCTION_PARSERS">NO_PAREN_FUNCTION_PARSERS</a></dd>
|
<dd id="Databricks.Parser.NO_PAREN_FUNCTION_PARSERS" class="variable"><a href="hive.html#Hive.Parser.NO_PAREN_FUNCTION_PARSERS">NO_PAREN_FUNCTION_PARSERS</a></dd>
|
||||||
<dd id="Databricks.Parser.PROPERTY_PARSERS" class="variable"><a href="hive.html#Hive.Parser.PROPERTY_PARSERS">PROPERTY_PARSERS</a></dd>
|
<dd id="Databricks.Parser.PROPERTY_PARSERS" class="variable"><a href="hive.html#Hive.Parser.PROPERTY_PARSERS">PROPERTY_PARSERS</a></dd>
|
||||||
|
|
||||||
|
|
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 it is too large
Load diff
|
@ -2026,6 +2026,7 @@ Default: 3</li>
|
||||||
<dd id="Postgres.Parser.MODIFIERS_ATTACHED_TO_UNION" class="variable"><a href="../parser.html#Parser.MODIFIERS_ATTACHED_TO_UNION">MODIFIERS_ATTACHED_TO_UNION</a></dd>
|
<dd id="Postgres.Parser.MODIFIERS_ATTACHED_TO_UNION" class="variable"><a href="../parser.html#Parser.MODIFIERS_ATTACHED_TO_UNION">MODIFIERS_ATTACHED_TO_UNION</a></dd>
|
||||||
<dd id="Postgres.Parser.UNION_MODIFIERS" class="variable"><a href="../parser.html#Parser.UNION_MODIFIERS">UNION_MODIFIERS</a></dd>
|
<dd id="Postgres.Parser.UNION_MODIFIERS" class="variable"><a href="../parser.html#Parser.UNION_MODIFIERS">UNION_MODIFIERS</a></dd>
|
||||||
<dd id="Postgres.Parser.NO_PAREN_IF_COMMANDS" class="variable"><a href="../parser.html#Parser.NO_PAREN_IF_COMMANDS">NO_PAREN_IF_COMMANDS</a></dd>
|
<dd id="Postgres.Parser.NO_PAREN_IF_COMMANDS" class="variable"><a href="../parser.html#Parser.NO_PAREN_IF_COMMANDS">NO_PAREN_IF_COMMANDS</a></dd>
|
||||||
|
<dd id="Postgres.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="../parser.html#Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
|
||||||
<dd id="Postgres.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
|
<dd id="Postgres.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
|
||||||
<dd id="Postgres.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
|
<dd id="Postgres.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
|
||||||
<dd id="Postgres.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
|
<dd id="Postgres.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
|
||||||
|
@ -2411,7 +2412,7 @@ Default: True</li>
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">SUPPORTED_JSON_PATH_PARTS</span> =
|
<span class="name">SUPPORTED_JSON_PATH_PARTS</span> =
|
||||||
<input id="Postgres.Generator.SUPPORTED_JSON_PATH_PARTS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
<input id="Postgres.Generator.SUPPORTED_JSON_PATH_PARTS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
<label class="view-value-button pdoc-button" for="Postgres.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>, <class '<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>}</span>
|
<label class="view-value-button pdoc-button" for="Postgres.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>, <class '<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>}</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
|
@ -955,6 +955,7 @@ Default: 3</li>
|
||||||
<div><dt><a href="hive.html#Hive.Parser">sqlglot.dialects.hive.Hive.Parser</a></dt>
|
<div><dt><a href="hive.html#Hive.Parser">sqlglot.dialects.hive.Hive.Parser</a></dt>
|
||||||
<dd id="Spark.Parser.LOG_DEFAULTS_TO_LN" class="variable"><a href="hive.html#Hive.Parser.LOG_DEFAULTS_TO_LN">LOG_DEFAULTS_TO_LN</a></dd>
|
<dd id="Spark.Parser.LOG_DEFAULTS_TO_LN" class="variable"><a href="hive.html#Hive.Parser.LOG_DEFAULTS_TO_LN">LOG_DEFAULTS_TO_LN</a></dd>
|
||||||
<dd id="Spark.Parser.STRICT_CAST" class="variable"><a href="hive.html#Hive.Parser.STRICT_CAST">STRICT_CAST</a></dd>
|
<dd id="Spark.Parser.STRICT_CAST" class="variable"><a href="hive.html#Hive.Parser.STRICT_CAST">STRICT_CAST</a></dd>
|
||||||
|
<dd id="Spark.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="hive.html#Hive.Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
|
||||||
<dd id="Spark.Parser.NO_PAREN_FUNCTION_PARSERS" class="variable"><a href="hive.html#Hive.Parser.NO_PAREN_FUNCTION_PARSERS">NO_PAREN_FUNCTION_PARSERS</a></dd>
|
<dd id="Spark.Parser.NO_PAREN_FUNCTION_PARSERS" class="variable"><a href="hive.html#Hive.Parser.NO_PAREN_FUNCTION_PARSERS">NO_PAREN_FUNCTION_PARSERS</a></dd>
|
||||||
<dd id="Spark.Parser.PROPERTY_PARSERS" class="variable"><a href="hive.html#Hive.Parser.PROPERTY_PARSERS">PROPERTY_PARSERS</a></dd>
|
<dd id="Spark.Parser.PROPERTY_PARSERS" class="variable"><a href="hive.html#Hive.Parser.PROPERTY_PARSERS">PROPERTY_PARSERS</a></dd>
|
||||||
|
|
||||||
|
|
|
@ -1279,6 +1279,7 @@ Default: 3</li>
|
||||||
<div><dt><a href="hive.html#Hive.Parser">sqlglot.dialects.hive.Hive.Parser</a></dt>
|
<div><dt><a href="hive.html#Hive.Parser">sqlglot.dialects.hive.Hive.Parser</a></dt>
|
||||||
<dd id="Spark2.Parser.LOG_DEFAULTS_TO_LN" class="variable"><a href="hive.html#Hive.Parser.LOG_DEFAULTS_TO_LN">LOG_DEFAULTS_TO_LN</a></dd>
|
<dd id="Spark2.Parser.LOG_DEFAULTS_TO_LN" class="variable"><a href="hive.html#Hive.Parser.LOG_DEFAULTS_TO_LN">LOG_DEFAULTS_TO_LN</a></dd>
|
||||||
<dd id="Spark2.Parser.STRICT_CAST" class="variable"><a href="hive.html#Hive.Parser.STRICT_CAST">STRICT_CAST</a></dd>
|
<dd id="Spark2.Parser.STRICT_CAST" class="variable"><a href="hive.html#Hive.Parser.STRICT_CAST">STRICT_CAST</a></dd>
|
||||||
|
<dd id="Spark2.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="hive.html#Hive.Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
|
||||||
<dd id="Spark2.Parser.NO_PAREN_FUNCTION_PARSERS" class="variable"><a href="hive.html#Hive.Parser.NO_PAREN_FUNCTION_PARSERS">NO_PAREN_FUNCTION_PARSERS</a></dd>
|
<dd id="Spark2.Parser.NO_PAREN_FUNCTION_PARSERS" class="variable"><a href="hive.html#Hive.Parser.NO_PAREN_FUNCTION_PARSERS">NO_PAREN_FUNCTION_PARSERS</a></dd>
|
||||||
<dd id="Spark2.Parser.PROPERTY_PARSERS" class="variable"><a href="hive.html#Hive.Parser.PROPERTY_PARSERS">PROPERTY_PARSERS</a></dd>
|
<dd id="Spark2.Parser.PROPERTY_PARSERS" class="variable"><a href="hive.html#Hive.Parser.PROPERTY_PARSERS">PROPERTY_PARSERS</a></dd>
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1410,6 +1410,7 @@ Default: 3</li>
|
||||||
<dd id="Tableau.Parser.STRING_ALIASES" class="variable"><a href="../parser.html#Parser.STRING_ALIASES">STRING_ALIASES</a></dd>
|
<dd id="Tableau.Parser.STRING_ALIASES" class="variable"><a href="../parser.html#Parser.STRING_ALIASES">STRING_ALIASES</a></dd>
|
||||||
<dd id="Tableau.Parser.MODIFIERS_ATTACHED_TO_UNION" class="variable"><a href="../parser.html#Parser.MODIFIERS_ATTACHED_TO_UNION">MODIFIERS_ATTACHED_TO_UNION</a></dd>
|
<dd id="Tableau.Parser.MODIFIERS_ATTACHED_TO_UNION" class="variable"><a href="../parser.html#Parser.MODIFIERS_ATTACHED_TO_UNION">MODIFIERS_ATTACHED_TO_UNION</a></dd>
|
||||||
<dd id="Tableau.Parser.UNION_MODIFIERS" class="variable"><a href="../parser.html#Parser.UNION_MODIFIERS">UNION_MODIFIERS</a></dd>
|
<dd id="Tableau.Parser.UNION_MODIFIERS" class="variable"><a href="../parser.html#Parser.UNION_MODIFIERS">UNION_MODIFIERS</a></dd>
|
||||||
|
<dd id="Tableau.Parser.VALUES_FOLLOWED_BY_PAREN" class="variable"><a href="../parser.html#Parser.VALUES_FOLLOWED_BY_PAREN">VALUES_FOLLOWED_BY_PAREN</a></dd>
|
||||||
<dd id="Tableau.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
|
<dd id="Tableau.Parser.error_level" class="variable"><a href="../parser.html#Parser.error_level">error_level</a></dd>
|
||||||
<dd id="Tableau.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
|
<dd id="Tableau.Parser.error_message_context" class="variable"><a href="../parser.html#Parser.error_message_context">error_message_context</a></dd>
|
||||||
<dd id="Tableau.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
|
<dd id="Tableau.Parser.max_errors" class="variable"><a href="../parser.html#Parser.max_errors">max_errors</a></dd>
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -605,7 +605,7 @@ Default: True</li>
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">SUPPORTED_JSON_PATH_PARTS</span> =
|
<span class="name">SUPPORTED_JSON_PATH_PARTS</span> =
|
||||||
<input id="Trino.Generator.SUPPORTED_JSON_PATH_PARTS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
<input id="Trino.Generator.SUPPORTED_JSON_PATH_PARTS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
<label class="view-value-button pdoc-button" for="Trino.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>, <class '<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>}</span>
|
<label class="view-value-button pdoc-button" for="Trino.Generator.SUPPORTED_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="../expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>, <class '<a href="../expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
|
@ -126,6 +126,15 @@
|
||||||
<li>
|
<li>
|
||||||
<a class="function" href="#is_date_unit">is_date_unit</a>
|
<a class="function" href="#is_date_unit">is_date_unit</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="class" href="#SingleValuedMapping">SingleValuedMapping</a>
|
||||||
|
<ul class="memberlist">
|
||||||
|
<li>
|
||||||
|
<a class="function" href="#SingleValuedMapping.__init__">SingleValuedMapping</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,7 +166,7 @@
|
||||||
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">import</span> <span class="nn">re</span>
|
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">import</span> <span class="nn">re</span>
|
||||||
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">import</span> <span class="nn">sys</span>
|
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">import</span> <span class="nn">sys</span>
|
||||||
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="kn">import</span> <span class="nn">typing</span> <span class="k">as</span> <span class="nn">t</span>
|
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="kn">import</span> <span class="nn">typing</span> <span class="k">as</span> <span class="nn">t</span>
|
||||||
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">from</span> <span class="nn">collections.abc</span> <span class="kn">import</span> <span class="n">Collection</span>
|
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">from</span> <span class="nn">collections.abc</span> <span class="kn">import</span> <span class="n">Collection</span><span class="p">,</span> <span class="n">Set</span>
|
||||||
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
|
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>
|
||||||
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">from</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="n">copy</span>
|
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">from</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="n">copy</span>
|
||||||
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span>
|
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span>
|
||||||
|
@ -647,6 +656,34 @@
|
||||||
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a>
|
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a>
|
||||||
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a><span class="k">def</span> <span class="nf">is_date_unit</span><span class="p">(</span><span class="n">expression</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">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">])</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a><span class="k">def</span> <span class="nf">is_date_unit</span><span class="p">(</span><span class="n">expression</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">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">])</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||||||
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a> <span class="k">return</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <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="ow">in</span> <span class="n">DATE_UNITS</span>
|
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a> <span class="k">return</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <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="ow">in</span> <span class="n">DATE_UNITS</span>
|
||||||
|
</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a>
|
||||||
|
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a>
|
||||||
|
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a><span class="n">K</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeVar</span><span class="p">(</span><span class="s2">"K"</span><span class="p">)</span>
|
||||||
|
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a><span class="n">V</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeVar</span><span class="p">(</span><span class="s2">"V"</span><span class="p">)</span>
|
||||||
|
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a>
|
||||||
|
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a>
|
||||||
|
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a><span class="k">class</span> <span class="nc">SingleValuedMapping</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">Mapping</span><span class="p">[</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="p">]):</span>
|
||||||
|
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
|
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a><span class="sd"> Mapping where all keys return the same value.</span>
|
||||||
|
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a>
|
||||||
|
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a><span class="sd"> This rigamarole is meant to avoid copying keys, which was originally intended</span>
|
||||||
|
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a><span class="sd"> as an optimization while qualifying columns for tables with lots of columns.</span>
|
||||||
|
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a><span class="sd"> """</span>
|
||||||
|
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a>
|
||||||
|
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keys</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">K</span><span class="p">],</span> <span class="n">value</span><span class="p">:</span> <span class="n">V</span><span class="p">):</span>
|
||||||
|
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span> <span class="o">=</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keys</span><span class="p">,</span> <span class="n">Set</span><span class="p">)</span> <span class="k">else</span> <span class="nb">set</span><span class="p">(</span><span class="n">keys</span><span class="p">)</span>
|
||||||
|
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">value</span>
|
||||||
|
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a>
|
||||||
|
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a> <span class="k">def</span> <span class="fm">__getitem__</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="n">K</span><span class="p">)</span> <span class="o">-></span> <span class="n">V</span><span class="p">:</span>
|
||||||
|
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">:</span>
|
||||||
|
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span>
|
||||||
|
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a> <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||||
|
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a>
|
||||||
|
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a> <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||||||
|
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">)</span>
|
||||||
|
</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a>
|
||||||
|
</span><span id="L-525"><a href="#L-525"><span class="linenos">525</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 class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">K</span><span class="p">]:</span>
|
||||||
|
</span><span id="L-526"><a href="#L-526"><span class="linenos">526</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">_keys</span><span class="p">)</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -1808,7 +1845,7 @@ belong to some totally-ordered set.</p>
|
||||||
<section id="DATE_UNITS">
|
<section id="DATE_UNITS">
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">DATE_UNITS</span> =
|
<span class="name">DATE_UNITS</span> =
|
||||||
<span class="default_value">{'quarter', 'month', 'day', 'year', 'week', 'year_month'}</span>
|
<span class="default_value">{'month', 'day', 'year_month', 'quarter', 'week', 'year'}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -1835,6 +1872,81 @@ belong to some totally-ordered set.</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</section>
|
||||||
|
<section id="SingleValuedMapping">
|
||||||
|
<input id="SingleValuedMapping-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
|
<div class="attr class">
|
||||||
|
|
||||||
|
<span class="def">class</span>
|
||||||
|
<span class="name">SingleValuedMapping</span><wbr>(<span class="base">typing.Mapping[~K, ~V]</span>):
|
||||||
|
|
||||||
|
<label class="view-source-button" for="SingleValuedMapping-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<a class="headerlink" href="#SingleValuedMapping"></a>
|
||||||
|
<div class="pdoc-code codehilite"><pre><span></span><span id="SingleValuedMapping-506"><a href="#SingleValuedMapping-506"><span class="linenos">506</span></a><span class="k">class</span> <span class="nc">SingleValuedMapping</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">Mapping</span><span class="p">[</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="p">]):</span>
|
||||||
|
</span><span id="SingleValuedMapping-507"><a href="#SingleValuedMapping-507"><span class="linenos">507</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
|
</span><span id="SingleValuedMapping-508"><a href="#SingleValuedMapping-508"><span class="linenos">508</span></a><span class="sd"> Mapping where all keys return the same value.</span>
|
||||||
|
</span><span id="SingleValuedMapping-509"><a href="#SingleValuedMapping-509"><span class="linenos">509</span></a>
|
||||||
|
</span><span id="SingleValuedMapping-510"><a href="#SingleValuedMapping-510"><span class="linenos">510</span></a><span class="sd"> This rigamarole is meant to avoid copying keys, which was originally intended</span>
|
||||||
|
</span><span id="SingleValuedMapping-511"><a href="#SingleValuedMapping-511"><span class="linenos">511</span></a><span class="sd"> as an optimization while qualifying columns for tables with lots of columns.</span>
|
||||||
|
</span><span id="SingleValuedMapping-512"><a href="#SingleValuedMapping-512"><span class="linenos">512</span></a><span class="sd"> """</span>
|
||||||
|
</span><span id="SingleValuedMapping-513"><a href="#SingleValuedMapping-513"><span class="linenos">513</span></a>
|
||||||
|
</span><span id="SingleValuedMapping-514"><a href="#SingleValuedMapping-514"><span class="linenos">514</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">keys</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">K</span><span class="p">],</span> <span class="n">value</span><span class="p">:</span> <span class="n">V</span><span class="p">):</span>
|
||||||
|
</span><span id="SingleValuedMapping-515"><a href="#SingleValuedMapping-515"><span class="linenos">515</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span> <span class="o">=</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keys</span><span class="p">,</span> <span class="n">Set</span><span class="p">)</span> <span class="k">else</span> <span class="nb">set</span><span class="p">(</span><span class="n">keys</span><span class="p">)</span>
|
||||||
|
</span><span id="SingleValuedMapping-516"><a href="#SingleValuedMapping-516"><span class="linenos">516</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">value</span>
|
||||||
|
</span><span id="SingleValuedMapping-517"><a href="#SingleValuedMapping-517"><span class="linenos">517</span></a>
|
||||||
|
</span><span id="SingleValuedMapping-518"><a href="#SingleValuedMapping-518"><span class="linenos">518</span></a> <span class="k">def</span> <span class="fm">__getitem__</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="n">K</span><span class="p">)</span> <span class="o">-></span> <span class="n">V</span><span class="p">:</span>
|
||||||
|
</span><span id="SingleValuedMapping-519"><a href="#SingleValuedMapping-519"><span class="linenos">519</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">:</span>
|
||||||
|
</span><span id="SingleValuedMapping-520"><a href="#SingleValuedMapping-520"><span class="linenos">520</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span>
|
||||||
|
</span><span id="SingleValuedMapping-521"><a href="#SingleValuedMapping-521"><span class="linenos">521</span></a> <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||||
|
</span><span id="SingleValuedMapping-522"><a href="#SingleValuedMapping-522"><span class="linenos">522</span></a>
|
||||||
|
</span><span id="SingleValuedMapping-523"><a href="#SingleValuedMapping-523"><span class="linenos">523</span></a> <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">int</span><span class="p">:</span>
|
||||||
|
</span><span id="SingleValuedMapping-524"><a href="#SingleValuedMapping-524"><span class="linenos">524</span></a> <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys</span><span class="p">)</span>
|
||||||
|
</span><span id="SingleValuedMapping-525"><a href="#SingleValuedMapping-525"><span class="linenos">525</span></a>
|
||||||
|
</span><span id="SingleValuedMapping-526"><a href="#SingleValuedMapping-526"><span class="linenos">526</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 class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Iterator</span><span class="p">[</span><span class="n">K</span><span class="p">]:</span>
|
||||||
|
</span><span id="SingleValuedMapping-527"><a href="#SingleValuedMapping-527"><span class="linenos">527</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">_keys</span><span class="p">)</span>
|
||||||
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="docstring"><p>Mapping where all keys return the same value.</p>
|
||||||
|
|
||||||
|
<p>This rigamarole is meant to avoid copying keys, which was originally intended
|
||||||
|
as an optimization while qualifying columns for tables with lots of columns.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="SingleValuedMapping.__init__" class="classattr">
|
||||||
|
<input id="SingleValuedMapping.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
|
<div class="attr function">
|
||||||
|
|
||||||
|
<span class="name">SingleValuedMapping</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">keys</span><span class="p">:</span> <span class="n">Collection</span><span class="p">[</span><span class="o">~</span><span class="n">K</span><span class="p">]</span>, </span><span class="param"><span class="n">value</span><span class="p">:</span> <span class="o">~</span><span class="n">V</span></span>)</span>
|
||||||
|
|
||||||
|
<label class="view-source-button" for="SingleValuedMapping.__init__-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<a class="headerlink" href="#SingleValuedMapping.__init__"></a>
|
||||||
|
<div class="pdoc-code codehilite"><pre><span></span><span id="SingleValuedMapping.__init__-514"><a href="#SingleValuedMapping.__init__-514"><span class="linenos">514</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">keys</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">K</span><span class="p">],</span> <span class="n">value</span><span class="p">:</span> <span class="n">V</span><span class="p">):</span>
|
||||||
|
</span><span id="SingleValuedMapping.__init__-515"><a href="#SingleValuedMapping.__init__-515"><span class="linenos">515</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_keys</span> <span class="o">=</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keys</span><span class="p">,</span> <span class="n">Set</span><span class="p">)</span> <span class="k">else</span> <span class="nb">set</span><span class="p">(</span><span class="n">keys</span><span class="p">)</span>
|
||||||
|
</span><span id="SingleValuedMapping.__init__-516"><a href="#SingleValuedMapping.__init__-516"><span class="linenos">516</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_value</span> <span class="o">=</span> <span class="n">value</span>
|
||||||
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="inherited">
|
||||||
|
<h5>Inherited Members</h5>
|
||||||
|
<dl>
|
||||||
|
<div><dt>collections.abc.Mapping</dt>
|
||||||
|
<dd id="SingleValuedMapping.get" class="function">get</dd>
|
||||||
|
<dd id="SingleValuedMapping.keys" class="function">keys</dd>
|
||||||
|
<dd id="SingleValuedMapping.items" class="function">items</dd>
|
||||||
|
<dd id="SingleValuedMapping.values" class="function">values</dd>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
<script>
|
<script>
|
||||||
|
|
|
@ -262,7 +262,7 @@
|
||||||
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Could not find </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2"> in </span><span class="si">{</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Could not find </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2"> in </span><span class="si">{</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||||
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a>
|
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a>
|
||||||
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">:</span>
|
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">:</span>
|
||||||
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="n">to_node</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">s</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="n">upstream</span><span class="p">)</span>
|
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="n">to_node</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">s</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="n">upstream</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||||
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a>
|
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a>
|
||||||
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="k">return</span> <span class="n">upstream</span>
|
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="k">return</span> <span class="n">upstream</span>
|
||||||
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a>
|
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a>
|
||||||
|
@ -318,96 +318,100 @@
|
||||||
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">Scope</span><span class="p">):</span>
|
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">Scope</span><span class="p">):</span>
|
||||||
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="c1"># The table itself came from a more specific scope. Recurse into that one using the unaliased column name.</span>
|
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="c1"># The table itself came from a more specific scope. Recurse into that one using the unaliased column name.</span>
|
||||||
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="n">to_node</span><span class="p">(</span>
|
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="n">to_node</span><span class="p">(</span>
|
||||||
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="n">c</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">source</span><span class="p">,</span> <span class="n">scope_name</span><span class="o">=</span><span class="n">table</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="n">node</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="n">aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
|
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="n">c</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
||||||
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="p">)</span>
|
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="n">scope</span><span class="o">=</span><span class="n">source</span><span class="p">,</span>
|
||||||
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="k">else</span><span class="p">:</span>
|
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="n">scope_name</span><span class="o">=</span><span class="n">table</span><span class="p">,</span>
|
||||||
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="c1"># The source is not a scope - we've reached the end of the line. At this point, if a source is not found</span>
|
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="n">upstream</span><span class="o">=</span><span class="n">node</span><span class="p">,</span>
|
||||||
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="c1"># it means this column's lineage is unknown. This can happen if the definition of a source used in a query</span>
|
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="n">alias</span><span class="o">=</span><span class="n">aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">)</span> <span class="ow">or</span> <span class="n">alias</span><span class="p">,</span>
|
||||||
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="c1"># is not passed into the `sources` map.</span>
|
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="p">)</span>
|
||||||
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="n">source</span> <span class="o">=</span> <span class="n">source</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">Placeholder</span><span class="p">()</span>
|
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="k">else</span><span class="p">:</span>
|
||||||
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a> <span class="n">node</span><span class="o">.</span><span class="n">downstream</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Node</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">c</span><span class="o">.</span><span class="n">sql</span><span class="p">(),</span> <span class="n">source</span><span class="o">=</span><span class="n">source</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">source</span><span class="p">))</span>
|
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a> <span class="c1"># The source is not a scope - we've reached the end of the line. At this point, if a source is not found</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 class="c1"># it means this column's lineage is unknown. This can happen if the definition of a source used in a query</span>
|
||||||
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a> <span class="k">return</span> <span class="n">node</span>
|
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a> <span class="c1"># is not passed into the `sources` map.</span>
|
||||||
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a>
|
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="n">source</span> <span class="o">=</span> <span class="n">source</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">Placeholder</span><span class="p">()</span>
|
||||||
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="k">return</span> <span class="n">to_node</span><span class="p">(</span><span class="n">column</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">scope</span><span class="p">)</span>
|
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="n">node</span><span class="o">.</span><span class="n">downstream</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Node</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">c</span><span class="o">.</span><span class="n">sql</span><span class="p">(),</span> <span class="n">source</span><span class="o">=</span><span class="n">source</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">source</span><span class="p">))</span>
|
||||||
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a>
|
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a>
|
||||||
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a>
|
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="k">return</span> <span class="n">node</span>
|
||||||
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a><span class="k">class</span> <span class="nc">GraphHTML</span><span class="p">:</span>
|
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a>
|
||||||
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a><span class="w"> </span><span class="sd">"""Node to HTML generator using vis.js.</span>
|
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a> <span class="k">return</span> <span class="n">to_node</span><span class="p">(</span><span class="n">column</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">scope</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><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a><span class="sd"> https://visjs.github.io/vis-network/docs/network/</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="sd"> """</span>
|
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a><span class="k">class</span> <span class="nc">GraphHTML</span><span class="p">:</span>
|
||||||
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a>
|
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a><span class="w"> </span><span class="sd">"""Node to HTML generator using vis.js.</span>
|
||||||
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a>
|
||||||
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">nodes</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="n">edges</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">imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">options</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><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a><span class="sd"> https://visjs.github.io/vis-network/docs/network/</span>
|
||||||
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="p">):</span>
|
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a><span class="sd"> """</span>
|
||||||
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span> <span class="o">=</span> <span class="n">imports</span>
|
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a>
|
||||||
</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="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
||||||
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
|
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">nodes</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="n">edges</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">imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">options</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><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="s2">"height"</span><span class="p">:</span> <span class="s2">"500px"</span><span class="p">,</span>
|
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="p">):</span>
|
||||||
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="s2">"width"</span><span class="p">:</span> <span class="s2">"100%"</span><span class="p">,</span>
|
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span> <span class="o">=</span> <span class="n">imports</span>
|
||||||
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="s2">"layout"</span><span class="p">:</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="s2">"hierarchical"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
|
||||||
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="s2">"height"</span><span class="p">:</span> <span class="s2">"500px"</span><span class="p">,</span>
|
||||||
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="s2">"nodeSpacing"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
|
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="s2">"width"</span><span class="p">:</span> <span class="s2">"100%"</span><span class="p">,</span>
|
||||||
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="s2">"sortMethod"</span><span class="p">:</span> <span class="s2">"directed"</span><span class="p">,</span>
|
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="s2">"layout"</span><span class="p">:</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="s2">"hierarchical"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="p">},</span>
|
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
||||||
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="s2">"interaction"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="s2">"nodeSpacing"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
|
||||||
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="s2">"dragNodes"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="s2">"sortMethod"</span><span class="p">:</span> <span class="s2">"directed"</span><span class="p">,</span>
|
||||||
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="s2">"selectable"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="p">},</span>
|
||||||
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="p">},</span>
|
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="p">},</span>
|
||||||
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="s2">"physics"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="s2">"interaction"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="s2">"dragNodes"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="p">},</span>
|
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="s2">"selectable"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="s2">"edges"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="p">},</span>
|
||||||
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="s2">"arrows"</span><span class="p">:</span> <span class="s2">"to"</span><span class="p">,</span>
|
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="s2">"physics"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="p">},</span>
|
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="s2">"nodes"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="p">},</span>
|
||||||
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="s2">"font"</span><span class="p">:</span> <span class="s2">"20px monaco"</span><span class="p">,</span>
|
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="s2">"edges"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="s2">"shape"</span><span class="p">:</span> <span class="s2">"box"</span><span class="p">,</span>
|
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="s2">"arrows"</span><span class="p">:</span> <span class="s2">"to"</span><span class="p">,</span>
|
||||||
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="s2">"widthConstraint"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="p">},</span>
|
||||||
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="s2">"maximum"</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
|
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="s2">"nodes"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="p">},</span>
|
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="s2">"font"</span><span class="p">:</span> <span class="s2">"20px monaco"</span><span class="p">,</span>
|
||||||
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="p">},</span>
|
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="s2">"shape"</span><span class="p">:</span> <span class="s2">"box"</span><span class="p">,</span>
|
||||||
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="o">**</span><span class="p">(</span><span class="n">options</span> <span class="ow">or</span> <span class="p">{}),</span>
|
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="s2">"widthConstraint"</span><span class="p">:</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><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="s2">"maximum"</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
|
||||||
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a>
|
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="p">},</span>
|
||||||
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="n">nodes</span>
|
</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="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="n">edges</span>
|
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="o">**</span><span class="p">(</span><span class="n">options</span> <span class="ow">or</span> <span class="p">{}),</span>
|
||||||
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a>
|
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="p">}</span>
|
||||||
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
</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="n">nodes</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
|
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="n">nodes</span>
|
||||||
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="n">edges</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">)</span>
|
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="n">edges</span>
|
||||||
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="n">options</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
|
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a>
|
||||||
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="n">imports</span> <span class="o">=</span> <span class="p">(</span>
|
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||||
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a><span class="w"> </span><span class="sd">"""<script type="text/javascript" src="https://unpkg.com/vis-data@latest/peer/umd/vis-data.min.js"></script></span>
|
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a> <span class="n">nodes</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
|
||||||
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a><span class="sd"> <script type="text/javascript" src="https://unpkg.com/vis-network@latest/peer/umd/vis-network.min.js"></script></span>
|
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="n">edges</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">)</span>
|
||||||
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a><span class="sd"> <link rel="stylesheet" type="text/css" href="https://unpkg.com/vis-network/styles/vis-network.min.css" />"""</span>
|
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a> <span class="n">options</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
|
||||||
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span>
|
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a> <span class="n">imports</span> <span class="o">=</span> <span class="p">(</span>
|
||||||
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a> <span class="k">else</span> <span class="s2">""</span>
|
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a><span class="w"> </span><span class="sd">"""<script type="text/javascript" src="https://unpkg.com/vis-data@latest/peer/umd/vis-data.min.js"></script></span>
|
||||||
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="p">)</span>
|
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a><span class="sd"> <script type="text/javascript" src="https://unpkg.com/vis-network@latest/peer/umd/vis-network.min.js"></script></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 class="sd"> <link rel="stylesheet" type="text/css" href="https://unpkg.com/vis-network/styles/vis-network.min.css" />"""</span>
|
||||||
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">"""<div></span>
|
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span>
|
||||||
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a><span class="s2"> <div id="sqlglot-lineage"></div></span>
|
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="k">else</span> <span class="s2">""</span>
|
||||||
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a><span class="s2"> </span><span class="si">{</span><span class="n">imports</span><span class="si">}</span>
|
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a> <span class="p">)</span>
|
||||||
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a><span class="s2"> <script type="text/javascript"></span>
|
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a>
|
||||||
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a><span class="s2"> var nodes = new vis.DataSet(</span><span class="si">{</span><span class="n">nodes</span><span class="si">}</span><span class="s2">)</span>
|
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">"""<div></span>
|
||||||
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a><span class="s2"> nodes.forEach(row => row["title"] = new DOMParser().parseFromString(row["title"], "text/html").body.childNodes[0])</span>
|
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a><span class="s2"> <div id="sqlglot-lineage"></div></span>
|
||||||
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a>
|
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a><span class="s2"> </span><span class="si">{</span><span class="n">imports</span><span class="si">}</span>
|
||||||
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a><span class="s2"> new vis.Network(</span>
|
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a><span class="s2"> <script type="text/javascript"></span>
|
||||||
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a><span class="s2"> document.getElementById("sqlglot-lineage"),</span>
|
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a><span class="s2"> var nodes = new vis.DataSet(</span><span class="si">{</span><span class="n">nodes</span><span class="si">}</span><span class="s2">)</span>
|
||||||
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a><span class="s2"> </span><span class="se">{{</span>
|
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a><span class="s2"> nodes.forEach(row => row["title"] = new DOMParser().parseFromString(row["title"], "text/html").body.childNodes[0])</span>
|
||||||
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a><span class="s2"> nodes: nodes,</span>
|
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a>
|
||||||
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a><span class="s2"> edges: new vis.DataSet(</span><span class="si">{</span><span class="n">edges</span><span class="si">}</span><span class="s2">)</span>
|
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a><span class="s2"> new vis.Network(</span>
|
||||||
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a><span class="s2"> </span><span class="se">}}</span><span class="s2">,</span>
|
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a><span class="s2"> document.getElementById("sqlglot-lineage"),</span>
|
||||||
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a><span class="s2"> </span><span class="si">{</span><span class="n">options</span><span class="si">}</span><span class="s2">,</span>
|
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a><span class="s2"> </span><span class="se">{{</span>
|
||||||
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a><span class="s2"> )</span>
|
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a><span class="s2"> nodes: nodes,</span>
|
||||||
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a><span class="s2"> </script></span>
|
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a><span class="s2"> edges: new vis.DataSet(</span><span class="si">{</span><span class="n">edges</span><span class="si">}</span><span class="s2">)</span>
|
||||||
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a><span class="s2"></div>"""</span>
|
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a><span class="s2"> </span><span class="se">}}</span><span class="s2">,</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="s2"> </span><span class="si">{</span><span class="n">options</span><span class="si">}</span><span class="s2">,</span>
|
||||||
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a> <span class="k">def</span> <span class="nf">_repr_html_</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a><span class="s2"> )</span>
|
||||||
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__str__</span><span class="p">()</span>
|
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a><span class="s2"> </script></span>
|
||||||
|
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</span></a><span class="s2"></div>"""</span>
|
||||||
|
</span><span id="L-303"><a href="#L-303"><span class="linenos">303</span></a>
|
||||||
|
</span><span id="L-304"><a href="#L-304"><span class="linenos">304</span></a> <span class="k">def</span> <span class="nf">_repr_html_</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
||||||
|
</span><span id="L-305"><a href="#L-305"><span class="linenos">305</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__str__</span><span class="p">()</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -722,7 +726,7 @@
|
||||||
</span><span id="lineage-154"><a href="#lineage-154"><span class="linenos">154</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Could not find </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2"> in </span><span class="si">{</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
</span><span id="lineage-154"><a href="#lineage-154"><span class="linenos">154</span></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Could not find </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2"> in </span><span class="si">{</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||||
</span><span id="lineage-155"><a href="#lineage-155"><span class="linenos">155</span></a>
|
</span><span id="lineage-155"><a href="#lineage-155"><span class="linenos">155</span></a>
|
||||||
</span><span id="lineage-156"><a href="#lineage-156"><span class="linenos">156</span></a> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">:</span>
|
</span><span id="lineage-156"><a href="#lineage-156"><span class="linenos">156</span></a> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">union_scopes</span><span class="p">:</span>
|
||||||
</span><span id="lineage-157"><a href="#lineage-157"><span class="linenos">157</span></a> <span class="n">to_node</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">s</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="n">upstream</span><span class="p">)</span>
|
</span><span id="lineage-157"><a href="#lineage-157"><span class="linenos">157</span></a> <span class="n">to_node</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">s</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="n">upstream</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||||
</span><span id="lineage-158"><a href="#lineage-158"><span class="linenos">158</span></a>
|
</span><span id="lineage-158"><a href="#lineage-158"><span class="linenos">158</span></a>
|
||||||
</span><span id="lineage-159"><a href="#lineage-159"><span class="linenos">159</span></a> <span class="k">return</span> <span class="n">upstream</span>
|
</span><span id="lineage-159"><a href="#lineage-159"><span class="linenos">159</span></a> <span class="k">return</span> <span class="n">upstream</span>
|
||||||
</span><span id="lineage-160"><a href="#lineage-160"><span class="linenos">160</span></a>
|
</span><span id="lineage-160"><a href="#lineage-160"><span class="linenos">160</span></a>
|
||||||
|
@ -778,18 +782,22 @@
|
||||||
</span><span id="lineage-210"><a href="#lineage-210"><span class="linenos">210</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">Scope</span><span class="p">):</span>
|
</span><span id="lineage-210"><a href="#lineage-210"><span class="linenos">210</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">Scope</span><span class="p">):</span>
|
||||||
</span><span id="lineage-211"><a href="#lineage-211"><span class="linenos">211</span></a> <span class="c1"># The table itself came from a more specific scope. Recurse into that one using the unaliased column name.</span>
|
</span><span id="lineage-211"><a href="#lineage-211"><span class="linenos">211</span></a> <span class="c1"># The table itself came from a more specific scope. Recurse into that one using the unaliased column name.</span>
|
||||||
</span><span id="lineage-212"><a href="#lineage-212"><span class="linenos">212</span></a> <span class="n">to_node</span><span class="p">(</span>
|
</span><span id="lineage-212"><a href="#lineage-212"><span class="linenos">212</span></a> <span class="n">to_node</span><span class="p">(</span>
|
||||||
</span><span id="lineage-213"><a href="#lineage-213"><span class="linenos">213</span></a> <span class="n">c</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">scope</span><span class="o">=</span><span class="n">source</span><span class="p">,</span> <span class="n">scope_name</span><span class="o">=</span><span class="n">table</span><span class="p">,</span> <span class="n">upstream</span><span class="o">=</span><span class="n">node</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="n">aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
|
</span><span id="lineage-213"><a href="#lineage-213"><span class="linenos">213</span></a> <span class="n">c</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
||||||
</span><span id="lineage-214"><a href="#lineage-214"><span class="linenos">214</span></a> <span class="p">)</span>
|
</span><span id="lineage-214"><a href="#lineage-214"><span class="linenos">214</span></a> <span class="n">scope</span><span class="o">=</span><span class="n">source</span><span class="p">,</span>
|
||||||
</span><span id="lineage-215"><a href="#lineage-215"><span class="linenos">215</span></a> <span class="k">else</span><span class="p">:</span>
|
</span><span id="lineage-215"><a href="#lineage-215"><span class="linenos">215</span></a> <span class="n">scope_name</span><span class="o">=</span><span class="n">table</span><span class="p">,</span>
|
||||||
</span><span id="lineage-216"><a href="#lineage-216"><span class="linenos">216</span></a> <span class="c1"># The source is not a scope - we've reached the end of the line. At this point, if a source is not found</span>
|
</span><span id="lineage-216"><a href="#lineage-216"><span class="linenos">216</span></a> <span class="n">upstream</span><span class="o">=</span><span class="n">node</span><span class="p">,</span>
|
||||||
</span><span id="lineage-217"><a href="#lineage-217"><span class="linenos">217</span></a> <span class="c1"># it means this column's lineage is unknown. This can happen if the definition of a source used in a query</span>
|
</span><span id="lineage-217"><a href="#lineage-217"><span class="linenos">217</span></a> <span class="n">alias</span><span class="o">=</span><span class="n">aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">table</span><span class="p">)</span> <span class="ow">or</span> <span class="n">alias</span><span class="p">,</span>
|
||||||
</span><span id="lineage-218"><a href="#lineage-218"><span class="linenos">218</span></a> <span class="c1"># is not passed into the `sources` map.</span>
|
</span><span id="lineage-218"><a href="#lineage-218"><span class="linenos">218</span></a> <span class="p">)</span>
|
||||||
</span><span id="lineage-219"><a href="#lineage-219"><span class="linenos">219</span></a> <span class="n">source</span> <span class="o">=</span> <span class="n">source</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">Placeholder</span><span class="p">()</span>
|
</span><span id="lineage-219"><a href="#lineage-219"><span class="linenos">219</span></a> <span class="k">else</span><span class="p">:</span>
|
||||||
</span><span id="lineage-220"><a href="#lineage-220"><span class="linenos">220</span></a> <span class="n">node</span><span class="o">.</span><span class="n">downstream</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Node</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">c</span><span class="o">.</span><span class="n">sql</span><span class="p">(),</span> <span class="n">source</span><span class="o">=</span><span class="n">source</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">source</span><span class="p">))</span>
|
</span><span id="lineage-220"><a href="#lineage-220"><span class="linenos">220</span></a> <span class="c1"># The source is not a scope - we've reached the end of the line. At this point, if a source is not found</span>
|
||||||
</span><span id="lineage-221"><a href="#lineage-221"><span class="linenos">221</span></a>
|
</span><span id="lineage-221"><a href="#lineage-221"><span class="linenos">221</span></a> <span class="c1"># it means this column's lineage is unknown. This can happen if the definition of a source used in a query</span>
|
||||||
</span><span id="lineage-222"><a href="#lineage-222"><span class="linenos">222</span></a> <span class="k">return</span> <span class="n">node</span>
|
</span><span id="lineage-222"><a href="#lineage-222"><span class="linenos">222</span></a> <span class="c1"># is not passed into the `sources` map.</span>
|
||||||
</span><span id="lineage-223"><a href="#lineage-223"><span class="linenos">223</span></a>
|
</span><span id="lineage-223"><a href="#lineage-223"><span class="linenos">223</span></a> <span class="n">source</span> <span class="o">=</span> <span class="n">source</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">Placeholder</span><span class="p">()</span>
|
||||||
</span><span id="lineage-224"><a href="#lineage-224"><span class="linenos">224</span></a> <span class="k">return</span> <span class="n">to_node</span><span class="p">(</span><span class="n">column</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">scope</span><span class="p">)</span>
|
</span><span id="lineage-224"><a href="#lineage-224"><span class="linenos">224</span></a> <span class="n">node</span><span class="o">.</span><span class="n">downstream</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Node</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">c</span><span class="o">.</span><span class="n">sql</span><span class="p">(),</span> <span class="n">source</span><span class="o">=</span><span class="n">source</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">source</span><span class="p">))</span>
|
||||||
|
</span><span id="lineage-225"><a href="#lineage-225"><span class="linenos">225</span></a>
|
||||||
|
</span><span id="lineage-226"><a href="#lineage-226"><span class="linenos">226</span></a> <span class="k">return</span> <span class="n">node</span>
|
||||||
|
</span><span id="lineage-227"><a href="#lineage-227"><span class="linenos">227</span></a>
|
||||||
|
</span><span id="lineage-228"><a href="#lineage-228"><span class="linenos">228</span></a> <span class="k">return</span> <span class="n">to_node</span><span class="p">(</span><span class="n">column</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">column</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">scope</span><span class="p">)</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -826,82 +834,82 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#GraphHTML"></a>
|
<a class="headerlink" href="#GraphHTML"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="GraphHTML-227"><a href="#GraphHTML-227"><span class="linenos">227</span></a><span class="k">class</span> <span class="nc">GraphHTML</span><span class="p">:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="GraphHTML-231"><a href="#GraphHTML-231"><span class="linenos">231</span></a><span class="k">class</span> <span class="nc">GraphHTML</span><span class="p">:</span>
|
||||||
</span><span id="GraphHTML-228"><a href="#GraphHTML-228"><span class="linenos">228</span></a><span class="w"> </span><span class="sd">"""Node to HTML generator using vis.js.</span>
|
</span><span id="GraphHTML-232"><a href="#GraphHTML-232"><span class="linenos">232</span></a><span class="w"> </span><span class="sd">"""Node to HTML generator using vis.js.</span>
|
||||||
</span><span id="GraphHTML-229"><a href="#GraphHTML-229"><span class="linenos">229</span></a>
|
</span><span id="GraphHTML-233"><a href="#GraphHTML-233"><span class="linenos">233</span></a>
|
||||||
</span><span id="GraphHTML-230"><a href="#GraphHTML-230"><span class="linenos">230</span></a><span class="sd"> https://visjs.github.io/vis-network/docs/network/</span>
|
</span><span id="GraphHTML-234"><a href="#GraphHTML-234"><span class="linenos">234</span></a><span class="sd"> https://visjs.github.io/vis-network/docs/network/</span>
|
||||||
</span><span id="GraphHTML-231"><a href="#GraphHTML-231"><span class="linenos">231</span></a><span class="sd"> """</span>
|
</span><span id="GraphHTML-235"><a href="#GraphHTML-235"><span class="linenos">235</span></a><span class="sd"> """</span>
|
||||||
</span><span id="GraphHTML-232"><a href="#GraphHTML-232"><span class="linenos">232</span></a>
|
</span><span id="GraphHTML-236"><a href="#GraphHTML-236"><span class="linenos">236</span></a>
|
||||||
</span><span id="GraphHTML-233"><a href="#GraphHTML-233"><span class="linenos">233</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
</span><span id="GraphHTML-237"><a href="#GraphHTML-237"><span class="linenos">237</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
||||||
</span><span id="GraphHTML-234"><a href="#GraphHTML-234"><span class="linenos">234</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">nodes</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="n">edges</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">imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">options</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><span id="GraphHTML-238"><a href="#GraphHTML-238"><span class="linenos">238</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">nodes</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="n">edges</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">imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">options</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><span id="GraphHTML-235"><a href="#GraphHTML-235"><span class="linenos">235</span></a> <span class="p">):</span>
|
</span><span id="GraphHTML-239"><a href="#GraphHTML-239"><span class="linenos">239</span></a> <span class="p">):</span>
|
||||||
</span><span id="GraphHTML-236"><a href="#GraphHTML-236"><span class="linenos">236</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span> <span class="o">=</span> <span class="n">imports</span>
|
</span><span id="GraphHTML-240"><a href="#GraphHTML-240"><span class="linenos">240</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span> <span class="o">=</span> <span class="n">imports</span>
|
||||||
</span><span id="GraphHTML-237"><a href="#GraphHTML-237"><span class="linenos">237</span></a>
|
</span><span id="GraphHTML-241"><a href="#GraphHTML-241"><span class="linenos">241</span></a>
|
||||||
</span><span id="GraphHTML-238"><a href="#GraphHTML-238"><span class="linenos">238</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
|
</span><span id="GraphHTML-242"><a href="#GraphHTML-242"><span class="linenos">242</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-239"><a href="#GraphHTML-239"><span class="linenos">239</span></a> <span class="s2">"height"</span><span class="p">:</span> <span class="s2">"500px"</span><span class="p">,</span>
|
</span><span id="GraphHTML-243"><a href="#GraphHTML-243"><span class="linenos">243</span></a> <span class="s2">"height"</span><span class="p">:</span> <span class="s2">"500px"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-240"><a href="#GraphHTML-240"><span class="linenos">240</span></a> <span class="s2">"width"</span><span class="p">:</span> <span class="s2">"100%"</span><span class="p">,</span>
|
</span><span id="GraphHTML-244"><a href="#GraphHTML-244"><span class="linenos">244</span></a> <span class="s2">"width"</span><span class="p">:</span> <span class="s2">"100%"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-241"><a href="#GraphHTML-241"><span class="linenos">241</span></a> <span class="s2">"layout"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML-245"><a href="#GraphHTML-245"><span class="linenos">245</span></a> <span class="s2">"layout"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-242"><a href="#GraphHTML-242"><span class="linenos">242</span></a> <span class="s2">"hierarchical"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML-246"><a href="#GraphHTML-246"><span class="linenos">246</span></a> <span class="s2">"hierarchical"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-243"><a href="#GraphHTML-243"><span class="linenos">243</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
</span><span id="GraphHTML-247"><a href="#GraphHTML-247"><span class="linenos">247</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-244"><a href="#GraphHTML-244"><span class="linenos">244</span></a> <span class="s2">"nodeSpacing"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
|
</span><span id="GraphHTML-248"><a href="#GraphHTML-248"><span class="linenos">248</span></a> <span class="s2">"nodeSpacing"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-245"><a href="#GraphHTML-245"><span class="linenos">245</span></a> <span class="s2">"sortMethod"</span><span class="p">:</span> <span class="s2">"directed"</span><span class="p">,</span>
|
</span><span id="GraphHTML-249"><a href="#GraphHTML-249"><span class="linenos">249</span></a> <span class="s2">"sortMethod"</span><span class="p">:</span> <span class="s2">"directed"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-246"><a href="#GraphHTML-246"><span class="linenos">246</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML-250"><a href="#GraphHTML-250"><span class="linenos">250</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML-247"><a href="#GraphHTML-247"><span class="linenos">247</span></a> <span class="p">},</span>
|
|
||||||
</span><span id="GraphHTML-248"><a href="#GraphHTML-248"><span class="linenos">248</span></a> <span class="s2">"interaction"</span><span class="p">:</span> <span class="p">{</span>
|
|
||||||
</span><span id="GraphHTML-249"><a href="#GraphHTML-249"><span class="linenos">249</span></a> <span class="s2">"dragNodes"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
||||||
</span><span id="GraphHTML-250"><a href="#GraphHTML-250"><span class="linenos">250</span></a> <span class="s2">"selectable"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
||||||
</span><span id="GraphHTML-251"><a href="#GraphHTML-251"><span class="linenos">251</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML-251"><a href="#GraphHTML-251"><span class="linenos">251</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML-252"><a href="#GraphHTML-252"><span class="linenos">252</span></a> <span class="s2">"physics"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML-252"><a href="#GraphHTML-252"><span class="linenos">252</span></a> <span class="s2">"interaction"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-253"><a href="#GraphHTML-253"><span class="linenos">253</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="GraphHTML-253"><a href="#GraphHTML-253"><span class="linenos">253</span></a> <span class="s2">"dragNodes"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-254"><a href="#GraphHTML-254"><span class="linenos">254</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML-254"><a href="#GraphHTML-254"><span class="linenos">254</span></a> <span class="s2">"selectable"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-255"><a href="#GraphHTML-255"><span class="linenos">255</span></a> <span class="s2">"edges"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML-255"><a href="#GraphHTML-255"><span class="linenos">255</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML-256"><a href="#GraphHTML-256"><span class="linenos">256</span></a> <span class="s2">"arrows"</span><span class="p">:</span> <span class="s2">"to"</span><span class="p">,</span>
|
</span><span id="GraphHTML-256"><a href="#GraphHTML-256"><span class="linenos">256</span></a> <span class="s2">"physics"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-257"><a href="#GraphHTML-257"><span class="linenos">257</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML-257"><a href="#GraphHTML-257"><span class="linenos">257</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-258"><a href="#GraphHTML-258"><span class="linenos">258</span></a> <span class="s2">"nodes"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML-258"><a href="#GraphHTML-258"><span class="linenos">258</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML-259"><a href="#GraphHTML-259"><span class="linenos">259</span></a> <span class="s2">"font"</span><span class="p">:</span> <span class="s2">"20px monaco"</span><span class="p">,</span>
|
</span><span id="GraphHTML-259"><a href="#GraphHTML-259"><span class="linenos">259</span></a> <span class="s2">"edges"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-260"><a href="#GraphHTML-260"><span class="linenos">260</span></a> <span class="s2">"shape"</span><span class="p">:</span> <span class="s2">"box"</span><span class="p">,</span>
|
</span><span id="GraphHTML-260"><a href="#GraphHTML-260"><span class="linenos">260</span></a> <span class="s2">"arrows"</span><span class="p">:</span> <span class="s2">"to"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-261"><a href="#GraphHTML-261"><span class="linenos">261</span></a> <span class="s2">"widthConstraint"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML-261"><a href="#GraphHTML-261"><span class="linenos">261</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML-262"><a href="#GraphHTML-262"><span class="linenos">262</span></a> <span class="s2">"maximum"</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
|
</span><span id="GraphHTML-262"><a href="#GraphHTML-262"><span class="linenos">262</span></a> <span class="s2">"nodes"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-263"><a href="#GraphHTML-263"><span class="linenos">263</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML-263"><a href="#GraphHTML-263"><span class="linenos">263</span></a> <span class="s2">"font"</span><span class="p">:</span> <span class="s2">"20px monaco"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-264"><a href="#GraphHTML-264"><span class="linenos">264</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML-264"><a href="#GraphHTML-264"><span class="linenos">264</span></a> <span class="s2">"shape"</span><span class="p">:</span> <span class="s2">"box"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-265"><a href="#GraphHTML-265"><span class="linenos">265</span></a> <span class="o">**</span><span class="p">(</span><span class="n">options</span> <span class="ow">or</span> <span class="p">{}),</span>
|
</span><span id="GraphHTML-265"><a href="#GraphHTML-265"><span class="linenos">265</span></a> <span class="s2">"widthConstraint"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML-266"><a href="#GraphHTML-266"><span class="linenos">266</span></a> <span class="p">}</span>
|
</span><span id="GraphHTML-266"><a href="#GraphHTML-266"><span class="linenos">266</span></a> <span class="s2">"maximum"</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML-267"><a href="#GraphHTML-267"><span class="linenos">267</span></a>
|
</span><span id="GraphHTML-267"><a href="#GraphHTML-267"><span class="linenos">267</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML-268"><a href="#GraphHTML-268"><span class="linenos">268</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="n">nodes</span>
|
</span><span id="GraphHTML-268"><a href="#GraphHTML-268"><span class="linenos">268</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML-269"><a href="#GraphHTML-269"><span class="linenos">269</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="n">edges</span>
|
</span><span id="GraphHTML-269"><a href="#GraphHTML-269"><span class="linenos">269</span></a> <span class="o">**</span><span class="p">(</span><span class="n">options</span> <span class="ow">or</span> <span class="p">{}),</span>
|
||||||
</span><span id="GraphHTML-270"><a href="#GraphHTML-270"><span class="linenos">270</span></a>
|
</span><span id="GraphHTML-270"><a href="#GraphHTML-270"><span class="linenos">270</span></a> <span class="p">}</span>
|
||||||
</span><span id="GraphHTML-271"><a href="#GraphHTML-271"><span class="linenos">271</span></a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
</span><span id="GraphHTML-271"><a href="#GraphHTML-271"><span class="linenos">271</span></a>
|
||||||
</span><span id="GraphHTML-272"><a href="#GraphHTML-272"><span class="linenos">272</span></a> <span class="n">nodes</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
|
</span><span id="GraphHTML-272"><a href="#GraphHTML-272"><span class="linenos">272</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="n">nodes</span>
|
||||||
</span><span id="GraphHTML-273"><a href="#GraphHTML-273"><span class="linenos">273</span></a> <span class="n">edges</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">)</span>
|
</span><span id="GraphHTML-273"><a href="#GraphHTML-273"><span class="linenos">273</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="n">edges</span>
|
||||||
</span><span id="GraphHTML-274"><a href="#GraphHTML-274"><span class="linenos">274</span></a> <span class="n">options</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
|
</span><span id="GraphHTML-274"><a href="#GraphHTML-274"><span class="linenos">274</span></a>
|
||||||
</span><span id="GraphHTML-275"><a href="#GraphHTML-275"><span class="linenos">275</span></a> <span class="n">imports</span> <span class="o">=</span> <span class="p">(</span>
|
</span><span id="GraphHTML-275"><a href="#GraphHTML-275"><span class="linenos">275</span></a> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||||||
</span><span id="GraphHTML-276"><a href="#GraphHTML-276"><span class="linenos">276</span></a><span class="w"> </span><span class="sd">"""<script type="text/javascript" src="https://unpkg.com/vis-data@latest/peer/umd/vis-data.min.js"></script></span>
|
</span><span id="GraphHTML-276"><a href="#GraphHTML-276"><span class="linenos">276</span></a> <span class="n">nodes</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
|
||||||
</span><span id="GraphHTML-277"><a href="#GraphHTML-277"><span class="linenos">277</span></a><span class="sd"> <script type="text/javascript" src="https://unpkg.com/vis-network@latest/peer/umd/vis-network.min.js"></script></span>
|
</span><span id="GraphHTML-277"><a href="#GraphHTML-277"><span class="linenos">277</span></a> <span class="n">edges</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">edges</span><span class="p">)</span>
|
||||||
</span><span id="GraphHTML-278"><a href="#GraphHTML-278"><span class="linenos">278</span></a><span class="sd"> <link rel="stylesheet" type="text/css" href="https://unpkg.com/vis-network/styles/vis-network.min.css" />"""</span>
|
</span><span id="GraphHTML-278"><a href="#GraphHTML-278"><span class="linenos">278</span></a> <span class="n">options</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
|
||||||
</span><span id="GraphHTML-279"><a href="#GraphHTML-279"><span class="linenos">279</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span>
|
</span><span id="GraphHTML-279"><a href="#GraphHTML-279"><span class="linenos">279</span></a> <span class="n">imports</span> <span class="o">=</span> <span class="p">(</span>
|
||||||
</span><span id="GraphHTML-280"><a href="#GraphHTML-280"><span class="linenos">280</span></a> <span class="k">else</span> <span class="s2">""</span>
|
</span><span id="GraphHTML-280"><a href="#GraphHTML-280"><span class="linenos">280</span></a><span class="w"> </span><span class="sd">"""<script type="text/javascript" src="https://unpkg.com/vis-data@latest/peer/umd/vis-data.min.js"></script></span>
|
||||||
</span><span id="GraphHTML-281"><a href="#GraphHTML-281"><span class="linenos">281</span></a> <span class="p">)</span>
|
</span><span id="GraphHTML-281"><a href="#GraphHTML-281"><span class="linenos">281</span></a><span class="sd"> <script type="text/javascript" src="https://unpkg.com/vis-network@latest/peer/umd/vis-network.min.js"></script></span>
|
||||||
</span><span id="GraphHTML-282"><a href="#GraphHTML-282"><span class="linenos">282</span></a>
|
</span><span id="GraphHTML-282"><a href="#GraphHTML-282"><span class="linenos">282</span></a><span class="sd"> <link rel="stylesheet" type="text/css" href="https://unpkg.com/vis-network/styles/vis-network.min.css" />"""</span>
|
||||||
</span><span id="GraphHTML-283"><a href="#GraphHTML-283"><span class="linenos">283</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">"""<div></span>
|
</span><span id="GraphHTML-283"><a href="#GraphHTML-283"><span class="linenos">283</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span>
|
||||||
</span><span id="GraphHTML-284"><a href="#GraphHTML-284"><span class="linenos">284</span></a><span class="s2"> <div id="sqlglot-lineage"></div></span>
|
</span><span id="GraphHTML-284"><a href="#GraphHTML-284"><span class="linenos">284</span></a> <span class="k">else</span> <span class="s2">""</span>
|
||||||
</span><span id="GraphHTML-285"><a href="#GraphHTML-285"><span class="linenos">285</span></a><span class="s2"> </span><span class="si">{</span><span class="n">imports</span><span class="si">}</span>
|
</span><span id="GraphHTML-285"><a href="#GraphHTML-285"><span class="linenos">285</span></a> <span class="p">)</span>
|
||||||
</span><span id="GraphHTML-286"><a href="#GraphHTML-286"><span class="linenos">286</span></a><span class="s2"> <script type="text/javascript"></span>
|
</span><span id="GraphHTML-286"><a href="#GraphHTML-286"><span class="linenos">286</span></a>
|
||||||
</span><span id="GraphHTML-287"><a href="#GraphHTML-287"><span class="linenos">287</span></a><span class="s2"> var nodes = new vis.DataSet(</span><span class="si">{</span><span class="n">nodes</span><span class="si">}</span><span class="s2">)</span>
|
</span><span id="GraphHTML-287"><a href="#GraphHTML-287"><span class="linenos">287</span></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">"""<div></span>
|
||||||
</span><span id="GraphHTML-288"><a href="#GraphHTML-288"><span class="linenos">288</span></a><span class="s2"> nodes.forEach(row => row["title"] = new DOMParser().parseFromString(row["title"], "text/html").body.childNodes[0])</span>
|
</span><span id="GraphHTML-288"><a href="#GraphHTML-288"><span class="linenos">288</span></a><span class="s2"> <div id="sqlglot-lineage"></div></span>
|
||||||
</span><span id="GraphHTML-289"><a href="#GraphHTML-289"><span class="linenos">289</span></a>
|
</span><span id="GraphHTML-289"><a href="#GraphHTML-289"><span class="linenos">289</span></a><span class="s2"> </span><span class="si">{</span><span class="n">imports</span><span class="si">}</span>
|
||||||
</span><span id="GraphHTML-290"><a href="#GraphHTML-290"><span class="linenos">290</span></a><span class="s2"> new vis.Network(</span>
|
</span><span id="GraphHTML-290"><a href="#GraphHTML-290"><span class="linenos">290</span></a><span class="s2"> <script type="text/javascript"></span>
|
||||||
</span><span id="GraphHTML-291"><a href="#GraphHTML-291"><span class="linenos">291</span></a><span class="s2"> document.getElementById("sqlglot-lineage"),</span>
|
</span><span id="GraphHTML-291"><a href="#GraphHTML-291"><span class="linenos">291</span></a><span class="s2"> var nodes = new vis.DataSet(</span><span class="si">{</span><span class="n">nodes</span><span class="si">}</span><span class="s2">)</span>
|
||||||
</span><span id="GraphHTML-292"><a href="#GraphHTML-292"><span class="linenos">292</span></a><span class="s2"> </span><span class="se">{{</span>
|
</span><span id="GraphHTML-292"><a href="#GraphHTML-292"><span class="linenos">292</span></a><span class="s2"> nodes.forEach(row => row["title"] = new DOMParser().parseFromString(row["title"], "text/html").body.childNodes[0])</span>
|
||||||
</span><span id="GraphHTML-293"><a href="#GraphHTML-293"><span class="linenos">293</span></a><span class="s2"> nodes: nodes,</span>
|
</span><span id="GraphHTML-293"><a href="#GraphHTML-293"><span class="linenos">293</span></a>
|
||||||
</span><span id="GraphHTML-294"><a href="#GraphHTML-294"><span class="linenos">294</span></a><span class="s2"> edges: new vis.DataSet(</span><span class="si">{</span><span class="n">edges</span><span class="si">}</span><span class="s2">)</span>
|
</span><span id="GraphHTML-294"><a href="#GraphHTML-294"><span class="linenos">294</span></a><span class="s2"> new vis.Network(</span>
|
||||||
</span><span id="GraphHTML-295"><a href="#GraphHTML-295"><span class="linenos">295</span></a><span class="s2"> </span><span class="se">}}</span><span class="s2">,</span>
|
</span><span id="GraphHTML-295"><a href="#GraphHTML-295"><span class="linenos">295</span></a><span class="s2"> document.getElementById("sqlglot-lineage"),</span>
|
||||||
</span><span id="GraphHTML-296"><a href="#GraphHTML-296"><span class="linenos">296</span></a><span class="s2"> </span><span class="si">{</span><span class="n">options</span><span class="si">}</span><span class="s2">,</span>
|
</span><span id="GraphHTML-296"><a href="#GraphHTML-296"><span class="linenos">296</span></a><span class="s2"> </span><span class="se">{{</span>
|
||||||
</span><span id="GraphHTML-297"><a href="#GraphHTML-297"><span class="linenos">297</span></a><span class="s2"> )</span>
|
</span><span id="GraphHTML-297"><a href="#GraphHTML-297"><span class="linenos">297</span></a><span class="s2"> nodes: nodes,</span>
|
||||||
</span><span id="GraphHTML-298"><a href="#GraphHTML-298"><span class="linenos">298</span></a><span class="s2"> </script></span>
|
</span><span id="GraphHTML-298"><a href="#GraphHTML-298"><span class="linenos">298</span></a><span class="s2"> edges: new vis.DataSet(</span><span class="si">{</span><span class="n">edges</span><span class="si">}</span><span class="s2">)</span>
|
||||||
</span><span id="GraphHTML-299"><a href="#GraphHTML-299"><span class="linenos">299</span></a><span class="s2"></div>"""</span>
|
</span><span id="GraphHTML-299"><a href="#GraphHTML-299"><span class="linenos">299</span></a><span class="s2"> </span><span class="se">}}</span><span class="s2">,</span>
|
||||||
</span><span id="GraphHTML-300"><a href="#GraphHTML-300"><span class="linenos">300</span></a>
|
</span><span id="GraphHTML-300"><a href="#GraphHTML-300"><span class="linenos">300</span></a><span class="s2"> </span><span class="si">{</span><span class="n">options</span><span class="si">}</span><span class="s2">,</span>
|
||||||
</span><span id="GraphHTML-301"><a href="#GraphHTML-301"><span class="linenos">301</span></a> <span class="k">def</span> <span class="nf">_repr_html_</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
</span><span id="GraphHTML-301"><a href="#GraphHTML-301"><span class="linenos">301</span></a><span class="s2"> )</span>
|
||||||
</span><span id="GraphHTML-302"><a href="#GraphHTML-302"><span class="linenos">302</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__str__</span><span class="p">()</span>
|
</span><span id="GraphHTML-302"><a href="#GraphHTML-302"><span class="linenos">302</span></a><span class="s2"> </script></span>
|
||||||
|
</span><span id="GraphHTML-303"><a href="#GraphHTML-303"><span class="linenos">303</span></a><span class="s2"></div>"""</span>
|
||||||
|
</span><span id="GraphHTML-304"><a href="#GraphHTML-304"><span class="linenos">304</span></a>
|
||||||
|
</span><span id="GraphHTML-305"><a href="#GraphHTML-305"><span class="linenos">305</span></a> <span class="k">def</span> <span class="nf">_repr_html_</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
||||||
|
</span><span id="GraphHTML-306"><a href="#GraphHTML-306"><span class="linenos">306</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__str__</span><span class="p">()</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -921,43 +929,43 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#GraphHTML.__init__"></a>
|
<a class="headerlink" href="#GraphHTML.__init__"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="GraphHTML.__init__-233"><a href="#GraphHTML.__init__-233"><span class="linenos">233</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="GraphHTML.__init__-237"><a href="#GraphHTML.__init__-237"><span class="linenos">237</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
||||||
</span><span id="GraphHTML.__init__-234"><a href="#GraphHTML.__init__-234"><span class="linenos">234</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">nodes</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="n">edges</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">imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">options</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><span id="GraphHTML.__init__-238"><a href="#GraphHTML.__init__-238"><span class="linenos">238</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">nodes</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="n">edges</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">imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">options</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><span id="GraphHTML.__init__-235"><a href="#GraphHTML.__init__-235"><span class="linenos">235</span></a> <span class="p">):</span>
|
</span><span id="GraphHTML.__init__-239"><a href="#GraphHTML.__init__-239"><span class="linenos">239</span></a> <span class="p">):</span>
|
||||||
</span><span id="GraphHTML.__init__-236"><a href="#GraphHTML.__init__-236"><span class="linenos">236</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span> <span class="o">=</span> <span class="n">imports</span>
|
</span><span id="GraphHTML.__init__-240"><a href="#GraphHTML.__init__-240"><span class="linenos">240</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">imports</span> <span class="o">=</span> <span class="n">imports</span>
|
||||||
</span><span id="GraphHTML.__init__-237"><a href="#GraphHTML.__init__-237"><span class="linenos">237</span></a>
|
</span><span id="GraphHTML.__init__-241"><a href="#GraphHTML.__init__-241"><span class="linenos">241</span></a>
|
||||||
</span><span id="GraphHTML.__init__-238"><a href="#GraphHTML.__init__-238"><span class="linenos">238</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
|
</span><span id="GraphHTML.__init__-242"><a href="#GraphHTML.__init__-242"><span class="linenos">242</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-239"><a href="#GraphHTML.__init__-239"><span class="linenos">239</span></a> <span class="s2">"height"</span><span class="p">:</span> <span class="s2">"500px"</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-243"><a href="#GraphHTML.__init__-243"><span class="linenos">243</span></a> <span class="s2">"height"</span><span class="p">:</span> <span class="s2">"500px"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-240"><a href="#GraphHTML.__init__-240"><span class="linenos">240</span></a> <span class="s2">"width"</span><span class="p">:</span> <span class="s2">"100%"</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-244"><a href="#GraphHTML.__init__-244"><span class="linenos">244</span></a> <span class="s2">"width"</span><span class="p">:</span> <span class="s2">"100%"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-241"><a href="#GraphHTML.__init__-241"><span class="linenos">241</span></a> <span class="s2">"layout"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML.__init__-245"><a href="#GraphHTML.__init__-245"><span class="linenos">245</span></a> <span class="s2">"layout"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-242"><a href="#GraphHTML.__init__-242"><span class="linenos">242</span></a> <span class="s2">"hierarchical"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML.__init__-246"><a href="#GraphHTML.__init__-246"><span class="linenos">246</span></a> <span class="s2">"hierarchical"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-243"><a href="#GraphHTML.__init__-243"><span class="linenos">243</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-247"><a href="#GraphHTML.__init__-247"><span class="linenos">247</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-244"><a href="#GraphHTML.__init__-244"><span class="linenos">244</span></a> <span class="s2">"nodeSpacing"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-248"><a href="#GraphHTML.__init__-248"><span class="linenos">248</span></a> <span class="s2">"nodeSpacing"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-245"><a href="#GraphHTML.__init__-245"><span class="linenos">245</span></a> <span class="s2">"sortMethod"</span><span class="p">:</span> <span class="s2">"directed"</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-249"><a href="#GraphHTML.__init__-249"><span class="linenos">249</span></a> <span class="s2">"sortMethod"</span><span class="p">:</span> <span class="s2">"directed"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-246"><a href="#GraphHTML.__init__-246"><span class="linenos">246</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML.__init__-250"><a href="#GraphHTML.__init__-250"><span class="linenos">250</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML.__init__-247"><a href="#GraphHTML.__init__-247"><span class="linenos">247</span></a> <span class="p">},</span>
|
|
||||||
</span><span id="GraphHTML.__init__-248"><a href="#GraphHTML.__init__-248"><span class="linenos">248</span></a> <span class="s2">"interaction"</span><span class="p">:</span> <span class="p">{</span>
|
|
||||||
</span><span id="GraphHTML.__init__-249"><a href="#GraphHTML.__init__-249"><span class="linenos">249</span></a> <span class="s2">"dragNodes"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
||||||
</span><span id="GraphHTML.__init__-250"><a href="#GraphHTML.__init__-250"><span class="linenos">250</span></a> <span class="s2">"selectable"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
||||||
</span><span id="GraphHTML.__init__-251"><a href="#GraphHTML.__init__-251"><span class="linenos">251</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML.__init__-251"><a href="#GraphHTML.__init__-251"><span class="linenos">251</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML.__init__-252"><a href="#GraphHTML.__init__-252"><span class="linenos">252</span></a> <span class="s2">"physics"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML.__init__-252"><a href="#GraphHTML.__init__-252"><span class="linenos">252</span></a> <span class="s2">"interaction"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-253"><a href="#GraphHTML.__init__-253"><span class="linenos">253</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-253"><a href="#GraphHTML.__init__-253"><span class="linenos">253</span></a> <span class="s2">"dragNodes"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-254"><a href="#GraphHTML.__init__-254"><span class="linenos">254</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML.__init__-254"><a href="#GraphHTML.__init__-254"><span class="linenos">254</span></a> <span class="s2">"selectable"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-255"><a href="#GraphHTML.__init__-255"><span class="linenos">255</span></a> <span class="s2">"edges"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML.__init__-255"><a href="#GraphHTML.__init__-255"><span class="linenos">255</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML.__init__-256"><a href="#GraphHTML.__init__-256"><span class="linenos">256</span></a> <span class="s2">"arrows"</span><span class="p">:</span> <span class="s2">"to"</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-256"><a href="#GraphHTML.__init__-256"><span class="linenos">256</span></a> <span class="s2">"physics"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-257"><a href="#GraphHTML.__init__-257"><span class="linenos">257</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML.__init__-257"><a href="#GraphHTML.__init__-257"><span class="linenos">257</span></a> <span class="s2">"enabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-258"><a href="#GraphHTML.__init__-258"><span class="linenos">258</span></a> <span class="s2">"nodes"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML.__init__-258"><a href="#GraphHTML.__init__-258"><span class="linenos">258</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML.__init__-259"><a href="#GraphHTML.__init__-259"><span class="linenos">259</span></a> <span class="s2">"font"</span><span class="p">:</span> <span class="s2">"20px monaco"</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-259"><a href="#GraphHTML.__init__-259"><span class="linenos">259</span></a> <span class="s2">"edges"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-260"><a href="#GraphHTML.__init__-260"><span class="linenos">260</span></a> <span class="s2">"shape"</span><span class="p">:</span> <span class="s2">"box"</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-260"><a href="#GraphHTML.__init__-260"><span class="linenos">260</span></a> <span class="s2">"arrows"</span><span class="p">:</span> <span class="s2">"to"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-261"><a href="#GraphHTML.__init__-261"><span class="linenos">261</span></a> <span class="s2">"widthConstraint"</span><span class="p">:</span> <span class="p">{</span>
|
</span><span id="GraphHTML.__init__-261"><a href="#GraphHTML.__init__-261"><span class="linenos">261</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML.__init__-262"><a href="#GraphHTML.__init__-262"><span class="linenos">262</span></a> <span class="s2">"maximum"</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
|
</span><span id="GraphHTML.__init__-262"><a href="#GraphHTML.__init__-262"><span class="linenos">262</span></a> <span class="s2">"nodes"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-263"><a href="#GraphHTML.__init__-263"><span class="linenos">263</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML.__init__-263"><a href="#GraphHTML.__init__-263"><span class="linenos">263</span></a> <span class="s2">"font"</span><span class="p">:</span> <span class="s2">"20px monaco"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-264"><a href="#GraphHTML.__init__-264"><span class="linenos">264</span></a> <span class="p">},</span>
|
</span><span id="GraphHTML.__init__-264"><a href="#GraphHTML.__init__-264"><span class="linenos">264</span></a> <span class="s2">"shape"</span><span class="p">:</span> <span class="s2">"box"</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-265"><a href="#GraphHTML.__init__-265"><span class="linenos">265</span></a> <span class="o">**</span><span class="p">(</span><span class="n">options</span> <span class="ow">or</span> <span class="p">{}),</span>
|
</span><span id="GraphHTML.__init__-265"><a href="#GraphHTML.__init__-265"><span class="linenos">265</span></a> <span class="s2">"widthConstraint"</span><span class="p">:</span> <span class="p">{</span>
|
||||||
</span><span id="GraphHTML.__init__-266"><a href="#GraphHTML.__init__-266"><span class="linenos">266</span></a> <span class="p">}</span>
|
</span><span id="GraphHTML.__init__-266"><a href="#GraphHTML.__init__-266"><span class="linenos">266</span></a> <span class="s2">"maximum"</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span>
|
||||||
</span><span id="GraphHTML.__init__-267"><a href="#GraphHTML.__init__-267"><span class="linenos">267</span></a>
|
</span><span id="GraphHTML.__init__-267"><a href="#GraphHTML.__init__-267"><span class="linenos">267</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML.__init__-268"><a href="#GraphHTML.__init__-268"><span class="linenos">268</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="n">nodes</span>
|
</span><span id="GraphHTML.__init__-268"><a href="#GraphHTML.__init__-268"><span class="linenos">268</span></a> <span class="p">},</span>
|
||||||
</span><span id="GraphHTML.__init__-269"><a href="#GraphHTML.__init__-269"><span class="linenos">269</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="n">edges</span>
|
</span><span id="GraphHTML.__init__-269"><a href="#GraphHTML.__init__-269"><span class="linenos">269</span></a> <span class="o">**</span><span class="p">(</span><span class="n">options</span> <span class="ow">or</span> <span class="p">{}),</span>
|
||||||
|
</span><span id="GraphHTML.__init__-270"><a href="#GraphHTML.__init__-270"><span class="linenos">270</span></a> <span class="p">}</span>
|
||||||
|
</span><span id="GraphHTML.__init__-271"><a href="#GraphHTML.__init__-271"><span class="linenos">271</span></a>
|
||||||
|
</span><span id="GraphHTML.__init__-272"><a href="#GraphHTML.__init__-272"><span class="linenos">272</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="n">nodes</span>
|
||||||
|
</span><span id="GraphHTML.__init__-273"><a href="#GraphHTML.__init__-273"><span class="linenos">273</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">edges</span> <span class="o">=</span> <span class="n">edges</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -585,7 +585,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">{'distinct', 'settings', 'distribute', 'sample', 'pivots', 'laterals', 'into', 'qualify', 'sort', 'cluster', 'limit', 'format', 'connect', 'windows', 'match', 'having', 'offset', 'kind', 'with', 'group', 'locks'}</span>
|
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'offset', 'distinct', 'into', 'match', 'limit', 'settings', 'laterals', 'distribute', 'qualify', 'cluster', 'format', 'group', 'kind', 'pivots', 'sample', 'connect', 'with', 'locks', 'having', 'sort', 'windows'}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -100,7 +100,7 @@
|
||||||
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">alias</span><span class="p">,</span> <span class="n">exp</span>
|
</span><span id="L-6"><a href="#L-6"><span class="linenos"> 6</span></a><span class="kn">from</span> <span class="nn">sqlglot</span> <span class="kn">import</span> <span class="n">alias</span><span class="p">,</span> <span class="n">exp</span>
|
||||||
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">sqlglot.dialects.dialect</span> <span class="kn">import</span> <span class="n">Dialect</span><span class="p">,</span> <span class="n">DialectType</span>
|
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">sqlglot.dialects.dialect</span> <span class="kn">import</span> <span class="n">Dialect</span><span class="p">,</span> <span class="n">DialectType</span>
|
||||||
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a><span class="kn">from</span> <span class="nn">sqlglot.errors</span> <span class="kn">import</span> <span class="n">OptimizeError</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.errors</span> <span class="kn">import</span> <span class="n">OptimizeError</span>
|
||||||
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">from</span> <span class="nn">sqlglot.helper</span> <span class="kn">import</span> <span class="n">seq_get</span>
|
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a><span class="kn">from</span> <span class="nn">sqlglot.helper</span> <span class="kn">import</span> <span class="n">seq_get</span><span class="p">,</span> <span class="n">SingleValuedMapping</span>
|
||||||
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.scope</span> <span class="kn">import</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">build_scope</span><span class="p">,</span> <span class="n">traverse_scope</span><span class="p">,</span> <span class="n">walk_in_scope</span>
|
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.scope</span> <span class="kn">import</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">build_scope</span><span class="p">,</span> <span class="n">traverse_scope</span><span class="p">,</span> <span class="n">walk_in_scope</span>
|
||||||
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.simplify</span> <span class="kn">import</span> <span class="n">simplify_parens</span>
|
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">from</span> <span class="nn">sqlglot.optimizer.simplify</span> <span class="kn">import</span> <span class="n">simplify_parens</span>
|
||||||
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span> <span class="nn">sqlglot.schema</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">ensure_schema</span>
|
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span> <span class="nn">sqlglot.schema</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">ensure_schema</span>
|
||||||
|
@ -680,8 +680,8 @@
|
||||||
</span><span id="L-586"><a href="#L-586"><span class="linenos">586</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">scope</span><span class="p">:</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">schema</span><span class="p">:</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">infer_schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
|
</span><span id="L-586"><a href="#L-586"><span class="linenos">586</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">scope</span><span class="p">:</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">schema</span><span class="p">:</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">infer_schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
|
||||||
</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span>
|
</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span>
|
||||||
</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">=</span> <span class="n">schema</span>
|
</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">=</span> <span class="n">schema</span>
|
||||||
</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</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="nb">str</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="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span>
|
</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</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="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span>
|
||||||
</span><span id="L-590"><a href="#L-590"><span class="linenos">590</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_unambiguous_columns</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="nb">str</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 id="L-590"><a href="#L-590"><span class="linenos">590</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_unambiguous_columns</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">Mapping</span><span class="p">[</span><span class="nb">str</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 id="L-591"><a href="#L-591"><span class="linenos">591</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</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">Set</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 id="L-591"><a href="#L-591"><span class="linenos">591</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</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">Set</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 id="L-592"><a href="#L-592"><span class="linenos">592</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_infer_schema</span> <span class="o">=</span> <span class="n">infer_schema</span>
|
</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_infer_schema</span> <span class="o">=</span> <span class="n">infer_schema</span>
|
||||||
</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a>
|
</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a>
|
||||||
|
@ -734,7 +734,7 @@
|
||||||
</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a> <span class="p">}</span>
|
</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a> <span class="p">}</span>
|
||||||
</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</span>
|
</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</span>
|
||||||
</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a>
|
</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a>
|
||||||
</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a> <span class="k">def</span> <span class="nf">get_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a> <span class="k">def</span> <span class="nf">get_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="L-644"><a href="#L-644"><span class="linenos">644</span></a><span class="w"> </span><span class="sd">"""Resolve the source columns for a given source `name`."""</span>
|
</span><span id="L-644"><a href="#L-644"><span class="linenos">644</span></a><span class="w"> </span><span class="sd">"""Resolve the source columns for a given source `name`."""</span>
|
||||||
</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">:</span>
|
</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">:</span>
|
||||||
</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown table: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown table: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||||
|
@ -764,7 +764,7 @@
|
||||||
</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="p">]</span>
|
</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="p">]</span>
|
||||||
</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="k">return</span> <span class="n">columns</span>
|
</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="k">return</span> <span class="n">columns</span>
|
||||||
</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a>
|
</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a>
|
||||||
</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="k">def</span> <span class="nf">_get_all_source_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">Dict</span><span class="p">[</span><span class="nb">str</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="nb">str</span><span class="p">]]:</span>
|
</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="k">def</span> <span class="nf">_get_all_source_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">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
|
||||||
</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
|
</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
|
||||||
</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
|
</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
|
||||||
|
@ -775,8 +775,8 @@
|
||||||
</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
|
</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
|
||||||
</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a>
|
</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a>
|
||||||
</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
|
</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
|
||||||
</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</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">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
|
</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</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">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
|
||||||
</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a> <span class="p">)</span> <span class="o">-></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="nb">str</span><span class="p">]:</span>
|
</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
|
</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
|
||||||
</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a>
|
</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a>
|
||||||
|
@ -792,36 +792,25 @@
|
||||||
</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
||||||
</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a>
|
</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a>
|
||||||
</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">first_columns</span><span class="p">)}</span>
|
</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a>
|
||||||
</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
|
</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">source_columns_pairs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
||||||
</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a>
|
</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a> <span class="c1"># Performance optimization - avoid copying first_columns if there is only one table.</span>
|
||||||
</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a> <span class="k">return</span> <span class="n">SingleValuedMapping</span><span class="p">(</span><span class="n">first_columns</span><span class="p">,</span> <span class="n">first_table</span><span class="p">)</span>
|
||||||
</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a>
|
||||||
</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_columns</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
|
</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">first_columns</span><span class="p">}</span>
|
||||||
</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
|
||||||
</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a>
|
</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a>
|
||||||
</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
|
</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
||||||
</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
||||||
</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
|
</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="n">all_columns</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
|
||||||
</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
|
</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
||||||
</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a>
|
</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a>
|
||||||
</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
|
</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
|
||||||
</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a>
|
</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||||
</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a> <span class="nd">@staticmethod</span>
|
</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
|
||||||
</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="k">def</span> <span class="nf">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
|
||||||
</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a>
|
||||||
</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a><span class="sd"> Find the unique columns in a list of columns.</span>
|
</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
|
||||||
</span><span id="L-720"><a href="#L-720"><span class="linenos">720</span></a>
|
|
||||||
</span><span id="L-721"><a href="#L-721"><span class="linenos">721</span></a><span class="sd"> Example:</span>
|
|
||||||
</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a><span class="sd"> >>> sorted(Resolver._find_unique_columns(["a", "b", "b", "c"]))</span>
|
|
||||||
</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a><span class="sd"> ['a', 'c']</span>
|
|
||||||
</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a>
|
|
||||||
</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a><span class="sd"> This is necessary because duplicate column names are ambiguous.</span>
|
|
||||||
</span><span id="L-726"><a href="#L-726"><span class="linenos">726</span></a><span class="sd"> """</span>
|
|
||||||
</span><span id="L-727"><a href="#L-727"><span class="linenos">727</span></a> <span class="n">counts</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="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
|
|
||||||
</span><span id="L-728"><a href="#L-728"><span class="linenos">728</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">:</span>
|
|
||||||
</span><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="n">counts</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
||||||
</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a> <span class="k">return</span> <span class="p">{</span><span class="n">column</span> <span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">counts</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">}</span>
|
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -1157,8 +1146,8 @@ know what you're doing!</li>
|
||||||
</span><span id="Resolver-587"><a href="#Resolver-587"><span class="linenos">587</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">scope</span><span class="p">:</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">schema</span><span class="p">:</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">infer_schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
|
</span><span id="Resolver-587"><a href="#Resolver-587"><span class="linenos">587</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">scope</span><span class="p">:</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">schema</span><span class="p">:</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">infer_schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
|
||||||
</span><span id="Resolver-588"><a href="#Resolver-588"><span class="linenos">588</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span>
|
</span><span id="Resolver-588"><a href="#Resolver-588"><span class="linenos">588</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span>
|
||||||
</span><span id="Resolver-589"><a href="#Resolver-589"><span class="linenos">589</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">=</span> <span class="n">schema</span>
|
</span><span id="Resolver-589"><a href="#Resolver-589"><span class="linenos">589</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">=</span> <span class="n">schema</span>
|
||||||
</span><span id="Resolver-590"><a href="#Resolver-590"><span class="linenos">590</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</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="nb">str</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="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span>
|
</span><span id="Resolver-590"><a href="#Resolver-590"><span class="linenos">590</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</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="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span>
|
||||||
</span><span id="Resolver-591"><a href="#Resolver-591"><span class="linenos">591</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_unambiguous_columns</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="nb">str</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 id="Resolver-591"><a href="#Resolver-591"><span class="linenos">591</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_unambiguous_columns</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">Mapping</span><span class="p">[</span><span class="nb">str</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 id="Resolver-592"><a href="#Resolver-592"><span class="linenos">592</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</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">Set</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 id="Resolver-592"><a href="#Resolver-592"><span class="linenos">592</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</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">Set</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 id="Resolver-593"><a href="#Resolver-593"><span class="linenos">593</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_infer_schema</span> <span class="o">=</span> <span class="n">infer_schema</span>
|
</span><span id="Resolver-593"><a href="#Resolver-593"><span class="linenos">593</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_infer_schema</span> <span class="o">=</span> <span class="n">infer_schema</span>
|
||||||
</span><span id="Resolver-594"><a href="#Resolver-594"><span class="linenos">594</span></a>
|
</span><span id="Resolver-594"><a href="#Resolver-594"><span class="linenos">594</span></a>
|
||||||
|
@ -1211,7 +1200,7 @@ know what you're doing!</li>
|
||||||
</span><span id="Resolver-641"><a href="#Resolver-641"><span class="linenos">641</span></a> <span class="p">}</span>
|
</span><span id="Resolver-641"><a href="#Resolver-641"><span class="linenos">641</span></a> <span class="p">}</span>
|
||||||
</span><span id="Resolver-642"><a href="#Resolver-642"><span class="linenos">642</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</span>
|
</span><span id="Resolver-642"><a href="#Resolver-642"><span class="linenos">642</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</span>
|
||||||
</span><span id="Resolver-643"><a href="#Resolver-643"><span class="linenos">643</span></a>
|
</span><span id="Resolver-643"><a href="#Resolver-643"><span class="linenos">643</span></a>
|
||||||
</span><span id="Resolver-644"><a href="#Resolver-644"><span class="linenos">644</span></a> <span class="k">def</span> <span class="nf">get_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
</span><span id="Resolver-644"><a href="#Resolver-644"><span class="linenos">644</span></a> <span class="k">def</span> <span class="nf">get_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="Resolver-645"><a href="#Resolver-645"><span class="linenos">645</span></a><span class="w"> </span><span class="sd">"""Resolve the source columns for a given source `name`."""</span>
|
</span><span id="Resolver-645"><a href="#Resolver-645"><span class="linenos">645</span></a><span class="w"> </span><span class="sd">"""Resolve the source columns for a given source `name`."""</span>
|
||||||
</span><span id="Resolver-646"><a href="#Resolver-646"><span class="linenos">646</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">:</span>
|
</span><span id="Resolver-646"><a href="#Resolver-646"><span class="linenos">646</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">:</span>
|
||||||
</span><span id="Resolver-647"><a href="#Resolver-647"><span class="linenos">647</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown table: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
</span><span id="Resolver-647"><a href="#Resolver-647"><span class="linenos">647</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown table: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||||
|
@ -1241,7 +1230,7 @@ know what you're doing!</li>
|
||||||
</span><span id="Resolver-671"><a href="#Resolver-671"><span class="linenos">671</span></a> <span class="p">]</span>
|
</span><span id="Resolver-671"><a href="#Resolver-671"><span class="linenos">671</span></a> <span class="p">]</span>
|
||||||
</span><span id="Resolver-672"><a href="#Resolver-672"><span class="linenos">672</span></a> <span class="k">return</span> <span class="n">columns</span>
|
</span><span id="Resolver-672"><a href="#Resolver-672"><span class="linenos">672</span></a> <span class="k">return</span> <span class="n">columns</span>
|
||||||
</span><span id="Resolver-673"><a href="#Resolver-673"><span class="linenos">673</span></a>
|
</span><span id="Resolver-673"><a href="#Resolver-673"><span class="linenos">673</span></a>
|
||||||
</span><span id="Resolver-674"><a href="#Resolver-674"><span class="linenos">674</span></a> <span class="k">def</span> <span class="nf">_get_all_source_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">Dict</span><span class="p">[</span><span class="nb">str</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="nb">str</span><span class="p">]]:</span>
|
</span><span id="Resolver-674"><a href="#Resolver-674"><span class="linenos">674</span></a> <span class="k">def</span> <span class="nf">_get_all_source_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">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
|
||||||
</span><span id="Resolver-675"><a href="#Resolver-675"><span class="linenos">675</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
</span><span id="Resolver-675"><a href="#Resolver-675"><span class="linenos">675</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
</span><span id="Resolver-676"><a href="#Resolver-676"><span class="linenos">676</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
|
</span><span id="Resolver-676"><a href="#Resolver-676"><span class="linenos">676</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span> <span class="o">=</span> <span class="p">{</span>
|
||||||
</span><span id="Resolver-677"><a href="#Resolver-677"><span class="linenos">677</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
|
</span><span id="Resolver-677"><a href="#Resolver-677"><span class="linenos">677</span></a> <span class="n">source_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_source_columns</span><span class="p">(</span><span class="n">source_name</span><span class="p">)</span>
|
||||||
|
@ -1252,8 +1241,8 @@ know what you're doing!</li>
|
||||||
</span><span id="Resolver-682"><a href="#Resolver-682"><span class="linenos">682</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
|
</span><span id="Resolver-682"><a href="#Resolver-682"><span class="linenos">682</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</span>
|
||||||
</span><span id="Resolver-683"><a href="#Resolver-683"><span class="linenos">683</span></a>
|
</span><span id="Resolver-683"><a href="#Resolver-683"><span class="linenos">683</span></a>
|
||||||
</span><span id="Resolver-684"><a href="#Resolver-684"><span class="linenos">684</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
|
</span><span id="Resolver-684"><a href="#Resolver-684"><span class="linenos">684</span></a> <span class="k">def</span> <span class="nf">_get_unambiguous_columns</span><span class="p">(</span>
|
||||||
</span><span id="Resolver-685"><a href="#Resolver-685"><span class="linenos">685</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</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">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
|
</span><span id="Resolver-685"><a href="#Resolver-685"><span class="linenos">685</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">source_columns</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">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
|
||||||
</span><span id="Resolver-686"><a href="#Resolver-686"><span class="linenos">686</span></a> <span class="p">)</span> <span class="o">-></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="nb">str</span><span class="p">]:</span>
|
</span><span id="Resolver-686"><a href="#Resolver-686"><span class="linenos">686</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="Resolver-687"><a href="#Resolver-687"><span class="linenos">687</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="Resolver-687"><a href="#Resolver-687"><span class="linenos">687</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="Resolver-688"><a href="#Resolver-688"><span class="linenos">688</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
|
</span><span id="Resolver-688"><a href="#Resolver-688"><span class="linenos">688</span></a><span class="sd"> Find all the unambiguous columns in sources.</span>
|
||||||
</span><span id="Resolver-689"><a href="#Resolver-689"><span class="linenos">689</span></a>
|
</span><span id="Resolver-689"><a href="#Resolver-689"><span class="linenos">689</span></a>
|
||||||
|
@ -1269,36 +1258,25 @@ know what you're doing!</li>
|
||||||
</span><span id="Resolver-699"><a href="#Resolver-699"><span class="linenos">699</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
</span><span id="Resolver-699"><a href="#Resolver-699"><span class="linenos">699</span></a> <span class="n">source_columns_pairs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">source_columns</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
||||||
</span><span id="Resolver-700"><a href="#Resolver-700"><span class="linenos">700</span></a>
|
</span><span id="Resolver-700"><a href="#Resolver-700"><span class="linenos">700</span></a>
|
||||||
</span><span id="Resolver-701"><a href="#Resolver-701"><span class="linenos">701</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
</span><span id="Resolver-701"><a href="#Resolver-701"><span class="linenos">701</span></a> <span class="n">first_table</span><span class="p">,</span> <span class="n">first_columns</span> <span class="o">=</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||||
</span><span id="Resolver-702"><a href="#Resolver-702"><span class="linenos">702</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">first_columns</span><span class="p">)}</span>
|
</span><span id="Resolver-702"><a href="#Resolver-702"><span class="linenos">702</span></a>
|
||||||
</span><span id="Resolver-703"><a href="#Resolver-703"><span class="linenos">703</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
|
</span><span id="Resolver-703"><a href="#Resolver-703"><span class="linenos">703</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">source_columns_pairs</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
||||||
</span><span id="Resolver-704"><a href="#Resolver-704"><span class="linenos">704</span></a>
|
</span><span id="Resolver-704"><a href="#Resolver-704"><span class="linenos">704</span></a> <span class="c1"># Performance optimization - avoid copying first_columns if there is only one table.</span>
|
||||||
</span><span id="Resolver-705"><a href="#Resolver-705"><span class="linenos">705</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
</span><span id="Resolver-705"><a href="#Resolver-705"><span class="linenos">705</span></a> <span class="k">return</span> <span class="n">SingleValuedMapping</span><span class="p">(</span><span class="n">first_columns</span><span class="p">,</span> <span class="n">first_table</span><span class="p">)</span>
|
||||||
</span><span id="Resolver-706"><a href="#Resolver-706"><span class="linenos">706</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
</span><span id="Resolver-706"><a href="#Resolver-706"><span class="linenos">706</span></a>
|
||||||
</span><span id="Resolver-707"><a href="#Resolver-707"><span class="linenos">707</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">all_columns</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
|
</span><span id="Resolver-707"><a href="#Resolver-707"><span class="linenos">707</span></a> <span class="n">unambiguous_columns</span> <span class="o">=</span> <span class="p">{</span><span class="n">col</span><span class="p">:</span> <span class="n">first_table</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">first_columns</span><span class="p">}</span>
|
||||||
</span><span id="Resolver-708"><a href="#Resolver-708"><span class="linenos">708</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
</span><span id="Resolver-708"><a href="#Resolver-708"><span class="linenos">708</span></a> <span class="n">all_columns</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">unambiguous_columns</span><span class="p">)</span>
|
||||||
</span><span id="Resolver-709"><a href="#Resolver-709"><span class="linenos">709</span></a>
|
</span><span id="Resolver-709"><a href="#Resolver-709"><span class="linenos">709</span></a>
|
||||||
</span><span id="Resolver-710"><a href="#Resolver-710"><span class="linenos">710</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
|
</span><span id="Resolver-710"><a href="#Resolver-710"><span class="linenos">710</span></a> <span class="k">for</span> <span class="n">table</span><span class="p">,</span> <span class="n">columns</span> <span class="ow">in</span> <span class="n">source_columns_pairs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
||||||
</span><span id="Resolver-711"><a href="#Resolver-711"><span class="linenos">711</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
</span><span id="Resolver-711"><a href="#Resolver-711"><span class="linenos">711</span></a> <span class="n">unique</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
||||||
</span><span id="Resolver-712"><a href="#Resolver-712"><span class="linenos">712</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
|
</span><span id="Resolver-712"><a href="#Resolver-712"><span class="linenos">712</span></a> <span class="n">ambiguous</span> <span class="o">=</span> <span class="n">all_columns</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">unique</span><span class="p">)</span>
|
||||||
</span><span id="Resolver-713"><a href="#Resolver-713"><span class="linenos">713</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
|
</span><span id="Resolver-713"><a href="#Resolver-713"><span class="linenos">713</span></a> <span class="n">all_columns</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
|
||||||
</span><span id="Resolver-714"><a href="#Resolver-714"><span class="linenos">714</span></a>
|
</span><span id="Resolver-714"><a href="#Resolver-714"><span class="linenos">714</span></a>
|
||||||
</span><span id="Resolver-715"><a href="#Resolver-715"><span class="linenos">715</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
|
</span><span id="Resolver-715"><a href="#Resolver-715"><span class="linenos">715</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">ambiguous</span><span class="p">:</span>
|
||||||
</span><span id="Resolver-716"><a href="#Resolver-716"><span class="linenos">716</span></a>
|
</span><span id="Resolver-716"><a href="#Resolver-716"><span class="linenos">716</span></a> <span class="n">unambiguous_columns</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||||
</span><span id="Resolver-717"><a href="#Resolver-717"><span class="linenos">717</span></a> <span class="nd">@staticmethod</span>
|
</span><span id="Resolver-717"><a href="#Resolver-717"><span class="linenos">717</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">unique</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">ambiguous</span><span class="p">):</span>
|
||||||
</span><span id="Resolver-718"><a href="#Resolver-718"><span class="linenos">718</span></a> <span class="k">def</span> <span class="nf">_find_unique_columns</span><span class="p">(</span><span class="n">columns</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Set</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
</span><span id="Resolver-718"><a href="#Resolver-718"><span class="linenos">718</span></a> <span class="n">unambiguous_columns</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span>
|
||||||
</span><span id="Resolver-719"><a href="#Resolver-719"><span class="linenos">719</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="Resolver-719"><a href="#Resolver-719"><span class="linenos">719</span></a>
|
||||||
</span><span id="Resolver-720"><a href="#Resolver-720"><span class="linenos">720</span></a><span class="sd"> Find the unique columns in a list of columns.</span>
|
</span><span id="Resolver-720"><a href="#Resolver-720"><span class="linenos">720</span></a> <span class="k">return</span> <span class="n">unambiguous_columns</span>
|
||||||
</span><span id="Resolver-721"><a href="#Resolver-721"><span class="linenos">721</span></a>
|
|
||||||
</span><span id="Resolver-722"><a href="#Resolver-722"><span class="linenos">722</span></a><span class="sd"> Example:</span>
|
|
||||||
</span><span id="Resolver-723"><a href="#Resolver-723"><span class="linenos">723</span></a><span class="sd"> >>> sorted(Resolver._find_unique_columns(["a", "b", "b", "c"]))</span>
|
|
||||||
</span><span id="Resolver-724"><a href="#Resolver-724"><span class="linenos">724</span></a><span class="sd"> ['a', 'c']</span>
|
|
||||||
</span><span id="Resolver-725"><a href="#Resolver-725"><span class="linenos">725</span></a>
|
|
||||||
</span><span id="Resolver-726"><a href="#Resolver-726"><span class="linenos">726</span></a><span class="sd"> This is necessary because duplicate column names are ambiguous.</span>
|
|
||||||
</span><span id="Resolver-727"><a href="#Resolver-727"><span class="linenos">727</span></a><span class="sd"> """</span>
|
|
||||||
</span><span id="Resolver-728"><a href="#Resolver-728"><span class="linenos">728</span></a> <span class="n">counts</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="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
|
|
||||||
</span><span id="Resolver-729"><a href="#Resolver-729"><span class="linenos">729</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">:</span>
|
|
||||||
</span><span id="Resolver-730"><a href="#Resolver-730"><span class="linenos">730</span></a> <span class="n">counts</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
||||||
</span><span id="Resolver-731"><a href="#Resolver-731"><span class="linenos">731</span></a> <span class="k">return</span> <span class="p">{</span><span class="n">column</span> <span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">count</span> <span class="ow">in</span> <span class="n">counts</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">}</span>
|
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
@ -1321,8 +1299,8 @@ know what you're doing!</li>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Resolver.__init__-587"><a href="#Resolver.__init__-587"><span class="linenos">587</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">scope</span><span class="p">:</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">schema</span><span class="p">:</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">infer_schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Resolver.__init__-587"><a href="#Resolver.__init__-587"><span class="linenos">587</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">scope</span><span class="p">:</span> <span class="n">Scope</span><span class="p">,</span> <span class="n">schema</span><span class="p">:</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">infer_schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
|
||||||
</span><span id="Resolver.__init__-588"><a href="#Resolver.__init__-588"><span class="linenos">588</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span>
|
</span><span id="Resolver.__init__-588"><a href="#Resolver.__init__-588"><span class="linenos">588</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span> <span class="o">=</span> <span class="n">scope</span>
|
||||||
</span><span id="Resolver.__init__-589"><a href="#Resolver.__init__-589"><span class="linenos">589</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">=</span> <span class="n">schema</span>
|
</span><span id="Resolver.__init__-589"><a href="#Resolver.__init__-589"><span class="linenos">589</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">schema</span> <span class="o">=</span> <span class="n">schema</span>
|
||||||
</span><span id="Resolver.__init__-590"><a href="#Resolver.__init__-590"><span class="linenos">590</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</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="nb">str</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="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span>
|
</span><span id="Resolver.__init__-590"><a href="#Resolver.__init__-590"><span class="linenos">590</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_source_columns</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="nb">str</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span>
|
||||||
</span><span id="Resolver.__init__-591"><a href="#Resolver.__init__-591"><span class="linenos">591</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_unambiguous_columns</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="nb">str</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 id="Resolver.__init__-591"><a href="#Resolver.__init__-591"><span class="linenos">591</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_unambiguous_columns</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">Mapping</span><span class="p">[</span><span class="nb">str</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 id="Resolver.__init__-592"><a href="#Resolver.__init__-592"><span class="linenos">592</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</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">Set</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 id="Resolver.__init__-592"><a href="#Resolver.__init__-592"><span class="linenos">592</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_all_columns</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">Set</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 id="Resolver.__init__-593"><a href="#Resolver.__init__-593"><span class="linenos">593</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_infer_schema</span> <span class="o">=</span> <span class="n">infer_schema</span>
|
</span><span id="Resolver.__init__-593"><a href="#Resolver.__init__-593"><span class="linenos">593</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_infer_schema</span> <span class="o">=</span> <span class="n">infer_schema</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
@ -1453,13 +1431,13 @@ know what you're doing!</li>
|
||||||
<div class="attr function">
|
<div class="attr function">
|
||||||
|
|
||||||
<span class="def">def</span>
|
<span class="def">def</span>
|
||||||
<span class="name">get_source_columns</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">name</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">only_visible</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">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
|
<span class="name">get_source_columns</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="n">name</span><span class="p">:</span> <span class="nb">str</span>, </span><span class="param"><span class="n">only_visible</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">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Resolver.get_source_columns-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Resolver.get_source_columns-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<a class="headerlink" href="#Resolver.get_source_columns"></a>
|
<a class="headerlink" href="#Resolver.get_source_columns"></a>
|
||||||
<div class="pdoc-code codehilite"><pre><span></span><span id="Resolver.get_source_columns-644"><a href="#Resolver.get_source_columns-644"><span class="linenos">644</span></a> <span class="k">def</span> <span class="nf">get_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
<div class="pdoc-code codehilite"><pre><span></span><span id="Resolver.get_source_columns-644"><a href="#Resolver.get_source_columns-644"><span class="linenos">644</span></a> <span class="k">def</span> <span class="nf">get_source_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="Resolver.get_source_columns-645"><a href="#Resolver.get_source_columns-645"><span class="linenos">645</span></a><span class="w"> </span><span class="sd">"""Resolve the source columns for a given source `name`."""</span>
|
</span><span id="Resolver.get_source_columns-645"><a href="#Resolver.get_source_columns-645"><span class="linenos">645</span></a><span class="w"> </span><span class="sd">"""Resolve the source columns for a given source `name`."""</span>
|
||||||
</span><span id="Resolver.get_source_columns-646"><a href="#Resolver.get_source_columns-646"><span class="linenos">646</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">:</span>
|
</span><span id="Resolver.get_source_columns-646"><a href="#Resolver.get_source_columns-646"><span class="linenos">646</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">:</span>
|
||||||
</span><span id="Resolver.get_source_columns-647"><a href="#Resolver.get_source_columns-647"><span class="linenos">647</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown table: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
</span><span id="Resolver.get_source_columns-647"><a href="#Resolver.get_source_columns-647"><span class="linenos">647</span></a> <span class="k">raise</span> <span class="n">OptimizeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown table: </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||||
|
|
|
@ -2546,7 +2546,7 @@ prefix are statically known.</p>
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">DATETRUNC_COMPARISONS</span> =
|
<span class="name">DATETRUNC_COMPARISONS</span> =
|
||||||
<input id="DATETRUNC_COMPARISONS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
<input id="DATETRUNC_COMPARISONS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||||
<label class="view-value-button pdoc-button" for="DATETRUNC_COMPARISONS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#GTE">sqlglot.expressions.GTE</a>'>, <class '<a href="../expressions.html#LTE">sqlglot.expressions.LTE</a>'>, <class '<a href="../expressions.html#EQ">sqlglot.expressions.EQ</a>'>, <class '<a href="../expressions.html#GT">sqlglot.expressions.GT</a>'>, <class '<a href="../expressions.html#LT">sqlglot.expressions.LT</a>'>, <class '<a href="../expressions.html#In">sqlglot.expressions.In</a>'>, <class '<a href="../expressions.html#NEQ">sqlglot.expressions.NEQ</a>'>}</span>
|
<label class="view-value-button pdoc-button" for="DATETRUNC_COMPARISONS-view-value"></label><span class="default_value">{<class '<a href="../expressions.html#GTE">sqlglot.expressions.GTE</a>'>, <class '<a href="../expressions.html#EQ">sqlglot.expressions.EQ</a>'>, <class '<a href="../expressions.html#LT">sqlglot.expressions.LT</a>'>, <class '<a href="../expressions.html#NEQ">sqlglot.expressions.NEQ</a>'>, <class '<a href="../expressions.html#GT">sqlglot.expressions.GT</a>'>, <class '<a href="../expressions.html#In">sqlglot.expressions.In</a>'>, <class '<a href="../expressions.html#LTE">sqlglot.expressions.LTE</a>'>}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -2626,7 +2626,7 @@ prefix are statically known.</p>
|
||||||
<section id="JOINS">
|
<section id="JOINS">
|
||||||
<div class="attr variable">
|
<div class="attr variable">
|
||||||
<span class="name">JOINS</span> =
|
<span class="name">JOINS</span> =
|
||||||
<span class="default_value">{('', 'INNER'), ('RIGHT', 'OUTER'), ('RIGHT', ''), ('', '')}</span>
|
<span class="default_value">{('', 'INNER'), ('RIGHT', ''), ('RIGHT', 'OUTER'), ('', '')}</span>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
19125
docs/sqlglot/parser.html
19125
docs/sqlglot/parser.html
File diff suppressed because one or more lines are too long
|
@ -221,7 +221,7 @@
|
||||||
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||||
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="n">normalize</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">bool</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="n">normalize</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">bool</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="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a><span class="sd"> Get the column names for a table.</span>
|
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a><span class="sd"> Get the column names for a table.</span>
|
||||||
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a>
|
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a>
|
||||||
|
@ -232,7 +232,7 @@
|
||||||
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a><span class="sd"> normalize: whether to normalize identifiers according to the dialect of interest.</span>
|
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a><span class="sd"> normalize: whether to normalize identifiers according to the dialect of interest.</span>
|
||||||
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a>
|
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a>
|
||||||
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> Returns:</span>
|
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a><span class="sd"> Returns:</span>
|
||||||
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="sd"> The list of column names.</span>
|
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a><span class="sd"> The sequence of column names.</span>
|
||||||
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="sd"> """</span>
|
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a><span class="sd"> """</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="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
|
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
|
||||||
|
@ -789,7 +789,7 @@
|
||||||
</span><span id="Schema-50"><a href="#Schema-50"><span class="linenos"> 50</span></a> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="Schema-50"><a href="#Schema-50"><span class="linenos"> 50</span></a> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="Schema-51"><a href="#Schema-51"><span class="linenos"> 51</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
</span><span id="Schema-51"><a href="#Schema-51"><span class="linenos"> 51</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||||
</span><span id="Schema-52"><a href="#Schema-52"><span class="linenos"> 52</span></a> <span class="n">normalize</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
</span><span id="Schema-52"><a href="#Schema-52"><span class="linenos"> 52</span></a> <span class="n">normalize</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||||
</span><span id="Schema-53"><a href="#Schema-53"><span class="linenos"> 53</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
</span><span id="Schema-53"><a href="#Schema-53"><span class="linenos"> 53</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="Schema-54"><a href="#Schema-54"><span class="linenos"> 54</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="Schema-54"><a href="#Schema-54"><span class="linenos"> 54</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="Schema-55"><a href="#Schema-55"><span class="linenos"> 55</span></a><span class="sd"> Get the column names for a table.</span>
|
</span><span id="Schema-55"><a href="#Schema-55"><span class="linenos"> 55</span></a><span class="sd"> Get the column names for a table.</span>
|
||||||
</span><span id="Schema-56"><a href="#Schema-56"><span class="linenos"> 56</span></a>
|
</span><span id="Schema-56"><a href="#Schema-56"><span class="linenos"> 56</span></a>
|
||||||
|
@ -800,7 +800,7 @@
|
||||||
</span><span id="Schema-61"><a href="#Schema-61"><span class="linenos"> 61</span></a><span class="sd"> normalize: whether to normalize identifiers according to the dialect of interest.</span>
|
</span><span id="Schema-61"><a href="#Schema-61"><span class="linenos"> 61</span></a><span class="sd"> normalize: whether to normalize identifiers according to the dialect of interest.</span>
|
||||||
</span><span id="Schema-62"><a href="#Schema-62"><span class="linenos"> 62</span></a>
|
</span><span id="Schema-62"><a href="#Schema-62"><span class="linenos"> 62</span></a>
|
||||||
</span><span id="Schema-63"><a href="#Schema-63"><span class="linenos"> 63</span></a><span class="sd"> Returns:</span>
|
</span><span id="Schema-63"><a href="#Schema-63"><span class="linenos"> 63</span></a><span class="sd"> Returns:</span>
|
||||||
</span><span id="Schema-64"><a href="#Schema-64"><span class="linenos"> 64</span></a><span class="sd"> The list of column names.</span>
|
</span><span id="Schema-64"><a href="#Schema-64"><span class="linenos"> 64</span></a><span class="sd"> The sequence of column names.</span>
|
||||||
</span><span id="Schema-65"><a href="#Schema-65"><span class="linenos"> 65</span></a><span class="sd"> """</span>
|
</span><span id="Schema-65"><a href="#Schema-65"><span class="linenos"> 65</span></a><span class="sd"> """</span>
|
||||||
</span><span id="Schema-66"><a href="#Schema-66"><span class="linenos"> 66</span></a>
|
</span><span id="Schema-66"><a href="#Schema-66"><span class="linenos"> 66</span></a>
|
||||||
</span><span id="Schema-67"><a href="#Schema-67"><span class="linenos"> 67</span></a> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
|
</span><span id="Schema-67"><a href="#Schema-67"><span class="linenos"> 67</span></a> <span class="nd">@abc</span><span class="o">.</span><span class="n">abstractmethod</span>
|
||||||
|
@ -932,7 +932,7 @@ The added table must have the necessary number of qualifiers in its path to matc
|
||||||
<div class="decorator">@abc.abstractmethod</div>
|
<div class="decorator">@abc.abstractmethod</div>
|
||||||
|
|
||||||
<span class="def">def</span>
|
<span class="def">def</span>
|
||||||
<span class="name">column_names</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="n"><a href="expressions.html#Table">sqlglot.expressions.Table</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">dialect</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"><a href="dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></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">normalize</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
|
<span class="name">column_names</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="n"><a href="expressions.html#Table">sqlglot.expressions.Table</a></span> <span class="o">|</span> <span class="nb">str</span>,</span><span class="param"> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>,</span><span class="param"> <span class="n">dialect</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"><a href="dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></span><span class="p">,</span> <span class="n">Type</span><span class="p">[</span><span class="n"><a href="dialects/dialect.html#Dialect">sqlglot.dialects.dialect.Dialect</a></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">normalize</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></span><span class="return-annotation">) -> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>:</span></span>
|
||||||
|
|
||||||
<label class="view-source-button" for="Schema.column_names-view-source"><span>View Source</span></label>
|
<label class="view-source-button" for="Schema.column_names-view-source"><span>View Source</span></label>
|
||||||
|
|
||||||
|
@ -945,7 +945,7 @@ The added table must have the necessary number of qualifiers in its path to matc
|
||||||
</span><span id="Schema.column_names-50"><a href="#Schema.column_names-50"><span class="linenos">50</span></a> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
</span><span id="Schema.column_names-50"><a href="#Schema.column_names-50"><span class="linenos">50</span></a> <span class="n">only_visible</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||||
</span><span id="Schema.column_names-51"><a href="#Schema.column_names-51"><span class="linenos">51</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
</span><span id="Schema.column_names-51"><a href="#Schema.column_names-51"><span class="linenos">51</span></a> <span class="n">dialect</span><span class="p">:</span> <span class="n">DialectType</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||||
</span><span id="Schema.column_names-52"><a href="#Schema.column_names-52"><span class="linenos">52</span></a> <span class="n">normalize</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
</span><span id="Schema.column_names-52"><a href="#Schema.column_names-52"><span class="linenos">52</span></a> <span class="n">normalize</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||||
</span><span id="Schema.column_names-53"><a href="#Schema.column_names-53"><span class="linenos">53</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
</span><span id="Schema.column_names-53"><a href="#Schema.column_names-53"><span class="linenos">53</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
|
||||||
</span><span id="Schema.column_names-54"><a href="#Schema.column_names-54"><span class="linenos">54</span></a><span class="w"> </span><span class="sd">"""</span>
|
</span><span id="Schema.column_names-54"><a href="#Schema.column_names-54"><span class="linenos">54</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||||
</span><span id="Schema.column_names-55"><a href="#Schema.column_names-55"><span class="linenos">55</span></a><span class="sd"> Get the column names for a table.</span>
|
</span><span id="Schema.column_names-55"><a href="#Schema.column_names-55"><span class="linenos">55</span></a><span class="sd"> Get the column names for a table.</span>
|
||||||
</span><span id="Schema.column_names-56"><a href="#Schema.column_names-56"><span class="linenos">56</span></a>
|
</span><span id="Schema.column_names-56"><a href="#Schema.column_names-56"><span class="linenos">56</span></a>
|
||||||
|
@ -956,7 +956,7 @@ The added table must have the necessary number of qualifiers in its path to matc
|
||||||
</span><span id="Schema.column_names-61"><a href="#Schema.column_names-61"><span class="linenos">61</span></a><span class="sd"> normalize: whether to normalize identifiers according to the dialect of interest.</span>
|
</span><span id="Schema.column_names-61"><a href="#Schema.column_names-61"><span class="linenos">61</span></a><span class="sd"> normalize: whether to normalize identifiers according to the dialect of interest.</span>
|
||||||
</span><span id="Schema.column_names-62"><a href="#Schema.column_names-62"><span class="linenos">62</span></a>
|
</span><span id="Schema.column_names-62"><a href="#Schema.column_names-62"><span class="linenos">62</span></a>
|
||||||
</span><span id="Schema.column_names-63"><a href="#Schema.column_names-63"><span class="linenos">63</span></a><span class="sd"> Returns:</span>
|
</span><span id="Schema.column_names-63"><a href="#Schema.column_names-63"><span class="linenos">63</span></a><span class="sd"> Returns:</span>
|
||||||
</span><span id="Schema.column_names-64"><a href="#Schema.column_names-64"><span class="linenos">64</span></a><span class="sd"> The list of column names.</span>
|
</span><span id="Schema.column_names-64"><a href="#Schema.column_names-64"><span class="linenos">64</span></a><span class="sd"> The sequence of column names.</span>
|
||||||
</span><span id="Schema.column_names-65"><a href="#Schema.column_names-65"><span class="linenos">65</span></a><span class="sd"> """</span>
|
</span><span id="Schema.column_names-65"><a href="#Schema.column_names-65"><span class="linenos">65</span></a><span class="sd"> """</span>
|
||||||
</span></pre></div>
|
</span></pre></div>
|
||||||
|
|
||||||
|
@ -975,7 +975,7 @@ The added table must have the necessary number of qualifiers in its path to matc
|
||||||
<h6 id="returns">Returns:</h6>
|
<h6 id="returns">Returns:</h6>
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>The list of column names.</p>
|
<p>The sequence of column names.</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1970,7 +1970,7 @@ The added table must have the necessary number of qualifiers in its path to matc
|
||||||
<h6 id="returns">Returns:</h6>
|
<h6 id="returns">Returns:</h6>
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>The list of column names.</p>
|
<p>The sequence of column names.</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -8364,7 +8364,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.SHOW">TokenType.SHOW</a>: 'SHOW'>, <<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: 'COMMAND'>, <<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: 'EXECUTE'>, <<a href="#TokenType.FETCH">TokenType.FETCH</a>: 'FETCH'>}</span>
|
<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>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -8376,7 +8376,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>
|
||||||
|
|
|
@ -1030,7 +1030,7 @@ def posexplode_outer(col: ColumnOrName) -> Column:
|
||||||
|
|
||||||
|
|
||||||
def get_json_object(col: ColumnOrName, path: str) -> Column:
|
def get_json_object(col: ColumnOrName, path: str) -> Column:
|
||||||
return Column.invoke_expression_over_column(col, expression.JSONExtract, path=lit(path))
|
return Column.invoke_expression_over_column(col, expression.JSONExtract, expression=lit(path))
|
||||||
|
|
||||||
|
|
||||||
def json_tuple(col: ColumnOrName, *fields: str) -> Column:
|
def json_tuple(col: ColumnOrName, *fields: str) -> Column:
|
||||||
|
|
|
@ -12,13 +12,14 @@ from sqlglot.dialects.dialect import (
|
||||||
binary_from_function,
|
binary_from_function,
|
||||||
date_add_interval_sql,
|
date_add_interval_sql,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
|
filter_array_using_unnest,
|
||||||
if_sql,
|
if_sql,
|
||||||
inline_array_sql,
|
inline_array_sql,
|
||||||
max_or_greatest,
|
max_or_greatest,
|
||||||
min_or_least,
|
min_or_least,
|
||||||
no_ilike_sql,
|
no_ilike_sql,
|
||||||
parse_date_delta_with_interval,
|
build_date_delta_with_interval,
|
||||||
regexp_replace_sql,
|
regexp_replace_sql,
|
||||||
rename_func,
|
rename_func,
|
||||||
timestrtotime_sql,
|
timestrtotime_sql,
|
||||||
|
@ -37,49 +38,28 @@ def _derived_table_values_to_unnest(self: BigQuery.Generator, expression: exp.Va
|
||||||
if not expression.find_ancestor(exp.From, exp.Join):
|
if not expression.find_ancestor(exp.From, exp.Join):
|
||||||
return self.values_sql(expression)
|
return self.values_sql(expression)
|
||||||
|
|
||||||
|
structs = []
|
||||||
alias = expression.args.get("alias")
|
alias = expression.args.get("alias")
|
||||||
|
for tup in expression.find_all(exp.Tuple):
|
||||||
|
field_aliases = alias.columns if alias else (f"_c{i}" for i in range(len(tup.expressions)))
|
||||||
|
expressions = [exp.alias_(fld, name) for fld, name in zip(tup.expressions, field_aliases)]
|
||||||
|
structs.append(exp.Struct(expressions=expressions))
|
||||||
|
|
||||||
return self.unnest_sql(
|
return self.unnest_sql(exp.Unnest(expressions=[exp.array(*structs, copy=False)]))
|
||||||
exp.Unnest(
|
|
||||||
expressions=[
|
|
||||||
exp.array(
|
|
||||||
*(
|
|
||||||
exp.Struct(
|
|
||||||
expressions=[
|
|
||||||
exp.alias_(value, column_name)
|
|
||||||
for value, column_name in zip(
|
|
||||||
t.expressions,
|
|
||||||
(
|
|
||||||
alias.columns
|
|
||||||
if alias and alias.columns
|
|
||||||
else (f"_c{i}" for i in range(len(t.expressions)))
|
|
||||||
),
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
for t in expression.find_all(exp.Tuple)
|
|
||||||
),
|
|
||||||
copy=False,
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def _returnsproperty_sql(self: BigQuery.Generator, expression: exp.ReturnsProperty) -> str:
|
def _returnsproperty_sql(self: BigQuery.Generator, expression: exp.ReturnsProperty) -> str:
|
||||||
this = expression.this
|
this = expression.this
|
||||||
if isinstance(this, exp.Schema):
|
if isinstance(this, exp.Schema):
|
||||||
this = f"{this.this} <{self.expressions(this)}>"
|
this = f"{self.sql(this, 'this')} <{self.expressions(this)}>"
|
||||||
else:
|
else:
|
||||||
this = self.sql(this)
|
this = self.sql(this)
|
||||||
return f"RETURNS {this}"
|
return f"RETURNS {this}"
|
||||||
|
|
||||||
|
|
||||||
def _create_sql(self: BigQuery.Generator, expression: exp.Create) -> str:
|
def _create_sql(self: BigQuery.Generator, expression: exp.Create) -> str:
|
||||||
kind = expression.args["kind"]
|
|
||||||
returns = expression.find(exp.ReturnsProperty)
|
returns = expression.find(exp.ReturnsProperty)
|
||||||
|
if expression.kind == "FUNCTION" and returns and returns.args.get("is_table"):
|
||||||
if kind.upper() == "FUNCTION" and returns and returns.args.get("is_table"):
|
|
||||||
expression.set("kind", "TABLE FUNCTION")
|
expression.set("kind", "TABLE FUNCTION")
|
||||||
|
|
||||||
if isinstance(expression.expression, (exp.Subquery, exp.Literal)):
|
if isinstance(expression.expression, (exp.Subquery, exp.Literal)):
|
||||||
|
@ -87,8 +67,6 @@ def _create_sql(self: BigQuery.Generator, expression: exp.Create) -> str:
|
||||||
|
|
||||||
return self.create_sql(expression)
|
return self.create_sql(expression)
|
||||||
|
|
||||||
return self.create_sql(expression)
|
|
||||||
|
|
||||||
|
|
||||||
def _unqualify_unnest(expression: exp.Expression) -> exp.Expression:
|
def _unqualify_unnest(expression: exp.Expression) -> exp.Expression:
|
||||||
"""Remove references to unnest table aliases since bigquery doesn't allow them.
|
"""Remove references to unnest table aliases since bigquery doesn't allow them.
|
||||||
|
@ -132,11 +110,10 @@ def _alias_ordered_group(expression: exp.Expression) -> exp.Expression:
|
||||||
if isinstance(select, exp.Alias)
|
if isinstance(select, exp.Alias)
|
||||||
}
|
}
|
||||||
|
|
||||||
for e in group.expressions:
|
for grouped in group.expressions:
|
||||||
alias = aliases.get(e)
|
alias = aliases.get(grouped)
|
||||||
|
|
||||||
if alias:
|
if alias:
|
||||||
e.replace(exp.column(alias))
|
grouped.replace(exp.column(alias))
|
||||||
|
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
@ -168,24 +145,24 @@ def _pushdown_cte_column_names(expression: exp.Expression) -> exp.Expression:
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
|
||||||
def _parse_parse_timestamp(args: t.List) -> exp.StrToTime:
|
def _build_parse_timestamp(args: t.List) -> exp.StrToTime:
|
||||||
this = format_time_lambda(exp.StrToTime, "bigquery")([seq_get(args, 1), seq_get(args, 0)])
|
this = build_formatted_time(exp.StrToTime, "bigquery")([seq_get(args, 1), seq_get(args, 0)])
|
||||||
this.set("zone", seq_get(args, 2))
|
this.set("zone", seq_get(args, 2))
|
||||||
return this
|
return this
|
||||||
|
|
||||||
|
|
||||||
def _parse_timestamp(args: t.List) -> exp.Timestamp:
|
def _build_timestamp(args: t.List) -> exp.Timestamp:
|
||||||
timestamp = exp.Timestamp.from_arg_list(args)
|
timestamp = exp.Timestamp.from_arg_list(args)
|
||||||
timestamp.set("with_tz", True)
|
timestamp.set("with_tz", True)
|
||||||
return timestamp
|
return timestamp
|
||||||
|
|
||||||
|
|
||||||
def _parse_date(args: t.List) -> exp.Date | exp.DateFromParts:
|
def _build_date(args: t.List) -> exp.Date | exp.DateFromParts:
|
||||||
expr_type = exp.DateFromParts if len(args) == 3 else exp.Date
|
expr_type = exp.DateFromParts if len(args) == 3 else exp.Date
|
||||||
return expr_type.from_arg_list(args)
|
return expr_type.from_arg_list(args)
|
||||||
|
|
||||||
|
|
||||||
def _parse_to_hex(args: t.List) -> exp.Hex | exp.MD5:
|
def _build_to_hex(args: t.List) -> exp.Hex | exp.MD5:
|
||||||
# TO_HEX(MD5(..)) is common in BigQuery, so it's parsed into MD5 to simplify its transpilation
|
# TO_HEX(MD5(..)) is common in BigQuery, so it's parsed into MD5 to simplify its transpilation
|
||||||
arg = seq_get(args, 0)
|
arg = seq_get(args, 0)
|
||||||
return exp.MD5(this=arg.this) if isinstance(arg, exp.MD5Digest) else exp.Hex(this=arg)
|
return exp.MD5(this=arg.this) if isinstance(arg, exp.MD5Digest) else exp.Hex(this=arg)
|
||||||
|
@ -214,18 +191,20 @@ def _ts_or_ds_diff_sql(self: BigQuery.Generator, expression: exp.TsOrDsDiff) ->
|
||||||
|
|
||||||
def _unix_to_time_sql(self: BigQuery.Generator, expression: exp.UnixToTime) -> str:
|
def _unix_to_time_sql(self: BigQuery.Generator, expression: exp.UnixToTime) -> str:
|
||||||
scale = expression.args.get("scale")
|
scale = expression.args.get("scale")
|
||||||
timestamp = self.sql(expression, "this")
|
timestamp = expression.this
|
||||||
|
|
||||||
if scale in (None, exp.UnixToTime.SECONDS):
|
if scale in (None, exp.UnixToTime.SECONDS):
|
||||||
return f"TIMESTAMP_SECONDS({timestamp})"
|
return self.func("TIMESTAMP_SECONDS", timestamp)
|
||||||
if scale == exp.UnixToTime.MILLIS:
|
if scale == exp.UnixToTime.MILLIS:
|
||||||
return f"TIMESTAMP_MILLIS({timestamp})"
|
return self.func("TIMESTAMP_MILLIS", timestamp)
|
||||||
if scale == exp.UnixToTime.MICROS:
|
if scale == exp.UnixToTime.MICROS:
|
||||||
return f"TIMESTAMP_MICROS({timestamp})"
|
return self.func("TIMESTAMP_MICROS", timestamp)
|
||||||
|
|
||||||
return f"TIMESTAMP_SECONDS(CAST({timestamp} / POW(10, {scale}) AS INT64))"
|
unix_seconds = exp.cast(exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)), "int64")
|
||||||
|
return self.func("TIMESTAMP_SECONDS", unix_seconds)
|
||||||
|
|
||||||
|
|
||||||
def _parse_time(args: t.List) -> exp.Func:
|
def _build_time(args: t.List) -> exp.Func:
|
||||||
if len(args) == 1:
|
if len(args) == 1:
|
||||||
return exp.TsOrDsToTime(this=args[0])
|
return exp.TsOrDsToTime(this=args[0])
|
||||||
if len(args) == 3:
|
if len(args) == 3:
|
||||||
|
@ -323,6 +302,7 @@ class BigQuery(Dialect):
|
||||||
"BYTES": TokenType.BINARY,
|
"BYTES": TokenType.BINARY,
|
||||||
"CURRENT_DATETIME": TokenType.CURRENT_DATETIME,
|
"CURRENT_DATETIME": TokenType.CURRENT_DATETIME,
|
||||||
"DECLARE": TokenType.COMMAND,
|
"DECLARE": TokenType.COMMAND,
|
||||||
|
"EXCEPTION": TokenType.COMMAND,
|
||||||
"FLOAT64": TokenType.DOUBLE,
|
"FLOAT64": TokenType.DOUBLE,
|
||||||
"FOR SYSTEM_TIME": TokenType.TIMESTAMP_SNAPSHOT,
|
"FOR SYSTEM_TIME": TokenType.TIMESTAMP_SNAPSHOT,
|
||||||
"MODEL": TokenType.MODEL,
|
"MODEL": TokenType.MODEL,
|
||||||
|
@ -340,15 +320,15 @@ class BigQuery(Dialect):
|
||||||
|
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"DATE": _parse_date,
|
"DATE": _build_date,
|
||||||
"DATE_ADD": parse_date_delta_with_interval(exp.DateAdd),
|
"DATE_ADD": build_date_delta_with_interval(exp.DateAdd),
|
||||||
"DATE_SUB": parse_date_delta_with_interval(exp.DateSub),
|
"DATE_SUB": build_date_delta_with_interval(exp.DateSub),
|
||||||
"DATE_TRUNC": lambda args: exp.DateTrunc(
|
"DATE_TRUNC": lambda args: exp.DateTrunc(
|
||||||
unit=exp.Literal.string(str(seq_get(args, 1))),
|
unit=exp.Literal.string(str(seq_get(args, 1))),
|
||||||
this=seq_get(args, 0),
|
this=seq_get(args, 0),
|
||||||
),
|
),
|
||||||
"DATETIME_ADD": parse_date_delta_with_interval(exp.DatetimeAdd),
|
"DATETIME_ADD": build_date_delta_with_interval(exp.DatetimeAdd),
|
||||||
"DATETIME_SUB": parse_date_delta_with_interval(exp.DatetimeSub),
|
"DATETIME_SUB": build_date_delta_with_interval(exp.DatetimeSub),
|
||||||
"DIV": binary_from_function(exp.IntDiv),
|
"DIV": binary_from_function(exp.IntDiv),
|
||||||
"FORMAT_DATE": lambda args: exp.TimeToStr(
|
"FORMAT_DATE": lambda args: exp.TimeToStr(
|
||||||
this=exp.TsOrDsToDate(this=seq_get(args, 1)), format=seq_get(args, 0)
|
this=exp.TsOrDsToDate(this=seq_get(args, 1)), format=seq_get(args, 0)
|
||||||
|
@ -358,11 +338,11 @@ class BigQuery(Dialect):
|
||||||
this=seq_get(args, 0), expression=seq_get(args, 1) or exp.Literal.string("$")
|
this=seq_get(args, 0), expression=seq_get(args, 1) or exp.Literal.string("$")
|
||||||
),
|
),
|
||||||
"MD5": exp.MD5Digest.from_arg_list,
|
"MD5": exp.MD5Digest.from_arg_list,
|
||||||
"TO_HEX": _parse_to_hex,
|
"TO_HEX": _build_to_hex,
|
||||||
"PARSE_DATE": lambda args: format_time_lambda(exp.StrToDate, "bigquery")(
|
"PARSE_DATE": lambda args: build_formatted_time(exp.StrToDate, "bigquery")(
|
||||||
[seq_get(args, 1), seq_get(args, 0)]
|
[seq_get(args, 1), seq_get(args, 0)]
|
||||||
),
|
),
|
||||||
"PARSE_TIMESTAMP": _parse_parse_timestamp,
|
"PARSE_TIMESTAMP": _build_parse_timestamp,
|
||||||
"REGEXP_CONTAINS": exp.RegexpLike.from_arg_list,
|
"REGEXP_CONTAINS": exp.RegexpLike.from_arg_list,
|
||||||
"REGEXP_EXTRACT": lambda args: exp.RegexpExtract(
|
"REGEXP_EXTRACT": lambda args: exp.RegexpExtract(
|
||||||
this=seq_get(args, 0),
|
this=seq_get(args, 0),
|
||||||
|
@ -378,12 +358,12 @@ class BigQuery(Dialect):
|
||||||
this=seq_get(args, 0),
|
this=seq_get(args, 0),
|
||||||
expression=seq_get(args, 1) or exp.Literal.string(","),
|
expression=seq_get(args, 1) or exp.Literal.string(","),
|
||||||
),
|
),
|
||||||
"TIME": _parse_time,
|
"TIME": _build_time,
|
||||||
"TIME_ADD": parse_date_delta_with_interval(exp.TimeAdd),
|
"TIME_ADD": build_date_delta_with_interval(exp.TimeAdd),
|
||||||
"TIME_SUB": parse_date_delta_with_interval(exp.TimeSub),
|
"TIME_SUB": build_date_delta_with_interval(exp.TimeSub),
|
||||||
"TIMESTAMP": _parse_timestamp,
|
"TIMESTAMP": _build_timestamp,
|
||||||
"TIMESTAMP_ADD": parse_date_delta_with_interval(exp.TimestampAdd),
|
"TIMESTAMP_ADD": build_date_delta_with_interval(exp.TimestampAdd),
|
||||||
"TIMESTAMP_SUB": parse_date_delta_with_interval(exp.TimestampSub),
|
"TIMESTAMP_SUB": build_date_delta_with_interval(exp.TimestampSub),
|
||||||
"TIMESTAMP_MICROS": lambda args: exp.UnixToTime(
|
"TIMESTAMP_MICROS": lambda args: exp.UnixToTime(
|
||||||
this=seq_get(args, 0), scale=exp.UnixToTime.MICROS
|
this=seq_get(args, 0), scale=exp.UnixToTime.MICROS
|
||||||
),
|
),
|
||||||
|
@ -424,7 +404,7 @@ class BigQuery(Dialect):
|
||||||
}
|
}
|
||||||
|
|
||||||
RANGE_PARSERS = parser.Parser.RANGE_PARSERS.copy()
|
RANGE_PARSERS = parser.Parser.RANGE_PARSERS.copy()
|
||||||
RANGE_PARSERS.pop(TokenType.OVERLAPS, None)
|
RANGE_PARSERS.pop(TokenType.OVERLAPS)
|
||||||
|
|
||||||
NULL_TOKENS = {TokenType.NULL, TokenType.UNKNOWN}
|
NULL_TOKENS = {TokenType.NULL, TokenType.UNKNOWN}
|
||||||
|
|
||||||
|
@ -551,6 +531,7 @@ class BigQuery(Dialect):
|
||||||
NULL_ORDERING_SUPPORTED = False
|
NULL_ORDERING_SUPPORTED = False
|
||||||
IGNORE_NULLS_IN_FUNC = True
|
IGNORE_NULLS_IN_FUNC = True
|
||||||
JSON_PATH_SINGLE_QUOTE_ESCAPE = True
|
JSON_PATH_SINGLE_QUOTE_ESCAPE = True
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = True
|
||||||
|
|
||||||
TRANSFORMS = {
|
TRANSFORMS = {
|
||||||
**generator.Generator.TRANSFORMS,
|
**generator.Generator.TRANSFORMS,
|
||||||
|
@ -558,6 +539,7 @@ class BigQuery(Dialect):
|
||||||
exp.ArgMax: arg_max_or_min_no_count("MAX_BY"),
|
exp.ArgMax: arg_max_or_min_no_count("MAX_BY"),
|
||||||
exp.ArgMin: arg_max_or_min_no_count("MIN_BY"),
|
exp.ArgMin: arg_max_or_min_no_count("MIN_BY"),
|
||||||
exp.ArrayContains: _array_contains_sql,
|
exp.ArrayContains: _array_contains_sql,
|
||||||
|
exp.ArrayFilter: filter_array_using_unnest,
|
||||||
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
||||||
exp.Cast: transforms.preprocess([transforms.remove_precision_parameterized_types]),
|
exp.Cast: transforms.preprocess([transforms.remove_precision_parameterized_types]),
|
||||||
exp.CollateProperty: lambda self, e: (
|
exp.CollateProperty: lambda self, e: (
|
||||||
|
@ -565,12 +547,14 @@ class BigQuery(Dialect):
|
||||||
if e.args.get("default")
|
if e.args.get("default")
|
||||||
else f"COLLATE {self.sql(e, 'this')}"
|
else f"COLLATE {self.sql(e, 'this')}"
|
||||||
),
|
),
|
||||||
|
exp.Commit: lambda *_: "COMMIT TRANSACTION",
|
||||||
exp.CountIf: rename_func("COUNTIF"),
|
exp.CountIf: rename_func("COUNTIF"),
|
||||||
exp.Create: _create_sql,
|
exp.Create: _create_sql,
|
||||||
exp.CTE: transforms.preprocess([_pushdown_cte_column_names]),
|
exp.CTE: transforms.preprocess([_pushdown_cte_column_names]),
|
||||||
exp.DateAdd: date_add_interval_sql("DATE", "ADD"),
|
exp.DateAdd: date_add_interval_sql("DATE", "ADD"),
|
||||||
exp.DateDiff: lambda self,
|
exp.DateDiff: lambda self, e: self.func(
|
||||||
e: f"DATE_DIFF({self.sql(e, 'this')}, {self.sql(e, 'expression')}, {self.sql(e.args.get('unit', 'DAY'))})",
|
"DATE_DIFF", e.this, e.expression, e.unit or "DAY"
|
||||||
|
),
|
||||||
exp.DateFromParts: rename_func("DATE"),
|
exp.DateFromParts: rename_func("DATE"),
|
||||||
exp.DateStrToDate: datestrtodate_sql,
|
exp.DateStrToDate: datestrtodate_sql,
|
||||||
exp.DateSub: date_add_interval_sql("DATE", "SUB"),
|
exp.DateSub: date_add_interval_sql("DATE", "SUB"),
|
||||||
|
@ -602,6 +586,7 @@ class BigQuery(Dialect):
|
||||||
exp.RegexpReplace: regexp_replace_sql,
|
exp.RegexpReplace: regexp_replace_sql,
|
||||||
exp.RegexpLike: rename_func("REGEXP_CONTAINS"),
|
exp.RegexpLike: rename_func("REGEXP_CONTAINS"),
|
||||||
exp.ReturnsProperty: _returnsproperty_sql,
|
exp.ReturnsProperty: _returnsproperty_sql,
|
||||||
|
exp.Rollback: lambda *_: "ROLLBACK TRANSACTION",
|
||||||
exp.Select: transforms.preprocess(
|
exp.Select: transforms.preprocess(
|
||||||
[
|
[
|
||||||
transforms.explode_to_unnest(),
|
transforms.explode_to_unnest(),
|
||||||
|
@ -617,8 +602,7 @@ class BigQuery(Dialect):
|
||||||
exp.StabilityProperty: lambda self, e: (
|
exp.StabilityProperty: lambda self, e: (
|
||||||
"DETERMINISTIC" if e.name == "IMMUTABLE" else "NOT DETERMINISTIC"
|
"DETERMINISTIC" if e.name == "IMMUTABLE" else "NOT DETERMINISTIC"
|
||||||
),
|
),
|
||||||
exp.StrToDate: lambda self,
|
exp.StrToDate: lambda self, e: self.func("PARSE_DATE", self.format_time(e), e.this),
|
||||||
e: f"PARSE_DATE({self.format_time(e)}, {self.sql(e, 'this')})",
|
|
||||||
exp.StrToTime: lambda self, e: self.func(
|
exp.StrToTime: lambda self, e: self.func(
|
||||||
"PARSE_TIMESTAMP", self.format_time(e), e.this, e.args.get("zone")
|
"PARSE_TIMESTAMP", self.format_time(e), e.this, e.args.get("zone")
|
||||||
),
|
),
|
||||||
|
@ -629,6 +613,7 @@ class BigQuery(Dialect):
|
||||||
exp.TimestampDiff: rename_func("TIMESTAMP_DIFF"),
|
exp.TimestampDiff: rename_func("TIMESTAMP_DIFF"),
|
||||||
exp.TimestampSub: date_add_interval_sql("TIMESTAMP", "SUB"),
|
exp.TimestampSub: date_add_interval_sql("TIMESTAMP", "SUB"),
|
||||||
exp.TimeStrToTime: timestrtotime_sql,
|
exp.TimeStrToTime: timestrtotime_sql,
|
||||||
|
exp.Transaction: lambda *_: "BEGIN TRANSACTION",
|
||||||
exp.Trim: lambda self, e: self.func("TRIM", e.this, e.expression),
|
exp.Trim: lambda self, e: self.func("TRIM", e.this, e.expression),
|
||||||
exp.TsOrDsAdd: _ts_or_ds_add_sql,
|
exp.TsOrDsAdd: _ts_or_ds_add_sql,
|
||||||
exp.TsOrDsDiff: _ts_or_ds_diff_sql,
|
exp.TsOrDsDiff: _ts_or_ds_diff_sql,
|
||||||
|
@ -778,12 +763,8 @@ class BigQuery(Dialect):
|
||||||
}
|
}
|
||||||
|
|
||||||
def timetostr_sql(self, expression: exp.TimeToStr) -> str:
|
def timetostr_sql(self, expression: exp.TimeToStr) -> str:
|
||||||
if isinstance(expression.this, exp.TsOrDsToDate):
|
this = expression.this if isinstance(expression.this, exp.TsOrDsToDate) else expression
|
||||||
this: exp.Expression = expression.this
|
return self.func("FORMAT_DATE", self.format_time(expression), this.this)
|
||||||
else:
|
|
||||||
this = expression
|
|
||||||
|
|
||||||
return f"FORMAT_DATE({self.format_time(expression)}, {self.sql(this, 'this')})"
|
|
||||||
|
|
||||||
def struct_sql(self, expression: exp.Struct) -> str:
|
def struct_sql(self, expression: exp.Struct) -> str:
|
||||||
args = []
|
args = []
|
||||||
|
@ -820,11 +801,6 @@ class BigQuery(Dialect):
|
||||||
def trycast_sql(self, expression: exp.TryCast) -> str:
|
def trycast_sql(self, expression: exp.TryCast) -> str:
|
||||||
return self.cast_sql(expression, safe_prefix="SAFE_")
|
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)
|
||||||
if isinstance(first_arg, exp.Subqueryable):
|
if isinstance(first_arg, exp.Subqueryable):
|
||||||
|
@ -862,25 +838,16 @@ class BigQuery(Dialect):
|
||||||
|
|
||||||
return f"{this}[{expressions_sql}]"
|
return f"{this}[{expressions_sql}]"
|
||||||
|
|
||||||
def transaction_sql(self, *_) -> str:
|
|
||||||
return "BEGIN TRANSACTION"
|
|
||||||
|
|
||||||
def commit_sql(self, *_) -> str:
|
|
||||||
return "COMMIT TRANSACTION"
|
|
||||||
|
|
||||||
def rollback_sql(self, *_) -> str:
|
|
||||||
return "ROLLBACK TRANSACTION"
|
|
||||||
|
|
||||||
def in_unnest_op(self, expression: exp.Unnest) -> str:
|
def in_unnest_op(self, expression: exp.Unnest) -> str:
|
||||||
return self.sql(expression)
|
return self.sql(expression)
|
||||||
|
|
||||||
def except_op(self, expression: exp.Except) -> str:
|
def except_op(self, expression: exp.Except) -> str:
|
||||||
if not expression.args.get("distinct", False):
|
if not expression.args.get("distinct"):
|
||||||
self.unsupported("EXCEPT without DISTINCT is not supported in BigQuery")
|
self.unsupported("EXCEPT without DISTINCT is not supported in BigQuery")
|
||||||
return f"EXCEPT{' DISTINCT' if expression.args.get('distinct') else ' ALL'}"
|
return f"EXCEPT{' DISTINCT' if expression.args.get('distinct') else ' ALL'}"
|
||||||
|
|
||||||
def intersect_op(self, expression: exp.Intersect) -> str:
|
def intersect_op(self, expression: exp.Intersect) -> str:
|
||||||
if not expression.args.get("distinct", False):
|
if not expression.args.get("distinct"):
|
||||||
self.unsupported("INTERSECT without DISTINCT is not supported in BigQuery")
|
self.unsupported("INTERSECT without DISTINCT is not supported in BigQuery")
|
||||||
return f"INTERSECT{' DISTINCT' if expression.args.get('distinct') else ' ALL'}"
|
return f"INTERSECT{' DISTINCT' if expression.args.get('distinct') else ' ALL'}"
|
||||||
|
|
||||||
|
|
|
@ -11,13 +11,12 @@ from sqlglot.dialects.dialect import (
|
||||||
json_extract_segments,
|
json_extract_segments,
|
||||||
json_path_key_only_name,
|
json_path_key_only_name,
|
||||||
no_pivot_sql,
|
no_pivot_sql,
|
||||||
parse_json_extract_path,
|
build_json_extract_path,
|
||||||
rename_func,
|
rename_func,
|
||||||
var_map_sql,
|
var_map_sql,
|
||||||
)
|
)
|
||||||
from sqlglot.errors import ParseError
|
from sqlglot.errors import ParseError
|
||||||
from sqlglot.helper import is_int, seq_get
|
from sqlglot.helper import is_int, seq_get
|
||||||
from sqlglot.parser import parse_var_map
|
|
||||||
from sqlglot.tokens import Token, TokenType
|
from sqlglot.tokens import Token, TokenType
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,9 +25,9 @@ def _lower_func(sql: str) -> str:
|
||||||
return sql[:index].lower() + sql[index:]
|
return sql[:index].lower() + sql[index:]
|
||||||
|
|
||||||
|
|
||||||
def _quantile_sql(self: ClickHouse.Generator, e: exp.Quantile) -> str:
|
def _quantile_sql(self: ClickHouse.Generator, expression: exp.Quantile) -> str:
|
||||||
quantile = e.args["quantile"]
|
quantile = expression.args["quantile"]
|
||||||
args = f"({self.sql(e, 'this')})"
|
args = f"({self.sql(expression, 'this')})"
|
||||||
|
|
||||||
if isinstance(quantile, exp.Array):
|
if isinstance(quantile, exp.Array):
|
||||||
func = self.func("quantiles", *quantile)
|
func = self.func("quantiles", *quantile)
|
||||||
|
@ -38,7 +37,7 @@ def _quantile_sql(self: ClickHouse.Generator, e: exp.Quantile) -> str:
|
||||||
return func + args
|
return func + args
|
||||||
|
|
||||||
|
|
||||||
def _parse_count_if(args: t.List) -> exp.CountIf | exp.CombinedAggFunc:
|
def _build_count_if(args: t.List) -> exp.CountIf | exp.CombinedAggFunc:
|
||||||
if len(args) == 1:
|
if len(args) == 1:
|
||||||
return exp.CountIf(this=seq_get(args, 0))
|
return exp.CountIf(this=seq_get(args, 0))
|
||||||
|
|
||||||
|
@ -111,7 +110,7 @@ class ClickHouse(Dialect):
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"ANY": exp.AnyValue.from_arg_list,
|
"ANY": exp.AnyValue.from_arg_list,
|
||||||
"ARRAYSUM": exp.ArraySum.from_arg_list,
|
"ARRAYSUM": exp.ArraySum.from_arg_list,
|
||||||
"COUNTIF": _parse_count_if,
|
"COUNTIF": _build_count_if,
|
||||||
"DATE_ADD": lambda args: exp.DateAdd(
|
"DATE_ADD": lambda args: exp.DateAdd(
|
||||||
this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0)
|
this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0)
|
||||||
),
|
),
|
||||||
|
@ -124,10 +123,10 @@ class ClickHouse(Dialect):
|
||||||
"DATEDIFF": lambda args: exp.DateDiff(
|
"DATEDIFF": lambda args: exp.DateDiff(
|
||||||
this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0)
|
this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0)
|
||||||
),
|
),
|
||||||
"JSONEXTRACTSTRING": parse_json_extract_path(
|
"JSONEXTRACTSTRING": build_json_extract_path(
|
||||||
exp.JSONExtractScalar, zero_based_indexing=False
|
exp.JSONExtractScalar, zero_based_indexing=False
|
||||||
),
|
),
|
||||||
"MAP": parse_var_map,
|
"MAP": parser.build_var_map,
|
||||||
"MATCH": exp.RegexpLike.from_arg_list,
|
"MATCH": exp.RegexpLike.from_arg_list,
|
||||||
"RANDCANONICAL": exp.Rand.from_arg_list,
|
"RANDCANONICAL": exp.Rand.from_arg_list,
|
||||||
"UNIQ": exp.ApproxDistinct.from_arg_list,
|
"UNIQ": exp.ApproxDistinct.from_arg_list,
|
||||||
|
@ -417,9 +416,9 @@ class ClickHouse(Dialect):
|
||||||
self, skip_join_token: bool = False, parse_bracket: bool = False
|
self, skip_join_token: bool = False, parse_bracket: bool = False
|
||||||
) -> t.Optional[exp.Join]:
|
) -> t.Optional[exp.Join]:
|
||||||
join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
|
join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
|
||||||
|
|
||||||
if join:
|
if join:
|
||||||
join.set("global", join.args.pop("method", None))
|
join.set("global", join.args.pop("method", None))
|
||||||
|
|
||||||
return join
|
return join
|
||||||
|
|
||||||
def _parse_function(
|
def _parse_function(
|
||||||
|
@ -516,6 +515,7 @@ class ClickHouse(Dialect):
|
||||||
TABLESAMPLE_SIZE_IS_ROWS = False
|
TABLESAMPLE_SIZE_IS_ROWS = False
|
||||||
TABLESAMPLE_KEYWORDS = "SAMPLE"
|
TABLESAMPLE_KEYWORDS = "SAMPLE"
|
||||||
LAST_DAY_SUPPORTS_DATE_PART = False
|
LAST_DAY_SUPPORTS_DATE_PART = False
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = True
|
||||||
|
|
||||||
STRING_TYPE_MAPPING = {
|
STRING_TYPE_MAPPING = {
|
||||||
exp.DataType.Type.CHAR: "String",
|
exp.DataType.Type.CHAR: "String",
|
||||||
|
@ -576,6 +576,8 @@ class ClickHouse(Dialect):
|
||||||
**generator.Generator.TRANSFORMS,
|
**generator.Generator.TRANSFORMS,
|
||||||
exp.AnyValue: rename_func("any"),
|
exp.AnyValue: rename_func("any"),
|
||||||
exp.ApproxDistinct: rename_func("uniq"),
|
exp.ApproxDistinct: rename_func("uniq"),
|
||||||
|
exp.ArrayFilter: lambda self, e: self.func("arrayFilter", e.expression, e.this),
|
||||||
|
exp.ArraySize: rename_func("LENGTH"),
|
||||||
exp.ArraySum: rename_func("arraySum"),
|
exp.ArraySum: rename_func("arraySum"),
|
||||||
exp.ArgMax: arg_max_or_min_no_count("argMax"),
|
exp.ArgMax: arg_max_or_min_no_count("argMax"),
|
||||||
exp.ArgMin: arg_max_or_min_no_count("argMin"),
|
exp.ArgMin: arg_max_or_min_no_count("argMin"),
|
||||||
|
@ -597,12 +599,13 @@ class ClickHouse(Dialect):
|
||||||
exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
|
exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
|
||||||
exp.Pivot: no_pivot_sql,
|
exp.Pivot: no_pivot_sql,
|
||||||
exp.Quantile: _quantile_sql,
|
exp.Quantile: _quantile_sql,
|
||||||
exp.RegexpLike: lambda self, e: f"match({self.format_args(e.this, e.expression)})",
|
exp.RegexpLike: lambda self, e: self.func("match", e.this, e.expression),
|
||||||
exp.Rand: rename_func("randCanonical"),
|
exp.Rand: rename_func("randCanonical"),
|
||||||
exp.Select: transforms.preprocess([transforms.eliminate_qualify]),
|
exp.Select: transforms.preprocess([transforms.eliminate_qualify]),
|
||||||
exp.StartsWith: rename_func("startsWith"),
|
exp.StartsWith: rename_func("startsWith"),
|
||||||
exp.StrPosition: lambda self,
|
exp.StrPosition: lambda self, e: self.func(
|
||||||
e: f"position({self.format_args(e.this, e.args.get('substr'), e.args.get('position'))})",
|
"position", e.this, e.args.get("substr"), e.args.get("position")
|
||||||
|
),
|
||||||
exp.VarMap: lambda self, e: _lower_func(var_map_sql(self, e)),
|
exp.VarMap: lambda self, e: _lower_func(var_map_sql(self, e)),
|
||||||
exp.Xor: lambda self, e: self.func("xor", e.this, e.expression, *e.expressions),
|
exp.Xor: lambda self, e: self.func("xor", e.this, e.expression, *e.expressions),
|
||||||
}
|
}
|
||||||
|
@ -652,6 +655,7 @@ class ClickHouse(Dialect):
|
||||||
this = expression.left
|
this = expression.left
|
||||||
else:
|
else:
|
||||||
return default(expression)
|
return default(expression)
|
||||||
|
|
||||||
return prefix + self.func("has", arr.this.unnest(), this)
|
return prefix + self.func("has", arr.this.unnest(), this)
|
||||||
|
|
||||||
def eq_sql(self, expression: exp.EQ) -> str:
|
def eq_sql(self, expression: exp.EQ) -> str:
|
||||||
|
@ -663,7 +667,7 @@ class ClickHouse(Dialect):
|
||||||
def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
|
def regexpilike_sql(self, expression: exp.RegexpILike) -> str:
|
||||||
# Manually add a flag to make the search case-insensitive
|
# Manually add a flag to make the search case-insensitive
|
||||||
regex = self.func("CONCAT", "'(?i)'", expression.expression)
|
regex = self.func("CONCAT", "'(?i)'", expression.expression)
|
||||||
return f"match({self.format_args(expression.this, regex)})"
|
return self.func("match", expression.this, regex)
|
||||||
|
|
||||||
def datatype_sql(self, expression: exp.DataType) -> str:
|
def datatype_sql(self, expression: exp.DataType) -> str:
|
||||||
# String is the standard ClickHouse type, every other variant is just an alias.
|
# String is the standard ClickHouse type, every other variant is just an alias.
|
||||||
|
@ -717,8 +721,9 @@ class ClickHouse(Dialect):
|
||||||
return f"ON CLUSTER {self.sql(expression, 'this')}"
|
return f"ON CLUSTER {self.sql(expression, 'this')}"
|
||||||
|
|
||||||
def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
|
def createable_sql(self, expression: exp.Create, locations: t.DefaultDict) -> str:
|
||||||
kind = self.sql(expression, "kind").upper()
|
if expression.kind in self.ON_CLUSTER_TARGETS and locations.get(
|
||||||
if kind in self.ON_CLUSTER_TARGETS and locations.get(exp.Properties.Location.POST_NAME):
|
exp.Properties.Location.POST_NAME
|
||||||
|
):
|
||||||
this_name = self.sql(expression.this, "this")
|
this_name = self.sql(expression.this, "this")
|
||||||
this_properties = " ".join(
|
this_properties = " ".join(
|
||||||
[self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
|
[self.sql(prop) for prop in locations[exp.Properties.Location.POST_NAME]]
|
||||||
|
|
|
@ -3,13 +3,19 @@ from __future__ import annotations
|
||||||
from sqlglot import exp, transforms
|
from sqlglot import exp, transforms
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
date_delta_sql,
|
date_delta_sql,
|
||||||
parse_date_delta,
|
build_date_delta,
|
||||||
timestamptrunc_sql,
|
timestamptrunc_sql,
|
||||||
)
|
)
|
||||||
from sqlglot.dialects.spark import Spark
|
from sqlglot.dialects.spark import Spark
|
||||||
from sqlglot.tokens import TokenType
|
from sqlglot.tokens import TokenType
|
||||||
|
|
||||||
|
|
||||||
|
def _timestamp_diff(
|
||||||
|
self: Databricks.Generator, expression: exp.DatetimeDiff | exp.TimestampDiff
|
||||||
|
) -> str:
|
||||||
|
return self.func("TIMESTAMPDIFF", expression.unit, expression.expression, expression.this)
|
||||||
|
|
||||||
|
|
||||||
class Databricks(Spark):
|
class Databricks(Spark):
|
||||||
SAFE_DIVISION = False
|
SAFE_DIVISION = False
|
||||||
|
|
||||||
|
@ -19,10 +25,10 @@ class Databricks(Spark):
|
||||||
|
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**Spark.Parser.FUNCTIONS,
|
**Spark.Parser.FUNCTIONS,
|
||||||
"DATEADD": parse_date_delta(exp.DateAdd),
|
"DATEADD": build_date_delta(exp.DateAdd),
|
||||||
"DATE_ADD": parse_date_delta(exp.DateAdd),
|
"DATE_ADD": build_date_delta(exp.DateAdd),
|
||||||
"DATEDIFF": parse_date_delta(exp.DateDiff),
|
"DATEDIFF": build_date_delta(exp.DateDiff),
|
||||||
"TIMESTAMPDIFF": parse_date_delta(exp.TimestampDiff),
|
"TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff),
|
||||||
}
|
}
|
||||||
|
|
||||||
FACTOR = {
|
FACTOR = {
|
||||||
|
@ -38,20 +44,16 @@ class Databricks(Spark):
|
||||||
exp.DateAdd: date_delta_sql("DATEADD"),
|
exp.DateAdd: date_delta_sql("DATEADD"),
|
||||||
exp.DateDiff: date_delta_sql("DATEDIFF"),
|
exp.DateDiff: date_delta_sql("DATEDIFF"),
|
||||||
exp.DatetimeAdd: lambda self, e: self.func(
|
exp.DatetimeAdd: lambda self, e: self.func(
|
||||||
"TIMESTAMPADD", e.text("unit"), e.expression, e.this
|
"TIMESTAMPADD", e.unit, e.expression, e.this
|
||||||
),
|
),
|
||||||
exp.DatetimeSub: lambda self, e: self.func(
|
exp.DatetimeSub: lambda self, e: self.func(
|
||||||
"TIMESTAMPADD",
|
"TIMESTAMPADD",
|
||||||
e.text("unit"),
|
e.unit,
|
||||||
exp.Mul(this=e.expression, expression=exp.Literal.number(-1)),
|
exp.Mul(this=e.expression, expression=exp.Literal.number(-1)),
|
||||||
e.this,
|
e.this,
|
||||||
),
|
),
|
||||||
exp.DatetimeDiff: lambda self, e: self.func(
|
exp.DatetimeDiff: _timestamp_diff,
|
||||||
"TIMESTAMPDIFF", e.text("unit"), e.expression, e.this
|
exp.TimestampDiff: _timestamp_diff,
|
||||||
),
|
|
||||||
exp.TimestampDiff: lambda self, e: self.func(
|
|
||||||
"TIMESTAMPDIFF", e.text("unit"), e.expression, e.this
|
|
||||||
),
|
|
||||||
exp.DatetimeTrunc: timestamptrunc_sql,
|
exp.DatetimeTrunc: timestamptrunc_sql,
|
||||||
exp.JSONExtract: lambda self, e: self.binary(e, ":"),
|
exp.JSONExtract: lambda self, e: self.binary(e, ":"),
|
||||||
exp.Select: transforms.preprocess(
|
exp.Select: transforms.preprocess(
|
||||||
|
@ -75,6 +77,7 @@ class Databricks(Spark):
|
||||||
):
|
):
|
||||||
# only BIGINT generated identity constraints are supported
|
# only BIGINT generated identity constraints are supported
|
||||||
expression.set("kind", exp.DataType.build("bigint"))
|
expression.set("kind", exp.DataType.build("bigint"))
|
||||||
|
|
||||||
return super().columndef_sql(expression, sep)
|
return super().columndef_sql(expression, sep)
|
||||||
|
|
||||||
def generatedasidentitycolumnconstraint_sql(
|
def generatedasidentitycolumnconstraint_sql(
|
||||||
|
|
|
@ -17,12 +17,12 @@ from sqlglot.trie import new_trie
|
||||||
|
|
||||||
DATE_ADD_OR_DIFF = t.Union[exp.DateAdd, exp.TsOrDsAdd, exp.DateDiff, exp.TsOrDsDiff]
|
DATE_ADD_OR_DIFF = t.Union[exp.DateAdd, exp.TsOrDsAdd, exp.DateDiff, exp.TsOrDsDiff]
|
||||||
DATE_ADD_OR_SUB = t.Union[exp.DateAdd, exp.TsOrDsAdd, exp.DateSub]
|
DATE_ADD_OR_SUB = t.Union[exp.DateAdd, exp.TsOrDsAdd, exp.DateSub]
|
||||||
|
JSON_EXTRACT_TYPE = t.Union[exp.JSONExtract, exp.JSONExtractScalar]
|
||||||
|
|
||||||
|
|
||||||
if t.TYPE_CHECKING:
|
if t.TYPE_CHECKING:
|
||||||
from sqlglot._typing import B, E, F
|
from sqlglot._typing import B, E, F
|
||||||
|
|
||||||
JSON_EXTRACT_TYPE = t.Union[exp.JSONExtract, exp.JSONExtractScalar]
|
|
||||||
|
|
||||||
logger = logging.getLogger("sqlglot")
|
logger = logging.getLogger("sqlglot")
|
||||||
|
|
||||||
|
|
||||||
|
@ -148,47 +148,53 @@ class _Dialect(type):
|
||||||
|
|
||||||
class Dialect(metaclass=_Dialect):
|
class Dialect(metaclass=_Dialect):
|
||||||
INDEX_OFFSET = 0
|
INDEX_OFFSET = 0
|
||||||
"""Determines the base index offset for arrays."""
|
"""The base index offset for arrays."""
|
||||||
|
|
||||||
WEEK_OFFSET = 0
|
WEEK_OFFSET = 0
|
||||||
"""Determines the day of week of DATE_TRUNC(week). Defaults to 0 (Monday). -1 would be Sunday."""
|
"""First day of the week in DATE_TRUNC(week). Defaults to 0 (Monday). -1 would be Sunday."""
|
||||||
|
|
||||||
UNNEST_COLUMN_ONLY = False
|
UNNEST_COLUMN_ONLY = False
|
||||||
"""Determines whether or not `UNNEST` table aliases are treated as column aliases."""
|
"""Whether `UNNEST` table aliases are treated as column aliases."""
|
||||||
|
|
||||||
ALIAS_POST_TABLESAMPLE = False
|
ALIAS_POST_TABLESAMPLE = False
|
||||||
"""Determines whether or not the table alias comes after tablesample."""
|
"""Whether the table alias comes after tablesample."""
|
||||||
|
|
||||||
TABLESAMPLE_SIZE_IS_PERCENT = False
|
TABLESAMPLE_SIZE_IS_PERCENT = False
|
||||||
"""Determines whether or not a size in the table sample clause represents percentage."""
|
"""Whether a size in the table sample clause represents percentage."""
|
||||||
|
|
||||||
NORMALIZATION_STRATEGY = NormalizationStrategy.LOWERCASE
|
NORMALIZATION_STRATEGY = NormalizationStrategy.LOWERCASE
|
||||||
"""Specifies the strategy according to which identifiers should be normalized."""
|
"""Specifies the strategy according to which identifiers should be normalized."""
|
||||||
|
|
||||||
IDENTIFIERS_CAN_START_WITH_DIGIT = False
|
IDENTIFIERS_CAN_START_WITH_DIGIT = False
|
||||||
"""Determines whether or not an unquoted identifier can start with a digit."""
|
"""Whether an unquoted identifier can start with a digit."""
|
||||||
|
|
||||||
DPIPE_IS_STRING_CONCAT = True
|
DPIPE_IS_STRING_CONCAT = True
|
||||||
"""Determines whether or not the DPIPE token (`||`) is a string concatenation operator."""
|
"""Whether the DPIPE token (`||`) is a string concatenation operator."""
|
||||||
|
|
||||||
STRICT_STRING_CONCAT = False
|
STRICT_STRING_CONCAT = False
|
||||||
"""Determines whether or not `CONCAT`'s arguments must be strings."""
|
"""Whether `CONCAT`'s arguments must be strings."""
|
||||||
|
|
||||||
SUPPORTS_USER_DEFINED_TYPES = True
|
SUPPORTS_USER_DEFINED_TYPES = True
|
||||||
"""Determines whether or not user-defined data types are supported."""
|
"""Whether user-defined data types are supported."""
|
||||||
|
|
||||||
SUPPORTS_SEMI_ANTI_JOIN = True
|
SUPPORTS_SEMI_ANTI_JOIN = True
|
||||||
"""Determines whether or not `SEMI` or `ANTI` joins are supported."""
|
"""Whether `SEMI` or `ANTI` joins are supported."""
|
||||||
|
|
||||||
NORMALIZE_FUNCTIONS: bool | str = "upper"
|
NORMALIZE_FUNCTIONS: bool | str = "upper"
|
||||||
"""Determines how function names are going to be normalized."""
|
"""
|
||||||
|
Determines how function names are going to be normalized.
|
||||||
|
Possible values:
|
||||||
|
"upper" or True: Convert names to uppercase.
|
||||||
|
"lower": Convert names to lowercase.
|
||||||
|
False: Disables function name normalization.
|
||||||
|
"""
|
||||||
|
|
||||||
LOG_BASE_FIRST = True
|
LOG_BASE_FIRST = True
|
||||||
"""Determines whether the base comes first in the `LOG` function."""
|
"""Whether the base comes first in the `LOG` function."""
|
||||||
|
|
||||||
NULL_ORDERING = "nulls_are_small"
|
NULL_ORDERING = "nulls_are_small"
|
||||||
"""
|
"""
|
||||||
Indicates the default `NULL` ordering method to use if not explicitly set.
|
Default `NULL` ordering method to use if not explicitly set.
|
||||||
Possible values: `"nulls_are_small"`, `"nulls_are_large"`, `"nulls_are_last"`
|
Possible values: `"nulls_are_small"`, `"nulls_are_large"`, `"nulls_are_last"`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -200,7 +206,7 @@ class Dialect(metaclass=_Dialect):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
SAFE_DIVISION = False
|
SAFE_DIVISION = False
|
||||||
"""Determines whether division by zero throws an error (`False`) or returns NULL (`True`)."""
|
"""Whether division by zero throws an error (`False`) or returns NULL (`True`)."""
|
||||||
|
|
||||||
CONCAT_COALESCE = False
|
CONCAT_COALESCE = False
|
||||||
"""A `NULL` arg in `CONCAT` yields `NULL` by default, but in some dialects it yields an empty string."""
|
"""A `NULL` arg in `CONCAT` yields `NULL` by default, but in some dialects it yields an empty string."""
|
||||||
|
@ -210,7 +216,7 @@ class Dialect(metaclass=_Dialect):
|
||||||
TIME_FORMAT = "'%Y-%m-%d %H:%M:%S'"
|
TIME_FORMAT = "'%Y-%m-%d %H:%M:%S'"
|
||||||
|
|
||||||
TIME_MAPPING: t.Dict[str, str] = {}
|
TIME_MAPPING: t.Dict[str, str] = {}
|
||||||
"""Associates this dialect's time formats with their equivalent Python `strftime` format."""
|
"""Associates this dialect's time formats with their equivalent Python `strftime` formats."""
|
||||||
|
|
||||||
# https://cloud.google.com/bigquery/docs/reference/standard-sql/format-elements#format_model_rules_date_time
|
# https://cloud.google.com/bigquery/docs/reference/standard-sql/format-elements#format_model_rules_date_time
|
||||||
# https://docs.teradata.com/r/Teradata-Database-SQL-Functions-Operators-Expressions-and-Predicates/March-2017/Data-Type-Conversions/Character-to-DATE-Conversion/Forcing-a-FORMAT-on-CAST-for-Converting-Character-to-DATE
|
# https://docs.teradata.com/r/Teradata-Database-SQL-Functions-Operators-Expressions-and-Predicates/March-2017/Data-Type-Conversions/Character-to-DATE-Conversion/Forcing-a-FORMAT-on-CAST-for-Converting-Character-to-DATE
|
||||||
|
@ -418,7 +424,7 @@ class Dialect(metaclass=_Dialect):
|
||||||
`"safe"`: Only returns `True` if the identifier is case-insensitive.
|
`"safe"`: Only returns `True` if the identifier is case-insensitive.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Whether or not the given text can be identified.
|
Whether the given text can be identified.
|
||||||
"""
|
"""
|
||||||
if identify is True or identify == "always":
|
if identify is True or identify == "always":
|
||||||
return True
|
return True
|
||||||
|
@ -614,7 +620,7 @@ def var_map_sql(
|
||||||
return self.func(map_func_name, *args)
|
return self.func(map_func_name, *args)
|
||||||
|
|
||||||
|
|
||||||
def format_time_lambda(
|
def build_formatted_time(
|
||||||
exp_class: t.Type[E], dialect: str, default: t.Optional[bool | str] = None
|
exp_class: t.Type[E], dialect: str, default: t.Optional[bool | str] = None
|
||||||
) -> t.Callable[[t.List], E]:
|
) -> t.Callable[[t.List], E]:
|
||||||
"""Helper used for time expressions.
|
"""Helper used for time expressions.
|
||||||
|
@ -628,7 +634,7 @@ def format_time_lambda(
|
||||||
A callable that can be used to return the appropriately formatted time expression.
|
A callable that can be used to return the appropriately formatted time expression.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def _format_time(args: t.List):
|
def _builder(args: t.List):
|
||||||
return exp_class(
|
return exp_class(
|
||||||
this=seq_get(args, 0),
|
this=seq_get(args, 0),
|
||||||
format=Dialect[dialect].format_time(
|
format=Dialect[dialect].format_time(
|
||||||
|
@ -637,7 +643,7 @@ def format_time_lambda(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return _format_time
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
def time_format(
|
def time_format(
|
||||||
|
@ -654,23 +660,23 @@ def time_format(
|
||||||
return _time_format
|
return _time_format
|
||||||
|
|
||||||
|
|
||||||
def parse_date_delta(
|
def build_date_delta(
|
||||||
exp_class: t.Type[E], unit_mapping: t.Optional[t.Dict[str, str]] = None
|
exp_class: t.Type[E], unit_mapping: t.Optional[t.Dict[str, str]] = None
|
||||||
) -> t.Callable[[t.List], E]:
|
) -> t.Callable[[t.List], E]:
|
||||||
def inner_func(args: t.List) -> E:
|
def _builder(args: t.List) -> E:
|
||||||
unit_based = len(args) == 3
|
unit_based = len(args) == 3
|
||||||
this = args[2] if unit_based else seq_get(args, 0)
|
this = args[2] if unit_based else seq_get(args, 0)
|
||||||
unit = args[0] if unit_based else exp.Literal.string("DAY")
|
unit = args[0] if unit_based else exp.Literal.string("DAY")
|
||||||
unit = exp.var(unit_mapping.get(unit.name.lower(), unit.name)) if unit_mapping else unit
|
unit = exp.var(unit_mapping.get(unit.name.lower(), unit.name)) if unit_mapping else unit
|
||||||
return exp_class(this=this, expression=seq_get(args, 1), unit=unit)
|
return exp_class(this=this, expression=seq_get(args, 1), unit=unit)
|
||||||
|
|
||||||
return inner_func
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
def parse_date_delta_with_interval(
|
def build_date_delta_with_interval(
|
||||||
expression_class: t.Type[E],
|
expression_class: t.Type[E],
|
||||||
) -> t.Callable[[t.List], t.Optional[E]]:
|
) -> t.Callable[[t.List], t.Optional[E]]:
|
||||||
def func(args: t.List) -> t.Optional[E]:
|
def _builder(args: t.List) -> t.Optional[E]:
|
||||||
if len(args) < 2:
|
if len(args) < 2:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -687,7 +693,7 @@ def parse_date_delta_with_interval(
|
||||||
this=args[0], expression=expression, unit=exp.Literal.string(interval.text("unit"))
|
this=args[0], expression=expression, unit=exp.Literal.string(interval.text("unit"))
|
||||||
)
|
)
|
||||||
|
|
||||||
return func
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
def date_trunc_to_time(args: t.List) -> exp.DateTrunc | exp.TimestampTrunc:
|
def date_trunc_to_time(args: t.List) -> exp.DateTrunc | exp.TimestampTrunc:
|
||||||
|
@ -888,7 +894,7 @@ def binary_from_function(expr_type: t.Type[B]) -> t.Callable[[t.List], B]:
|
||||||
|
|
||||||
|
|
||||||
# Used to represent DATE_TRUNC in Doris, Postgres and Starrocks dialects
|
# Used to represent DATE_TRUNC in Doris, Postgres and Starrocks dialects
|
||||||
def parse_timestamp_trunc(args: t.List) -> exp.TimestampTrunc:
|
def build_timestamp_trunc(args: t.List) -> exp.TimestampTrunc:
|
||||||
return exp.TimestampTrunc(this=seq_get(args, 1), unit=seq_get(args, 0))
|
return exp.TimestampTrunc(this=seq_get(args, 1), unit=seq_get(args, 0))
|
||||||
|
|
||||||
|
|
||||||
|
@ -991,10 +997,10 @@ def merge_without_target_sql(self: Generator, expression: exp.Merge) -> str:
|
||||||
return self.merge_sql(expression)
|
return self.merge_sql(expression)
|
||||||
|
|
||||||
|
|
||||||
def parse_json_extract_path(
|
def build_json_extract_path(
|
||||||
expr_type: t.Type[F], zero_based_indexing: bool = True
|
expr_type: t.Type[F], zero_based_indexing: bool = True
|
||||||
) -> t.Callable[[t.List], F]:
|
) -> t.Callable[[t.List], F]:
|
||||||
def _parse_json_extract_path(args: t.List) -> F:
|
def _builder(args: t.List) -> F:
|
||||||
segments: t.List[exp.JSONPathPart] = [exp.JSONPathRoot()]
|
segments: t.List[exp.JSONPathPart] = [exp.JSONPathRoot()]
|
||||||
for arg in args[1:]:
|
for arg in args[1:]:
|
||||||
if not isinstance(arg, exp.Literal):
|
if not isinstance(arg, exp.Literal):
|
||||||
|
@ -1014,11 +1020,11 @@ def parse_json_extract_path(
|
||||||
del args[2:]
|
del args[2:]
|
||||||
return expr_type(this=seq_get(args, 0), expression=exp.JSONPath(expressions=segments))
|
return expr_type(this=seq_get(args, 0), expression=exp.JSONPath(expressions=segments))
|
||||||
|
|
||||||
return _parse_json_extract_path
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
def json_extract_segments(
|
def json_extract_segments(
|
||||||
name: str, quoted_index: bool = True
|
name: str, quoted_index: bool = True, op: t.Optional[str] = None
|
||||||
) -> t.Callable[[Generator, JSON_EXTRACT_TYPE], str]:
|
) -> t.Callable[[Generator, JSON_EXTRACT_TYPE], str]:
|
||||||
def _json_extract_segments(self: Generator, expression: JSON_EXTRACT_TYPE) -> str:
|
def _json_extract_segments(self: Generator, expression: JSON_EXTRACT_TYPE) -> str:
|
||||||
path = expression.expression
|
path = expression.expression
|
||||||
|
@ -1036,6 +1042,8 @@ def json_extract_segments(
|
||||||
|
|
||||||
segments.append(path)
|
segments.append(path)
|
||||||
|
|
||||||
|
if op:
|
||||||
|
return f" {op} ".join([self.sql(expression.this), *segments])
|
||||||
return self.func(name, expression.this, *segments)
|
return self.func(name, expression.this, *segments)
|
||||||
|
|
||||||
return _json_extract_segments
|
return _json_extract_segments
|
||||||
|
@ -1046,3 +1054,19 @@ def json_path_key_only_name(self: Generator, expression: exp.JSONPathKey) -> str
|
||||||
self.unsupported("Unsupported wildcard in JSONPathKey expression")
|
self.unsupported("Unsupported wildcard in JSONPathKey expression")
|
||||||
|
|
||||||
return expression.name
|
return expression.name
|
||||||
|
|
||||||
|
|
||||||
|
def filter_array_using_unnest(self: Generator, expression: exp.ArrayFilter) -> str:
|
||||||
|
cond = expression.expression
|
||||||
|
if isinstance(cond, exp.Lambda) and len(cond.expressions) == 1:
|
||||||
|
alias = cond.expressions[0]
|
||||||
|
cond = cond.this
|
||||||
|
elif isinstance(cond, exp.Predicate):
|
||||||
|
alias = "_u"
|
||||||
|
else:
|
||||||
|
self.unsupported("Unsupported filter condition")
|
||||||
|
return ""
|
||||||
|
|
||||||
|
unnest = exp.Unnest(expressions=[expression.this])
|
||||||
|
filtered = exp.select(alias).from_(exp.alias_(unnest, None, table=[alias])).where(cond)
|
||||||
|
return self.sql(exp.Array(expressions=[filtered]))
|
||||||
|
|
|
@ -4,7 +4,7 @@ from sqlglot import exp
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
approx_count_distinct_sql,
|
approx_count_distinct_sql,
|
||||||
arrow_json_extract_sql,
|
arrow_json_extract_sql,
|
||||||
parse_timestamp_trunc,
|
build_timestamp_trunc,
|
||||||
rename_func,
|
rename_func,
|
||||||
time_format,
|
time_format,
|
||||||
)
|
)
|
||||||
|
@ -20,7 +20,7 @@ class Doris(MySQL):
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**MySQL.Parser.FUNCTIONS,
|
**MySQL.Parser.FUNCTIONS,
|
||||||
"COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list,
|
"COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list,
|
||||||
"DATE_TRUNC": parse_timestamp_trunc,
|
"DATE_TRUNC": build_timestamp_trunc,
|
||||||
"REGEXP": exp.RegexpLike.from_arg_list,
|
"REGEXP": exp.RegexpLike.from_arg_list,
|
||||||
"TO_DATE": exp.TsOrDsToDate.from_arg_list,
|
"TO_DATE": exp.TsOrDsToDate.from_arg_list,
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ class Doris(MySQL):
|
||||||
exp.ArgMin: rename_func("MIN_BY"),
|
exp.ArgMin: rename_func("MIN_BY"),
|
||||||
exp.ArrayAgg: rename_func("COLLECT_LIST"),
|
exp.ArrayAgg: rename_func("COLLECT_LIST"),
|
||||||
exp.ArrayUniqueAgg: rename_func("COLLECT_SET"),
|
exp.ArrayUniqueAgg: rename_func("COLLECT_SET"),
|
||||||
exp.CurrentTimestamp: lambda *_: "NOW()",
|
exp.CurrentTimestamp: lambda self, _: self.func("NOW"),
|
||||||
exp.DateTrunc: lambda self, e: self.func(
|
exp.DateTrunc: lambda self, e: self.func(
|
||||||
"DATE_TRUNC", e.this, "'" + e.text("unit") + "'"
|
"DATE_TRUNC", e.this, "'" + e.text("unit") + "'"
|
||||||
),
|
),
|
||||||
|
@ -55,14 +55,11 @@ class Doris(MySQL):
|
||||||
exp.Map: rename_func("ARRAY_MAP"),
|
exp.Map: rename_func("ARRAY_MAP"),
|
||||||
exp.RegexpLike: rename_func("REGEXP"),
|
exp.RegexpLike: rename_func("REGEXP"),
|
||||||
exp.RegexpSplit: rename_func("SPLIT_BY_STRING"),
|
exp.RegexpSplit: rename_func("SPLIT_BY_STRING"),
|
||||||
exp.StrToUnix: lambda self,
|
exp.StrToUnix: lambda self, e: self.func("UNIX_TIMESTAMP", e.this, self.format_time(e)),
|
||||||
e: f"UNIX_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.Split: rename_func("SPLIT_BY_STRING"),
|
exp.Split: rename_func("SPLIT_BY_STRING"),
|
||||||
exp.TimeStrToDate: rename_func("TO_DATE"),
|
exp.TimeStrToDate: rename_func("TO_DATE"),
|
||||||
exp.ToChar: lambda self,
|
exp.ToChar: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)),
|
||||||
e: f"DATE_FORMAT({self.sql(e, 'this')}, {self.format_time(e)})",
|
exp.TsOrDsAdd: lambda self, e: self.func("DATE_ADD", e.this, e.expression),
|
||||||
exp.TsOrDsAdd: lambda self,
|
|
||||||
e: f"DATE_ADD({self.sql(e, 'this')}, {self.sql(e, 'expression')})", # Only for day level
|
|
||||||
exp.TsOrDsToDate: lambda self, e: self.func("TO_DATE", e.this),
|
exp.TsOrDsToDate: lambda self, e: self.func("TO_DATE", e.this),
|
||||||
exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
|
exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
|
||||||
exp.TimestampTrunc: lambda self, e: self.func(
|
exp.TimestampTrunc: lambda self, e: self.func(
|
||||||
|
|
|
@ -6,7 +6,7 @@ from sqlglot import exp, generator, parser, tokens, transforms
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
Dialect,
|
Dialect,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
no_trycast_sql,
|
no_trycast_sql,
|
||||||
rename_func,
|
rename_func,
|
||||||
str_position_sql,
|
str_position_sql,
|
||||||
|
@ -19,9 +19,7 @@ def _date_add_sql(kind: str) -> t.Callable[[Drill.Generator, exp.DateAdd | exp.D
|
||||||
def func(self: Drill.Generator, expression: exp.DateAdd | exp.DateSub) -> str:
|
def func(self: Drill.Generator, expression: exp.DateAdd | exp.DateSub) -> str:
|
||||||
this = self.sql(expression, "this")
|
this = self.sql(expression, "this")
|
||||||
unit = exp.var(expression.text("unit").upper() or "DAY")
|
unit = exp.var(expression.text("unit").upper() or "DAY")
|
||||||
return (
|
return self.func(f"DATE_{kind}", this, exp.Interval(this=expression.expression, unit=unit))
|
||||||
f"DATE_{kind}({this}, {self.sql(exp.Interval(this=expression.expression, unit=unit))})"
|
|
||||||
)
|
|
||||||
|
|
||||||
return func
|
return func
|
||||||
|
|
||||||
|
@ -30,8 +28,8 @@ def _str_to_date(self: Drill.Generator, expression: exp.StrToDate) -> str:
|
||||||
this = self.sql(expression, "this")
|
this = self.sql(expression, "this")
|
||||||
time_format = self.format_time(expression)
|
time_format = self.format_time(expression)
|
||||||
if time_format == Drill.DATE_FORMAT:
|
if time_format == Drill.DATE_FORMAT:
|
||||||
return f"CAST({this} AS DATE)"
|
return self.sql(exp.cast(this, "date"))
|
||||||
return f"TO_DATE({this}, {time_format})"
|
return self.func("TO_DATE", this, time_format)
|
||||||
|
|
||||||
|
|
||||||
class Drill(Dialect):
|
class Drill(Dialect):
|
||||||
|
@ -86,9 +84,9 @@ class Drill(Dialect):
|
||||||
|
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"DATE_FORMAT": format_time_lambda(exp.TimeToStr, "drill"),
|
"DATE_FORMAT": build_formatted_time(exp.TimeToStr, "drill"),
|
||||||
"TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list,
|
"TO_TIMESTAMP": exp.TimeStrToTime.from_arg_list,
|
||||||
"TO_CHAR": format_time_lambda(exp.TimeToStr, "drill"),
|
"TO_CHAR": build_formatted_time(exp.TimeToStr, "drill"),
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEFAULTS_TO_LN = True
|
LOG_DEFAULTS_TO_LN = True
|
||||||
|
@ -135,8 +133,7 @@ class Drill(Dialect):
|
||||||
e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})",
|
e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.DATEINT_FORMAT})",
|
||||||
exp.If: lambda self,
|
exp.If: lambda self,
|
||||||
e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})",
|
e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})",
|
||||||
exp.ILike: lambda self,
|
exp.ILike: lambda self, e: self.binary(e, "`ILIKE`"),
|
||||||
e: f" {self.sql(e, 'this')} `ILIKE` {self.sql(e, 'expression')}",
|
|
||||||
exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"),
|
exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"),
|
||||||
exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
|
exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
|
||||||
exp.RegexpLike: rename_func("REGEXP_MATCHES"),
|
exp.RegexpLike: rename_func("REGEXP_MATCHES"),
|
||||||
|
@ -146,12 +143,11 @@ class Drill(Dialect):
|
||||||
exp.Select: transforms.preprocess(
|
exp.Select: transforms.preprocess(
|
||||||
[transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins]
|
[transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins]
|
||||||
),
|
),
|
||||||
exp.StrToTime: lambda self,
|
exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)),
|
||||||
e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
|
exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, "date")),
|
||||||
exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)",
|
|
||||||
exp.TimeStrToTime: timestrtotime_sql,
|
exp.TimeStrToTime: timestrtotime_sql,
|
||||||
exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
|
exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
|
||||||
exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})",
|
exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)),
|
||||||
exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
|
exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
|
||||||
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
||||||
exp.TryCast: no_trycast_sql,
|
exp.TryCast: no_trycast_sql,
|
||||||
|
|
|
@ -14,7 +14,7 @@ from sqlglot.dialects.dialect import (
|
||||||
date_trunc_to_time,
|
date_trunc_to_time,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
encode_decode_sql,
|
encode_decode_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
inline_array_sql,
|
inline_array_sql,
|
||||||
no_comment_column_constraint_sql,
|
no_comment_column_constraint_sql,
|
||||||
no_safe_divide_sql,
|
no_safe_divide_sql,
|
||||||
|
@ -62,26 +62,24 @@ def _date_sql(self: DuckDB.Generator, expression: exp.Date) -> str:
|
||||||
|
|
||||||
def _array_sort_sql(self: DuckDB.Generator, expression: exp.ArraySort) -> str:
|
def _array_sort_sql(self: DuckDB.Generator, expression: exp.ArraySort) -> str:
|
||||||
if expression.expression:
|
if expression.expression:
|
||||||
self.unsupported("DUCKDB ARRAY_SORT does not support a comparator")
|
self.unsupported("DuckDB ARRAY_SORT does not support a comparator")
|
||||||
return f"ARRAY_SORT({self.sql(expression, 'this')})"
|
return self.func("ARRAY_SORT", expression.this)
|
||||||
|
|
||||||
|
|
||||||
def _sort_array_sql(self: DuckDB.Generator, expression: exp.SortArray) -> str:
|
def _sort_array_sql(self: DuckDB.Generator, expression: exp.SortArray) -> str:
|
||||||
this = self.sql(expression, "this")
|
name = "ARRAY_REVERSE_SORT" if expression.args.get("asc") == exp.false() else "ARRAY_SORT"
|
||||||
if expression.args.get("asc") == exp.false():
|
return self.func(name, expression.this)
|
||||||
return f"ARRAY_REVERSE_SORT({this})"
|
|
||||||
return f"ARRAY_SORT({this})"
|
|
||||||
|
|
||||||
|
|
||||||
def _sort_array_reverse(args: t.List) -> exp.Expression:
|
def _build_sort_array_desc(args: t.List) -> exp.Expression:
|
||||||
return exp.SortArray(this=seq_get(args, 0), asc=exp.false())
|
return exp.SortArray(this=seq_get(args, 0), asc=exp.false())
|
||||||
|
|
||||||
|
|
||||||
def _parse_date_diff(args: t.List) -> exp.Expression:
|
def _build_date_diff(args: t.List) -> exp.Expression:
|
||||||
return exp.DateDiff(this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0))
|
return exp.DateDiff(this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0))
|
||||||
|
|
||||||
|
|
||||||
def _parse_make_timestamp(args: t.List) -> exp.Expression:
|
def _build_make_timestamp(args: t.List) -> exp.Expression:
|
||||||
if len(args) == 1:
|
if len(args) == 1:
|
||||||
return exp.UnixToTime(this=seq_get(args, 0), scale=exp.UnixToTime.MICROS)
|
return exp.UnixToTime(this=seq_get(args, 0), scale=exp.UnixToTime.MICROS)
|
||||||
|
|
||||||
|
@ -103,9 +101,6 @@ def _struct_sql(self: DuckDB.Generator, expression: exp.Struct) -> str:
|
||||||
value = expr.this
|
value = expr.this
|
||||||
else:
|
else:
|
||||||
key = expr.name or expr.this.name
|
key = expr.name or expr.this.name
|
||||||
if isinstance(expr, exp.Bracket):
|
|
||||||
value = expr.expressions[0]
|
|
||||||
else:
|
|
||||||
value = expr.expression
|
value = expr.expression
|
||||||
|
|
||||||
args.append(f"{self.sql(exp.Literal.string(key))}: {self.sql(value)}")
|
args.append(f"{self.sql(exp.Literal.string(key))}: {self.sql(value)}")
|
||||||
|
@ -131,15 +126,16 @@ def _json_format_sql(self: DuckDB.Generator, expression: exp.JSONFormat) -> str:
|
||||||
|
|
||||||
def _unix_to_time_sql(self: DuckDB.Generator, expression: exp.UnixToTime) -> str:
|
def _unix_to_time_sql(self: DuckDB.Generator, expression: exp.UnixToTime) -> str:
|
||||||
scale = expression.args.get("scale")
|
scale = expression.args.get("scale")
|
||||||
timestamp = self.sql(expression, "this")
|
timestamp = expression.this
|
||||||
if scale in (None, exp.UnixToTime.SECONDS):
|
|
||||||
return f"TO_TIMESTAMP({timestamp})"
|
|
||||||
if scale == exp.UnixToTime.MILLIS:
|
|
||||||
return f"EPOCH_MS({timestamp})"
|
|
||||||
if scale == exp.UnixToTime.MICROS:
|
|
||||||
return f"MAKE_TIMESTAMP({timestamp})"
|
|
||||||
|
|
||||||
return f"TO_TIMESTAMP({timestamp} / POW(10, {scale}))"
|
if scale in (None, exp.UnixToTime.SECONDS):
|
||||||
|
return self.func("TO_TIMESTAMP", timestamp)
|
||||||
|
if scale == exp.UnixToTime.MILLIS:
|
||||||
|
return self.func("EPOCH_MS", timestamp)
|
||||||
|
if scale == exp.UnixToTime.MICROS:
|
||||||
|
return self.func("MAKE_TIMESTAMP", timestamp)
|
||||||
|
|
||||||
|
return self.func("TO_TIMESTAMP", exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)))
|
||||||
|
|
||||||
|
|
||||||
def _rename_unless_within_group(
|
def _rename_unless_within_group(
|
||||||
|
@ -152,7 +148,7 @@ def _rename_unless_within_group(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _parse_struct_pack(args: t.List) -> exp.Struct:
|
def _build_struct_pack(args: t.List) -> exp.Struct:
|
||||||
args_with_columns_as_identifiers = [
|
args_with_columns_as_identifiers = [
|
||||||
exp.PropertyEQ(this=arg.this.this, expression=arg.expression) for arg in args
|
exp.PropertyEQ(this=arg.this.this, expression=arg.expression) for arg in args
|
||||||
]
|
]
|
||||||
|
@ -220,11 +216,10 @@ class DuckDB(Dialect):
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"ARRAY_HAS": exp.ArrayContains.from_arg_list,
|
"ARRAY_HAS": exp.ArrayContains.from_arg_list,
|
||||||
"ARRAY_LENGTH": exp.ArraySize.from_arg_list,
|
|
||||||
"ARRAY_SORT": exp.SortArray.from_arg_list,
|
"ARRAY_SORT": exp.SortArray.from_arg_list,
|
||||||
"ARRAY_REVERSE_SORT": _sort_array_reverse,
|
"ARRAY_REVERSE_SORT": _build_sort_array_desc,
|
||||||
"DATEDIFF": _parse_date_diff,
|
"DATEDIFF": _build_date_diff,
|
||||||
"DATE_DIFF": _parse_date_diff,
|
"DATE_DIFF": _build_date_diff,
|
||||||
"DATE_TRUNC": date_trunc_to_time,
|
"DATE_TRUNC": date_trunc_to_time,
|
||||||
"DATETRUNC": date_trunc_to_time,
|
"DATETRUNC": date_trunc_to_time,
|
||||||
"DECODE": lambda args: exp.Decode(
|
"DECODE": lambda args: exp.Decode(
|
||||||
|
@ -238,14 +233,14 @@ class DuckDB(Dialect):
|
||||||
this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS
|
this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS
|
||||||
),
|
),
|
||||||
"JSON": exp.ParseJSON.from_arg_list,
|
"JSON": exp.ParseJSON.from_arg_list,
|
||||||
"JSON_EXTRACT_PATH": parser.parse_extract_json_with_path(exp.JSONExtract),
|
"JSON_EXTRACT_PATH": parser.build_extract_json_with_path(exp.JSONExtract),
|
||||||
"JSON_EXTRACT_STRING": parser.parse_extract_json_with_path(exp.JSONExtractScalar),
|
"JSON_EXTRACT_STRING": parser.build_extract_json_with_path(exp.JSONExtractScalar),
|
||||||
"LIST_HAS": exp.ArrayContains.from_arg_list,
|
"LIST_HAS": exp.ArrayContains.from_arg_list,
|
||||||
"LIST_REVERSE_SORT": _sort_array_reverse,
|
"LIST_REVERSE_SORT": _build_sort_array_desc,
|
||||||
"LIST_SORT": exp.SortArray.from_arg_list,
|
"LIST_SORT": exp.SortArray.from_arg_list,
|
||||||
"LIST_VALUE": exp.Array.from_arg_list,
|
"LIST_VALUE": exp.Array.from_arg_list,
|
||||||
"MAKE_TIME": exp.TimeFromParts.from_arg_list,
|
"MAKE_TIME": exp.TimeFromParts.from_arg_list,
|
||||||
"MAKE_TIMESTAMP": _parse_make_timestamp,
|
"MAKE_TIMESTAMP": _build_make_timestamp,
|
||||||
"MEDIAN": lambda args: exp.PercentileCont(
|
"MEDIAN": lambda args: exp.PercentileCont(
|
||||||
this=seq_get(args, 0), expression=exp.Literal.number(0.5)
|
this=seq_get(args, 0), expression=exp.Literal.number(0.5)
|
||||||
),
|
),
|
||||||
|
@ -261,12 +256,12 @@ class DuckDB(Dialect):
|
||||||
replacement=seq_get(args, 2),
|
replacement=seq_get(args, 2),
|
||||||
modifiers=seq_get(args, 3),
|
modifiers=seq_get(args, 3),
|
||||||
),
|
),
|
||||||
"STRFTIME": format_time_lambda(exp.TimeToStr, "duckdb"),
|
"STRFTIME": build_formatted_time(exp.TimeToStr, "duckdb"),
|
||||||
"STRING_SPLIT": exp.Split.from_arg_list,
|
"STRING_SPLIT": exp.Split.from_arg_list,
|
||||||
"STRING_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
|
"STRING_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
|
||||||
"STRING_TO_ARRAY": exp.Split.from_arg_list,
|
"STRING_TO_ARRAY": exp.Split.from_arg_list,
|
||||||
"STRPTIME": format_time_lambda(exp.StrToTime, "duckdb"),
|
"STRPTIME": build_formatted_time(exp.StrToTime, "duckdb"),
|
||||||
"STRUCT_PACK": _parse_struct_pack,
|
"STRUCT_PACK": _build_struct_pack,
|
||||||
"STR_SPLIT": exp.Split.from_arg_list,
|
"STR_SPLIT": exp.Split.from_arg_list,
|
||||||
"STR_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
|
"STR_SPLIT_REGEX": exp.RegexpSplit.from_arg_list,
|
||||||
"TO_TIMESTAMP": exp.UnixToTime.from_arg_list,
|
"TO_TIMESTAMP": exp.UnixToTime.from_arg_list,
|
||||||
|
@ -275,7 +270,7 @@ class DuckDB(Dialect):
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCTION_PARSERS = parser.Parser.FUNCTION_PARSERS.copy()
|
FUNCTION_PARSERS = parser.Parser.FUNCTION_PARSERS.copy()
|
||||||
FUNCTION_PARSERS.pop("DECODE", None)
|
FUNCTION_PARSERS.pop("DECODE")
|
||||||
|
|
||||||
TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - {
|
TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - {
|
||||||
TokenType.SEMI,
|
TokenType.SEMI,
|
||||||
|
@ -334,6 +329,7 @@ class DuckDB(Dialect):
|
||||||
JSON_PATH_BRACKETED_KEY_SUPPORTED = False
|
JSON_PATH_BRACKETED_KEY_SUPPORTED = False
|
||||||
SUPPORTS_CREATE_TABLE_LIKE = False
|
SUPPORTS_CREATE_TABLE_LIKE = False
|
||||||
MULTI_ARG_DISTINCT = False
|
MULTI_ARG_DISTINCT = False
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = True
|
||||||
|
|
||||||
TRANSFORMS = {
|
TRANSFORMS = {
|
||||||
**generator.Generator.TRANSFORMS,
|
**generator.Generator.TRANSFORMS,
|
||||||
|
@ -343,6 +339,7 @@ class DuckDB(Dialect):
|
||||||
if e.expressions and e.expressions[0].find(exp.Select)
|
if e.expressions and e.expressions[0].find(exp.Select)
|
||||||
else inline_array_sql(self, e)
|
else inline_array_sql(self, e)
|
||||||
),
|
),
|
||||||
|
exp.ArrayFilter: rename_func("LIST_FILTER"),
|
||||||
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
||||||
exp.ArgMax: arg_max_or_min_no_count("ARG_MAX"),
|
exp.ArgMax: arg_max_or_min_no_count("ARG_MAX"),
|
||||||
exp.ArgMin: arg_max_or_min_no_count("ARG_MIN"),
|
exp.ArgMin: arg_max_or_min_no_count("ARG_MIN"),
|
||||||
|
@ -350,9 +347,9 @@ class DuckDB(Dialect):
|
||||||
exp.ArraySum: rename_func("LIST_SUM"),
|
exp.ArraySum: rename_func("LIST_SUM"),
|
||||||
exp.BitwiseXor: rename_func("XOR"),
|
exp.BitwiseXor: rename_func("XOR"),
|
||||||
exp.CommentColumnConstraint: no_comment_column_constraint_sql,
|
exp.CommentColumnConstraint: no_comment_column_constraint_sql,
|
||||||
exp.CurrentDate: lambda self, e: "CURRENT_DATE",
|
exp.CurrentDate: lambda *_: "CURRENT_DATE",
|
||||||
exp.CurrentTime: lambda self, e: "CURRENT_TIME",
|
exp.CurrentTime: lambda *_: "CURRENT_TIME",
|
||||||
exp.CurrentTimestamp: lambda self, e: "CURRENT_TIMESTAMP",
|
exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
|
||||||
exp.DayOfMonth: rename_func("DAYOFMONTH"),
|
exp.DayOfMonth: rename_func("DAYOFMONTH"),
|
||||||
exp.DayOfWeek: rename_func("DAYOFWEEK"),
|
exp.DayOfWeek: rename_func("DAYOFWEEK"),
|
||||||
exp.DayOfYear: rename_func("DAYOFYEAR"),
|
exp.DayOfYear: rename_func("DAYOFYEAR"),
|
||||||
|
@ -409,19 +406,19 @@ class DuckDB(Dialect):
|
||||||
exp.StrPosition: str_position_sql,
|
exp.StrPosition: str_position_sql,
|
||||||
exp.StrToDate: lambda self, e: f"CAST({str_to_time_sql(self, e)} AS DATE)",
|
exp.StrToDate: lambda self, e: f"CAST({str_to_time_sql(self, e)} AS DATE)",
|
||||||
exp.StrToTime: str_to_time_sql,
|
exp.StrToTime: str_to_time_sql,
|
||||||
exp.StrToUnix: lambda self,
|
exp.StrToUnix: lambda self, e: self.func(
|
||||||
e: f"EPOCH(STRPTIME({self.sql(e, 'this')}, {self.format_time(e)}))",
|
"EPOCH", self.func("STRPTIME", e.this, self.format_time(e))
|
||||||
|
),
|
||||||
exp.Struct: _struct_sql,
|
exp.Struct: _struct_sql,
|
||||||
exp.Timestamp: no_timestamp_sql,
|
exp.Timestamp: no_timestamp_sql,
|
||||||
exp.TimestampDiff: lambda self, e: self.func(
|
exp.TimestampDiff: lambda self, e: self.func(
|
||||||
"DATE_DIFF", exp.Literal.string(e.unit), e.expression, e.this
|
"DATE_DIFF", exp.Literal.string(e.unit), e.expression, e.this
|
||||||
),
|
),
|
||||||
exp.TimestampTrunc: timestamptrunc_sql,
|
exp.TimestampTrunc: timestamptrunc_sql,
|
||||||
exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)",
|
exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, "date")),
|
||||||
exp.TimeStrToTime: timestrtotime_sql,
|
exp.TimeStrToTime: timestrtotime_sql,
|
||||||
exp.TimeStrToUnix: lambda self, e: f"EPOCH(CAST({self.sql(e, 'this')} AS TIMESTAMP))",
|
exp.TimeStrToUnix: lambda self, e: self.func("EPOCH", exp.cast(e.this, "timestamp")),
|
||||||
exp.TimeToStr: lambda self,
|
exp.TimeToStr: lambda self, e: self.func("STRFTIME", e.this, self.format_time(e)),
|
||||||
e: f"STRFTIME({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.TimeToUnix: rename_func("EPOCH"),
|
exp.TimeToUnix: rename_func("EPOCH"),
|
||||||
exp.TsOrDiToDi: lambda self,
|
exp.TsOrDiToDi: lambda self,
|
||||||
e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS TEXT), '-', ''), 1, 8) AS INT)",
|
e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS TEXT), '-', ''), 1, 8) AS INT)",
|
||||||
|
@ -432,8 +429,9 @@ class DuckDB(Dialect):
|
||||||
exp.cast(e.expression, "TIMESTAMP"),
|
exp.cast(e.expression, "TIMESTAMP"),
|
||||||
exp.cast(e.this, "TIMESTAMP"),
|
exp.cast(e.this, "TIMESTAMP"),
|
||||||
),
|
),
|
||||||
exp.UnixToStr: lambda self,
|
exp.UnixToStr: lambda self, e: self.func(
|
||||||
e: f"STRFTIME(TO_TIMESTAMP({self.sql(e, 'this')}), {self.format_time(e)})",
|
"STRFTIME", self.func("TO_TIMESTAMP", e.this), self.format_time(e)
|
||||||
|
),
|
||||||
exp.UnixToTime: _unix_to_time_sql,
|
exp.UnixToTime: _unix_to_time_sql,
|
||||||
exp.UnixToTimeStr: lambda self, e: f"CAST(TO_TIMESTAMP({self.sql(e, 'this')}) AS TEXT)",
|
exp.UnixToTimeStr: lambda self, e: f"CAST(TO_TIMESTAMP({self.sql(e, 'this')}) AS TEXT)",
|
||||||
exp.VariancePop: rename_func("VAR_POP"),
|
exp.VariancePop: rename_func("VAR_POP"),
|
||||||
|
|
|
@ -10,7 +10,7 @@ from sqlglot.dialects.dialect import (
|
||||||
approx_count_distinct_sql,
|
approx_count_distinct_sql,
|
||||||
arg_max_or_min_no_count,
|
arg_max_or_min_no_count,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
if_sql,
|
if_sql,
|
||||||
is_parse_json,
|
is_parse_json,
|
||||||
left_to_substring_sql,
|
left_to_substring_sql,
|
||||||
|
@ -38,7 +38,6 @@ from sqlglot.transforms import (
|
||||||
move_schema_columns_to_partitioned_by,
|
move_schema_columns_to_partitioned_by,
|
||||||
)
|
)
|
||||||
from sqlglot.helper import seq_get
|
from sqlglot.helper import seq_get
|
||||||
from sqlglot.parser import parse_var_map
|
|
||||||
from sqlglot.tokens import TokenType
|
from sqlglot.tokens import TokenType
|
||||||
|
|
||||||
# (FuncType, Multiplier)
|
# (FuncType, Multiplier)
|
||||||
|
@ -130,7 +129,7 @@ def _json_format_sql(self: Hive.Generator, expression: exp.JSONFormat) -> str:
|
||||||
def _array_sort_sql(self: Hive.Generator, expression: exp.ArraySort) -> str:
|
def _array_sort_sql(self: Hive.Generator, expression: exp.ArraySort) -> str:
|
||||||
if expression.expression:
|
if expression.expression:
|
||||||
self.unsupported("Hive SORT_ARRAY does not support a comparator")
|
self.unsupported("Hive SORT_ARRAY does not support a comparator")
|
||||||
return f"SORT_ARRAY({self.sql(expression, 'this')})"
|
return self.func("SORT_ARRAY", expression.this)
|
||||||
|
|
||||||
|
|
||||||
def _property_sql(self: Hive.Generator, expression: exp.Property) -> str:
|
def _property_sql(self: Hive.Generator, expression: exp.Property) -> str:
|
||||||
|
@ -157,23 +156,18 @@ def _str_to_time_sql(self: Hive.Generator, expression: exp.StrToTime) -> str:
|
||||||
return f"CAST({this} AS TIMESTAMP)"
|
return f"CAST({this} AS TIMESTAMP)"
|
||||||
|
|
||||||
|
|
||||||
def _time_to_str(self: Hive.Generator, expression: exp.TimeToStr) -> str:
|
|
||||||
this = self.sql(expression, "this")
|
|
||||||
time_format = self.format_time(expression)
|
|
||||||
return f"DATE_FORMAT({this}, {time_format})"
|
|
||||||
|
|
||||||
|
|
||||||
def _to_date_sql(self: Hive.Generator, expression: exp.TsOrDsToDate) -> str:
|
def _to_date_sql(self: Hive.Generator, expression: exp.TsOrDsToDate) -> str:
|
||||||
this = self.sql(expression, "this")
|
|
||||||
time_format = self.format_time(expression)
|
time_format = self.format_time(expression)
|
||||||
if time_format and time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT):
|
if time_format and time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT):
|
||||||
return f"TO_DATE({this}, {time_format})"
|
return self.func("TO_DATE", expression.this, time_format)
|
||||||
|
|
||||||
if isinstance(expression.this, exp.TsOrDsToDate):
|
if isinstance(expression.this, exp.TsOrDsToDate):
|
||||||
return this
|
return self.sql(expression, "this")
|
||||||
return f"TO_DATE({this})"
|
|
||||||
|
return self.func("TO_DATE", expression.this)
|
||||||
|
|
||||||
|
|
||||||
def _parse_ignore_nulls(
|
def _build_with_ignore_nulls(
|
||||||
exp_class: t.Type[exp.Expression],
|
exp_class: t.Type[exp.Expression],
|
||||||
) -> t.Callable[[t.List[exp.Expression]], exp.Expression]:
|
) -> t.Callable[[t.List[exp.Expression]], exp.Expression]:
|
||||||
def _parse(args: t.List[exp.Expression]) -> exp.Expression:
|
def _parse(args: t.List[exp.Expression]) -> exp.Expression:
|
||||||
|
@ -276,7 +270,7 @@ class Hive(Dialect):
|
||||||
"DATE_ADD": lambda args: exp.TsOrDsAdd(
|
"DATE_ADD": lambda args: exp.TsOrDsAdd(
|
||||||
this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY")
|
this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY")
|
||||||
),
|
),
|
||||||
"DATE_FORMAT": lambda args: format_time_lambda(exp.TimeToStr, "hive")(
|
"DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")(
|
||||||
[
|
[
|
||||||
exp.TimeStrToTime(this=seq_get(args, 0)),
|
exp.TimeStrToTime(this=seq_get(args, 0)),
|
||||||
seq_get(args, 1),
|
seq_get(args, 1),
|
||||||
|
@ -292,14 +286,14 @@ class Hive(Dialect):
|
||||||
expression=exp.TsOrDsToDate(this=seq_get(args, 1)),
|
expression=exp.TsOrDsToDate(this=seq_get(args, 1)),
|
||||||
),
|
),
|
||||||
"DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
"DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||||
"FIRST": _parse_ignore_nulls(exp.First),
|
"FIRST": _build_with_ignore_nulls(exp.First),
|
||||||
"FIRST_VALUE": _parse_ignore_nulls(exp.FirstValue),
|
"FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue),
|
||||||
"FROM_UNIXTIME": format_time_lambda(exp.UnixToStr, "hive", True),
|
"FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True),
|
||||||
"GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list,
|
"GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list,
|
||||||
"LAST": _parse_ignore_nulls(exp.Last),
|
"LAST": _build_with_ignore_nulls(exp.Last),
|
||||||
"LAST_VALUE": _parse_ignore_nulls(exp.LastValue),
|
"LAST_VALUE": _build_with_ignore_nulls(exp.LastValue),
|
||||||
"LOCATE": locate_to_strposition,
|
"LOCATE": locate_to_strposition,
|
||||||
"MAP": parse_var_map,
|
"MAP": parser.build_var_map,
|
||||||
"MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)),
|
"MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)),
|
||||||
"PERCENTILE": exp.Quantile.from_arg_list,
|
"PERCENTILE": exp.Quantile.from_arg_list,
|
||||||
"PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list,
|
"PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list,
|
||||||
|
@ -313,10 +307,10 @@ class Hive(Dialect):
|
||||||
pair_delim=seq_get(args, 1) or exp.Literal.string(","),
|
pair_delim=seq_get(args, 1) or exp.Literal.string(","),
|
||||||
key_value_delim=seq_get(args, 2) or exp.Literal.string(":"),
|
key_value_delim=seq_get(args, 2) or exp.Literal.string(":"),
|
||||||
),
|
),
|
||||||
"TO_DATE": format_time_lambda(exp.TsOrDsToDate, "hive"),
|
"TO_DATE": build_formatted_time(exp.TsOrDsToDate, "hive"),
|
||||||
"TO_JSON": exp.JSONFormat.from_arg_list,
|
"TO_JSON": exp.JSONFormat.from_arg_list,
|
||||||
"UNBASE64": exp.FromBase64.from_arg_list,
|
"UNBASE64": exp.FromBase64.from_arg_list,
|
||||||
"UNIX_TIMESTAMP": format_time_lambda(exp.StrToUnix, "hive", True),
|
"UNIX_TIMESTAMP": build_formatted_time(exp.StrToUnix, "hive", True),
|
||||||
"YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)),
|
"YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,8 +481,10 @@ class Hive(Dialect):
|
||||||
exp.If: if_sql(),
|
exp.If: if_sql(),
|
||||||
exp.ILike: no_ilike_sql,
|
exp.ILike: no_ilike_sql,
|
||||||
exp.IsNan: rename_func("ISNAN"),
|
exp.IsNan: rename_func("ISNAN"),
|
||||||
exp.JSONExtract: rename_func("GET_JSON_OBJECT"),
|
exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression),
|
||||||
exp.JSONExtractScalar: rename_func("GET_JSON_OBJECT"),
|
exp.JSONExtractScalar: lambda self, e: self.func(
|
||||||
|
"GET_JSON_OBJECT", e.this, e.expression
|
||||||
|
),
|
||||||
exp.JSONFormat: _json_format_sql,
|
exp.JSONFormat: _json_format_sql,
|
||||||
exp.Left: left_to_substring_sql,
|
exp.Left: left_to_substring_sql,
|
||||||
exp.Map: var_map_sql,
|
exp.Map: var_map_sql,
|
||||||
|
@ -496,7 +492,7 @@ class Hive(Dialect):
|
||||||
exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)),
|
exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)),
|
||||||
exp.Min: min_or_least,
|
exp.Min: min_or_least,
|
||||||
exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression),
|
exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression),
|
||||||
exp.NotNullColumnConstraint: lambda self, e: (
|
exp.NotNullColumnConstraint: lambda _, e: (
|
||||||
"" if e.args.get("allow_null") else "NOT NULL"
|
"" if e.args.get("allow_null") else "NOT NULL"
|
||||||
),
|
),
|
||||||
exp.VarMap: var_map_sql,
|
exp.VarMap: var_map_sql,
|
||||||
|
@ -517,8 +513,9 @@ class Hive(Dialect):
|
||||||
exp.SafeDivide: no_safe_divide_sql,
|
exp.SafeDivide: no_safe_divide_sql,
|
||||||
exp.SchemaCommentProperty: lambda self, e: self.naked_property(e),
|
exp.SchemaCommentProperty: lambda self, e: self.naked_property(e),
|
||||||
exp.ArrayUniqueAgg: rename_func("COLLECT_SET"),
|
exp.ArrayUniqueAgg: rename_func("COLLECT_SET"),
|
||||||
exp.Split: lambda self,
|
exp.Split: lambda self, e: self.func(
|
||||||
e: f"SPLIT({self.sql(e, 'this')}, CONCAT('\\\\Q', {self.sql(e, 'expression')}))",
|
"SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression)
|
||||||
|
),
|
||||||
exp.StrPosition: strposition_to_locate_sql,
|
exp.StrPosition: strposition_to_locate_sql,
|
||||||
exp.StrToDate: _str_to_date_sql,
|
exp.StrToDate: _str_to_date_sql,
|
||||||
exp.StrToTime: _str_to_time_sql,
|
exp.StrToTime: _str_to_time_sql,
|
||||||
|
@ -527,7 +524,7 @@ class Hive(Dialect):
|
||||||
exp.TimeStrToDate: rename_func("TO_DATE"),
|
exp.TimeStrToDate: rename_func("TO_DATE"),
|
||||||
exp.TimeStrToTime: timestrtotime_sql,
|
exp.TimeStrToTime: timestrtotime_sql,
|
||||||
exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
|
exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
|
||||||
exp.TimeToStr: _time_to_str,
|
exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)),
|
||||||
exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
|
exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
|
||||||
exp.ToBase64: rename_func("BASE64"),
|
exp.ToBase64: rename_func("BASE64"),
|
||||||
exp.TsOrDiToDi: lambda self,
|
exp.TsOrDiToDi: lambda self,
|
||||||
|
@ -549,9 +546,9 @@ class Hive(Dialect):
|
||||||
e: f"({self.expressions(e, 'this', indent=False)})",
|
e: f"({self.expressions(e, 'this', indent=False)})",
|
||||||
exp.NonClusteredColumnConstraint: lambda self,
|
exp.NonClusteredColumnConstraint: lambda self,
|
||||||
e: f"({self.expressions(e, 'this', indent=False)})",
|
e: f"({self.expressions(e, 'this', indent=False)})",
|
||||||
exp.NotForReplicationColumnConstraint: lambda self, e: "",
|
exp.NotForReplicationColumnConstraint: lambda *_: "",
|
||||||
exp.OnProperty: lambda self, e: "",
|
exp.OnProperty: lambda *_: "",
|
||||||
exp.PrimaryKeyColumnConstraint: lambda self, e: "PRIMARY KEY",
|
exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY",
|
||||||
}
|
}
|
||||||
|
|
||||||
PROPERTIES_LOCATION = {
|
PROPERTIES_LOCATION = {
|
||||||
|
|
|
@ -9,7 +9,7 @@ from sqlglot.dialects.dialect import (
|
||||||
arrow_json_extract_sql,
|
arrow_json_extract_sql,
|
||||||
date_add_interval_sql,
|
date_add_interval_sql,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
isnull_to_is_null,
|
isnull_to_is_null,
|
||||||
locate_to_strposition,
|
locate_to_strposition,
|
||||||
max_or_greatest,
|
max_or_greatest,
|
||||||
|
@ -19,8 +19,8 @@ from sqlglot.dialects.dialect import (
|
||||||
no_pivot_sql,
|
no_pivot_sql,
|
||||||
no_tablesample_sql,
|
no_tablesample_sql,
|
||||||
no_trycast_sql,
|
no_trycast_sql,
|
||||||
parse_date_delta,
|
build_date_delta,
|
||||||
parse_date_delta_with_interval,
|
build_date_delta_with_interval,
|
||||||
rename_func,
|
rename_func,
|
||||||
strposition_to_locate_sql,
|
strposition_to_locate_sql,
|
||||||
)
|
)
|
||||||
|
@ -39,9 +39,6 @@ def _date_trunc_sql(self: MySQL.Generator, expression: exp.DateTrunc) -> str:
|
||||||
expr = self.sql(expression, "this")
|
expr = self.sql(expression, "this")
|
||||||
unit = expression.text("unit").upper()
|
unit = expression.text("unit").upper()
|
||||||
|
|
||||||
if unit == "DAY":
|
|
||||||
return f"DATE({expr})"
|
|
||||||
|
|
||||||
if unit == "WEEK":
|
if unit == "WEEK":
|
||||||
concat = f"CONCAT(YEAR({expr}), ' ', WEEK({expr}, 1), ' 1')"
|
concat = f"CONCAT(YEAR({expr}), ' ', WEEK({expr}, 1), ' 1')"
|
||||||
date_format = "%Y %u %w"
|
date_format = "%Y %u %w"
|
||||||
|
@ -55,10 +52,11 @@ def _date_trunc_sql(self: MySQL.Generator, expression: exp.DateTrunc) -> str:
|
||||||
concat = f"CONCAT(YEAR({expr}), ' 1 1')"
|
concat = f"CONCAT(YEAR({expr}), ' 1 1')"
|
||||||
date_format = "%Y %c %e"
|
date_format = "%Y %c %e"
|
||||||
else:
|
else:
|
||||||
|
if unit != "DAY":
|
||||||
self.unsupported(f"Unexpected interval unit: {unit}")
|
self.unsupported(f"Unexpected interval unit: {unit}")
|
||||||
return f"DATE({expr})"
|
return self.func("DATE", expr)
|
||||||
|
|
||||||
return f"STR_TO_DATE({concat}, '{date_format}')"
|
return self.func("STR_TO_DATE", concat, f"'{date_format}'")
|
||||||
|
|
||||||
|
|
||||||
# All specifiers for time parts (as opposed to date parts)
|
# All specifiers for time parts (as opposed to date parts)
|
||||||
|
@ -93,8 +91,7 @@ def _str_to_date(args: t.List) -> exp.StrToDate | exp.StrToTime:
|
||||||
def _str_to_date_sql(
|
def _str_to_date_sql(
|
||||||
self: MySQL.Generator, expression: exp.StrToDate | exp.StrToTime | exp.TsOrDsToDate
|
self: MySQL.Generator, expression: exp.StrToDate | exp.StrToTime | exp.TsOrDsToDate
|
||||||
) -> str:
|
) -> str:
|
||||||
date_format = self.format_time(expression)
|
return self.func("STR_TO_DATE", expression.this, self.format_time(expression))
|
||||||
return f"STR_TO_DATE({self.sql(expression.this)}, {date_format})"
|
|
||||||
|
|
||||||
|
|
||||||
def _trim_sql(self: MySQL.Generator, expression: exp.Trim) -> str:
|
def _trim_sql(self: MySQL.Generator, expression: exp.Trim) -> str:
|
||||||
|
@ -127,9 +124,7 @@ def _date_add_sql(
|
||||||
|
|
||||||
def _ts_or_ds_to_date_sql(self: MySQL.Generator, expression: exp.TsOrDsToDate) -> str:
|
def _ts_or_ds_to_date_sql(self: MySQL.Generator, expression: exp.TsOrDsToDate) -> str:
|
||||||
time_format = expression.args.get("format")
|
time_format = expression.args.get("format")
|
||||||
if time_format:
|
return _str_to_date_sql(self, expression) if time_format else self.func("DATE", expression.this)
|
||||||
return _str_to_date_sql(self, expression)
|
|
||||||
return f"DATE({self.sql(expression, 'this')})"
|
|
||||||
|
|
||||||
|
|
||||||
def _remove_ts_or_ds_to_date(
|
def _remove_ts_or_ds_to_date(
|
||||||
|
@ -289,9 +284,9 @@ class MySQL(Dialect):
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)),
|
"DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)),
|
||||||
"DATE_ADD": parse_date_delta_with_interval(exp.DateAdd),
|
"DATE_ADD": build_date_delta_with_interval(exp.DateAdd),
|
||||||
"DATE_FORMAT": format_time_lambda(exp.TimeToStr, "mysql"),
|
"DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"),
|
||||||
"DATE_SUB": parse_date_delta_with_interval(exp.DateSub),
|
"DATE_SUB": build_date_delta_with_interval(exp.DateSub),
|
||||||
"DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
"DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||||
"DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
"DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||||
"DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
"DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||||
|
@ -306,7 +301,7 @@ class MySQL(Dialect):
|
||||||
format=exp.Literal.string("%B"),
|
format=exp.Literal.string("%B"),
|
||||||
),
|
),
|
||||||
"STR_TO_DATE": _str_to_date,
|
"STR_TO_DATE": _str_to_date,
|
||||||
"TIMESTAMPDIFF": parse_date_delta(exp.TimestampDiff),
|
"TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff),
|
||||||
"TO_DAYS": lambda args: exp.paren(
|
"TO_DAYS": lambda args: exp.paren(
|
||||||
exp.DateDiff(
|
exp.DateDiff(
|
||||||
this=exp.TsOrDsToDate(this=seq_get(args, 0)),
|
this=exp.TsOrDsToDate(this=seq_get(args, 0)),
|
||||||
|
|
|
@ -6,7 +6,7 @@ from sqlglot import exp, generator, parser, tokens, transforms
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
Dialect,
|
Dialect,
|
||||||
NormalizationStrategy,
|
NormalizationStrategy,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
no_ilike_sql,
|
no_ilike_sql,
|
||||||
rename_func,
|
rename_func,
|
||||||
trim_sql,
|
trim_sql,
|
||||||
|
@ -18,26 +18,7 @@ if t.TYPE_CHECKING:
|
||||||
from sqlglot._typing import E
|
from sqlglot._typing import E
|
||||||
|
|
||||||
|
|
||||||
def _parse_xml_table(self: Oracle.Parser) -> exp.XMLTable:
|
def _build_timetostr_or_tochar(args: t.List) -> exp.TimeToStr | exp.ToChar:
|
||||||
this = self._parse_string()
|
|
||||||
|
|
||||||
passing = None
|
|
||||||
columns = None
|
|
||||||
|
|
||||||
if self._match_text_seq("PASSING"):
|
|
||||||
# The BY VALUE keywords are optional and are provided for semantic clarity
|
|
||||||
self._match_text_seq("BY", "VALUE")
|
|
||||||
passing = self._parse_csv(self._parse_column)
|
|
||||||
|
|
||||||
by_ref = self._match_text_seq("RETURNING", "SEQUENCE", "BY", "REF")
|
|
||||||
|
|
||||||
if self._match_text_seq("COLUMNS"):
|
|
||||||
columns = self._parse_csv(self._parse_field_def)
|
|
||||||
|
|
||||||
return self.expression(exp.XMLTable, this=this, passing=passing, columns=columns, by_ref=by_ref)
|
|
||||||
|
|
||||||
|
|
||||||
def to_char(args: t.List) -> exp.TimeToStr | exp.ToChar:
|
|
||||||
this = seq_get(args, 0)
|
this = seq_get(args, 0)
|
||||||
|
|
||||||
if this and not this.type:
|
if this and not this.type:
|
||||||
|
@ -45,7 +26,7 @@ def to_char(args: t.List) -> exp.TimeToStr | exp.ToChar:
|
||||||
|
|
||||||
annotate_types(this)
|
annotate_types(this)
|
||||||
if this.is_type(*exp.DataType.TEMPORAL_TYPES):
|
if this.is_type(*exp.DataType.TEMPORAL_TYPES):
|
||||||
return format_time_lambda(exp.TimeToStr, "oracle", default=True)(args)
|
return build_formatted_time(exp.TimeToStr, "oracle", default=True)(args)
|
||||||
|
|
||||||
return exp.ToChar.from_arg_list(args)
|
return exp.ToChar.from_arg_list(args)
|
||||||
|
|
||||||
|
@ -93,9 +74,9 @@ class Oracle(Dialect):
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
|
"SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
|
||||||
"TO_CHAR": to_char,
|
"TO_CHAR": _build_timetostr_or_tochar,
|
||||||
"TO_TIMESTAMP": format_time_lambda(exp.StrToTime, "oracle"),
|
"TO_TIMESTAMP": build_formatted_time(exp.StrToTime, "oracle"),
|
||||||
"TO_DATE": format_time_lambda(exp.StrToDate, "oracle"),
|
"TO_DATE": build_formatted_time(exp.StrToDate, "oracle"),
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCTION_PARSERS: t.Dict[str, t.Callable] = {
|
FUNCTION_PARSERS: t.Dict[str, t.Callable] = {
|
||||||
|
@ -109,7 +90,7 @@ class Oracle(Dialect):
|
||||||
this=self._parse_format_json(self._parse_bitwise()),
|
this=self._parse_format_json(self._parse_bitwise()),
|
||||||
order=self._parse_order(),
|
order=self._parse_order(),
|
||||||
),
|
),
|
||||||
"XMLTABLE": _parse_xml_table,
|
"XMLTABLE": lambda self: self._parse_xml_table(),
|
||||||
}
|
}
|
||||||
|
|
||||||
QUERY_MODIFIER_PARSERS = {
|
QUERY_MODIFIER_PARSERS = {
|
||||||
|
@ -127,6 +108,26 @@ class Oracle(Dialect):
|
||||||
# Reference: https://stackoverflow.com/a/336455
|
# Reference: https://stackoverflow.com/a/336455
|
||||||
DISTINCT_TOKENS = {TokenType.DISTINCT, TokenType.UNIQUE}
|
DISTINCT_TOKENS = {TokenType.DISTINCT, TokenType.UNIQUE}
|
||||||
|
|
||||||
|
def _parse_xml_table(self) -> exp.XMLTable:
|
||||||
|
this = self._parse_string()
|
||||||
|
|
||||||
|
passing = None
|
||||||
|
columns = None
|
||||||
|
|
||||||
|
if self._match_text_seq("PASSING"):
|
||||||
|
# The BY VALUE keywords are optional and are provided for semantic clarity
|
||||||
|
self._match_text_seq("BY", "VALUE")
|
||||||
|
passing = self._parse_csv(self._parse_column)
|
||||||
|
|
||||||
|
by_ref = self._match_text_seq("RETURNING", "SEQUENCE", "BY", "REF")
|
||||||
|
|
||||||
|
if self._match_text_seq("COLUMNS"):
|
||||||
|
columns = self._parse_csv(self._parse_field_def)
|
||||||
|
|
||||||
|
return self.expression(
|
||||||
|
exp.XMLTable, this=this, passing=passing, columns=columns, by_ref=by_ref
|
||||||
|
)
|
||||||
|
|
||||||
def _parse_json_array(self, expr_type: t.Type[E], **kwargs) -> E:
|
def _parse_json_array(self, expr_type: t.Type[E], **kwargs) -> E:
|
||||||
return self.expression(
|
return self.expression(
|
||||||
expr_type,
|
expr_type,
|
||||||
|
@ -200,18 +201,17 @@ class Oracle(Dialect):
|
||||||
transforms.eliminate_qualify,
|
transforms.eliminate_qualify,
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
exp.StrToTime: lambda self,
|
exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)),
|
||||||
e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
|
exp.StrToDate: lambda self, e: self.func("TO_DATE", e.this, self.format_time(e)),
|
||||||
exp.StrToDate: lambda self, e: f"TO_DATE({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.Subquery: lambda self, e: self.subquery_sql(e, sep=" "),
|
exp.Subquery: lambda self, e: self.subquery_sql(e, sep=" "),
|
||||||
exp.Substring: rename_func("SUBSTR"),
|
exp.Substring: rename_func("SUBSTR"),
|
||||||
exp.Table: lambda self, e: self.table_sql(e, sep=" "),
|
exp.Table: lambda self, e: self.table_sql(e, sep=" "),
|
||||||
exp.TableSample: lambda self, e: self.tablesample_sql(e, sep=" "),
|
exp.TableSample: lambda self, e: self.tablesample_sql(e, sep=" "),
|
||||||
exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})",
|
exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)),
|
||||||
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
||||||
exp.Trim: trim_sql,
|
exp.Trim: trim_sql,
|
||||||
exp.UnixToTime: lambda self,
|
exp.UnixToTime: lambda self,
|
||||||
e: f"TO_DATE('1970-01-01','YYYY-MM-DD') + ({self.sql(e, 'this')} / 86400)",
|
e: f"TO_DATE('1970-01-01', 'YYYY-MM-DD') + ({self.sql(e, 'this')} / 86400)",
|
||||||
}
|
}
|
||||||
|
|
||||||
PROPERTIES_LOCATION = {
|
PROPERTIES_LOCATION = {
|
||||||
|
|
|
@ -6,10 +6,12 @@ from sqlglot import exp, generator, parser, tokens, transforms
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
DATE_ADD_OR_SUB,
|
DATE_ADD_OR_SUB,
|
||||||
Dialect,
|
Dialect,
|
||||||
|
JSON_EXTRACT_TYPE,
|
||||||
any_value_to_max_sql,
|
any_value_to_max_sql,
|
||||||
bool_xor_sql,
|
bool_xor_sql,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
|
filter_array_using_unnest,
|
||||||
json_extract_segments,
|
json_extract_segments,
|
||||||
json_path_key_only_name,
|
json_path_key_only_name,
|
||||||
max_or_greatest,
|
max_or_greatest,
|
||||||
|
@ -20,8 +22,8 @@ from sqlglot.dialects.dialect import (
|
||||||
no_paren_current_date_sql,
|
no_paren_current_date_sql,
|
||||||
no_pivot_sql,
|
no_pivot_sql,
|
||||||
no_trycast_sql,
|
no_trycast_sql,
|
||||||
parse_json_extract_path,
|
build_json_extract_path,
|
||||||
parse_timestamp_trunc,
|
build_timestamp_trunc,
|
||||||
rename_func,
|
rename_func,
|
||||||
str_position_sql,
|
str_position_sql,
|
||||||
struct_extract_sql,
|
struct_extract_sql,
|
||||||
|
@ -163,7 +165,7 @@ def _serial_to_generated(expression: exp.Expression) -> exp.Expression:
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
|
||||||
def _generate_series(args: t.List) -> exp.Expression:
|
def _build_generate_series(args: t.List) -> exp.GenerateSeries:
|
||||||
# The goal is to convert step values like '1 day' or INTERVAL '1 day' into INTERVAL '1' day
|
# The goal is to convert step values like '1 day' or INTERVAL '1 day' into INTERVAL '1' day
|
||||||
step = seq_get(args, 2)
|
step = seq_get(args, 2)
|
||||||
|
|
||||||
|
@ -179,14 +181,25 @@ def _generate_series(args: t.List) -> exp.Expression:
|
||||||
return exp.GenerateSeries.from_arg_list(args)
|
return exp.GenerateSeries.from_arg_list(args)
|
||||||
|
|
||||||
|
|
||||||
def _to_timestamp(args: t.List) -> exp.Expression:
|
def _build_to_timestamp(args: t.List) -> exp.UnixToTime | exp.StrToTime:
|
||||||
# TO_TIMESTAMP accepts either a single double argument or (text, text)
|
# TO_TIMESTAMP accepts either a single double argument or (text, text)
|
||||||
if len(args) == 1:
|
if len(args) == 1:
|
||||||
# https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-TABLE
|
# https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-TABLE
|
||||||
return exp.UnixToTime.from_arg_list(args)
|
return exp.UnixToTime.from_arg_list(args)
|
||||||
|
|
||||||
# https://www.postgresql.org/docs/current/functions-formatting.html
|
# https://www.postgresql.org/docs/current/functions-formatting.html
|
||||||
return format_time_lambda(exp.StrToTime, "postgres")(args)
|
return build_formatted_time(exp.StrToTime, "postgres")(args)
|
||||||
|
|
||||||
|
|
||||||
|
def _json_extract_sql(
|
||||||
|
name: str, op: str
|
||||||
|
) -> t.Callable[[Postgres.Generator, JSON_EXTRACT_TYPE], str]:
|
||||||
|
def _generate(self: Postgres.Generator, expression: JSON_EXTRACT_TYPE) -> str:
|
||||||
|
if expression.args.get("only_json_types"):
|
||||||
|
return json_extract_segments(name, quoted_index=False, op=op)(self, expression)
|
||||||
|
return json_extract_segments(name)(self, expression)
|
||||||
|
|
||||||
|
return _generate
|
||||||
|
|
||||||
|
|
||||||
class Postgres(Dialect):
|
class Postgres(Dialect):
|
||||||
|
@ -292,19 +305,19 @@ class Postgres(Dialect):
|
||||||
**parser.Parser.PROPERTY_PARSERS,
|
**parser.Parser.PROPERTY_PARSERS,
|
||||||
"SET": lambda self: self.expression(exp.SetConfigProperty, this=self._parse_set()),
|
"SET": lambda self: self.expression(exp.SetConfigProperty, this=self._parse_set()),
|
||||||
}
|
}
|
||||||
PROPERTY_PARSERS.pop("INPUT", None)
|
PROPERTY_PARSERS.pop("INPUT")
|
||||||
|
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"DATE_TRUNC": parse_timestamp_trunc,
|
"DATE_TRUNC": build_timestamp_trunc,
|
||||||
"GENERATE_SERIES": _generate_series,
|
"GENERATE_SERIES": _build_generate_series,
|
||||||
"JSON_EXTRACT_PATH": parse_json_extract_path(exp.JSONExtract),
|
"JSON_EXTRACT_PATH": build_json_extract_path(exp.JSONExtract),
|
||||||
"JSON_EXTRACT_PATH_TEXT": parse_json_extract_path(exp.JSONExtractScalar),
|
"JSON_EXTRACT_PATH_TEXT": build_json_extract_path(exp.JSONExtractScalar),
|
||||||
"MAKE_TIME": exp.TimeFromParts.from_arg_list,
|
"MAKE_TIME": exp.TimeFromParts.from_arg_list,
|
||||||
"MAKE_TIMESTAMP": exp.TimestampFromParts.from_arg_list,
|
"MAKE_TIMESTAMP": exp.TimestampFromParts.from_arg_list,
|
||||||
"NOW": exp.CurrentTimestamp.from_arg_list,
|
"NOW": exp.CurrentTimestamp.from_arg_list,
|
||||||
"TO_CHAR": format_time_lambda(exp.TimeToStr, "postgres"),
|
"TO_CHAR": build_formatted_time(exp.TimeToStr, "postgres"),
|
||||||
"TO_TIMESTAMP": _to_timestamp,
|
"TO_TIMESTAMP": _build_to_timestamp,
|
||||||
"UNNEST": exp.Explode.from_arg_list,
|
"UNNEST": exp.Explode.from_arg_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,6 +351,8 @@ class Postgres(Dialect):
|
||||||
TokenType.END: lambda self: self._parse_commit_or_rollback(),
|
TokenType.END: lambda self: self._parse_commit_or_rollback(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JSON_ARROWS_REQUIRE_JSON_TYPE = True
|
||||||
|
|
||||||
def _parse_operator(self, this: t.Optional[exp.Expression]) -> t.Optional[exp.Expression]:
|
def _parse_operator(self, this: t.Optional[exp.Expression]) -> t.Optional[exp.Expression]:
|
||||||
while True:
|
while True:
|
||||||
if not self._match(TokenType.L_PAREN):
|
if not self._match(TokenType.L_PAREN):
|
||||||
|
@ -387,6 +402,7 @@ class Postgres(Dialect):
|
||||||
SUPPORTS_UNLOGGED_TABLES = True
|
SUPPORTS_UNLOGGED_TABLES = True
|
||||||
LIKE_PROPERTY_INSIDE_SCHEMA = True
|
LIKE_PROPERTY_INSIDE_SCHEMA = True
|
||||||
MULTI_ARG_DISTINCT = False
|
MULTI_ARG_DISTINCT = False
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = True
|
||||||
|
|
||||||
SUPPORTED_JSON_PATH_PARTS = {
|
SUPPORTED_JSON_PATH_PARTS = {
|
||||||
exp.JSONPathKey,
|
exp.JSONPathKey,
|
||||||
|
@ -416,6 +432,8 @@ class Postgres(Dialect):
|
||||||
exp.ArrayContained: lambda self, e: self.binary(e, "<@"),
|
exp.ArrayContained: lambda self, e: self.binary(e, "<@"),
|
||||||
exp.ArrayContains: lambda self, e: self.binary(e, "@>"),
|
exp.ArrayContains: lambda self, e: self.binary(e, "@>"),
|
||||||
exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"),
|
exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"),
|
||||||
|
exp.ArrayFilter: filter_array_using_unnest,
|
||||||
|
exp.ArraySize: lambda self, e: self.func("ARRAY_LENGTH", e.this, e.expression or "1"),
|
||||||
exp.BitwiseXor: lambda self, e: self.binary(e, "#"),
|
exp.BitwiseXor: lambda self, e: self.binary(e, "#"),
|
||||||
exp.ColumnDef: transforms.preprocess([_auto_increment_to_serial, _serial_to_generated]),
|
exp.ColumnDef: transforms.preprocess([_auto_increment_to_serial, _serial_to_generated]),
|
||||||
exp.CurrentDate: no_paren_current_date_sql,
|
exp.CurrentDate: no_paren_current_date_sql,
|
||||||
|
@ -428,8 +446,8 @@ class Postgres(Dialect):
|
||||||
exp.DateSub: _date_add_sql("-"),
|
exp.DateSub: _date_add_sql("-"),
|
||||||
exp.Explode: rename_func("UNNEST"),
|
exp.Explode: rename_func("UNNEST"),
|
||||||
exp.GroupConcat: _string_agg_sql,
|
exp.GroupConcat: _string_agg_sql,
|
||||||
exp.JSONExtract: json_extract_segments("JSON_EXTRACT_PATH"),
|
exp.JSONExtract: _json_extract_sql("JSON_EXTRACT_PATH", "->"),
|
||||||
exp.JSONExtractScalar: json_extract_segments("JSON_EXTRACT_PATH_TEXT"),
|
exp.JSONExtractScalar: _json_extract_sql("JSON_EXTRACT_PATH_TEXT", "->>"),
|
||||||
exp.JSONBExtract: lambda self, e: self.binary(e, "#>"),
|
exp.JSONBExtract: lambda self, e: self.binary(e, "#>"),
|
||||||
exp.JSONBExtractScalar: lambda self, e: self.binary(e, "#>>"),
|
exp.JSONBExtractScalar: lambda self, e: self.binary(e, "#>>"),
|
||||||
exp.JSONBContains: lambda self, e: self.binary(e, "?"),
|
exp.JSONBContains: lambda self, e: self.binary(e, "?"),
|
||||||
|
@ -462,21 +480,20 @@ class Postgres(Dialect):
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
exp.StrPosition: str_position_sql,
|
exp.StrPosition: str_position_sql,
|
||||||
exp.StrToTime: lambda self,
|
exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)),
|
||||||
e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.StructExtract: struct_extract_sql,
|
exp.StructExtract: struct_extract_sql,
|
||||||
exp.Substring: _substring_sql,
|
exp.Substring: _substring_sql,
|
||||||
exp.TimeFromParts: rename_func("MAKE_TIME"),
|
exp.TimeFromParts: rename_func("MAKE_TIME"),
|
||||||
exp.TimestampFromParts: rename_func("MAKE_TIMESTAMP"),
|
exp.TimestampFromParts: rename_func("MAKE_TIMESTAMP"),
|
||||||
exp.TimestampTrunc: timestamptrunc_sql,
|
exp.TimestampTrunc: timestamptrunc_sql,
|
||||||
exp.TimeStrToTime: timestrtotime_sql,
|
exp.TimeStrToTime: timestrtotime_sql,
|
||||||
exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})",
|
exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)),
|
||||||
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
||||||
exp.Trim: trim_sql,
|
exp.Trim: trim_sql,
|
||||||
exp.TryCast: no_trycast_sql,
|
exp.TryCast: no_trycast_sql,
|
||||||
exp.TsOrDsAdd: _date_add_sql("+"),
|
exp.TsOrDsAdd: _date_add_sql("+"),
|
||||||
exp.TsOrDsDiff: _date_diff_sql,
|
exp.TsOrDsDiff: _date_diff_sql,
|
||||||
exp.UnixToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')})",
|
exp.UnixToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this),
|
||||||
exp.VariancePop: rename_func("VAR_POP"),
|
exp.VariancePop: rename_func("VAR_POP"),
|
||||||
exp.Variance: rename_func("VAR_SAMP"),
|
exp.Variance: rename_func("VAR_SAMP"),
|
||||||
exp.Xor: bool_xor_sql,
|
exp.Xor: bool_xor_sql,
|
||||||
|
|
|
@ -11,7 +11,7 @@ from sqlglot.dialects.dialect import (
|
||||||
date_trunc_to_time,
|
date_trunc_to_time,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
encode_decode_sql,
|
encode_decode_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
if_sql,
|
if_sql,
|
||||||
left_to_substring_sql,
|
left_to_substring_sql,
|
||||||
no_ilike_sql,
|
no_ilike_sql,
|
||||||
|
@ -31,12 +31,6 @@ from sqlglot.helper import apply_index_offset, seq_get
|
||||||
from sqlglot.tokens import TokenType
|
from sqlglot.tokens import TokenType
|
||||||
|
|
||||||
|
|
||||||
def _approx_distinct_sql(self: Presto.Generator, expression: exp.ApproxDistinct) -> str:
|
|
||||||
accuracy = expression.args.get("accuracy")
|
|
||||||
accuracy = ", " + self.sql(accuracy) if accuracy else ""
|
|
||||||
return f"APPROX_DISTINCT({self.sql(expression, 'this')}{accuracy})"
|
|
||||||
|
|
||||||
|
|
||||||
def _explode_to_unnest_sql(self: Presto.Generator, expression: exp.Lateral) -> str:
|
def _explode_to_unnest_sql(self: Presto.Generator, expression: exp.Lateral) -> str:
|
||||||
if isinstance(expression.this, exp.Explode):
|
if isinstance(expression.this, exp.Explode):
|
||||||
return self.sql(
|
return self.sql(
|
||||||
|
@ -81,20 +75,20 @@ def _schema_sql(self: Presto.Generator, expression: exp.Schema) -> str:
|
||||||
|
|
||||||
def _quantile_sql(self: Presto.Generator, expression: exp.Quantile) -> str:
|
def _quantile_sql(self: Presto.Generator, expression: exp.Quantile) -> str:
|
||||||
self.unsupported("Presto does not support exact quantiles")
|
self.unsupported("Presto does not support exact quantiles")
|
||||||
return f"APPROX_PERCENTILE({self.sql(expression, 'this')}, {self.sql(expression, 'quantile')})"
|
return self.func("APPROX_PERCENTILE", expression.this, expression.args.get("quantile"))
|
||||||
|
|
||||||
|
|
||||||
def _str_to_time_sql(
|
def _str_to_time_sql(
|
||||||
self: Presto.Generator, expression: exp.StrToDate | exp.StrToTime | exp.TsOrDsToDate
|
self: Presto.Generator, expression: exp.StrToDate | exp.StrToTime | exp.TsOrDsToDate
|
||||||
) -> str:
|
) -> str:
|
||||||
return f"DATE_PARSE({self.sql(expression, 'this')}, {self.format_time(expression)})"
|
return self.func("DATE_PARSE", expression.this, self.format_time(expression))
|
||||||
|
|
||||||
|
|
||||||
def _ts_or_ds_to_date_sql(self: Presto.Generator, expression: exp.TsOrDsToDate) -> str:
|
def _ts_or_ds_to_date_sql(self: Presto.Generator, expression: exp.TsOrDsToDate) -> str:
|
||||||
time_format = self.format_time(expression)
|
time_format = self.format_time(expression)
|
||||||
if time_format and time_format not in (Presto.TIME_FORMAT, Presto.DATE_FORMAT):
|
if time_format and time_format not in (Presto.TIME_FORMAT, Presto.DATE_FORMAT):
|
||||||
return exp.cast(_str_to_time_sql(self, expression), "DATE").sql(dialect="presto")
|
return self.sql(exp.cast(_str_to_time_sql(self, expression), "DATE"))
|
||||||
return exp.cast(exp.cast(expression.this, "TIMESTAMP", copy=True), "DATE").sql(dialect="presto")
|
return self.sql(exp.cast(exp.cast(expression.this, "TIMESTAMP"), "DATE"))
|
||||||
|
|
||||||
|
|
||||||
def _ts_or_ds_add_sql(self: Presto.Generator, expression: exp.TsOrDsAdd) -> str:
|
def _ts_or_ds_add_sql(self: Presto.Generator, expression: exp.TsOrDsAdd) -> str:
|
||||||
|
@ -110,7 +104,7 @@ def _ts_or_ds_diff_sql(self: Presto.Generator, expression: exp.TsOrDsDiff) -> st
|
||||||
return self.func("DATE_DIFF", unit, expr, this)
|
return self.func("DATE_DIFF", unit, expr, this)
|
||||||
|
|
||||||
|
|
||||||
def _approx_percentile(args: t.List) -> exp.Expression:
|
def _build_approx_percentile(args: t.List) -> exp.Expression:
|
||||||
if len(args) == 4:
|
if len(args) == 4:
|
||||||
return exp.ApproxQuantile(
|
return exp.ApproxQuantile(
|
||||||
this=seq_get(args, 0),
|
this=seq_get(args, 0),
|
||||||
|
@ -125,7 +119,7 @@ def _approx_percentile(args: t.List) -> exp.Expression:
|
||||||
return exp.ApproxQuantile.from_arg_list(args)
|
return exp.ApproxQuantile.from_arg_list(args)
|
||||||
|
|
||||||
|
|
||||||
def _from_unixtime(args: t.List) -> exp.Expression:
|
def _build_from_unixtime(args: t.List) -> exp.Expression:
|
||||||
if len(args) == 3:
|
if len(args) == 3:
|
||||||
return exp.UnixToTime(
|
return exp.UnixToTime(
|
||||||
this=seq_get(args, 0),
|
this=seq_get(args, 0),
|
||||||
|
@ -182,7 +176,7 @@ def _to_int(expression: exp.Expression) -> exp.Expression:
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
|
|
||||||
def _parse_to_char(args: t.List) -> exp.TimeToStr:
|
def _build_to_char(args: t.List) -> exp.TimeToStr:
|
||||||
fmt = seq_get(args, 1)
|
fmt = seq_get(args, 1)
|
||||||
if isinstance(fmt, exp.Literal):
|
if isinstance(fmt, exp.Literal):
|
||||||
# We uppercase this to match Teradata's format mapping keys
|
# We uppercase this to match Teradata's format mapping keys
|
||||||
|
@ -190,7 +184,7 @@ def _parse_to_char(args: t.List) -> exp.TimeToStr:
|
||||||
|
|
||||||
# We use "teradata" on purpose here, because the time formats are different in Presto.
|
# We use "teradata" on purpose here, because the time formats are different in Presto.
|
||||||
# See https://prestodb.io/docs/current/functions/teradata.html?highlight=to_char#to_char
|
# See https://prestodb.io/docs/current/functions/teradata.html?highlight=to_char#to_char
|
||||||
return format_time_lambda(exp.TimeToStr, "teradata")(args)
|
return build_formatted_time(exp.TimeToStr, "teradata")(args)
|
||||||
|
|
||||||
|
|
||||||
class Presto(Dialect):
|
class Presto(Dialect):
|
||||||
|
@ -231,7 +225,7 @@ class Presto(Dialect):
|
||||||
**parser.Parser.FUNCTIONS,
|
**parser.Parser.FUNCTIONS,
|
||||||
"ARBITRARY": exp.AnyValue.from_arg_list,
|
"ARBITRARY": exp.AnyValue.from_arg_list,
|
||||||
"APPROX_DISTINCT": exp.ApproxDistinct.from_arg_list,
|
"APPROX_DISTINCT": exp.ApproxDistinct.from_arg_list,
|
||||||
"APPROX_PERCENTILE": _approx_percentile,
|
"APPROX_PERCENTILE": _build_approx_percentile,
|
||||||
"BITWISE_AND": binary_from_function(exp.BitwiseAnd),
|
"BITWISE_AND": binary_from_function(exp.BitwiseAnd),
|
||||||
"BITWISE_NOT": lambda args: exp.BitwiseNot(this=seq_get(args, 0)),
|
"BITWISE_NOT": lambda args: exp.BitwiseNot(this=seq_get(args, 0)),
|
||||||
"BITWISE_OR": binary_from_function(exp.BitwiseOr),
|
"BITWISE_OR": binary_from_function(exp.BitwiseOr),
|
||||||
|
@ -244,14 +238,14 @@ class Presto(Dialect):
|
||||||
"DATE_DIFF": lambda args: exp.DateDiff(
|
"DATE_DIFF": lambda args: exp.DateDiff(
|
||||||
this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0)
|
this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0)
|
||||||
),
|
),
|
||||||
"DATE_FORMAT": format_time_lambda(exp.TimeToStr, "presto"),
|
"DATE_FORMAT": build_formatted_time(exp.TimeToStr, "presto"),
|
||||||
"DATE_PARSE": format_time_lambda(exp.StrToTime, "presto"),
|
"DATE_PARSE": build_formatted_time(exp.StrToTime, "presto"),
|
||||||
"DATE_TRUNC": date_trunc_to_time,
|
"DATE_TRUNC": date_trunc_to_time,
|
||||||
"ELEMENT_AT": lambda args: exp.Bracket(
|
"ELEMENT_AT": lambda args: exp.Bracket(
|
||||||
this=seq_get(args, 0), expressions=[seq_get(args, 1)], offset=1, safe=True
|
this=seq_get(args, 0), expressions=[seq_get(args, 1)], offset=1, safe=True
|
||||||
),
|
),
|
||||||
"FROM_HEX": exp.Unhex.from_arg_list,
|
"FROM_HEX": exp.Unhex.from_arg_list,
|
||||||
"FROM_UNIXTIME": _from_unixtime,
|
"FROM_UNIXTIME": _build_from_unixtime,
|
||||||
"FROM_UTF8": lambda args: exp.Decode(
|
"FROM_UTF8": lambda args: exp.Decode(
|
||||||
this=seq_get(args, 0), replace=seq_get(args, 1), charset=exp.Literal.string("utf-8")
|
this=seq_get(args, 0), replace=seq_get(args, 1), charset=exp.Literal.string("utf-8")
|
||||||
),
|
),
|
||||||
|
@ -271,7 +265,7 @@ class Presto(Dialect):
|
||||||
"STRPOS": lambda args: exp.StrPosition(
|
"STRPOS": lambda args: exp.StrPosition(
|
||||||
this=seq_get(args, 0), substr=seq_get(args, 1), instance=seq_get(args, 2)
|
this=seq_get(args, 0), substr=seq_get(args, 1), instance=seq_get(args, 2)
|
||||||
),
|
),
|
||||||
"TO_CHAR": _parse_to_char,
|
"TO_CHAR": _build_to_char,
|
||||||
"TO_HEX": exp.Hex.from_arg_list,
|
"TO_HEX": exp.Hex.from_arg_list,
|
||||||
"TO_UNIXTIME": exp.TimeToUnix.from_arg_list,
|
"TO_UNIXTIME": exp.TimeToUnix.from_arg_list,
|
||||||
"TO_UTF8": lambda args: exp.Encode(
|
"TO_UTF8": lambda args: exp.Encode(
|
||||||
|
@ -318,35 +312,35 @@ class Presto(Dialect):
|
||||||
TRANSFORMS = {
|
TRANSFORMS = {
|
||||||
**generator.Generator.TRANSFORMS,
|
**generator.Generator.TRANSFORMS,
|
||||||
exp.AnyValue: rename_func("ARBITRARY"),
|
exp.AnyValue: rename_func("ARBITRARY"),
|
||||||
exp.ApproxDistinct: _approx_distinct_sql,
|
exp.ApproxDistinct: lambda self, e: self.func(
|
||||||
|
"APPROX_DISTINCT", e.this, e.args.get("accuracy")
|
||||||
|
),
|
||||||
exp.ApproxQuantile: rename_func("APPROX_PERCENTILE"),
|
exp.ApproxQuantile: rename_func("APPROX_PERCENTILE"),
|
||||||
exp.ArgMax: rename_func("MAX_BY"),
|
exp.ArgMax: rename_func("MAX_BY"),
|
||||||
exp.ArgMin: rename_func("MIN_BY"),
|
exp.ArgMin: rename_func("MIN_BY"),
|
||||||
exp.Array: lambda self, e: f"ARRAY[{self.expressions(e, flat=True)}]",
|
exp.Array: lambda self, e: f"ARRAY[{self.expressions(e, flat=True)}]",
|
||||||
|
exp.ArrayAny: rename_func("ANY_MATCH"),
|
||||||
exp.ArrayConcat: rename_func("CONCAT"),
|
exp.ArrayConcat: rename_func("CONCAT"),
|
||||||
exp.ArrayContains: rename_func("CONTAINS"),
|
exp.ArrayContains: rename_func("CONTAINS"),
|
||||||
exp.ArraySize: rename_func("CARDINALITY"),
|
exp.ArraySize: rename_func("CARDINALITY"),
|
||||||
exp.ArrayUniqueAgg: rename_func("SET_AGG"),
|
exp.ArrayUniqueAgg: rename_func("SET_AGG"),
|
||||||
exp.AtTimeZone: rename_func("AT_TIMEZONE"),
|
exp.AtTimeZone: rename_func("AT_TIMEZONE"),
|
||||||
exp.BitwiseAnd: lambda self,
|
exp.BitwiseAnd: lambda self, e: self.func("BITWISE_AND", e.this, e.expression),
|
||||||
e: f"BITWISE_AND({self.sql(e, 'this')}, {self.sql(e, 'expression')})",
|
exp.BitwiseLeftShift: lambda self, e: self.func(
|
||||||
exp.BitwiseLeftShift: lambda self,
|
"BITWISE_ARITHMETIC_SHIFT_LEFT", e.this, e.expression
|
||||||
e: f"BITWISE_ARITHMETIC_SHIFT_LEFT({self.sql(e, 'this')}, {self.sql(e, 'expression')})",
|
),
|
||||||
exp.BitwiseNot: lambda self, e: f"BITWISE_NOT({self.sql(e, 'this')})",
|
exp.BitwiseNot: lambda self, e: self.func("BITWISE_NOT", e.this),
|
||||||
exp.BitwiseOr: lambda self,
|
exp.BitwiseOr: lambda self, e: self.func("BITWISE_OR", e.this, e.expression),
|
||||||
e: f"BITWISE_OR({self.sql(e, 'this')}, {self.sql(e, 'expression')})",
|
exp.BitwiseRightShift: lambda self, e: self.func(
|
||||||
exp.BitwiseRightShift: lambda self,
|
"BITWISE_ARITHMETIC_SHIFT_RIGHT", e.this, e.expression
|
||||||
e: f"BITWISE_ARITHMETIC_SHIFT_RIGHT({self.sql(e, 'this')}, {self.sql(e, 'expression')})",
|
),
|
||||||
exp.BitwiseXor: lambda self,
|
exp.BitwiseXor: lambda self, e: self.func("BITWISE_XOR", e.this, e.expression),
|
||||||
e: f"BITWISE_XOR({self.sql(e, 'this')}, {self.sql(e, 'expression')})",
|
|
||||||
exp.Cast: transforms.preprocess([transforms.epoch_cast_to_ts]),
|
exp.Cast: transforms.preprocess([transforms.epoch_cast_to_ts]),
|
||||||
exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
|
exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
|
||||||
exp.DateAdd: lambda self, e: self.func(
|
exp.DateAdd: lambda self, e: self.func(
|
||||||
"DATE_ADD",
|
"DATE_ADD",
|
||||||
exp.Literal.string(e.text("unit") or "DAY"),
|
exp.Literal.string(e.text("unit") or "DAY"),
|
||||||
_to_int(
|
_to_int(e.expression),
|
||||||
e.expression,
|
|
||||||
),
|
|
||||||
e.this,
|
e.this,
|
||||||
),
|
),
|
||||||
exp.DateDiff: lambda self, e: self.func(
|
exp.DateDiff: lambda self, e: self.func(
|
||||||
|
@ -407,21 +401,21 @@ class Presto(Dialect):
|
||||||
exp.StrToDate: lambda self, e: f"CAST({_str_to_time_sql(self, e)} AS DATE)",
|
exp.StrToDate: lambda self, e: f"CAST({_str_to_time_sql(self, e)} AS DATE)",
|
||||||
exp.StrToMap: rename_func("SPLIT_TO_MAP"),
|
exp.StrToMap: rename_func("SPLIT_TO_MAP"),
|
||||||
exp.StrToTime: _str_to_time_sql,
|
exp.StrToTime: _str_to_time_sql,
|
||||||
exp.StrToUnix: lambda self,
|
exp.StrToUnix: lambda self, e: self.func(
|
||||||
e: f"TO_UNIXTIME(DATE_PARSE({self.sql(e, 'this')}, {self.format_time(e)}))",
|
"TO_UNIXTIME", self.func("DATE_PARSE", e.this, self.format_time(e))
|
||||||
|
),
|
||||||
exp.StructExtract: struct_extract_sql,
|
exp.StructExtract: struct_extract_sql,
|
||||||
exp.Table: transforms.preprocess([_unnest_sequence]),
|
exp.Table: transforms.preprocess([_unnest_sequence]),
|
||||||
exp.Timestamp: no_timestamp_sql,
|
exp.Timestamp: no_timestamp_sql,
|
||||||
exp.TimestampTrunc: timestamptrunc_sql,
|
exp.TimestampTrunc: timestamptrunc_sql,
|
||||||
exp.TimeStrToDate: timestrtotime_sql,
|
exp.TimeStrToDate: timestrtotime_sql,
|
||||||
exp.TimeStrToTime: timestrtotime_sql,
|
exp.TimeStrToTime: timestrtotime_sql,
|
||||||
exp.TimeStrToUnix: lambda self,
|
exp.TimeStrToUnix: lambda self, e: self.func(
|
||||||
e: f"TO_UNIXTIME(DATE_PARSE({self.sql(e, 'this')}, {Presto.TIME_FORMAT}))",
|
"TO_UNIXTIME", self.func("DATE_PARSE", e.this, Presto.TIME_FORMAT)
|
||||||
exp.TimeToStr: lambda self,
|
),
|
||||||
e: f"DATE_FORMAT({self.sql(e, 'this')}, {self.format_time(e)})",
|
exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)),
|
||||||
exp.TimeToUnix: rename_func("TO_UNIXTIME"),
|
exp.TimeToUnix: rename_func("TO_UNIXTIME"),
|
||||||
exp.ToChar: lambda self,
|
exp.ToChar: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)),
|
||||||
e: f"DATE_FORMAT({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.TryCast: transforms.preprocess([transforms.epoch_cast_to_ts]),
|
exp.TryCast: transforms.preprocess([transforms.epoch_cast_to_ts]),
|
||||||
exp.TsOrDiToDi: lambda self,
|
exp.TsOrDiToDi: lambda self,
|
||||||
e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)",
|
e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)",
|
||||||
|
|
|
@ -21,15 +21,15 @@ if t.TYPE_CHECKING:
|
||||||
from sqlglot._typing import E
|
from sqlglot._typing import E
|
||||||
|
|
||||||
|
|
||||||
def _parse_date_delta(expr_type: t.Type[E]) -> t.Callable[[t.List], E]:
|
def _build_date_delta(expr_type: t.Type[E]) -> t.Callable[[t.List], E]:
|
||||||
def _parse_delta(args: t.List) -> E:
|
def _builder(args: t.List) -> E:
|
||||||
expr = expr_type(this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0))
|
expr = expr_type(this=seq_get(args, 2), expression=seq_get(args, 1), unit=seq_get(args, 0))
|
||||||
if expr_type is exp.TsOrDsAdd:
|
if expr_type is exp.TsOrDsAdd:
|
||||||
expr.set("return_type", exp.DataType.build("TIMESTAMP"))
|
expr.set("return_type", exp.DataType.build("TIMESTAMP"))
|
||||||
|
|
||||||
return expr
|
return expr
|
||||||
|
|
||||||
return _parse_delta
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
class Redshift(Postgres):
|
class Redshift(Postgres):
|
||||||
|
@ -55,10 +55,10 @@ class Redshift(Postgres):
|
||||||
unit=exp.var("month"),
|
unit=exp.var("month"),
|
||||||
return_type=exp.DataType.build("TIMESTAMP"),
|
return_type=exp.DataType.build("TIMESTAMP"),
|
||||||
),
|
),
|
||||||
"DATEADD": _parse_date_delta(exp.TsOrDsAdd),
|
"DATEADD": _build_date_delta(exp.TsOrDsAdd),
|
||||||
"DATE_ADD": _parse_date_delta(exp.TsOrDsAdd),
|
"DATE_ADD": _build_date_delta(exp.TsOrDsAdd),
|
||||||
"DATEDIFF": _parse_date_delta(exp.TsOrDsDiff),
|
"DATEDIFF": _build_date_delta(exp.TsOrDsDiff),
|
||||||
"DATE_DIFF": _parse_date_delta(exp.TsOrDsDiff),
|
"DATE_DIFF": _build_date_delta(exp.TsOrDsDiff),
|
||||||
"GETDATE": exp.CurrentTimestamp.from_arg_list,
|
"GETDATE": exp.CurrentTimestamp.from_arg_list,
|
||||||
"LISTAGG": exp.GroupConcat.from_arg_list,
|
"LISTAGG": exp.GroupConcat.from_arg_list,
|
||||||
"STRTOL": exp.FromBase.from_arg_list,
|
"STRTOL": exp.FromBase.from_arg_list,
|
||||||
|
@ -171,6 +171,7 @@ class Redshift(Postgres):
|
||||||
TZ_TO_WITH_TIME_ZONE = True
|
TZ_TO_WITH_TIME_ZONE = True
|
||||||
NVL2_SUPPORTED = True
|
NVL2_SUPPORTED = True
|
||||||
LAST_DAY_SUPPORTS_DATE_PART = False
|
LAST_DAY_SUPPORTS_DATE_PART = False
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = False
|
||||||
|
|
||||||
TYPE_MAPPING = {
|
TYPE_MAPPING = {
|
||||||
**Postgres.Generator.TYPE_MAPPING,
|
**Postgres.Generator.TYPE_MAPPING,
|
||||||
|
@ -192,11 +193,12 @@ class Redshift(Postgres):
|
||||||
),
|
),
|
||||||
exp.DateAdd: date_delta_sql("DATEADD"),
|
exp.DateAdd: date_delta_sql("DATEADD"),
|
||||||
exp.DateDiff: date_delta_sql("DATEDIFF"),
|
exp.DateDiff: date_delta_sql("DATEDIFF"),
|
||||||
exp.DistKeyProperty: lambda self, e: f"DISTKEY({e.name})",
|
exp.DistKeyProperty: lambda self, e: self.func("DISTKEY", e.this),
|
||||||
exp.DistStyleProperty: lambda self, e: self.naked_property(e),
|
exp.DistStyleProperty: lambda self, e: self.naked_property(e),
|
||||||
exp.FromBase: rename_func("STRTOL"),
|
exp.FromBase: rename_func("STRTOL"),
|
||||||
exp.GeneratedAsIdentityColumnConstraint: generatedasidentitycolumnconstraint_sql,
|
exp.GeneratedAsIdentityColumnConstraint: generatedasidentitycolumnconstraint_sql,
|
||||||
exp.JSONExtract: json_extract_segments("JSON_EXTRACT_PATH_TEXT"),
|
exp.JSONExtract: json_extract_segments("JSON_EXTRACT_PATH_TEXT"),
|
||||||
|
exp.JSONExtractScalar: json_extract_segments("JSON_EXTRACT_PATH_TEXT"),
|
||||||
exp.GroupConcat: rename_func("LISTAGG"),
|
exp.GroupConcat: rename_func("LISTAGG"),
|
||||||
exp.ParseJSON: rename_func("JSON_PARSE"),
|
exp.ParseJSON: rename_func("JSON_PARSE"),
|
||||||
exp.Select: transforms.preprocess(
|
exp.Select: transforms.preprocess(
|
||||||
|
|
|
@ -10,7 +10,7 @@ from sqlglot.dialects.dialect import (
|
||||||
date_delta_sql,
|
date_delta_sql,
|
||||||
date_trunc_to_time,
|
date_trunc_to_time,
|
||||||
datestrtodate_sql,
|
datestrtodate_sql,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
if_sql,
|
if_sql,
|
||||||
inline_array_sql,
|
inline_array_sql,
|
||||||
max_or_greatest,
|
max_or_greatest,
|
||||||
|
@ -29,12 +29,12 @@ if t.TYPE_CHECKING:
|
||||||
|
|
||||||
|
|
||||||
# from https://docs.snowflake.com/en/sql-reference/functions/to_timestamp.html
|
# from https://docs.snowflake.com/en/sql-reference/functions/to_timestamp.html
|
||||||
def _parse_to_timestamp(args: t.List) -> t.Union[exp.StrToTime, exp.UnixToTime, exp.TimeStrToTime]:
|
def _build_to_timestamp(args: t.List) -> t.Union[exp.StrToTime, exp.UnixToTime, exp.TimeStrToTime]:
|
||||||
if len(args) == 2:
|
if len(args) == 2:
|
||||||
first_arg, second_arg = args
|
first_arg, second_arg = args
|
||||||
if second_arg.is_string:
|
if second_arg.is_string:
|
||||||
# case: <string_expr> [ , <format> ]
|
# case: <string_expr> [ , <format> ]
|
||||||
return format_time_lambda(exp.StrToTime, "snowflake")(args)
|
return build_formatted_time(exp.StrToTime, "snowflake")(args)
|
||||||
return exp.UnixToTime(this=first_arg, scale=second_arg)
|
return exp.UnixToTime(this=first_arg, scale=second_arg)
|
||||||
|
|
||||||
from sqlglot.optimizer.simplify import simplify_literals
|
from sqlglot.optimizer.simplify import simplify_literals
|
||||||
|
@ -52,14 +52,14 @@ def _parse_to_timestamp(args: t.List) -> t.Union[exp.StrToTime, exp.UnixToTime,
|
||||||
return exp.UnixToTime.from_arg_list(args)
|
return exp.UnixToTime.from_arg_list(args)
|
||||||
|
|
||||||
# case: <date_expr>
|
# case: <date_expr>
|
||||||
return format_time_lambda(exp.StrToTime, "snowflake", default=True)(args)
|
return build_formatted_time(exp.StrToTime, "snowflake", default=True)(args)
|
||||||
|
|
||||||
# case: <numeric_expr>
|
# case: <numeric_expr>
|
||||||
return exp.UnixToTime.from_arg_list(args)
|
return exp.UnixToTime.from_arg_list(args)
|
||||||
|
|
||||||
|
|
||||||
def _parse_object_construct(args: t.List) -> t.Union[exp.StarMap, exp.Struct]:
|
def _build_object_construct(args: t.List) -> t.Union[exp.StarMap, exp.Struct]:
|
||||||
expression = parser.parse_var_map(args)
|
expression = parser.build_var_map(args)
|
||||||
|
|
||||||
if isinstance(expression, exp.StarMap):
|
if isinstance(expression, exp.StarMap):
|
||||||
return expression
|
return expression
|
||||||
|
@ -71,48 +71,14 @@ def _parse_object_construct(args: t.List) -> t.Union[exp.StarMap, exp.Struct]:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _parse_datediff(args: t.List) -> exp.DateDiff:
|
def _build_datediff(args: t.List) -> exp.DateDiff:
|
||||||
return exp.DateDiff(
|
return exp.DateDiff(
|
||||||
this=seq_get(args, 2), expression=seq_get(args, 1), unit=_map_date_part(seq_get(args, 0))
|
this=seq_get(args, 2), expression=seq_get(args, 1), unit=_map_date_part(seq_get(args, 0))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# https://docs.snowflake.com/en/sql-reference/functions/date_part.html
|
|
||||||
# https://docs.snowflake.com/en/sql-reference/functions-date-time.html#label-supported-date-time-parts
|
|
||||||
def _parse_date_part(self: Snowflake.Parser) -> t.Optional[exp.Expression]:
|
|
||||||
this = self._parse_var() or self._parse_type()
|
|
||||||
|
|
||||||
if not this:
|
|
||||||
return None
|
|
||||||
|
|
||||||
self._match(TokenType.COMMA)
|
|
||||||
expression = self._parse_bitwise()
|
|
||||||
this = _map_date_part(this)
|
|
||||||
name = this.name.upper()
|
|
||||||
|
|
||||||
if name.startswith("EPOCH"):
|
|
||||||
if name == "EPOCH_MILLISECOND":
|
|
||||||
scale = 10**3
|
|
||||||
elif name == "EPOCH_MICROSECOND":
|
|
||||||
scale = 10**6
|
|
||||||
elif name == "EPOCH_NANOSECOND":
|
|
||||||
scale = 10**9
|
|
||||||
else:
|
|
||||||
scale = None
|
|
||||||
|
|
||||||
ts = self.expression(exp.Cast, this=expression, to=exp.DataType.build("TIMESTAMP"))
|
|
||||||
to_unix: exp.Expression = self.expression(exp.TimeToUnix, this=ts)
|
|
||||||
|
|
||||||
if scale:
|
|
||||||
to_unix = exp.Mul(this=to_unix, expression=exp.Literal.number(scale))
|
|
||||||
|
|
||||||
return to_unix
|
|
||||||
|
|
||||||
return self.expression(exp.Extract, this=this, expression=expression)
|
|
||||||
|
|
||||||
|
|
||||||
# https://docs.snowflake.com/en/sql-reference/functions/div0
|
# https://docs.snowflake.com/en/sql-reference/functions/div0
|
||||||
def _div0_to_if(args: t.List) -> exp.If:
|
def _build_if_from_div0(args: t.List) -> exp.If:
|
||||||
cond = exp.EQ(this=seq_get(args, 1), expression=exp.Literal.number(0))
|
cond = exp.EQ(this=seq_get(args, 1), expression=exp.Literal.number(0))
|
||||||
true = exp.Literal.number(0)
|
true = exp.Literal.number(0)
|
||||||
false = exp.Div(this=seq_get(args, 0), expression=seq_get(args, 1))
|
false = exp.Div(this=seq_get(args, 0), expression=seq_get(args, 1))
|
||||||
|
@ -120,13 +86,13 @@ def _div0_to_if(args: t.List) -> exp.If:
|
||||||
|
|
||||||
|
|
||||||
# https://docs.snowflake.com/en/sql-reference/functions/zeroifnull
|
# https://docs.snowflake.com/en/sql-reference/functions/zeroifnull
|
||||||
def _zeroifnull_to_if(args: t.List) -> exp.If:
|
def _build_if_from_zeroifnull(args: t.List) -> exp.If:
|
||||||
cond = exp.Is(this=seq_get(args, 0), expression=exp.Null())
|
cond = exp.Is(this=seq_get(args, 0), expression=exp.Null())
|
||||||
return exp.If(this=cond, true=exp.Literal.number(0), false=seq_get(args, 0))
|
return exp.If(this=cond, true=exp.Literal.number(0), false=seq_get(args, 0))
|
||||||
|
|
||||||
|
|
||||||
# https://docs.snowflake.com/en/sql-reference/functions/zeroifnull
|
# https://docs.snowflake.com/en/sql-reference/functions/zeroifnull
|
||||||
def _nullifzero_to_if(args: t.List) -> exp.If:
|
def _build_if_from_nullifzero(args: t.List) -> exp.If:
|
||||||
cond = exp.EQ(this=seq_get(args, 0), expression=exp.Literal.number(0))
|
cond = exp.EQ(this=seq_get(args, 0), expression=exp.Literal.number(0))
|
||||||
return exp.If(this=cond, true=exp.Null(), false=seq_get(args, 0))
|
return exp.If(this=cond, true=exp.Null(), false=seq_get(args, 0))
|
||||||
|
|
||||||
|
@ -150,13 +116,13 @@ def _regexpilike_sql(self: Snowflake.Generator, expression: exp.RegexpILike) ->
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _parse_convert_timezone(args: t.List) -> t.Union[exp.Anonymous, exp.AtTimeZone]:
|
def _build_convert_timezone(args: t.List) -> t.Union[exp.Anonymous, exp.AtTimeZone]:
|
||||||
if len(args) == 3:
|
if len(args) == 3:
|
||||||
return exp.Anonymous(this="CONVERT_TIMEZONE", expressions=args)
|
return exp.Anonymous(this="CONVERT_TIMEZONE", expressions=args)
|
||||||
return exp.AtTimeZone(this=seq_get(args, 1), zone=seq_get(args, 0))
|
return exp.AtTimeZone(this=seq_get(args, 1), zone=seq_get(args, 0))
|
||||||
|
|
||||||
|
|
||||||
def _parse_regexp_replace(args: t.List) -> exp.RegexpReplace:
|
def _build_regexp_replace(args: t.List) -> exp.RegexpReplace:
|
||||||
regexp_replace = exp.RegexpReplace.from_arg_list(args)
|
regexp_replace = exp.RegexpReplace.from_arg_list(args)
|
||||||
|
|
||||||
if not regexp_replace.args.get("replacement"):
|
if not regexp_replace.args.get("replacement"):
|
||||||
|
@ -266,38 +232,7 @@ def _date_trunc_to_time(args: t.List) -> exp.DateTrunc | exp.TimestampTrunc:
|
||||||
return trunc
|
return trunc
|
||||||
|
|
||||||
|
|
||||||
def _parse_colon_get_path(
|
def _build_timestamp_from_parts(args: t.List) -> exp.Func:
|
||||||
self: parser.Parser, this: t.Optional[exp.Expression]
|
|
||||||
) -> t.Optional[exp.Expression]:
|
|
||||||
while True:
|
|
||||||
path = self._parse_bitwise()
|
|
||||||
|
|
||||||
# The cast :: operator has a lower precedence than the extraction operator :, so
|
|
||||||
# we rearrange the AST appropriately to avoid casting the 2nd argument of GET_PATH
|
|
||||||
if isinstance(path, exp.Cast):
|
|
||||||
target_type = path.to
|
|
||||||
path = path.this
|
|
||||||
else:
|
|
||||||
target_type = None
|
|
||||||
|
|
||||||
if isinstance(path, exp.Expression):
|
|
||||||
path = exp.Literal.string(path.sql(dialect="snowflake"))
|
|
||||||
|
|
||||||
# The extraction operator : is left-associative
|
|
||||||
this = self.expression(
|
|
||||||
exp.JSONExtract, this=this, expression=self.dialect.to_json_path(path)
|
|
||||||
)
|
|
||||||
|
|
||||||
if target_type:
|
|
||||||
this = exp.cast(this, target_type)
|
|
||||||
|
|
||||||
if not self._match(TokenType.COLON):
|
|
||||||
break
|
|
||||||
|
|
||||||
return self._parse_range(this)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_timestamp_from_parts(args: t.List) -> exp.Func:
|
|
||||||
if len(args) == 2:
|
if len(args) == 2:
|
||||||
# Other dialects don't have the TIMESTAMP_FROM_PARTS(date, time) concept,
|
# Other dialects don't have the TIMESTAMP_FROM_PARTS(date, time) concept,
|
||||||
# so we parse this into Anonymous for now instead of introducing complexity
|
# so we parse this into Anonymous for now instead of introducing complexity
|
||||||
|
@ -396,15 +331,15 @@ class Snowflake(Dialect):
|
||||||
"BITXOR": binary_from_function(exp.BitwiseXor),
|
"BITXOR": binary_from_function(exp.BitwiseXor),
|
||||||
"BIT_XOR": binary_from_function(exp.BitwiseXor),
|
"BIT_XOR": binary_from_function(exp.BitwiseXor),
|
||||||
"BOOLXOR": binary_from_function(exp.Xor),
|
"BOOLXOR": binary_from_function(exp.Xor),
|
||||||
"CONVERT_TIMEZONE": _parse_convert_timezone,
|
"CONVERT_TIMEZONE": _build_convert_timezone,
|
||||||
"DATE_TRUNC": _date_trunc_to_time,
|
"DATE_TRUNC": _date_trunc_to_time,
|
||||||
"DATEADD": lambda args: exp.DateAdd(
|
"DATEADD": lambda args: exp.DateAdd(
|
||||||
this=seq_get(args, 2),
|
this=seq_get(args, 2),
|
||||||
expression=seq_get(args, 1),
|
expression=seq_get(args, 1),
|
||||||
unit=_map_date_part(seq_get(args, 0)),
|
unit=_map_date_part(seq_get(args, 0)),
|
||||||
),
|
),
|
||||||
"DATEDIFF": _parse_datediff,
|
"DATEDIFF": _build_datediff,
|
||||||
"DIV0": _div0_to_if,
|
"DIV0": _build_if_from_div0,
|
||||||
"FLATTEN": exp.Explode.from_arg_list,
|
"FLATTEN": exp.Explode.from_arg_list,
|
||||||
"GET_PATH": lambda args, dialect: exp.JSONExtract(
|
"GET_PATH": lambda args, dialect: exp.JSONExtract(
|
||||||
this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1))
|
this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1))
|
||||||
|
@ -414,24 +349,24 @@ class Snowflake(Dialect):
|
||||||
this=seq_get(args, 0), unit=_map_date_part(seq_get(args, 1))
|
this=seq_get(args, 0), unit=_map_date_part(seq_get(args, 1))
|
||||||
),
|
),
|
||||||
"LISTAGG": exp.GroupConcat.from_arg_list,
|
"LISTAGG": exp.GroupConcat.from_arg_list,
|
||||||
"NULLIFZERO": _nullifzero_to_if,
|
"NULLIFZERO": _build_if_from_nullifzero,
|
||||||
"OBJECT_CONSTRUCT": _parse_object_construct,
|
"OBJECT_CONSTRUCT": _build_object_construct,
|
||||||
"REGEXP_REPLACE": _parse_regexp_replace,
|
"REGEXP_REPLACE": _build_regexp_replace,
|
||||||
"REGEXP_SUBSTR": exp.RegexpExtract.from_arg_list,
|
"REGEXP_SUBSTR": exp.RegexpExtract.from_arg_list,
|
||||||
"RLIKE": exp.RegexpLike.from_arg_list,
|
"RLIKE": exp.RegexpLike.from_arg_list,
|
||||||
"SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
|
"SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
|
||||||
"TIMEDIFF": _parse_datediff,
|
"TIMEDIFF": _build_datediff,
|
||||||
"TIMESTAMPDIFF": _parse_datediff,
|
"TIMESTAMPDIFF": _build_datediff,
|
||||||
"TIMESTAMPFROMPARTS": _parse_timestamp_from_parts,
|
"TIMESTAMPFROMPARTS": _build_timestamp_from_parts,
|
||||||
"TIMESTAMP_FROM_PARTS": _parse_timestamp_from_parts,
|
"TIMESTAMP_FROM_PARTS": _build_timestamp_from_parts,
|
||||||
"TO_TIMESTAMP": _parse_to_timestamp,
|
"TO_TIMESTAMP": _build_to_timestamp,
|
||||||
"TO_VARCHAR": exp.ToChar.from_arg_list,
|
"TO_VARCHAR": exp.ToChar.from_arg_list,
|
||||||
"ZEROIFNULL": _zeroifnull_to_if,
|
"ZEROIFNULL": _build_if_from_zeroifnull,
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCTION_PARSERS = {
|
FUNCTION_PARSERS = {
|
||||||
**parser.Parser.FUNCTION_PARSERS,
|
**parser.Parser.FUNCTION_PARSERS,
|
||||||
"DATE_PART": _parse_date_part,
|
"DATE_PART": lambda self: self._parse_date_part(),
|
||||||
"OBJECT_CONSTRUCT_KEEP_NULL": lambda self: self._parse_json_object(),
|
"OBJECT_CONSTRUCT_KEEP_NULL": lambda self: self._parse_json_object(),
|
||||||
}
|
}
|
||||||
FUNCTION_PARSERS.pop("TRIM")
|
FUNCTION_PARSERS.pop("TRIM")
|
||||||
|
@ -442,7 +377,7 @@ class Snowflake(Dialect):
|
||||||
**parser.Parser.RANGE_PARSERS,
|
**parser.Parser.RANGE_PARSERS,
|
||||||
TokenType.LIKE_ANY: parser.binary_range_parser(exp.LikeAny),
|
TokenType.LIKE_ANY: parser.binary_range_parser(exp.LikeAny),
|
||||||
TokenType.ILIKE_ANY: parser.binary_range_parser(exp.ILikeAny),
|
TokenType.ILIKE_ANY: parser.binary_range_parser(exp.ILikeAny),
|
||||||
TokenType.COLON: _parse_colon_get_path,
|
TokenType.COLON: lambda self, this: self._parse_colon_get_path(this),
|
||||||
}
|
}
|
||||||
|
|
||||||
ALTER_PARSERS = {
|
ALTER_PARSERS = {
|
||||||
|
@ -489,6 +424,69 @@ class Snowflake(Dialect):
|
||||||
|
|
||||||
FLATTEN_COLUMNS = ["SEQ", "KEY", "PATH", "INDEX", "VALUE", "THIS"]
|
FLATTEN_COLUMNS = ["SEQ", "KEY", "PATH", "INDEX", "VALUE", "THIS"]
|
||||||
|
|
||||||
|
def _parse_colon_get_path(
|
||||||
|
self: parser.Parser, this: t.Optional[exp.Expression]
|
||||||
|
) -> t.Optional[exp.Expression]:
|
||||||
|
while True:
|
||||||
|
path = self._parse_bitwise()
|
||||||
|
|
||||||
|
# The cast :: operator has a lower precedence than the extraction operator :, so
|
||||||
|
# we rearrange the AST appropriately to avoid casting the 2nd argument of GET_PATH
|
||||||
|
if isinstance(path, exp.Cast):
|
||||||
|
target_type = path.to
|
||||||
|
path = path.this
|
||||||
|
else:
|
||||||
|
target_type = None
|
||||||
|
|
||||||
|
if isinstance(path, exp.Expression):
|
||||||
|
path = exp.Literal.string(path.sql(dialect="snowflake"))
|
||||||
|
|
||||||
|
# The extraction operator : is left-associative
|
||||||
|
this = self.expression(
|
||||||
|
exp.JSONExtract, this=this, expression=self.dialect.to_json_path(path)
|
||||||
|
)
|
||||||
|
|
||||||
|
if target_type:
|
||||||
|
this = exp.cast(this, target_type)
|
||||||
|
|
||||||
|
if not self._match(TokenType.COLON):
|
||||||
|
break
|
||||||
|
|
||||||
|
return self._parse_range(this)
|
||||||
|
|
||||||
|
# https://docs.snowflake.com/en/sql-reference/functions/date_part.html
|
||||||
|
# https://docs.snowflake.com/en/sql-reference/functions-date-time.html#label-supported-date-time-parts
|
||||||
|
def _parse_date_part(self: Snowflake.Parser) -> t.Optional[exp.Expression]:
|
||||||
|
this = self._parse_var() or self._parse_type()
|
||||||
|
|
||||||
|
if not this:
|
||||||
|
return None
|
||||||
|
|
||||||
|
self._match(TokenType.COMMA)
|
||||||
|
expression = self._parse_bitwise()
|
||||||
|
this = _map_date_part(this)
|
||||||
|
name = this.name.upper()
|
||||||
|
|
||||||
|
if name.startswith("EPOCH"):
|
||||||
|
if name == "EPOCH_MILLISECOND":
|
||||||
|
scale = 10**3
|
||||||
|
elif name == "EPOCH_MICROSECOND":
|
||||||
|
scale = 10**6
|
||||||
|
elif name == "EPOCH_NANOSECOND":
|
||||||
|
scale = 10**9
|
||||||
|
else:
|
||||||
|
scale = None
|
||||||
|
|
||||||
|
ts = self.expression(exp.Cast, this=expression, to=exp.DataType.build("TIMESTAMP"))
|
||||||
|
to_unix: exp.Expression = self.expression(exp.TimeToUnix, this=ts)
|
||||||
|
|
||||||
|
if scale:
|
||||||
|
to_unix = exp.Mul(this=to_unix, expression=exp.Literal.number(scale))
|
||||||
|
|
||||||
|
return to_unix
|
||||||
|
|
||||||
|
return self.expression(exp.Extract, this=this, expression=expression)
|
||||||
|
|
||||||
def _parse_bracket_key_value(self, is_map: bool = False) -> t.Optional[exp.Expression]:
|
def _parse_bracket_key_value(self, is_map: bool = False) -> t.Optional[exp.Expression]:
|
||||||
if is_map:
|
if is_map:
|
||||||
# Keys are strings in Snowflake's objects, see also:
|
# Keys are strings in Snowflake's objects, see also:
|
||||||
|
@ -665,6 +663,7 @@ class Snowflake(Dialect):
|
||||||
"SAMPLE": TokenType.TABLE_SAMPLE,
|
"SAMPLE": TokenType.TABLE_SAMPLE,
|
||||||
"SQL_DOUBLE": TokenType.DOUBLE,
|
"SQL_DOUBLE": TokenType.DOUBLE,
|
||||||
"SQL_VARCHAR": TokenType.VARCHAR,
|
"SQL_VARCHAR": TokenType.VARCHAR,
|
||||||
|
"STORAGE INTEGRATION": TokenType.STORAGE_INTEGRATION,
|
||||||
"TIMESTAMP_LTZ": TokenType.TIMESTAMPLTZ,
|
"TIMESTAMP_LTZ": TokenType.TIMESTAMPLTZ,
|
||||||
"TIMESTAMP_NTZ": TokenType.TIMESTAMP,
|
"TIMESTAMP_NTZ": TokenType.TIMESTAMP,
|
||||||
"TIMESTAMP_TZ": TokenType.TIMESTAMPTZ,
|
"TIMESTAMP_TZ": TokenType.TIMESTAMPTZ,
|
||||||
|
@ -724,8 +723,10 @@ class Snowflake(Dialect):
|
||||||
),
|
),
|
||||||
exp.GroupConcat: rename_func("LISTAGG"),
|
exp.GroupConcat: rename_func("LISTAGG"),
|
||||||
exp.If: if_sql(name="IFF", false_value="NULL"),
|
exp.If: if_sql(name="IFF", false_value="NULL"),
|
||||||
exp.JSONExtract: rename_func("GET_PATH"),
|
exp.JSONExtract: lambda self, e: self.func("GET_PATH", e.this, e.expression),
|
||||||
exp.JSONExtractScalar: rename_func("JSON_EXTRACT_PATH_TEXT"),
|
exp.JSONExtractScalar: lambda self, e: self.func(
|
||||||
|
"JSON_EXTRACT_PATH_TEXT", e.this, e.expression
|
||||||
|
),
|
||||||
exp.JSONObject: lambda self, e: self.func("OBJECT_CONSTRUCT_KEEP_NULL", *e.expressions),
|
exp.JSONObject: lambda self, e: self.func("OBJECT_CONSTRUCT_KEEP_NULL", *e.expressions),
|
||||||
exp.JSONPathRoot: lambda *_: "",
|
exp.JSONPathRoot: lambda *_: "",
|
||||||
exp.LogicalAnd: rename_func("BOOLAND_AGG"),
|
exp.LogicalAnd: rename_func("BOOLAND_AGG"),
|
||||||
|
@ -756,8 +757,7 @@ class Snowflake(Dialect):
|
||||||
exp.StrPosition: lambda self, e: self.func(
|
exp.StrPosition: lambda self, e: self.func(
|
||||||
"POSITION", e.args.get("substr"), e.this, e.args.get("position")
|
"POSITION", e.args.get("substr"), e.this, e.args.get("position")
|
||||||
),
|
),
|
||||||
exp.StrToTime: lambda self,
|
exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)),
|
||||||
e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.Struct: lambda self, e: self.func(
|
exp.Struct: lambda self, e: self.func(
|
||||||
"OBJECT_CONSTRUCT",
|
"OBJECT_CONSTRUCT",
|
||||||
*(arg for expression in e.expressions for arg in expression.flatten()),
|
*(arg for expression in e.expressions for arg in expression.flatten()),
|
||||||
|
@ -901,12 +901,12 @@ class Snowflake(Dialect):
|
||||||
)
|
)
|
||||||
|
|
||||||
def except_op(self, expression: exp.Except) -> str:
|
def except_op(self, expression: exp.Except) -> str:
|
||||||
if not expression.args.get("distinct", False):
|
if not expression.args.get("distinct"):
|
||||||
self.unsupported("EXCEPT with All is not supported in Snowflake")
|
self.unsupported("EXCEPT with All is not supported in Snowflake")
|
||||||
return super().except_op(expression)
|
return super().except_op(expression)
|
||||||
|
|
||||||
def intersect_op(self, expression: exp.Intersect) -> str:
|
def intersect_op(self, expression: exp.Intersect) -> str:
|
||||||
if not expression.args.get("distinct", False):
|
if not expression.args.get("distinct"):
|
||||||
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)
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import typing as t
|
||||||
|
|
||||||
from sqlglot import exp
|
from sqlglot import exp
|
||||||
from sqlglot.dialects.dialect import rename_func
|
from sqlglot.dialects.dialect import rename_func
|
||||||
from sqlglot.dialects.hive import _parse_ignore_nulls
|
from sqlglot.dialects.hive import _build_with_ignore_nulls
|
||||||
from sqlglot.dialects.spark2 import Spark2, temporary_storage_provider
|
from sqlglot.dialects.spark2 import Spark2, temporary_storage_provider
|
||||||
from sqlglot.helper import seq_get
|
from sqlglot.helper import seq_get
|
||||||
from sqlglot.transforms import (
|
from sqlglot.transforms import (
|
||||||
|
@ -15,7 +15,7 @@ from sqlglot.transforms import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _parse_datediff(args: t.List) -> exp.Expression:
|
def _build_datediff(args: t.List) -> exp.Expression:
|
||||||
"""
|
"""
|
||||||
Although Spark docs don't mention the "unit" argument, Spark3 added support for
|
Although Spark docs don't mention the "unit" argument, Spark3 added support for
|
||||||
it at some point. Databricks also supports this variant (see below).
|
it at some point. Databricks also supports this variant (see below).
|
||||||
|
@ -61,8 +61,8 @@ class Spark(Spark2):
|
||||||
class Parser(Spark2.Parser):
|
class Parser(Spark2.Parser):
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**Spark2.Parser.FUNCTIONS,
|
**Spark2.Parser.FUNCTIONS,
|
||||||
"ANY_VALUE": _parse_ignore_nulls(exp.AnyValue),
|
"ANY_VALUE": _build_with_ignore_nulls(exp.AnyValue),
|
||||||
"DATEDIFF": _parse_datediff,
|
"DATEDIFF": _build_datediff,
|
||||||
}
|
}
|
||||||
|
|
||||||
def _parse_generated_as_identity(
|
def _parse_generated_as_identity(
|
||||||
|
|
|
@ -5,7 +5,7 @@ import typing as t
|
||||||
from sqlglot import exp, transforms
|
from sqlglot import exp, transforms
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
binary_from_function,
|
binary_from_function,
|
||||||
format_time_lambda,
|
build_formatted_time,
|
||||||
is_parse_json,
|
is_parse_json,
|
||||||
pivot_column_names,
|
pivot_column_names,
|
||||||
rename_func,
|
rename_func,
|
||||||
|
@ -26,36 +26,37 @@ def _map_sql(self: Spark2.Generator, expression: exp.Map) -> str:
|
||||||
values = expression.args.get("values")
|
values = expression.args.get("values")
|
||||||
|
|
||||||
if not keys or not values:
|
if not keys or not values:
|
||||||
return "MAP()"
|
return self.func("MAP")
|
||||||
|
|
||||||
return f"MAP_FROM_ARRAYS({self.sql(keys)}, {self.sql(values)})"
|
return self.func("MAP_FROM_ARRAYS", keys, values)
|
||||||
|
|
||||||
|
|
||||||
def _parse_as_cast(to_type: str) -> t.Callable[[t.List], exp.Expression]:
|
def _build_as_cast(to_type: str) -> t.Callable[[t.List], exp.Expression]:
|
||||||
return lambda args: exp.Cast(this=seq_get(args, 0), to=exp.DataType.build(to_type))
|
return lambda args: exp.Cast(this=seq_get(args, 0), to=exp.DataType.build(to_type))
|
||||||
|
|
||||||
|
|
||||||
def _str_to_date(self: Spark2.Generator, expression: exp.StrToDate) -> str:
|
def _str_to_date(self: Spark2.Generator, expression: exp.StrToDate) -> str:
|
||||||
this = self.sql(expression, "this")
|
|
||||||
time_format = self.format_time(expression)
|
time_format = self.format_time(expression)
|
||||||
if time_format == Hive.DATE_FORMAT:
|
if time_format == Hive.DATE_FORMAT:
|
||||||
return f"TO_DATE({this})"
|
return self.func("TO_DATE", expression.this)
|
||||||
return f"TO_DATE({this}, {time_format})"
|
return self.func("TO_DATE", expression.this, time_format)
|
||||||
|
|
||||||
|
|
||||||
def _unix_to_time_sql(self: Spark2.Generator, expression: exp.UnixToTime) -> str:
|
def _unix_to_time_sql(self: Spark2.Generator, expression: exp.UnixToTime) -> str:
|
||||||
scale = expression.args.get("scale")
|
scale = expression.args.get("scale")
|
||||||
timestamp = self.sql(expression, "this")
|
timestamp = expression.this
|
||||||
if scale is None:
|
|
||||||
return f"CAST(FROM_UNIXTIME({timestamp}) AS TIMESTAMP)"
|
|
||||||
if scale == exp.UnixToTime.SECONDS:
|
|
||||||
return f"TIMESTAMP_SECONDS({timestamp})"
|
|
||||||
if scale == exp.UnixToTime.MILLIS:
|
|
||||||
return f"TIMESTAMP_MILLIS({timestamp})"
|
|
||||||
if scale == exp.UnixToTime.MICROS:
|
|
||||||
return f"TIMESTAMP_MICROS({timestamp})"
|
|
||||||
|
|
||||||
return f"TIMESTAMP_SECONDS({timestamp} / POW(10, {scale}))"
|
if scale is None:
|
||||||
|
return self.sql(exp.cast(exp.func("from_unixtime", timestamp), "timestamp"))
|
||||||
|
if scale == exp.UnixToTime.SECONDS:
|
||||||
|
return self.func("TIMESTAMP_SECONDS", timestamp)
|
||||||
|
if scale == exp.UnixToTime.MILLIS:
|
||||||
|
return self.func("TIMESTAMP_MILLIS", timestamp)
|
||||||
|
if scale == exp.UnixToTime.MICROS:
|
||||||
|
return self.func("TIMESTAMP_MICROS", timestamp)
|
||||||
|
|
||||||
|
unix_seconds = exp.Div(this=timestamp, expression=exp.func("POW", 10, scale))
|
||||||
|
return self.func("TIMESTAMP_SECONDS", unix_seconds)
|
||||||
|
|
||||||
|
|
||||||
def _unalias_pivot(expression: exp.Expression) -> exp.Expression:
|
def _unalias_pivot(expression: exp.Expression) -> exp.Expression:
|
||||||
|
@ -116,16 +117,16 @@ class Spark2(Hive):
|
||||||
**Hive.Parser.FUNCTIONS,
|
**Hive.Parser.FUNCTIONS,
|
||||||
"AGGREGATE": exp.Reduce.from_arg_list,
|
"AGGREGATE": exp.Reduce.from_arg_list,
|
||||||
"APPROX_PERCENTILE": exp.ApproxQuantile.from_arg_list,
|
"APPROX_PERCENTILE": exp.ApproxQuantile.from_arg_list,
|
||||||
"BOOLEAN": _parse_as_cast("boolean"),
|
"BOOLEAN": _build_as_cast("boolean"),
|
||||||
"DATE": _parse_as_cast("date"),
|
"DATE": _build_as_cast("date"),
|
||||||
"DATE_TRUNC": lambda args: exp.TimestampTrunc(
|
"DATE_TRUNC": lambda args: exp.TimestampTrunc(
|
||||||
this=seq_get(args, 1), unit=exp.var(seq_get(args, 0))
|
this=seq_get(args, 1), unit=exp.var(seq_get(args, 0))
|
||||||
),
|
),
|
||||||
"DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
"DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||||
"DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
"DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||||
"DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
"DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))),
|
||||||
"DOUBLE": _parse_as_cast("double"),
|
"DOUBLE": _build_as_cast("double"),
|
||||||
"FLOAT": _parse_as_cast("float"),
|
"FLOAT": _build_as_cast("float"),
|
||||||
"FROM_UTC_TIMESTAMP": lambda args: exp.AtTimeZone(
|
"FROM_UTC_TIMESTAMP": lambda args: exp.AtTimeZone(
|
||||||
this=exp.cast_unless(
|
this=exp.cast_unless(
|
||||||
seq_get(args, 0) or exp.Var(this=""),
|
seq_get(args, 0) or exp.Var(this=""),
|
||||||
|
@ -134,17 +135,17 @@ class Spark2(Hive):
|
||||||
),
|
),
|
||||||
zone=seq_get(args, 1),
|
zone=seq_get(args, 1),
|
||||||
),
|
),
|
||||||
"INT": _parse_as_cast("int"),
|
"INT": _build_as_cast("int"),
|
||||||
"MAP_FROM_ARRAYS": exp.Map.from_arg_list,
|
"MAP_FROM_ARRAYS": exp.Map.from_arg_list,
|
||||||
"RLIKE": exp.RegexpLike.from_arg_list,
|
"RLIKE": exp.RegexpLike.from_arg_list,
|
||||||
"SHIFTLEFT": binary_from_function(exp.BitwiseLeftShift),
|
"SHIFTLEFT": binary_from_function(exp.BitwiseLeftShift),
|
||||||
"SHIFTRIGHT": binary_from_function(exp.BitwiseRightShift),
|
"SHIFTRIGHT": binary_from_function(exp.BitwiseRightShift),
|
||||||
"STRING": _parse_as_cast("string"),
|
"STRING": _build_as_cast("string"),
|
||||||
"TIMESTAMP": _parse_as_cast("timestamp"),
|
"TIMESTAMP": _build_as_cast("timestamp"),
|
||||||
"TO_TIMESTAMP": lambda args: (
|
"TO_TIMESTAMP": lambda args: (
|
||||||
_parse_as_cast("timestamp")(args)
|
_build_as_cast("timestamp")(args)
|
||||||
if len(args) == 1
|
if len(args) == 1
|
||||||
else format_time_lambda(exp.StrToTime, "spark")(args)
|
else build_formatted_time(exp.StrToTime, "spark")(args)
|
||||||
),
|
),
|
||||||
"TO_UNIX_TIMESTAMP": exp.StrToUnix.from_arg_list,
|
"TO_UNIX_TIMESTAMP": exp.StrToUnix.from_arg_list,
|
||||||
"TO_UTC_TIMESTAMP": lambda args: exp.FromTimeZone(
|
"TO_UTC_TIMESTAMP": lambda args: exp.FromTimeZone(
|
||||||
|
@ -187,6 +188,7 @@ class Spark2(Hive):
|
||||||
class Generator(Hive.Generator):
|
class Generator(Hive.Generator):
|
||||||
QUERY_HINTS = True
|
QUERY_HINTS = True
|
||||||
NVL2_SUPPORTED = True
|
NVL2_SUPPORTED = True
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = True
|
||||||
|
|
||||||
PROPERTIES_LOCATION = {
|
PROPERTIES_LOCATION = {
|
||||||
**Hive.Generator.PROPERTIES_LOCATION,
|
**Hive.Generator.PROPERTIES_LOCATION,
|
||||||
|
@ -201,8 +203,9 @@ class Spark2(Hive):
|
||||||
exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
|
exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
|
||||||
exp.ArraySum: lambda self,
|
exp.ArraySum: lambda self,
|
||||||
e: f"AGGREGATE({self.sql(e, 'this')}, 0, (acc, x) -> acc + x, acc -> acc)",
|
e: f"AGGREGATE({self.sql(e, 'this')}, 0, (acc, x) -> acc + x, acc -> acc)",
|
||||||
exp.AtTimeZone: lambda self,
|
exp.AtTimeZone: lambda self, e: self.func(
|
||||||
e: f"FROM_UTC_TIMESTAMP({self.sql(e, 'this')}, {self.sql(e, 'zone')})",
|
"FROM_UTC_TIMESTAMP", e.this, e.args.get("zone")
|
||||||
|
),
|
||||||
exp.BitwiseLeftShift: rename_func("SHIFTLEFT"),
|
exp.BitwiseLeftShift: rename_func("SHIFTLEFT"),
|
||||||
exp.BitwiseRightShift: rename_func("SHIFTRIGHT"),
|
exp.BitwiseRightShift: rename_func("SHIFTRIGHT"),
|
||||||
exp.Create: preprocess(
|
exp.Create: preprocess(
|
||||||
|
@ -221,8 +224,9 @@ class Spark2(Hive):
|
||||||
exp.DayOfYear: rename_func("DAYOFYEAR"),
|
exp.DayOfYear: rename_func("DAYOFYEAR"),
|
||||||
exp.FileFormatProperty: lambda self, e: f"USING {e.name.upper()}",
|
exp.FileFormatProperty: lambda self, e: f"USING {e.name.upper()}",
|
||||||
exp.From: transforms.preprocess([_unalias_pivot]),
|
exp.From: transforms.preprocess([_unalias_pivot]),
|
||||||
exp.FromTimeZone: lambda self,
|
exp.FromTimeZone: lambda self, e: self.func(
|
||||||
e: f"TO_UTC_TIMESTAMP({self.sql(e, 'this')}, {self.sql(e, 'zone')})",
|
"TO_UTC_TIMESTAMP", e.this, e.args.get("zone")
|
||||||
|
),
|
||||||
exp.LogicalAnd: rename_func("BOOL_AND"),
|
exp.LogicalAnd: rename_func("BOOL_AND"),
|
||||||
exp.LogicalOr: rename_func("BOOL_OR"),
|
exp.LogicalOr: rename_func("BOOL_OR"),
|
||||||
exp.Map: _map_sql,
|
exp.Map: _map_sql,
|
||||||
|
@ -236,8 +240,7 @@ class Spark2(Hive):
|
||||||
e.args.get("position"),
|
e.args.get("position"),
|
||||||
),
|
),
|
||||||
exp.StrToDate: _str_to_date,
|
exp.StrToDate: _str_to_date,
|
||||||
exp.StrToTime: lambda self,
|
exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)),
|
||||||
e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.TimestampTrunc: lambda self, e: self.func(
|
exp.TimestampTrunc: lambda self, e: self.func(
|
||||||
"DATE_TRUNC", exp.Literal.string(e.text("unit")), e.this
|
"DATE_TRUNC", exp.Literal.string(e.text("unit")), e.this
|
||||||
),
|
),
|
||||||
|
@ -263,9 +266,6 @@ class Spark2(Hive):
|
||||||
args = []
|
args = []
|
||||||
for arg in expression.expressions:
|
for arg in expression.expressions:
|
||||||
if isinstance(arg, self.KEY_VALUE_DEFINITIONS):
|
if isinstance(arg, self.KEY_VALUE_DEFINITIONS):
|
||||||
if isinstance(arg, exp.Bracket):
|
|
||||||
args.append(exp.alias_(arg.this, arg.expressions[0].name))
|
|
||||||
else:
|
|
||||||
args.append(exp.alias_(arg.expression, arg.this.name))
|
args.append(exp.alias_(arg.expression, arg.this.name))
|
||||||
else:
|
else:
|
||||||
args.append(arg)
|
args.append(arg)
|
||||||
|
|
|
@ -4,7 +4,7 @@ from sqlglot import exp
|
||||||
from sqlglot.dialects.dialect import (
|
from sqlglot.dialects.dialect import (
|
||||||
approx_count_distinct_sql,
|
approx_count_distinct_sql,
|
||||||
arrow_json_extract_sql,
|
arrow_json_extract_sql,
|
||||||
parse_timestamp_trunc,
|
build_timestamp_trunc,
|
||||||
rename_func,
|
rename_func,
|
||||||
)
|
)
|
||||||
from sqlglot.dialects.mysql import MySQL
|
from sqlglot.dialects.mysql import MySQL
|
||||||
|
@ -15,7 +15,7 @@ class StarRocks(MySQL):
|
||||||
class Parser(MySQL.Parser):
|
class Parser(MySQL.Parser):
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
**MySQL.Parser.FUNCTIONS,
|
**MySQL.Parser.FUNCTIONS,
|
||||||
"DATE_TRUNC": parse_timestamp_trunc,
|
"DATE_TRUNC": build_timestamp_trunc,
|
||||||
"DATEDIFF": lambda args: exp.DateDiff(
|
"DATEDIFF": lambda args: exp.DateDiff(
|
||||||
this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY")
|
this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY")
|
||||||
),
|
),
|
||||||
|
@ -44,14 +44,12 @@ class StarRocks(MySQL):
|
||||||
exp.JSONExtractScalar: arrow_json_extract_sql,
|
exp.JSONExtractScalar: arrow_json_extract_sql,
|
||||||
exp.JSONExtract: arrow_json_extract_sql,
|
exp.JSONExtract: arrow_json_extract_sql,
|
||||||
exp.RegexpLike: rename_func("REGEXP"),
|
exp.RegexpLike: rename_func("REGEXP"),
|
||||||
exp.StrToUnix: lambda self,
|
exp.StrToUnix: lambda self, e: self.func("UNIX_TIMESTAMP", e.this, self.format_time(e)),
|
||||||
e: f"UNIX_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.TimestampTrunc: lambda self, e: self.func(
|
exp.TimestampTrunc: lambda self, e: self.func(
|
||||||
"DATE_TRUNC", exp.Literal.string(e.text("unit")), e.this
|
"DATE_TRUNC", exp.Literal.string(e.text("unit")), e.this
|
||||||
),
|
),
|
||||||
exp.TimeStrToDate: rename_func("TO_DATE"),
|
exp.TimeStrToDate: rename_func("TO_DATE"),
|
||||||
exp.UnixToStr: lambda self,
|
exp.UnixToStr: lambda self, e: self.func("FROM_UNIXTIME", e.this, self.format_time(e)),
|
||||||
e: f"FROM_UNIXTIME({self.sql(e, 'this')}, {self.format_time(e)})",
|
|
||||||
exp.UnixToTime: rename_func("FROM_UNIXTIME"),
|
exp.UnixToTime: rename_func("FROM_UNIXTIME"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,8 @@ class Tableau(Dialect):
|
||||||
def count_sql(self, expression: exp.Count) -> str:
|
def count_sql(self, expression: exp.Count) -> str:
|
||||||
this = expression.this
|
this = expression.this
|
||||||
if isinstance(this, exp.Distinct):
|
if isinstance(this, exp.Distinct):
|
||||||
return f"COUNTD({self.expressions(this, flat=True)})"
|
return self.func("COUNTD", *this.expressions)
|
||||||
return f"COUNT({self.sql(expression, 'this')})"
|
return self.func("COUNT", this)
|
||||||
|
|
||||||
class Parser(parser.Parser):
|
class Parser(parser.Parser):
|
||||||
FUNCTIONS = {
|
FUNCTIONS = {
|
||||||
|
|
|
@ -178,6 +178,7 @@ class Teradata(Dialect):
|
||||||
QUERY_HINTS = False
|
QUERY_HINTS = False
|
||||||
TABLESAMPLE_KEYWORDS = "SAMPLE"
|
TABLESAMPLE_KEYWORDS = "SAMPLE"
|
||||||
LAST_DAY_SUPPORTS_DATE_PART = False
|
LAST_DAY_SUPPORTS_DATE_PART = False
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = True
|
||||||
|
|
||||||
TYPE_MAPPING = {
|
TYPE_MAPPING = {
|
||||||
**generator.Generator.TYPE_MAPPING,
|
**generator.Generator.TYPE_MAPPING,
|
||||||
|
@ -195,6 +196,7 @@ class Teradata(Dialect):
|
||||||
**generator.Generator.TRANSFORMS,
|
**generator.Generator.TRANSFORMS,
|
||||||
exp.ArgMax: rename_func("MAX_BY"),
|
exp.ArgMax: rename_func("MAX_BY"),
|
||||||
exp.ArgMin: rename_func("MIN_BY"),
|
exp.ArgMin: rename_func("MIN_BY"),
|
||||||
|
exp.ArraySize: rename_func("CARDINALITY"),
|
||||||
exp.Max: max_or_greatest,
|
exp.Max: max_or_greatest,
|
||||||
exp.Min: min_or_least,
|
exp.Min: min_or_least,
|
||||||
exp.Pow: lambda self, e: self.binary(e, "**"),
|
exp.Pow: lambda self, e: self.binary(e, "**"),
|
||||||
|
|
|
@ -13,7 +13,7 @@ from sqlglot.dialects.dialect import (
|
||||||
generatedasidentitycolumnconstraint_sql,
|
generatedasidentitycolumnconstraint_sql,
|
||||||
max_or_greatest,
|
max_or_greatest,
|
||||||
min_or_least,
|
min_or_least,
|
||||||
parse_date_delta,
|
build_date_delta,
|
||||||
rename_func,
|
rename_func,
|
||||||
timestrtotime_sql,
|
timestrtotime_sql,
|
||||||
trim_sql,
|
trim_sql,
|
||||||
|
@ -64,10 +64,10 @@ DEFAULT_START_DATE = datetime.date(1900, 1, 1)
|
||||||
BIT_TYPES = {exp.EQ, exp.NEQ, exp.Is, exp.In, exp.Select, exp.Alias}
|
BIT_TYPES = {exp.EQ, exp.NEQ, exp.Is, exp.In, exp.Select, exp.Alias}
|
||||||
|
|
||||||
|
|
||||||
def _format_time_lambda(
|
def _build_formatted_time(
|
||||||
exp_class: t.Type[E], full_format_mapping: t.Optional[bool] = None
|
exp_class: t.Type[E], full_format_mapping: t.Optional[bool] = None
|
||||||
) -> t.Callable[[t.List], E]:
|
) -> t.Callable[[t.List], E]:
|
||||||
def _format_time(args: t.List) -> E:
|
def _builder(args: t.List) -> E:
|
||||||
assert len(args) == 2
|
assert len(args) == 2
|
||||||
|
|
||||||
return exp_class(
|
return exp_class(
|
||||||
|
@ -84,10 +84,10 @@ def _format_time_lambda(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
return _format_time
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
def _parse_format(args: t.List) -> exp.Expression:
|
def _build_format(args: t.List) -> exp.NumberToStr | exp.TimeToStr:
|
||||||
this = seq_get(args, 0)
|
this = seq_get(args, 0)
|
||||||
fmt = seq_get(args, 1)
|
fmt = seq_get(args, 1)
|
||||||
culture = seq_get(args, 2)
|
culture = seq_get(args, 2)
|
||||||
|
@ -107,7 +107,7 @@ def _parse_format(args: t.List) -> exp.Expression:
|
||||||
return exp.TimeToStr(this=this, format=fmt, culture=culture)
|
return exp.TimeToStr(this=this, format=fmt, culture=culture)
|
||||||
|
|
||||||
|
|
||||||
def _parse_eomonth(args: t.List) -> exp.LastDay:
|
def _build_eomonth(args: t.List) -> exp.LastDay:
|
||||||
date = exp.TsOrDsToDate(this=seq_get(args, 0))
|
date = exp.TsOrDsToDate(this=seq_get(args, 0))
|
||||||
month_lag = seq_get(args, 1)
|
month_lag = seq_get(args, 1)
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ def _parse_eomonth(args: t.List) -> exp.LastDay:
|
||||||
return exp.LastDay(this=this)
|
return exp.LastDay(this=this)
|
||||||
|
|
||||||
|
|
||||||
def _parse_hashbytes(args: t.List) -> exp.Expression:
|
def _build_hashbytes(args: t.List) -> exp.Expression:
|
||||||
kind, data = args
|
kind, data = args
|
||||||
kind = kind.name.upper() if kind.is_string else ""
|
kind = kind.name.upper() if kind.is_string else ""
|
||||||
|
|
||||||
|
@ -179,10 +179,10 @@ def _string_agg_sql(self: TSQL.Generator, expression: exp.GroupConcat) -> str:
|
||||||
return f"STRING_AGG({self.format_args(this, separator)}){order}"
|
return f"STRING_AGG({self.format_args(this, separator)}){order}"
|
||||||
|
|
||||||
|
|
||||||
def _parse_date_delta(
|
def _build_date_delta(
|
||||||
exp_class: t.Type[E], unit_mapping: t.Optional[t.Dict[str, str]] = None
|
exp_class: t.Type[E], unit_mapping: t.Optional[t.Dict[str, str]] = None
|
||||||
) -> t.Callable[[t.List], E]:
|
) -> t.Callable[[t.List], E]:
|
||||||
def inner_func(args: t.List) -> E:
|
def _builder(args: t.List) -> E:
|
||||||
unit = seq_get(args, 0)
|
unit = seq_get(args, 0)
|
||||||
if unit and unit_mapping:
|
if unit and unit_mapping:
|
||||||
unit = exp.var(unit_mapping.get(unit.name.lower(), unit.name))
|
unit = exp.var(unit_mapping.get(unit.name.lower(), unit.name))
|
||||||
|
@ -204,7 +204,7 @@ def _parse_date_delta(
|
||||||
unit=unit,
|
unit=unit,
|
||||||
)
|
)
|
||||||
|
|
||||||
return inner_func
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
def qualify_derived_table_outputs(expression: exp.Expression) -> exp.Expression:
|
def qualify_derived_table_outputs(expression: exp.Expression) -> exp.Expression:
|
||||||
|
@ -242,7 +242,7 @@ def qualify_derived_table_outputs(expression: exp.Expression) -> exp.Expression:
|
||||||
|
|
||||||
|
|
||||||
# https://learn.microsoft.com/en-us/sql/t-sql/functions/datetimefromparts-transact-sql?view=sql-server-ver16#syntax
|
# https://learn.microsoft.com/en-us/sql/t-sql/functions/datetimefromparts-transact-sql?view=sql-server-ver16#syntax
|
||||||
def _parse_datetimefromparts(args: t.List) -> exp.TimestampFromParts:
|
def _build_datetimefromparts(args: t.List) -> exp.TimestampFromParts:
|
||||||
return exp.TimestampFromParts(
|
return exp.TimestampFromParts(
|
||||||
year=seq_get(args, 0),
|
year=seq_get(args, 0),
|
||||||
month=seq_get(args, 1),
|
month=seq_get(args, 1),
|
||||||
|
@ -255,7 +255,7 @@ def _parse_datetimefromparts(args: t.List) -> exp.TimestampFromParts:
|
||||||
|
|
||||||
|
|
||||||
# https://learn.microsoft.com/en-us/sql/t-sql/functions/timefromparts-transact-sql?view=sql-server-ver16#syntax
|
# https://learn.microsoft.com/en-us/sql/t-sql/functions/timefromparts-transact-sql?view=sql-server-ver16#syntax
|
||||||
def _parse_timefromparts(args: t.List) -> exp.TimeFromParts:
|
def _build_timefromparts(args: t.List) -> exp.TimeFromParts:
|
||||||
return exp.TimeFromParts(
|
return exp.TimeFromParts(
|
||||||
hour=seq_get(args, 0),
|
hour=seq_get(args, 0),
|
||||||
min=seq_get(args, 1),
|
min=seq_get(args, 1),
|
||||||
|
@ -265,7 +265,7 @@ def _parse_timefromparts(args: t.List) -> exp.TimeFromParts:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _parse_as_text(
|
def _build_with_arg_as_text(
|
||||||
klass: t.Type[exp.Expression],
|
klass: t.Type[exp.Expression],
|
||||||
) -> t.Callable[[t.List[exp.Expression]], exp.Expression]:
|
) -> t.Callable[[t.List[exp.Expression]], exp.Expression]:
|
||||||
def _parse(args: t.List[exp.Expression]) -> exp.Expression:
|
def _parse(args: t.List[exp.Expression]) -> exp.Expression:
|
||||||
|
@ -288,8 +288,8 @@ def _parse_as_text(
|
||||||
def _json_extract_sql(
|
def _json_extract_sql(
|
||||||
self: TSQL.Generator, expression: exp.JSONExtract | exp.JSONExtractScalar
|
self: TSQL.Generator, expression: exp.JSONExtract | exp.JSONExtractScalar
|
||||||
) -> str:
|
) -> str:
|
||||||
json_query = rename_func("JSON_QUERY")(self, expression)
|
json_query = self.func("JSON_QUERY", expression.this, expression.expression)
|
||||||
json_value = rename_func("JSON_VALUE")(self, expression)
|
json_value = self.func("JSON_VALUE", expression.this, expression.expression)
|
||||||
return self.func("ISNULL", json_query, json_value)
|
return self.func("ISNULL", json_query, json_value)
|
||||||
|
|
||||||
|
|
||||||
|
@ -448,28 +448,28 @@ class TSQL(Dialect):
|
||||||
substr=seq_get(args, 0),
|
substr=seq_get(args, 0),
|
||||||
position=seq_get(args, 2),
|
position=seq_get(args, 2),
|
||||||
),
|
),
|
||||||
"DATEADD": parse_date_delta(exp.DateAdd, unit_mapping=DATE_DELTA_INTERVAL),
|
"DATEADD": build_date_delta(exp.DateAdd, unit_mapping=DATE_DELTA_INTERVAL),
|
||||||
"DATEDIFF": _parse_date_delta(exp.DateDiff, unit_mapping=DATE_DELTA_INTERVAL),
|
"DATEDIFF": _build_date_delta(exp.DateDiff, unit_mapping=DATE_DELTA_INTERVAL),
|
||||||
"DATENAME": _format_time_lambda(exp.TimeToStr, full_format_mapping=True),
|
"DATENAME": _build_formatted_time(exp.TimeToStr, full_format_mapping=True),
|
||||||
"DATEPART": _format_time_lambda(exp.TimeToStr),
|
"DATEPART": _build_formatted_time(exp.TimeToStr),
|
||||||
"DATETIMEFROMPARTS": _parse_datetimefromparts,
|
"DATETIMEFROMPARTS": _build_datetimefromparts,
|
||||||
"EOMONTH": _parse_eomonth,
|
"EOMONTH": _build_eomonth,
|
||||||
"FORMAT": _parse_format,
|
"FORMAT": _build_format,
|
||||||
"GETDATE": exp.CurrentTimestamp.from_arg_list,
|
"GETDATE": exp.CurrentTimestamp.from_arg_list,
|
||||||
"HASHBYTES": _parse_hashbytes,
|
"HASHBYTES": _build_hashbytes,
|
||||||
"ISNULL": exp.Coalesce.from_arg_list,
|
"ISNULL": exp.Coalesce.from_arg_list,
|
||||||
"JSON_QUERY": parser.parse_extract_json_with_path(exp.JSONExtract),
|
"JSON_QUERY": parser.build_extract_json_with_path(exp.JSONExtract),
|
||||||
"JSON_VALUE": parser.parse_extract_json_with_path(exp.JSONExtractScalar),
|
"JSON_VALUE": parser.build_extract_json_with_path(exp.JSONExtractScalar),
|
||||||
"LEN": _parse_as_text(exp.Length),
|
"LEN": _build_with_arg_as_text(exp.Length),
|
||||||
"LEFT": _parse_as_text(exp.Left),
|
"LEFT": _build_with_arg_as_text(exp.Left),
|
||||||
"RIGHT": _parse_as_text(exp.Right),
|
"RIGHT": _build_with_arg_as_text(exp.Right),
|
||||||
"REPLICATE": exp.Repeat.from_arg_list,
|
"REPLICATE": exp.Repeat.from_arg_list,
|
||||||
"SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
|
"SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
|
||||||
"SYSDATETIME": exp.CurrentTimestamp.from_arg_list,
|
"SYSDATETIME": exp.CurrentTimestamp.from_arg_list,
|
||||||
"SUSER_NAME": exp.CurrentUser.from_arg_list,
|
"SUSER_NAME": exp.CurrentUser.from_arg_list,
|
||||||
"SUSER_SNAME": exp.CurrentUser.from_arg_list,
|
"SUSER_SNAME": exp.CurrentUser.from_arg_list,
|
||||||
"SYSTEM_USER": exp.CurrentUser.from_arg_list,
|
"SYSTEM_USER": exp.CurrentUser.from_arg_list,
|
||||||
"TIMEFROMPARTS": _parse_timefromparts,
|
"TIMEFROMPARTS": _build_timefromparts,
|
||||||
}
|
}
|
||||||
|
|
||||||
JOIN_HINTS = {
|
JOIN_HINTS = {
|
||||||
|
@ -756,6 +756,9 @@ class TSQL(Dialect):
|
||||||
transforms.eliminate_qualify,
|
transforms.eliminate_qualify,
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
|
exp.StrPosition: lambda self, e: self.func(
|
||||||
|
"CHARINDEX", e.args.get("substr"), e.this, e.args.get("position")
|
||||||
|
),
|
||||||
exp.Subquery: transforms.preprocess([qualify_derived_table_outputs]),
|
exp.Subquery: transforms.preprocess([qualify_derived_table_outputs]),
|
||||||
exp.SHA: lambda self, e: self.func("HASHBYTES", exp.Literal.string("SHA1"), e.this),
|
exp.SHA: lambda self, e: self.func("HASHBYTES", exp.Literal.string("SHA1"), e.this),
|
||||||
exp.SHA2: lambda self, e: self.func(
|
exp.SHA2: lambda self, e: self.func(
|
||||||
|
@ -855,7 +858,7 @@ class TSQL(Dialect):
|
||||||
return sql
|
return sql
|
||||||
|
|
||||||
def create_sql(self, expression: exp.Create) -> str:
|
def create_sql(self, expression: exp.Create) -> str:
|
||||||
kind = self.sql(expression, "kind").upper()
|
kind = expression.kind
|
||||||
exists = expression.args.pop("exists", None)
|
exists = expression.args.pop("exists", None)
|
||||||
sql = super().create_sql(expression)
|
sql = super().create_sql(expression)
|
||||||
|
|
||||||
|
|
|
@ -67,8 +67,8 @@ class Expression(metaclass=_Expression):
|
||||||
Attributes:
|
Attributes:
|
||||||
key: a unique key for each class in the Expression hierarchy. This is useful for hashing
|
key: a unique key for each class in the Expression hierarchy. This is useful for hashing
|
||||||
and representing expressions as strings.
|
and representing expressions as strings.
|
||||||
arg_types: determines what arguments (child nodes) are supported by an expression. It
|
arg_types: determines the arguments (child nodes) supported by an expression. It maps
|
||||||
maps arg keys to booleans that indicate whether the corresponding args are optional.
|
arg keys to booleans that indicate whether the corresponding args are optional.
|
||||||
parent: a reference to the parent expression (or None, in case of root expressions).
|
parent: a reference to the parent expression (or None, in case of root expressions).
|
||||||
arg_key: the arg key an expression is associated with, i.e. the name its parent expression
|
arg_key: the arg key an expression is associated with, i.e. the name its parent expression
|
||||||
uses to refer to it.
|
uses to refer to it.
|
||||||
|
@ -680,7 +680,7 @@ class Expression(metaclass=_Expression):
|
||||||
*expressions: the SQL code strings to parse.
|
*expressions: the SQL code strings to parse.
|
||||||
If an `Expression` instance is passed, it will be used as-is.
|
If an `Expression` instance is passed, it will be used as-is.
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: whether or not to copy the involved expressions (only applies to Expressions).
|
copy: whether to copy the involved expressions (only applies to Expressions).
|
||||||
opts: other options to use to parse the input expressions.
|
opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -706,7 +706,7 @@ class Expression(metaclass=_Expression):
|
||||||
*expressions: the SQL code strings to parse.
|
*expressions: the SQL code strings to parse.
|
||||||
If an `Expression` instance is passed, it will be used as-is.
|
If an `Expression` instance is passed, it will be used as-is.
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: whether or not to copy the involved expressions (only applies to Expressions).
|
copy: whether to copy the involved expressions (only applies to Expressions).
|
||||||
opts: other options to use to parse the input expressions.
|
opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -723,7 +723,7 @@ class Expression(metaclass=_Expression):
|
||||||
'NOT x = 1'
|
'NOT x = 1'
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
copy: whether or not to copy this object.
|
copy: whether to copy this object.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The new Not instance.
|
The new Not instance.
|
||||||
|
@ -3820,7 +3820,7 @@ class DataType(Expression):
|
||||||
dialect: the dialect to use for parsing `dtype`, in case it's a string.
|
dialect: the dialect to use for parsing `dtype`, in case it's a string.
|
||||||
udt: when set to True, `dtype` will be used as-is if it can't be parsed into a
|
udt: when set to True, `dtype` will be used as-is if it can't be parsed into a
|
||||||
DataType, thus creating a user-defined type.
|
DataType, thus creating a user-defined type.
|
||||||
copy: whether or not to copy the data type.
|
copy: whether to copy the data type.
|
||||||
kwargs: additional arguments to pass in the constructor of DataType.
|
kwargs: additional arguments to pass in the constructor of DataType.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -4309,9 +4309,9 @@ class Func(Condition):
|
||||||
Attributes:
|
Attributes:
|
||||||
is_var_len_args (bool): if set to True the last argument defined in arg_types will be
|
is_var_len_args (bool): if set to True the last argument defined in arg_types will be
|
||||||
treated as a variable length argument and the argument's value will be stored as a list.
|
treated as a variable length argument and the argument's value will be stored as a list.
|
||||||
_sql_names (list): determines the SQL name (1st item in the list) and aliases (subsequent items)
|
_sql_names (list): the SQL name (1st item in the list) and aliases (subsequent items) for this
|
||||||
for this function expression. These values are used to map this node to a name during parsing
|
function expression. These values are used to map this node to a name during parsing as
|
||||||
as well as to provide the function's name during SQL string generation. By default the SQL
|
well as to provide the function's name during SQL string generation. By default the SQL
|
||||||
name is set to the expression's class name transformed to snake case.
|
name is set to the expression's class name transformed to snake case.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -4449,6 +4449,7 @@ class ArrayAll(Func):
|
||||||
arg_types = {"this": True, "expression": True}
|
arg_types = {"this": True, "expression": True}
|
||||||
|
|
||||||
|
|
||||||
|
# Represents Python's `any(f(x) for x in array)`, where `array` is `this` and `f` is `expression`
|
||||||
class ArrayAny(Func):
|
class ArrayAny(Func):
|
||||||
arg_types = {"this": True, "expression": True}
|
arg_types = {"this": True, "expression": True}
|
||||||
|
|
||||||
|
@ -4482,6 +4483,7 @@ class ArrayOverlaps(Binary, Func):
|
||||||
|
|
||||||
class ArraySize(Func):
|
class ArraySize(Func):
|
||||||
arg_types = {"this": True, "expression": False}
|
arg_types = {"this": True, "expression": False}
|
||||||
|
_sql_names = ["ARRAY_SIZE", "ARRAY_LENGTH"]
|
||||||
|
|
||||||
|
|
||||||
class ArraySort(Func):
|
class ArraySort(Func):
|
||||||
|
@ -5033,7 +5035,7 @@ class JSONBContains(Binary):
|
||||||
|
|
||||||
|
|
||||||
class JSONExtract(Binary, Func):
|
class JSONExtract(Binary, Func):
|
||||||
arg_types = {"this": True, "expression": True, "expressions": False}
|
arg_types = {"this": True, "expression": True, "only_json_types": False, "expressions": False}
|
||||||
_sql_names = ["JSON_EXTRACT"]
|
_sql_names = ["JSON_EXTRACT"]
|
||||||
is_var_len_args = True
|
is_var_len_args = True
|
||||||
|
|
||||||
|
@ -5043,7 +5045,7 @@ class JSONExtract(Binary, Func):
|
||||||
|
|
||||||
|
|
||||||
class JSONExtractScalar(Binary, Func):
|
class JSONExtractScalar(Binary, Func):
|
||||||
arg_types = {"this": True, "expression": True, "expressions": False}
|
arg_types = {"this": True, "expression": True, "only_json_types": False, "expressions": False}
|
||||||
_sql_names = ["JSON_EXTRACT_SCALAR"]
|
_sql_names = ["JSON_EXTRACT_SCALAR"]
|
||||||
is_var_len_args = True
|
is_var_len_args = True
|
||||||
|
|
||||||
|
@ -5626,7 +5628,7 @@ def maybe_parse(
|
||||||
input expression is a SQL string).
|
input expression is a SQL string).
|
||||||
prefix: a string to prefix the sql with before it gets parsed
|
prefix: a string to prefix the sql with before it gets parsed
|
||||||
(automatically includes a space)
|
(automatically includes a space)
|
||||||
copy: whether or not to copy the expression.
|
copy: whether to copy the expression.
|
||||||
**opts: other options to use to parse the input expressions (again, in the case
|
**opts: other options to use to parse the input expressions (again, in the case
|
||||||
that an input expression is a SQL string).
|
that an input expression is a SQL string).
|
||||||
|
|
||||||
|
@ -5897,7 +5899,7 @@ def union(
|
||||||
If an `Expression` instance is passed, it will be used as-is.
|
If an `Expression` instance is passed, it will be used as-is.
|
||||||
distinct: set the DISTINCT flag if and only if this is true.
|
distinct: set the DISTINCT flag if and only if this is true.
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: whether or not to copy the expression.
|
copy: whether to copy the expression.
|
||||||
opts: other options to use to parse the input expressions.
|
opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -5931,7 +5933,7 @@ def intersect(
|
||||||
If an `Expression` instance is passed, it will be used as-is.
|
If an `Expression` instance is passed, it will be used as-is.
|
||||||
distinct: set the DISTINCT flag if and only if this is true.
|
distinct: set the DISTINCT flag if and only if this is true.
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: whether or not to copy the expression.
|
copy: whether to copy the expression.
|
||||||
opts: other options to use to parse the input expressions.
|
opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -5965,7 +5967,7 @@ def except_(
|
||||||
If an `Expression` instance is passed, it will be used as-is.
|
If an `Expression` instance is passed, it will be used as-is.
|
||||||
distinct: set the DISTINCT flag if and only if this is true.
|
distinct: set the DISTINCT flag if and only if this is true.
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: whether or not to copy the expression.
|
copy: whether to copy the expression.
|
||||||
opts: other options to use to parse the input expressions.
|
opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -6127,7 +6129,7 @@ def insert(
|
||||||
overwrite: whether to INSERT OVERWRITE or not.
|
overwrite: whether to INSERT OVERWRITE or not.
|
||||||
returning: sql conditional parsed into a RETURNING statement
|
returning: sql conditional parsed into a RETURNING statement
|
||||||
dialect: the dialect used to parse the input expressions.
|
dialect: the dialect used to parse the input expressions.
|
||||||
copy: whether or not to copy the expression.
|
copy: whether to copy the expression.
|
||||||
**opts: other options to use to parse the input expressions.
|
**opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -6168,7 +6170,7 @@ def condition(
|
||||||
If an Expression instance is passed, this is used as-is.
|
If an Expression instance is passed, this is used as-is.
|
||||||
dialect: the dialect used to parse the input expression (in the case that the
|
dialect: the dialect used to parse the input expression (in the case that the
|
||||||
input expression is a SQL string).
|
input expression is a SQL string).
|
||||||
copy: Whether or not to copy `expression` (only applies to expressions).
|
copy: Whether to copy `expression` (only applies to expressions).
|
||||||
**opts: other options to use to parse the input expressions (again, in the case
|
**opts: other options to use to parse the input expressions (again, in the case
|
||||||
that the input expression is a SQL string).
|
that the input expression is a SQL string).
|
||||||
|
|
||||||
|
@ -6198,7 +6200,7 @@ def and_(
|
||||||
*expressions: the SQL code strings to parse.
|
*expressions: the SQL code strings to parse.
|
||||||
If an Expression instance is passed, this is used as-is.
|
If an Expression instance is passed, this is used as-is.
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: whether or not to copy `expressions` (only applies to Expressions).
|
copy: whether to copy `expressions` (only applies to Expressions).
|
||||||
**opts: other options to use to parse the input expressions.
|
**opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -6221,7 +6223,7 @@ def or_(
|
||||||
*expressions: the SQL code strings to parse.
|
*expressions: the SQL code strings to parse.
|
||||||
If an Expression instance is passed, this is used as-is.
|
If an Expression instance is passed, this is used as-is.
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: whether or not to copy `expressions` (only applies to Expressions).
|
copy: whether to copy `expressions` (only applies to Expressions).
|
||||||
**opts: other options to use to parse the input expressions.
|
**opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -6296,8 +6298,8 @@ def to_identifier(name, quoted=None, copy=True):
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
name: The name to turn into an identifier.
|
name: The name to turn into an identifier.
|
||||||
quoted: Whether or not force quote the identifier.
|
quoted: Whether to force quote the identifier.
|
||||||
copy: Whether or not to copy name if it's an Identifier.
|
copy: Whether to copy name if it's an Identifier.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The identifier ast node.
|
The identifier ast node.
|
||||||
|
@ -6379,7 +6381,7 @@ def to_table(
|
||||||
Args:
|
Args:
|
||||||
sql_path: a `[catalog].[schema].[table]` string.
|
sql_path: a `[catalog].[schema].[table]` string.
|
||||||
dialect: the source dialect according to which the table name will be parsed.
|
dialect: the source dialect according to which the table name will be parsed.
|
||||||
copy: Whether or not to copy a table if it is passed in.
|
copy: Whether to copy a table if it is passed in.
|
||||||
kwargs: the kwargs to instantiate the resulting `Table` expression with.
|
kwargs: the kwargs to instantiate the resulting `Table` expression with.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -6418,7 +6420,7 @@ def to_column(sql_path: str | Column, **kwargs) -> Column:
|
||||||
|
|
||||||
def alias_(
|
def alias_(
|
||||||
expression: ExpOrStr,
|
expression: ExpOrStr,
|
||||||
alias: str | Identifier,
|
alias: t.Optional[str | Identifier],
|
||||||
table: bool | t.Sequence[str | Identifier] = False,
|
table: bool | t.Sequence[str | Identifier] = False,
|
||||||
quoted: t.Optional[bool] = None,
|
quoted: t.Optional[bool] = None,
|
||||||
dialect: DialectType = None,
|
dialect: DialectType = None,
|
||||||
|
@ -6439,10 +6441,10 @@ def alias_(
|
||||||
If an Expression instance is passed, this is used as-is.
|
If an Expression instance is passed, this is used as-is.
|
||||||
alias: the alias name to use. If the name has
|
alias: the alias name to use. If the name has
|
||||||
special characters it is quoted.
|
special characters it is quoted.
|
||||||
table: Whether or not to create a table alias, can also be a list of columns.
|
table: Whether to create a table alias, can also be a list of columns.
|
||||||
quoted: whether or not to quote the alias
|
quoted: whether to quote the alias
|
||||||
dialect: the dialect used to parse the input expression.
|
dialect: the dialect used to parse the input expression.
|
||||||
copy: Whether or not to copy the expression.
|
copy: Whether to copy the expression.
|
||||||
**opts: other options to use to parse the input expressions.
|
**opts: other options to use to parse the input expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -6549,7 +6551,7 @@ def column(
|
||||||
catalog: Catalog name.
|
catalog: Catalog name.
|
||||||
fields: Additional fields using dots.
|
fields: Additional fields using dots.
|
||||||
quoted: Whether to force quotes on the column's identifiers.
|
quoted: Whether to force quotes on the column's identifiers.
|
||||||
copy: Whether or not to copy identifiers if passed in.
|
copy: Whether to copy identifiers if passed in.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The new Column instance.
|
The new Column instance.
|
||||||
|
@ -6576,7 +6578,7 @@ def cast(expression: ExpOrStr, to: DATA_TYPE, copy: bool = True, **opts) -> Cast
|
||||||
Args:
|
Args:
|
||||||
expression: The expression to cast.
|
expression: The expression to cast.
|
||||||
to: The datatype to cast to.
|
to: The datatype to cast to.
|
||||||
copy: Whether or not to copy the supplied expressions.
|
copy: Whether to copy the supplied expressions.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The new Cast instance.
|
The new Cast instance.
|
||||||
|
@ -6704,7 +6706,7 @@ def rename_column(
|
||||||
table_name: Name of the table
|
table_name: Name of the table
|
||||||
old_column: The old name of the column
|
old_column: The old name of the column
|
||||||
new_column: The new name of the column
|
new_column: The new name of the column
|
||||||
exists: Whether or not to add the `IF EXISTS` clause
|
exists: Whether to add the `IF EXISTS` clause
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Alter table expression
|
Alter table expression
|
||||||
|
@ -6727,7 +6729,7 @@ def convert(value: t.Any, copy: bool = False) -> Expression:
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
value: A python object.
|
value: A python object.
|
||||||
copy: Whether or not to copy `value` (only applies to Expressions and collections).
|
copy: Whether to copy `value` (only applies to Expressions and collections).
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Expression: the equivalent expression object.
|
Expression: the equivalent expression object.
|
||||||
|
@ -6847,7 +6849,7 @@ def normalize_table_name(table: str | Table, dialect: DialectType = None, copy:
|
||||||
Args:
|
Args:
|
||||||
table: the table to normalize
|
table: the table to normalize
|
||||||
dialect: the dialect to use for normalization rules
|
dialect: the dialect to use for normalization rules
|
||||||
copy: whether or not to copy the expression.
|
copy: whether to copy the expression.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
>>> normalize_table_name("`A-B`.c", dialect="bigquery")
|
>>> normalize_table_name("`A-B`.c", dialect="bigquery")
|
||||||
|
@ -6872,7 +6874,7 @@ def replace_tables(
|
||||||
expression: expression node to be transformed and replaced.
|
expression: expression node to be transformed and replaced.
|
||||||
mapping: mapping of table names.
|
mapping: mapping of table names.
|
||||||
dialect: the dialect of the mapping table
|
dialect: the dialect of the mapping table
|
||||||
copy: whether or not to copy the expression.
|
copy: whether to copy the expression.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
>>> from sqlglot import exp, parse_one
|
>>> from sqlglot import exp, parse_one
|
||||||
|
@ -6959,7 +6961,7 @@ def expand(
|
||||||
expression: The expression to expand.
|
expression: The expression to expand.
|
||||||
sources: A dictionary of name to Subqueryables.
|
sources: A dictionary of name to Subqueryables.
|
||||||
dialect: The dialect of the sources dict.
|
dialect: The dialect of the sources dict.
|
||||||
copy: Whether or not to copy the expression during transformation. Defaults to True.
|
copy: Whether to copy the expression during transformation. Defaults to True.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The transformed expression.
|
The transformed expression.
|
||||||
|
@ -6993,7 +6995,7 @@ def func(name: str, *args, copy: bool = True, dialect: DialectType = None, **kwa
|
||||||
Args:
|
Args:
|
||||||
name: the name of the function to build.
|
name: the name of the function to build.
|
||||||
args: the args used to instantiate the function of interest.
|
args: the args used to instantiate the function of interest.
|
||||||
copy: whether or not to copy the argument expressions.
|
copy: whether to copy the argument expressions.
|
||||||
dialect: the source dialect.
|
dialect: the source dialect.
|
||||||
kwargs: the kwargs used to instantiate the function of interest.
|
kwargs: the kwargs used to instantiate the function of interest.
|
||||||
|
|
||||||
|
@ -7096,7 +7098,7 @@ def array(
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
expressions: the expressions to add to the array.
|
expressions: the expressions to add to the array.
|
||||||
copy: whether or not to copy the argument expressions.
|
copy: whether to copy the argument expressions.
|
||||||
dialect: the source dialect.
|
dialect: the source dialect.
|
||||||
kwargs: the kwargs used to instantiate the function of interest.
|
kwargs: the kwargs used to instantiate the function of interest.
|
||||||
|
|
||||||
|
@ -7123,7 +7125,7 @@ def tuple_(
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
expressions: the expressions to add to the tuple.
|
expressions: the expressions to add to the tuple.
|
||||||
copy: whether or not to copy the argument expressions.
|
copy: whether to copy the argument expressions.
|
||||||
dialect: the source dialect.
|
dialect: the source dialect.
|
||||||
kwargs: the kwargs used to instantiate the function of interest.
|
kwargs: the kwargs used to instantiate the function of interest.
|
||||||
|
|
||||||
|
|
|
@ -38,19 +38,19 @@ class Generator(metaclass=_Generator):
|
||||||
Generator converts a given syntax tree to the corresponding SQL string.
|
Generator converts a given syntax tree to the corresponding SQL string.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
pretty: Whether or not to format the produced SQL string.
|
pretty: Whether to format the produced SQL string.
|
||||||
Default: False.
|
Default: False.
|
||||||
identify: Determines when an identifier should be quoted. Possible values are:
|
identify: Determines when an identifier should be quoted. Possible values are:
|
||||||
False (default): Never quote, except in cases where it's mandatory by the dialect.
|
False (default): Never quote, except in cases where it's mandatory by the dialect.
|
||||||
True or 'always': Always quote.
|
True or 'always': Always quote.
|
||||||
'safe': Only quote identifiers that are case insensitive.
|
'safe': Only quote identifiers that are case insensitive.
|
||||||
normalize: Whether or not to normalize identifiers to lowercase.
|
normalize: Whether to normalize identifiers to lowercase.
|
||||||
Default: False.
|
Default: False.
|
||||||
pad: Determines the pad size in a formatted string.
|
pad: The pad size in a formatted string.
|
||||||
Default: 2.
|
Default: 2.
|
||||||
indent: Determines the indentation size in a formatted string.
|
indent: The indentation size in a formatted string.
|
||||||
Default: 2.
|
Default: 2.
|
||||||
normalize_functions: Whether or not to normalize all function names. Possible values are:
|
normalize_functions: How to normalize function names. Possible values are:
|
||||||
"upper" or True (default): Convert names to uppercase.
|
"upper" or True (default): Convert names to uppercase.
|
||||||
"lower": Convert names to lowercase.
|
"lower": Convert names to lowercase.
|
||||||
False: Disables function name normalization.
|
False: Disables function name normalization.
|
||||||
|
@ -59,14 +59,14 @@ class Generator(metaclass=_Generator):
|
||||||
max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError.
|
max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError.
|
||||||
This is only relevant if unsupported_level is ErrorLevel.RAISE.
|
This is only relevant if unsupported_level is ErrorLevel.RAISE.
|
||||||
Default: 3
|
Default: 3
|
||||||
leading_comma: Determines whether or not the comma is leading or trailing in select expressions.
|
leading_comma: Whether the comma is leading or trailing in select expressions.
|
||||||
This is only relevant when generating in pretty mode.
|
This is only relevant when generating in pretty mode.
|
||||||
Default: False
|
Default: False
|
||||||
max_text_width: The max number of characters in a segment before creating new lines in pretty mode.
|
max_text_width: The max number of characters in a segment before creating new lines in pretty mode.
|
||||||
The default is on the smaller end because the length only represents a segment and not the true
|
The default is on the smaller end because the length only represents a segment and not the true
|
||||||
line length.
|
line length.
|
||||||
Default: 80
|
Default: 80
|
||||||
comments: Whether or not to preserve comments in the output SQL code.
|
comments: Whether to preserve comments in the output SQL code.
|
||||||
Default: True
|
Default: True
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -97,6 +97,12 @@ class Generator(metaclass=_Generator):
|
||||||
exp.InlineLengthColumnConstraint: lambda self, e: f"INLINE LENGTH {self.sql(e, 'this')}",
|
exp.InlineLengthColumnConstraint: lambda self, e: f"INLINE LENGTH {self.sql(e, 'this')}",
|
||||||
exp.InputModelProperty: lambda self, e: f"INPUT{self.sql(e, 'this')}",
|
exp.InputModelProperty: lambda self, e: f"INPUT{self.sql(e, 'this')}",
|
||||||
exp.IntervalSpan: lambda self, e: f"{self.sql(e, 'this')} TO {self.sql(e, 'expression')}",
|
exp.IntervalSpan: lambda self, e: f"{self.sql(e, 'this')} TO {self.sql(e, 'expression')}",
|
||||||
|
exp.JSONExtract: lambda self, e: self.func(
|
||||||
|
"JSON_EXTRACT", e.this, e.expression, *e.expressions
|
||||||
|
),
|
||||||
|
exp.JSONExtractScalar: lambda self, e: self.func(
|
||||||
|
"JSON_EXTRACT_SCALAR", e.this, e.expression, *e.expressions
|
||||||
|
),
|
||||||
exp.LanguageProperty: lambda self, e: self.naked_property(e),
|
exp.LanguageProperty: lambda self, e: self.naked_property(e),
|
||||||
exp.LocationProperty: lambda self, e: self.naked_property(e),
|
exp.LocationProperty: lambda self, e: self.naked_property(e),
|
||||||
exp.LogProperty: lambda self, e: f"{'NO ' if e.args.get('no') else ''}LOG",
|
exp.LogProperty: lambda self, e: f"{'NO ' if e.args.get('no') else ''}LOG",
|
||||||
|
@ -134,15 +140,15 @@ class Generator(metaclass=_Generator):
|
||||||
exp.WithJournalTableProperty: lambda self, e: f"WITH JOURNAL TABLE={self.sql(e, 'this')}",
|
exp.WithJournalTableProperty: lambda self, e: f"WITH JOURNAL TABLE={self.sql(e, 'this')}",
|
||||||
}
|
}
|
||||||
|
|
||||||
# Whether or not null ordering is supported in order by
|
# Whether null ordering is supported in order by
|
||||||
# True: Full Support, None: No support, False: No support in window specifications
|
# True: Full Support, None: No support, False: No support in window specifications
|
||||||
NULL_ORDERING_SUPPORTED: t.Optional[bool] = True
|
NULL_ORDERING_SUPPORTED: t.Optional[bool] = True
|
||||||
|
|
||||||
# Whether or not ignore nulls is inside the agg or outside.
|
# Whether ignore nulls is inside the agg or outside.
|
||||||
# FIRST(x IGNORE NULLS) OVER vs FIRST (x) IGNORE NULLS OVER
|
# FIRST(x IGNORE NULLS) OVER vs FIRST (x) IGNORE NULLS OVER
|
||||||
IGNORE_NULLS_IN_FUNC = False
|
IGNORE_NULLS_IN_FUNC = False
|
||||||
|
|
||||||
# Whether or not locking reads (i.e. SELECT ... FOR UPDATE/SHARE) are supported
|
# Whether locking reads (i.e. SELECT ... FOR UPDATE/SHARE) are supported
|
||||||
LOCKING_READS_SUPPORTED = False
|
LOCKING_READS_SUPPORTED = False
|
||||||
|
|
||||||
# Always do union distinct or union all
|
# Always do union distinct or union all
|
||||||
|
@ -151,25 +157,25 @@ class Generator(metaclass=_Generator):
|
||||||
# Wrap derived values in parens, usually standard but spark doesn't support it
|
# Wrap derived values in parens, usually standard but spark doesn't support it
|
||||||
WRAP_DERIVED_VALUES = True
|
WRAP_DERIVED_VALUES = True
|
||||||
|
|
||||||
# Whether or not create function uses an AS before the RETURN
|
# Whether create function uses an AS before the RETURN
|
||||||
CREATE_FUNCTION_RETURN_AS = True
|
CREATE_FUNCTION_RETURN_AS = True
|
||||||
|
|
||||||
# Whether or not MERGE ... WHEN MATCHED BY SOURCE is allowed
|
# Whether MERGE ... WHEN MATCHED BY SOURCE is allowed
|
||||||
MATCHED_BY_SOURCE = True
|
MATCHED_BY_SOURCE = True
|
||||||
|
|
||||||
# Whether or not the INTERVAL expression works only with values like '1 day'
|
# Whether the INTERVAL expression works only with values like '1 day'
|
||||||
SINGLE_STRING_INTERVAL = False
|
SINGLE_STRING_INTERVAL = False
|
||||||
|
|
||||||
# Whether or not the plural form of date parts like day (i.e. "days") is supported in INTERVALs
|
# Whether the plural form of date parts like day (i.e. "days") is supported in INTERVALs
|
||||||
INTERVAL_ALLOWS_PLURAL_FORM = True
|
INTERVAL_ALLOWS_PLURAL_FORM = True
|
||||||
|
|
||||||
# Whether or not limit and fetch are supported (possible values: "ALL", "LIMIT", "FETCH")
|
# Whether limit and fetch are supported (possible values: "ALL", "LIMIT", "FETCH")
|
||||||
LIMIT_FETCH = "ALL"
|
LIMIT_FETCH = "ALL"
|
||||||
|
|
||||||
# Whether or not limit and fetch allows expresions or just limits
|
# Whether limit and fetch allows expresions or just limits
|
||||||
LIMIT_ONLY_LITERALS = False
|
LIMIT_ONLY_LITERALS = False
|
||||||
|
|
||||||
# Whether or not a table is allowed to be renamed with a db
|
# Whether a table is allowed to be renamed with a db
|
||||||
RENAME_TABLE_WITH_DB = True
|
RENAME_TABLE_WITH_DB = True
|
||||||
|
|
||||||
# The separator for grouping sets and rollups
|
# The separator for grouping sets and rollups
|
||||||
|
@ -178,105 +184,105 @@ class Generator(metaclass=_Generator):
|
||||||
# The string used for creating an index on a table
|
# The string used for creating an index on a table
|
||||||
INDEX_ON = "ON"
|
INDEX_ON = "ON"
|
||||||
|
|
||||||
# Whether or not join hints should be generated
|
# Whether join hints should be generated
|
||||||
JOIN_HINTS = True
|
JOIN_HINTS = True
|
||||||
|
|
||||||
# Whether or not table hints should be generated
|
# Whether table hints should be generated
|
||||||
TABLE_HINTS = True
|
TABLE_HINTS = True
|
||||||
|
|
||||||
# Whether or not query hints should be generated
|
# Whether query hints should be generated
|
||||||
QUERY_HINTS = True
|
QUERY_HINTS = True
|
||||||
|
|
||||||
# What kind of separator to use for query hints
|
# What kind of separator to use for query hints
|
||||||
QUERY_HINT_SEP = ", "
|
QUERY_HINT_SEP = ", "
|
||||||
|
|
||||||
# Whether or not comparing against booleans (e.g. x IS TRUE) is supported
|
# Whether comparing against booleans (e.g. x IS TRUE) is supported
|
||||||
IS_BOOL_ALLOWED = True
|
IS_BOOL_ALLOWED = True
|
||||||
|
|
||||||
# Whether or not to include the "SET" keyword in the "INSERT ... ON DUPLICATE KEY UPDATE" statement
|
# Whether to include the "SET" keyword in the "INSERT ... ON DUPLICATE KEY UPDATE" statement
|
||||||
DUPLICATE_KEY_UPDATE_WITH_SET = True
|
DUPLICATE_KEY_UPDATE_WITH_SET = True
|
||||||
|
|
||||||
# Whether or not to generate the limit as TOP <value> instead of LIMIT <value>
|
# Whether to generate the limit as TOP <value> instead of LIMIT <value>
|
||||||
LIMIT_IS_TOP = False
|
LIMIT_IS_TOP = False
|
||||||
|
|
||||||
# Whether or not to generate INSERT INTO ... RETURNING or INSERT INTO RETURNING ...
|
# Whether to generate INSERT INTO ... RETURNING or INSERT INTO RETURNING ...
|
||||||
RETURNING_END = True
|
RETURNING_END = True
|
||||||
|
|
||||||
# Whether or not to generate the (+) suffix for columns used in old-style join conditions
|
# Whether to generate the (+) suffix for columns used in old-style join conditions
|
||||||
COLUMN_JOIN_MARKS_SUPPORTED = False
|
COLUMN_JOIN_MARKS_SUPPORTED = False
|
||||||
|
|
||||||
# Whether or not to generate an unquoted value for EXTRACT's date part argument
|
# Whether to generate an unquoted value for EXTRACT's date part argument
|
||||||
EXTRACT_ALLOWS_QUOTES = True
|
EXTRACT_ALLOWS_QUOTES = True
|
||||||
|
|
||||||
# Whether or not TIMETZ / TIMESTAMPTZ will be generated using the "WITH TIME ZONE" syntax
|
# Whether TIMETZ / TIMESTAMPTZ will be generated using the "WITH TIME ZONE" syntax
|
||||||
TZ_TO_WITH_TIME_ZONE = False
|
TZ_TO_WITH_TIME_ZONE = False
|
||||||
|
|
||||||
# Whether or not the NVL2 function is supported
|
# Whether the NVL2 function is supported
|
||||||
NVL2_SUPPORTED = True
|
NVL2_SUPPORTED = True
|
||||||
|
|
||||||
# https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax
|
# https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax
|
||||||
SELECT_KINDS: t.Tuple[str, ...] = ("STRUCT", "VALUE")
|
SELECT_KINDS: t.Tuple[str, ...] = ("STRUCT", "VALUE")
|
||||||
|
|
||||||
# Whether or not VALUES statements can be used as derived tables.
|
# Whether VALUES statements can be used as derived tables.
|
||||||
# MySQL 5 and Redshift do not allow this, so when False, it will convert
|
# MySQL 5 and Redshift do not allow this, so when False, it will convert
|
||||||
# SELECT * VALUES into SELECT UNION
|
# SELECT * VALUES into SELECT UNION
|
||||||
VALUES_AS_TABLE = True
|
VALUES_AS_TABLE = True
|
||||||
|
|
||||||
# Whether or not the word COLUMN is included when adding a column with ALTER TABLE
|
# Whether the word COLUMN is included when adding a column with ALTER TABLE
|
||||||
ALTER_TABLE_INCLUDE_COLUMN_KEYWORD = True
|
ALTER_TABLE_INCLUDE_COLUMN_KEYWORD = True
|
||||||
|
|
||||||
# UNNEST WITH ORDINALITY (presto) instead of UNNEST WITH OFFSET (bigquery)
|
# UNNEST WITH ORDINALITY (presto) instead of UNNEST WITH OFFSET (bigquery)
|
||||||
UNNEST_WITH_ORDINALITY = True
|
UNNEST_WITH_ORDINALITY = True
|
||||||
|
|
||||||
# Whether or not FILTER (WHERE cond) can be used for conditional aggregation
|
# Whether FILTER (WHERE cond) can be used for conditional aggregation
|
||||||
AGGREGATE_FILTER_SUPPORTED = True
|
AGGREGATE_FILTER_SUPPORTED = True
|
||||||
|
|
||||||
# Whether or not JOIN sides (LEFT, RIGHT) are supported in conjunction with SEMI/ANTI join kinds
|
# Whether JOIN sides (LEFT, RIGHT) are supported in conjunction with SEMI/ANTI join kinds
|
||||||
SEMI_ANTI_JOIN_WITH_SIDE = True
|
SEMI_ANTI_JOIN_WITH_SIDE = True
|
||||||
|
|
||||||
# Whether or not to include the type of a computed column in the CREATE DDL
|
# Whether to include the type of a computed column in the CREATE DDL
|
||||||
COMPUTED_COLUMN_WITH_TYPE = True
|
COMPUTED_COLUMN_WITH_TYPE = True
|
||||||
|
|
||||||
# Whether or not CREATE TABLE .. COPY .. is supported. False means we'll generate CLONE instead of COPY
|
# Whether CREATE TABLE .. COPY .. is supported. False means we'll generate CLONE instead of COPY
|
||||||
SUPPORTS_TABLE_COPY = True
|
SUPPORTS_TABLE_COPY = True
|
||||||
|
|
||||||
# Whether or not parentheses are required around the table sample's expression
|
# Whether parentheses are required around the table sample's expression
|
||||||
TABLESAMPLE_REQUIRES_PARENS = True
|
TABLESAMPLE_REQUIRES_PARENS = True
|
||||||
|
|
||||||
# Whether or not a table sample clause's size needs to be followed by the ROWS keyword
|
# Whether a table sample clause's size needs to be followed by the ROWS keyword
|
||||||
TABLESAMPLE_SIZE_IS_ROWS = True
|
TABLESAMPLE_SIZE_IS_ROWS = True
|
||||||
|
|
||||||
# The keyword(s) to use when generating a sample clause
|
# The keyword(s) to use when generating a sample clause
|
||||||
TABLESAMPLE_KEYWORDS = "TABLESAMPLE"
|
TABLESAMPLE_KEYWORDS = "TABLESAMPLE"
|
||||||
|
|
||||||
# Whether or not the TABLESAMPLE clause supports a method name, like BERNOULLI
|
# Whether the TABLESAMPLE clause supports a method name, like BERNOULLI
|
||||||
TABLESAMPLE_WITH_METHOD = True
|
TABLESAMPLE_WITH_METHOD = True
|
||||||
|
|
||||||
# The keyword to use when specifying the seed of a sample clause
|
# The keyword to use when specifying the seed of a sample clause
|
||||||
TABLESAMPLE_SEED_KEYWORD = "SEED"
|
TABLESAMPLE_SEED_KEYWORD = "SEED"
|
||||||
|
|
||||||
# Whether or not COLLATE is a function instead of a binary operator
|
# Whether COLLATE is a function instead of a binary operator
|
||||||
COLLATE_IS_FUNC = False
|
COLLATE_IS_FUNC = False
|
||||||
|
|
||||||
# Whether or not data types support additional specifiers like e.g. CHAR or BYTE (oracle)
|
# Whether data types support additional specifiers like e.g. CHAR or BYTE (oracle)
|
||||||
DATA_TYPE_SPECIFIERS_ALLOWED = False
|
DATA_TYPE_SPECIFIERS_ALLOWED = False
|
||||||
|
|
||||||
# Whether or not conditions require booleans WHERE x = 0 vs WHERE x
|
# Whether conditions require booleans WHERE x = 0 vs WHERE x
|
||||||
ENSURE_BOOLS = False
|
ENSURE_BOOLS = False
|
||||||
|
|
||||||
# Whether or not the "RECURSIVE" keyword is required when defining recursive CTEs
|
# Whether the "RECURSIVE" keyword is required when defining recursive CTEs
|
||||||
CTE_RECURSIVE_KEYWORD_REQUIRED = True
|
CTE_RECURSIVE_KEYWORD_REQUIRED = True
|
||||||
|
|
||||||
# Whether or not CONCAT requires >1 arguments
|
# Whether CONCAT requires >1 arguments
|
||||||
SUPPORTS_SINGLE_ARG_CONCAT = True
|
SUPPORTS_SINGLE_ARG_CONCAT = True
|
||||||
|
|
||||||
# Whether or not LAST_DAY function supports a date part argument
|
# Whether LAST_DAY function supports a date part argument
|
||||||
LAST_DAY_SUPPORTS_DATE_PART = True
|
LAST_DAY_SUPPORTS_DATE_PART = True
|
||||||
|
|
||||||
# Whether or not named columns are allowed in table aliases
|
# Whether named columns are allowed in table aliases
|
||||||
SUPPORTS_TABLE_ALIAS_COLUMNS = True
|
SUPPORTS_TABLE_ALIAS_COLUMNS = True
|
||||||
|
|
||||||
# Whether or not UNPIVOT aliases are Identifiers (False means they're Literals)
|
# Whether UNPIVOT aliases are Identifiers (False means they're Literals)
|
||||||
UNPIVOT_ALIASES_ARE_IDENTIFIERS = True
|
UNPIVOT_ALIASES_ARE_IDENTIFIERS = True
|
||||||
|
|
||||||
# What delimiter to use for separating JSON key/value pairs
|
# What delimiter to use for separating JSON key/value pairs
|
||||||
|
@ -285,34 +291,37 @@ class Generator(metaclass=_Generator):
|
||||||
# INSERT OVERWRITE TABLE x override
|
# INSERT OVERWRITE TABLE x override
|
||||||
INSERT_OVERWRITE = " OVERWRITE TABLE"
|
INSERT_OVERWRITE = " OVERWRITE TABLE"
|
||||||
|
|
||||||
# Whether or not the SELECT .. INTO syntax is used instead of CTAS
|
# Whether the SELECT .. INTO syntax is used instead of CTAS
|
||||||
SUPPORTS_SELECT_INTO = False
|
SUPPORTS_SELECT_INTO = False
|
||||||
|
|
||||||
# Whether or not UNLOGGED tables can be created
|
# Whether UNLOGGED tables can be created
|
||||||
SUPPORTS_UNLOGGED_TABLES = False
|
SUPPORTS_UNLOGGED_TABLES = False
|
||||||
|
|
||||||
# Whether or not the CREATE TABLE LIKE statement is supported
|
# Whether the CREATE TABLE LIKE statement is supported
|
||||||
SUPPORTS_CREATE_TABLE_LIKE = True
|
SUPPORTS_CREATE_TABLE_LIKE = True
|
||||||
|
|
||||||
# Whether or not the LikeProperty needs to be specified inside of the schema clause
|
# Whether the LikeProperty needs to be specified inside of the schema clause
|
||||||
LIKE_PROPERTY_INSIDE_SCHEMA = False
|
LIKE_PROPERTY_INSIDE_SCHEMA = False
|
||||||
|
|
||||||
# Whether or not DISTINCT can be followed by multiple args in an AggFunc. If not, it will be
|
# Whether DISTINCT can be followed by multiple args in an AggFunc. If not, it will be
|
||||||
# transpiled into a series of CASE-WHEN-ELSE, ultimately using a tuple conseisting of the args
|
# transpiled into a series of CASE-WHEN-ELSE, ultimately using a tuple conseisting of the args
|
||||||
MULTI_ARG_DISTINCT = True
|
MULTI_ARG_DISTINCT = True
|
||||||
|
|
||||||
# Whether or not the JSON extraction operators expect a value of type JSON
|
# Whether the JSON extraction operators expect a value of type JSON
|
||||||
JSON_TYPE_REQUIRED_FOR_EXTRACTION = False
|
JSON_TYPE_REQUIRED_FOR_EXTRACTION = False
|
||||||
|
|
||||||
# Whether or not bracketed keys like ["foo"] are supported in JSON paths
|
# Whether bracketed keys like ["foo"] are supported in JSON paths
|
||||||
JSON_PATH_BRACKETED_KEY_SUPPORTED = True
|
JSON_PATH_BRACKETED_KEY_SUPPORTED = True
|
||||||
|
|
||||||
# Whether or not to escape keys using single quotes in JSON paths
|
# Whether to escape keys using single quotes in JSON paths
|
||||||
JSON_PATH_SINGLE_QUOTE_ESCAPE = False
|
JSON_PATH_SINGLE_QUOTE_ESCAPE = False
|
||||||
|
|
||||||
# The JSONPathPart expressions supported by this dialect
|
# The JSONPathPart expressions supported by this dialect
|
||||||
SUPPORTED_JSON_PATH_PARTS = ALL_JSON_PATH_PARTS.copy()
|
SUPPORTED_JSON_PATH_PARTS = ALL_JSON_PATH_PARTS.copy()
|
||||||
|
|
||||||
|
# Whether any(f(x) for x in array) can be implemented by this dialect
|
||||||
|
CAN_IMPLEMENT_ARRAY_ANY = False
|
||||||
|
|
||||||
TYPE_MAPPING = {
|
TYPE_MAPPING = {
|
||||||
exp.DataType.Type.NCHAR: "CHAR",
|
exp.DataType.Type.NCHAR: "CHAR",
|
||||||
exp.DataType.Type.NVARCHAR: "VARCHAR",
|
exp.DataType.Type.NVARCHAR: "VARCHAR",
|
||||||
|
@ -453,7 +462,7 @@ class Generator(metaclass=_Generator):
|
||||||
# Expressions that need to have all CTEs under them bubbled up to them
|
# Expressions that need to have all CTEs under them bubbled up to them
|
||||||
EXPRESSIONS_WITHOUT_NESTED_CTES: t.Set[t.Type[exp.Expression]] = set()
|
EXPRESSIONS_WITHOUT_NESTED_CTES: t.Set[t.Type[exp.Expression]] = set()
|
||||||
|
|
||||||
KEY_VALUE_DEFINITIONS = (exp.Bracket, exp.EQ, exp.PropertyEQ, exp.Slice)
|
KEY_VALUE_DEFINITIONS = (exp.EQ, exp.PropertyEQ, exp.Slice)
|
||||||
|
|
||||||
SENTINEL_LINE_BREAK = "__SQLGLOT__LB__"
|
SENTINEL_LINE_BREAK = "__SQLGLOT__LB__"
|
||||||
|
|
||||||
|
@ -524,7 +533,7 @@ class Generator(metaclass=_Generator):
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
expression: The syntax tree.
|
expression: The syntax tree.
|
||||||
copy: Whether or not to copy the expression. The generator performs mutations so
|
copy: Whether to copy the expression. The generator performs mutations so
|
||||||
it is safer to copy.
|
it is safer to copy.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
@ -3404,6 +3413,21 @@ class Generator(metaclass=_Generator):
|
||||||
|
|
||||||
return self.func("LAST_DAY", expression.this)
|
return self.func("LAST_DAY", expression.this)
|
||||||
|
|
||||||
|
def arrayany_sql(self, expression: exp.ArrayAny) -> str:
|
||||||
|
if self.CAN_IMPLEMENT_ARRAY_ANY:
|
||||||
|
filtered = exp.ArrayFilter(this=expression.this, expression=expression.expression)
|
||||||
|
filtered_not_empty = exp.ArraySize(this=filtered).neq(0)
|
||||||
|
original_is_empty = exp.ArraySize(this=expression.this).eq(0)
|
||||||
|
return self.sql(exp.paren(original_is_empty.or_(filtered_not_empty)))
|
||||||
|
|
||||||
|
from sqlglot.dialects import Dialect
|
||||||
|
|
||||||
|
# SQLGlot's executor supports ARRAY_ANY, so we don't wanna warn for the SQLGlot dialect
|
||||||
|
if self.dialect.__class__ != Dialect:
|
||||||
|
self.unsupported("ARRAY_ANY is unsupported")
|
||||||
|
|
||||||
|
return self.function_fallback_sql(expression)
|
||||||
|
|
||||||
def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str:
|
def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str:
|
||||||
this = expression.this
|
this = expression.this
|
||||||
if isinstance(this, exp.JSONPathWildcard):
|
if isinstance(this, exp.JSONPathWildcard):
|
||||||
|
|
|
@ -76,7 +76,7 @@ def normalized(expression: exp.Expression, dnf: bool = False) -> bool:
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
expression: The expression to check if it's normalized.
|
expression: The expression to check if it's normalized.
|
||||||
dnf: Whether or not to check if the expression is in Disjunctive Normal Form (DNF).
|
dnf: Whether to check if the expression is in Disjunctive Normal Form (DNF).
|
||||||
Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).
|
Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).
|
||||||
"""
|
"""
|
||||||
ancestor, root = (exp.And, exp.Or) if dnf else (exp.Or, exp.And)
|
ancestor, root = (exp.And, exp.Or) if dnf else (exp.Or, exp.And)
|
||||||
|
@ -99,7 +99,7 @@ def normalization_distance(expression: exp.Expression, dnf: bool = False) -> int
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
expression: The expression to compute the normalization distance for.
|
expression: The expression to compute the normalization distance for.
|
||||||
dnf: Whether or not to check if the expression is in Disjunctive Normal Form (DNF).
|
dnf: Whether to check if the expression is in Disjunctive Normal Form (DNF).
|
||||||
Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).
|
Default: False, i.e. we check if it's in Conjunctive Normal Form (CNF).
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
|
@ -48,15 +48,15 @@ def qualify(
|
||||||
db: Default database name for tables.
|
db: Default database name for tables.
|
||||||
catalog: Default catalog name for tables.
|
catalog: Default catalog name for tables.
|
||||||
schema: Schema to infer column names and types.
|
schema: Schema to infer column names and types.
|
||||||
expand_alias_refs: Whether or not to expand references to aliases.
|
expand_alias_refs: Whether to expand references to aliases.
|
||||||
expand_stars: Whether or not to expand star queries. This is a necessary step
|
expand_stars: Whether to expand star queries. This is a necessary step
|
||||||
for most of the optimizer's rules to work; do not set to False unless you
|
for most of the optimizer's rules to work; do not set to False unless you
|
||||||
know what you're doing!
|
know what you're doing!
|
||||||
infer_schema: Whether or not to infer the schema if missing.
|
infer_schema: Whether to infer the schema if missing.
|
||||||
isolate_tables: Whether or not to isolate table selects.
|
isolate_tables: Whether to isolate table selects.
|
||||||
qualify_columns: Whether or not to qualify columns.
|
qualify_columns: Whether to qualify columns.
|
||||||
validate_qualify_columns: Whether or not to validate columns.
|
validate_qualify_columns: Whether to validate columns.
|
||||||
quote_identifiers: Whether or not to run the quote_identifiers step.
|
quote_identifiers: Whether to run the quote_identifiers step.
|
||||||
This step is necessary to ensure correctness for case sensitive queries.
|
This step is necessary to ensure correctness for case sensitive queries.
|
||||||
But this flag is provided in case this step is performed at a later time.
|
But this flag is provided in case this step is performed at a later time.
|
||||||
identify: If True, quote all identifiers, else only necessary ones.
|
identify: If True, quote all identifiers, else only necessary ones.
|
||||||
|
|
|
@ -35,11 +35,11 @@ def qualify_columns(
|
||||||
Args:
|
Args:
|
||||||
expression: Expression to qualify.
|
expression: Expression to qualify.
|
||||||
schema: Database schema.
|
schema: Database schema.
|
||||||
expand_alias_refs: Whether or not to expand references to aliases.
|
expand_alias_refs: Whether to expand references to aliases.
|
||||||
expand_stars: Whether or not to expand star queries. This is a necessary step
|
expand_stars: Whether to expand star queries. This is a necessary step
|
||||||
for most of the optimizer's rules to work; do not set to False unless you
|
for most of the optimizer's rules to work; do not set to False unless you
|
||||||
know what you're doing!
|
know what you're doing!
|
||||||
infer_schema: Whether or not to infer the schema if missing.
|
infer_schema: Whether to infer the schema if missing.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The qualified expression.
|
The qualified expression.
|
||||||
|
@ -164,12 +164,7 @@ def _expand_using(scope: Scope, resolver: Resolver) -> t.Dict[str, t.Any]:
|
||||||
|
|
||||||
table = table or source_table
|
table = table or source_table
|
||||||
conditions.append(
|
conditions.append(
|
||||||
exp.condition(
|
exp.column(identifier, table=table).eq(exp.column(identifier, table=join_table))
|
||||||
exp.EQ(
|
|
||||||
this=exp.column(identifier, table=table),
|
|
||||||
expression=exp.column(identifier, table=join_table),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Set all values in the dict to None, because we only care about the key ordering
|
# Set all values in the dict to None, because we only care about the key ordering
|
||||||
|
@ -449,10 +444,9 @@ def _expand_stars(
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for name in columns:
|
for name in columns:
|
||||||
if name in using_column_tables and table in using_column_tables[name]:
|
if name in columns_to_exclude or name in coalesced_columns:
|
||||||
if name in coalesced_columns:
|
|
||||||
continue
|
continue
|
||||||
|
if name in using_column_tables and table in using_column_tables[name]:
|
||||||
coalesced_columns.add(name)
|
coalesced_columns.add(name)
|
||||||
tables = using_column_tables[name]
|
tables = using_column_tables[name]
|
||||||
coalesce = [exp.column(name, table=table) for table in tables]
|
coalesce = [exp.column(name, table=table) for table in tables]
|
||||||
|
@ -464,7 +458,7 @@ def _expand_stars(
|
||||||
copy=False,
|
copy=False,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif name not in columns_to_exclude:
|
else:
|
||||||
alias_ = replace_columns.get(table_id, {}).get(name, name)
|
alias_ = replace_columns.get(table_id, {}).get(name, name)
|
||||||
column = exp.column(name, table=table)
|
column = exp.column(name, table=table)
|
||||||
new_selections.append(
|
new_selections.append(
|
||||||
|
|
|
@ -254,7 +254,7 @@ class Scope:
|
||||||
self._columns = []
|
self._columns = []
|
||||||
for column in columns + external_columns:
|
for column in columns + external_columns:
|
||||||
ancestor = column.find_ancestor(
|
ancestor = column.find_ancestor(
|
||||||
exp.Select, exp.Qualify, exp.Order, exp.Having, exp.Hint, exp.Table
|
exp.Select, exp.Qualify, exp.Order, exp.Having, exp.Hint, exp.Table, exp.Star
|
||||||
)
|
)
|
||||||
if (
|
if (
|
||||||
not ancestor
|
not ancestor
|
||||||
|
|
|
@ -41,7 +41,7 @@ def simplify(
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
expression (sqlglot.Expression): expression to simplify
|
expression (sqlglot.Expression): expression to simplify
|
||||||
constant_propagation: whether or not the constant propagation rule should be used
|
constant_propagation: whether the constant propagation rule should be used
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
sqlglot.Expression: simplified expression
|
sqlglot.Expression: simplified expression
|
||||||
|
|
|
@ -248,7 +248,7 @@ def decorrelate(select, parent_select, external_columns, next_alias_name):
|
||||||
key.replace(exp.to_identifier("_x"))
|
key.replace(exp.to_identifier("_x"))
|
||||||
parent_predicate = _replace(
|
parent_predicate = _replace(
|
||||||
parent_predicate,
|
parent_predicate,
|
||||||
f'({parent_predicate} AND ARRAY_ANY({nested}, "_x" -> {predicate}))',
|
f"({parent_predicate} AND ARRAY_ANY({nested}, _x -> {predicate}))",
|
||||||
)
|
)
|
||||||
|
|
||||||
parent_select.join(
|
parent_select.join(
|
||||||
|
|
|
@ -18,7 +18,7 @@ if t.TYPE_CHECKING:
|
||||||
logger = logging.getLogger("sqlglot")
|
logger = logging.getLogger("sqlglot")
|
||||||
|
|
||||||
|
|
||||||
def parse_var_map(args: t.List) -> exp.StarMap | exp.VarMap:
|
def build_var_map(args: t.List) -> exp.StarMap | exp.VarMap:
|
||||||
if len(args) == 1 and args[0].is_star:
|
if len(args) == 1 and args[0].is_star:
|
||||||
return exp.StarMap(this=args[0])
|
return exp.StarMap(this=args[0])
|
||||||
|
|
||||||
|
@ -28,13 +28,10 @@ def parse_var_map(args: t.List) -> exp.StarMap | exp.VarMap:
|
||||||
keys.append(args[i])
|
keys.append(args[i])
|
||||||
values.append(args[i + 1])
|
values.append(args[i + 1])
|
||||||
|
|
||||||
return exp.VarMap(
|
return exp.VarMap(keys=exp.array(*keys, copy=False), values=exp.array(*values, copy=False))
|
||||||
keys=exp.array(*keys, copy=False),
|
|
||||||
values=exp.array(*values, copy=False),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def parse_like(args: t.List) -> exp.Escape | exp.Like:
|
def build_like(args: t.List) -> exp.Escape | exp.Like:
|
||||||
like = exp.Like(this=seq_get(args, 1), expression=seq_get(args, 0))
|
like = exp.Like(this=seq_get(args, 1), expression=seq_get(args, 0))
|
||||||
return exp.Escape(this=like, expression=seq_get(args, 2)) if len(args) > 2 else like
|
return exp.Escape(this=like, expression=seq_get(args, 2)) if len(args) > 2 else like
|
||||||
|
|
||||||
|
@ -47,7 +44,7 @@ def binary_range_parser(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def parse_logarithm(args: t.List, dialect: Dialect) -> exp.Func:
|
def build_logarithm(args: t.List, dialect: Dialect) -> exp.Func:
|
||||||
# Default argument order is base, expression
|
# Default argument order is base, expression
|
||||||
this = seq_get(args, 0)
|
this = seq_get(args, 0)
|
||||||
expression = seq_get(args, 1)
|
expression = seq_get(args, 1)
|
||||||
|
@ -60,8 +57,8 @@ def parse_logarithm(args: t.List, dialect: Dialect) -> exp.Func:
|
||||||
return (exp.Ln if dialect.parser_class.LOG_DEFAULTS_TO_LN else exp.Log)(this=this)
|
return (exp.Ln if dialect.parser_class.LOG_DEFAULTS_TO_LN else exp.Log)(this=this)
|
||||||
|
|
||||||
|
|
||||||
def parse_extract_json_with_path(expr_type: t.Type[E]) -> t.Callable[[t.List, Dialect], E]:
|
def build_extract_json_with_path(expr_type: t.Type[E]) -> t.Callable[[t.List, Dialect], E]:
|
||||||
def _parser(args: t.List, dialect: Dialect) -> E:
|
def _builder(args: t.List, dialect: Dialect) -> E:
|
||||||
expression = expr_type(
|
expression = expr_type(
|
||||||
this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1))
|
this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1))
|
||||||
)
|
)
|
||||||
|
@ -70,7 +67,7 @@ def parse_extract_json_with_path(expr_type: t.Type[E]) -> t.Callable[[t.List, Di
|
||||||
|
|
||||||
return expression
|
return expression
|
||||||
|
|
||||||
return _parser
|
return _builder
|
||||||
|
|
||||||
|
|
||||||
class _Parser(type):
|
class _Parser(type):
|
||||||
|
@ -90,8 +87,8 @@ class Parser(metaclass=_Parser):
|
||||||
Args:
|
Args:
|
||||||
error_level: The desired error level.
|
error_level: The desired error level.
|
||||||
Default: ErrorLevel.IMMEDIATE
|
Default: ErrorLevel.IMMEDIATE
|
||||||
error_message_context: Determines the amount of context to capture from a
|
error_message_context: The amount of context to capture from a query string when displaying
|
||||||
query string when displaying the error message (in number of characters).
|
the error message (in number of characters).
|
||||||
Default: 100
|
Default: 100
|
||||||
max_errors: Maximum number of error messages to include in a raised ParseError.
|
max_errors: Maximum number of error messages to include in a raised ParseError.
|
||||||
This is only relevant if error_level is ErrorLevel.RAISE.
|
This is only relevant if error_level is ErrorLevel.RAISE.
|
||||||
|
@ -115,11 +112,11 @@ class Parser(metaclass=_Parser):
|
||||||
to=exp.DataType(this=exp.DataType.Type.TEXT),
|
to=exp.DataType(this=exp.DataType.Type.TEXT),
|
||||||
),
|
),
|
||||||
"GLOB": lambda args: exp.Glob(this=seq_get(args, 1), expression=seq_get(args, 0)),
|
"GLOB": lambda args: exp.Glob(this=seq_get(args, 1), expression=seq_get(args, 0)),
|
||||||
"JSON_EXTRACT": parse_extract_json_with_path(exp.JSONExtract),
|
"JSON_EXTRACT": build_extract_json_with_path(exp.JSONExtract),
|
||||||
"JSON_EXTRACT_SCALAR": parse_extract_json_with_path(exp.JSONExtractScalar),
|
"JSON_EXTRACT_SCALAR": build_extract_json_with_path(exp.JSONExtractScalar),
|
||||||
"JSON_EXTRACT_PATH_TEXT": parse_extract_json_with_path(exp.JSONExtractScalar),
|
"JSON_EXTRACT_PATH_TEXT": build_extract_json_with_path(exp.JSONExtractScalar),
|
||||||
"LIKE": parse_like,
|
"LIKE": build_like,
|
||||||
"LOG": parse_logarithm,
|
"LOG": build_logarithm,
|
||||||
"TIME_TO_TIME_STR": lambda args: exp.Cast(
|
"TIME_TO_TIME_STR": lambda args: exp.Cast(
|
||||||
this=seq_get(args, 0),
|
this=seq_get(args, 0),
|
||||||
to=exp.DataType(this=exp.DataType.Type.TEXT),
|
to=exp.DataType(this=exp.DataType.Type.TEXT),
|
||||||
|
@ -132,7 +129,7 @@ class Parser(metaclass=_Parser):
|
||||||
start=exp.Literal.number(1),
|
start=exp.Literal.number(1),
|
||||||
length=exp.Literal.number(10),
|
length=exp.Literal.number(10),
|
||||||
),
|
),
|
||||||
"VAR_MAP": parse_var_map,
|
"VAR_MAP": build_var_map,
|
||||||
}
|
}
|
||||||
|
|
||||||
NO_PAREN_FUNCTIONS = {
|
NO_PAREN_FUNCTIONS = {
|
||||||
|
@ -292,6 +289,7 @@ class Parser(metaclass=_Parser):
|
||||||
TokenType.VIEW,
|
TokenType.VIEW,
|
||||||
TokenType.MODEL,
|
TokenType.MODEL,
|
||||||
TokenType.DICTIONARY,
|
TokenType.DICTIONARY,
|
||||||
|
TokenType.STORAGE_INTEGRATION,
|
||||||
}
|
}
|
||||||
|
|
||||||
CREATABLES = {
|
CREATABLES = {
|
||||||
|
@ -550,11 +548,13 @@ class Parser(metaclass=_Parser):
|
||||||
exp.JSONExtract,
|
exp.JSONExtract,
|
||||||
this=this,
|
this=this,
|
||||||
expression=self.dialect.to_json_path(path),
|
expression=self.dialect.to_json_path(path),
|
||||||
|
only_json_types=self.JSON_ARROWS_REQUIRE_JSON_TYPE,
|
||||||
),
|
),
|
||||||
TokenType.DARROW: lambda self, this, path: self.expression(
|
TokenType.DARROW: lambda self, this, path: self.expression(
|
||||||
exp.JSONExtractScalar,
|
exp.JSONExtractScalar,
|
||||||
this=this,
|
this=this,
|
||||||
expression=self.dialect.to_json_path(path),
|
expression=self.dialect.to_json_path(path),
|
||||||
|
only_json_types=self.JSON_ARROWS_REQUIRE_JSON_TYPE,
|
||||||
),
|
),
|
||||||
TokenType.HASH_ARROW: lambda self, this, path: self.expression(
|
TokenType.HASH_ARROW: lambda self, this, path: self.expression(
|
||||||
exp.JSONBExtract,
|
exp.JSONBExtract,
|
||||||
|
@ -983,28 +983,31 @@ class Parser(metaclass=_Parser):
|
||||||
|
|
||||||
LOG_DEFAULTS_TO_LN = False
|
LOG_DEFAULTS_TO_LN = False
|
||||||
|
|
||||||
# Whether or not ADD is present for each column added by ALTER TABLE
|
# Whether ADD is present for each column added by ALTER TABLE
|
||||||
ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN = True
|
ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN = True
|
||||||
|
|
||||||
# Whether or not the table sample clause expects CSV syntax
|
# Whether the table sample clause expects CSV syntax
|
||||||
TABLESAMPLE_CSV = False
|
TABLESAMPLE_CSV = False
|
||||||
|
|
||||||
# Whether or not the SET command needs a delimiter (e.g. "=") for assignments
|
# Whether the SET command needs a delimiter (e.g. "=") for assignments
|
||||||
SET_REQUIRES_ASSIGNMENT_DELIMITER = True
|
SET_REQUIRES_ASSIGNMENT_DELIMITER = True
|
||||||
|
|
||||||
# Whether the TRIM function expects the characters to trim as its first argument
|
# Whether the TRIM function expects the characters to trim as its first argument
|
||||||
TRIM_PATTERN_FIRST = False
|
TRIM_PATTERN_FIRST = False
|
||||||
|
|
||||||
# Whether or not string aliases are supported `SELECT COUNT(*) 'count'`
|
# Whether string aliases are supported `SELECT COUNT(*) 'count'`
|
||||||
STRING_ALIASES = False
|
STRING_ALIASES = False
|
||||||
|
|
||||||
# Whether query modifiers such as LIMIT are attached to the UNION node (vs its right operand)
|
# Whether query modifiers such as LIMIT are attached to the UNION node (vs its right operand)
|
||||||
MODIFIERS_ATTACHED_TO_UNION = True
|
MODIFIERS_ATTACHED_TO_UNION = True
|
||||||
UNION_MODIFIERS = {"order", "limit", "offset"}
|
UNION_MODIFIERS = {"order", "limit", "offset"}
|
||||||
|
|
||||||
# Parses no parenthesis if statements as commands
|
# Whether to parse IF statements that aren't followed by a left parenthesis as commands
|
||||||
NO_PAREN_IF_COMMANDS = True
|
NO_PAREN_IF_COMMANDS = True
|
||||||
|
|
||||||
|
# Whether the -> and ->> operators expect documents of type JSON (e.g. Postgres)
|
||||||
|
JSON_ARROWS_REQUIRE_JSON_TYPE = False
|
||||||
|
|
||||||
# Whether or not a VALUES keyword needs to be followed by '(' to form a VALUES clause.
|
# Whether or not a VALUES keyword needs to be followed by '(' to form a VALUES clause.
|
||||||
# If this is True and '(' is not found, the keyword will be treated as an identifier
|
# If this is True and '(' is not found, the keyword will be treated as an identifier
|
||||||
VALUES_FOLLOWED_BY_PAREN = True
|
VALUES_FOLLOWED_BY_PAREN = True
|
||||||
|
|
|
@ -92,7 +92,7 @@ class Schema(abc.ABC):
|
||||||
normalize: t.Optional[bool] = None,
|
normalize: t.Optional[bool] = None,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
"""
|
"""
|
||||||
Returns whether or not `column` appears in `table`'s schema.
|
Returns whether `column` appears in `table`'s schema.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
table: the source table.
|
table: the source table.
|
||||||
|
@ -115,7 +115,7 @@ class Schema(abc.ABC):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def empty(self) -> bool:
|
def empty(self) -> bool:
|
||||||
"""Returns whether or not the schema is empty."""
|
"""Returns whether the schema is empty."""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ class AbstractMappingSchema:
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
table: the target table.
|
table: the target table.
|
||||||
raise_on_missing: whether or not to raise in case the schema is not found.
|
raise_on_missing: whether to raise in case the schema is not found.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The schema of the target table.
|
The schema of the target table.
|
||||||
|
|
|
@ -346,6 +346,7 @@ class TokenType(AutoName):
|
||||||
SOME = auto()
|
SOME = auto()
|
||||||
SORT_BY = auto()
|
SORT_BY = auto()
|
||||||
START_WITH = auto()
|
START_WITH = auto()
|
||||||
|
STORAGE_INTEGRATION = auto()
|
||||||
STRUCT = auto()
|
STRUCT = auto()
|
||||||
TABLE_SAMPLE = auto()
|
TABLE_SAMPLE = auto()
|
||||||
TEMPORARY = auto()
|
TEMPORARY = auto()
|
||||||
|
@ -577,7 +578,7 @@ class Tokenizer(metaclass=_Tokenizer):
|
||||||
STRING_ESCAPES = ["'"]
|
STRING_ESCAPES = ["'"]
|
||||||
VAR_SINGLE_TOKENS: t.Set[str] = set()
|
VAR_SINGLE_TOKENS: t.Set[str] = set()
|
||||||
|
|
||||||
# Whether or not the heredoc tags follow the same lexical rules as unquoted identifiers
|
# Whether the heredoc tags follow the same lexical rules as unquoted identifiers
|
||||||
HEREDOC_TAG_IS_IDENTIFIER = False
|
HEREDOC_TAG_IS_IDENTIFIER = False
|
||||||
|
|
||||||
# Token that we'll generate as a fallback if the heredoc prefix doesn't correspond to a heredoc
|
# Token that we'll generate as a fallback if the heredoc prefix doesn't correspond to a heredoc
|
||||||
|
|
|
@ -18,88 +18,6 @@ class TestBigQuery(Validator):
|
||||||
maxDiff = None
|
maxDiff = None
|
||||||
|
|
||||||
def test_bigquery(self):
|
def test_bigquery(self):
|
||||||
with self.assertLogs(helper_logger) as cm:
|
|
||||||
statements = parse(
|
|
||||||
"""
|
|
||||||
BEGIN
|
|
||||||
DECLARE 1;
|
|
||||||
IF from_date IS NULL THEN SET x = 1;
|
|
||||||
END IF;
|
|
||||||
END
|
|
||||||
""",
|
|
||||||
read="bigquery",
|
|
||||||
)
|
|
||||||
self.assertIn("unsupported syntax", cm.output[0])
|
|
||||||
|
|
||||||
for actual, expected in zip(
|
|
||||||
statements, ("BEGIN DECLARE 1", "IF from_date IS NULL THEN SET x = 1", "END IF", "END")
|
|
||||||
):
|
|
||||||
self.assertEqual(actual.sql(dialect="bigquery"), expected)
|
|
||||||
|
|
||||||
with self.assertLogs(helper_logger) as cm:
|
|
||||||
self.validate_identity(
|
|
||||||
"SELECT * FROM t AS t(c1, c2)",
|
|
||||||
"SELECT * FROM t AS t",
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
cm.output, ["WARNING:sqlglot:Named columns are not supported in table alias."]
|
|
||||||
)
|
|
||||||
|
|
||||||
with self.assertLogs(helper_logger) as cm:
|
|
||||||
self.validate_all(
|
|
||||||
"SELECT a[1], b[OFFSET(1)], c[ORDINAL(1)], d[SAFE_OFFSET(1)], e[SAFE_ORDINAL(1)]",
|
|
||||||
write={
|
|
||||||
"duckdb": "SELECT a[2], b[2], c[1], d[2], e[1]",
|
|
||||||
"bigquery": "SELECT a[1], b[OFFSET(1)], c[ORDINAL(1)], d[SAFE_OFFSET(1)], e[SAFE_ORDINAL(1)]",
|
|
||||||
"presto": "SELECT a[2], b[2], c[1], ELEMENT_AT(d, 2), ELEMENT_AT(e, 1)",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
self.validate_all(
|
|
||||||
"a[0]",
|
|
||||||
read={
|
|
||||||
"bigquery": "a[0]",
|
|
||||||
"duckdb": "a[1]",
|
|
||||||
"presto": "a[1]",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
with self.assertRaises(TokenError):
|
|
||||||
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")
|
|
||||||
|
|
||||||
with self.assertRaises(ParseError):
|
|
||||||
transpile("DATE_ADD(x, day)", read="bigquery")
|
|
||||||
|
|
||||||
with self.assertLogs(parser_logger) as cm:
|
|
||||||
for_in_stmts = parse(
|
|
||||||
"FOR record IN (SELECT word FROM shakespeare) DO SELECT record.word; END FOR;",
|
|
||||||
read="bigquery",
|
|
||||||
)
|
|
||||||
self.assertEqual(
|
|
||||||
[s.sql(dialect="bigquery") for s in for_in_stmts],
|
|
||||||
["FOR record IN (SELECT word FROM shakespeare) DO SELECT record.word", "END FOR"],
|
|
||||||
)
|
|
||||||
assert "'END FOR'" in cm.output[0]
|
|
||||||
|
|
||||||
self.validate_identity("CREATE SCHEMA x DEFAULT COLLATE 'en'")
|
self.validate_identity("CREATE SCHEMA x DEFAULT COLLATE 'en'")
|
||||||
self.validate_identity("CREATE TABLE x (y INT64) DEFAULT COLLATE 'en'")
|
self.validate_identity("CREATE TABLE x (y INT64) DEFAULT COLLATE 'en'")
|
||||||
self.validate_identity("PARSE_JSON('{}', wide_number_mode => 'exact')")
|
self.validate_identity("PARSE_JSON('{}', wide_number_mode => 'exact')")
|
||||||
|
@ -1086,6 +1004,127 @@ WHERE
|
||||||
pretty=True,
|
pretty=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_errors(self):
|
||||||
|
with self.assertRaises(TokenError):
|
||||||
|
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")
|
||||||
|
|
||||||
|
with self.assertRaises(ParseError):
|
||||||
|
transpile("DATE_ADD(x, day)", read="bigquery")
|
||||||
|
|
||||||
|
def test_warnings(self):
|
||||||
|
with self.assertLogs(helper_logger) as cm:
|
||||||
|
self.validate_identity(
|
||||||
|
"WITH cte(c) AS (SELECT * FROM t) SELECT * FROM cte",
|
||||||
|
"WITH cte AS (SELECT * FROM t) SELECT * FROM cte",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIn("Can't push down CTE column names for star queries.", cm.output[0])
|
||||||
|
self.assertIn("Named columns are not supported in table alias.", cm.output[1])
|
||||||
|
|
||||||
|
with self.assertLogs(helper_logger) as cm:
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT * FROM t AS t(c1, c2)",
|
||||||
|
"SELECT * FROM t AS t",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIn("Named columns are not supported in table alias.", cm.output[0])
|
||||||
|
|
||||||
|
with self.assertLogs(helper_logger) as cm:
|
||||||
|
statements = parse(
|
||||||
|
"""
|
||||||
|
BEGIN
|
||||||
|
DECLARE 1;
|
||||||
|
IF from_date IS NULL THEN SET x = 1;
|
||||||
|
END IF;
|
||||||
|
END
|
||||||
|
""",
|
||||||
|
read="bigquery",
|
||||||
|
)
|
||||||
|
|
||||||
|
for actual, expected in zip(
|
||||||
|
statements,
|
||||||
|
("BEGIN DECLARE 1", "IF from_date IS NULL THEN SET x = 1", "END IF", "END"),
|
||||||
|
):
|
||||||
|
self.assertEqual(actual.sql(dialect="bigquery"), expected)
|
||||||
|
|
||||||
|
self.assertIn("unsupported syntax", cm.output[0])
|
||||||
|
|
||||||
|
with self.assertLogs(helper_logger) as cm:
|
||||||
|
statements = parse(
|
||||||
|
"""
|
||||||
|
BEGIN CALL `project_id.dataset_id.stored_procedure_id`();
|
||||||
|
EXCEPTION WHEN ERROR THEN INSERT INTO `project_id.dataset_id.table_id` SELECT @@error.message, CURRENT_TIMESTAMP();
|
||||||
|
END
|
||||||
|
""",
|
||||||
|
read="bigquery",
|
||||||
|
)
|
||||||
|
|
||||||
|
expected_statements = (
|
||||||
|
"BEGIN CALL `project_id.dataset_id.stored_procedure_id`()",
|
||||||
|
"EXCEPTION WHEN ERROR THEN INSERT INTO `project_id.dataset_id.table_id` SELECT @@error.message, CURRENT_TIMESTAMP()",
|
||||||
|
"END",
|
||||||
|
)
|
||||||
|
|
||||||
|
for actual, expected in zip(statements, expected_statements):
|
||||||
|
self.assertEqual(actual.sql(dialect="bigquery"), expected)
|
||||||
|
|
||||||
|
self.assertIn("unsupported syntax", cm.output[0])
|
||||||
|
|
||||||
|
with self.assertLogs(helper_logger) as cm:
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT * FROM t AS t(c1, c2)",
|
||||||
|
"SELECT * FROM t AS t",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIn("Named columns are not supported in table alias.", cm.output[0])
|
||||||
|
|
||||||
|
with self.assertLogs(helper_logger):
|
||||||
|
self.validate_all(
|
||||||
|
"SELECT a[1], b[OFFSET(1)], c[ORDINAL(1)], d[SAFE_OFFSET(1)], e[SAFE_ORDINAL(1)]",
|
||||||
|
write={
|
||||||
|
"duckdb": "SELECT a[2], b[2], c[1], d[2], e[1]",
|
||||||
|
"bigquery": "SELECT a[1], b[OFFSET(1)], c[ORDINAL(1)], d[SAFE_OFFSET(1)], e[SAFE_ORDINAL(1)]",
|
||||||
|
"presto": "SELECT a[2], b[2], c[1], ELEMENT_AT(d, 2), ELEMENT_AT(e, 1)",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
self.validate_all(
|
||||||
|
"a[0]",
|
||||||
|
read={
|
||||||
|
"bigquery": "a[0]",
|
||||||
|
"duckdb": "a[1]",
|
||||||
|
"presto": "a[1]",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertLogs(parser_logger) as cm:
|
||||||
|
for_in_stmts = parse(
|
||||||
|
"FOR record IN (SELECT word FROM shakespeare) DO SELECT record.word; END FOR;",
|
||||||
|
read="bigquery",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
[s.sql(dialect="bigquery") for s in for_in_stmts],
|
||||||
|
["FOR record IN (SELECT word FROM shakespeare) DO SELECT record.word", "END FOR"],
|
||||||
|
)
|
||||||
|
self.assertIn("'END FOR'", cm.output[0])
|
||||||
|
|
||||||
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;'"
|
||||||
|
|
|
@ -729,7 +729,7 @@ class TestDialect(Validator):
|
||||||
write={
|
write={
|
||||||
"duckdb": "TO_TIMESTAMP(x)",
|
"duckdb": "TO_TIMESTAMP(x)",
|
||||||
"hive": "FROM_UNIXTIME(x)",
|
"hive": "FROM_UNIXTIME(x)",
|
||||||
"oracle": "TO_DATE('1970-01-01','YYYY-MM-DD') + (x / 86400)",
|
"oracle": "TO_DATE('1970-01-01', 'YYYY-MM-DD') + (x / 86400)",
|
||||||
"postgres": "TO_TIMESTAMP(x)",
|
"postgres": "TO_TIMESTAMP(x)",
|
||||||
"presto": "FROM_UNIXTIME(x)",
|
"presto": "FROM_UNIXTIME(x)",
|
||||||
"starrocks": "FROM_UNIXTIME(x)",
|
"starrocks": "FROM_UNIXTIME(x)",
|
||||||
|
@ -2272,3 +2272,32 @@ SELECT
|
||||||
"tsql": "RAND()",
|
"tsql": "RAND()",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_array_any(self):
|
||||||
|
self.validate_all(
|
||||||
|
"ARRAY_ANY(arr, x -> pred)",
|
||||||
|
write={
|
||||||
|
"": "ARRAY_ANY(arr, x -> pred)",
|
||||||
|
"bigquery": "(ARRAY_LENGTH(arr) = 0 OR ARRAY_LENGTH(ARRAY(SELECT x FROM UNNEST(arr) AS x WHERE pred)) <> 0)",
|
||||||
|
"clickhouse": "(LENGTH(arr) = 0 OR LENGTH(arrayFilter(x -> pred, arr)) <> 0)",
|
||||||
|
"databricks": "(SIZE(arr) = 0 OR SIZE(FILTER(arr, x -> pred)) <> 0)",
|
||||||
|
"doris": UnsupportedError,
|
||||||
|
"drill": UnsupportedError,
|
||||||
|
"duckdb": "(ARRAY_LENGTH(arr) = 0 OR ARRAY_LENGTH(LIST_FILTER(arr, x -> pred)) <> 0)",
|
||||||
|
"hive": UnsupportedError,
|
||||||
|
"mysql": UnsupportedError,
|
||||||
|
"oracle": UnsupportedError,
|
||||||
|
"postgres": "(ARRAY_LENGTH(arr, 1) = 0 OR ARRAY_LENGTH(ARRAY(SELECT x FROM UNNEST(arr) AS _t(x) WHERE pred), 1) <> 0)",
|
||||||
|
"presto": "ANY_MATCH(arr, x -> pred)",
|
||||||
|
"redshift": UnsupportedError,
|
||||||
|
"snowflake": UnsupportedError,
|
||||||
|
"spark": "(SIZE(arr) = 0 OR SIZE(FILTER(arr, x -> pred)) <> 0)",
|
||||||
|
"spark2": "(SIZE(arr) = 0 OR SIZE(FILTER(arr, x -> pred)) <> 0)",
|
||||||
|
"sqlite": UnsupportedError,
|
||||||
|
"starrocks": UnsupportedError,
|
||||||
|
"tableau": UnsupportedError,
|
||||||
|
"teradata": "(CARDINALITY(arr) = 0 OR CARDINALITY(FILTER(arr, x -> pred)) <> 0)",
|
||||||
|
"trino": "ANY_MATCH(arr, x -> pred)",
|
||||||
|
"tsql": UnsupportedError,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
|
@ -290,15 +290,15 @@ class TestPostgres(Validator):
|
||||||
)
|
)
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"""'{"x": {"y": 1}}'::json->'x'->'y'""",
|
"""'{"x": {"y": 1}}'::json->'x'->'y'""",
|
||||||
"""JSON_EXTRACT_PATH(JSON_EXTRACT_PATH(CAST('{"x": {"y": 1}}' AS JSON), 'x'), 'y')""",
|
"""CAST('{"x": {"y": 1}}' AS JSON) -> 'x' -> 'y'""",
|
||||||
)
|
)
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"""'[1,2,3]'::json->>2""",
|
"""'[1,2,3]'::json->>2""",
|
||||||
"JSON_EXTRACT_PATH_TEXT(CAST('[1,2,3]' AS JSON), '2')",
|
"CAST('[1,2,3]' AS JSON) ->> 2",
|
||||||
)
|
)
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"""'{"a":1,"b":2}'::json->>'b'""",
|
"""'{"a":1,"b":2}'::json->>'b'""",
|
||||||
"""JSON_EXTRACT_PATH_TEXT(CAST('{"a":1,"b":2}' AS JSON), 'b')""",
|
"""CAST('{"a":1,"b":2}' AS JSON) ->> 'b'""",
|
||||||
)
|
)
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"""'{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}'""",
|
"""'{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}'""",
|
||||||
|
@ -310,11 +310,11 @@ class TestPostgres(Validator):
|
||||||
)
|
)
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"'[1,2,3]'::json->2",
|
"'[1,2,3]'::json->2",
|
||||||
"JSON_EXTRACT_PATH(CAST('[1,2,3]' AS JSON), '2')",
|
"CAST('[1,2,3]' AS JSON) -> 2",
|
||||||
)
|
)
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"""SELECT JSON_ARRAY_ELEMENTS((foo->'sections')::JSON) AS sections""",
|
"""SELECT JSON_ARRAY_ELEMENTS((foo->'sections')::JSON) AS sections""",
|
||||||
"""SELECT JSON_ARRAY_ELEMENTS(CAST((JSON_EXTRACT_PATH(foo, 'sections')) AS JSON)) AS sections""",
|
"""SELECT JSON_ARRAY_ELEMENTS(CAST((foo -> 'sections') AS JSON)) AS sections""",
|
||||||
)
|
)
|
||||||
self.validate_identity(
|
self.validate_identity(
|
||||||
"MERGE INTO x USING (SELECT id) AS y ON a = b WHEN MATCHED THEN UPDATE SET x.a = y.b WHEN NOT MATCHED THEN INSERT (a, b) VALUES (y.a, y.b)",
|
"MERGE INTO x USING (SELECT id) AS y ON a = b WHEN MATCHED THEN UPDATE SET x.a = y.b WHEN NOT MATCHED THEN INSERT (a, b) VALUES (y.a, y.b)",
|
||||||
|
@ -357,12 +357,13 @@ class TestPostgres(Validator):
|
||||||
"x -> 'y' -> 0 -> 'z'",
|
"x -> 'y' -> 0 -> 'z'",
|
||||||
write={
|
write={
|
||||||
"": "JSON_EXTRACT(JSON_EXTRACT(JSON_EXTRACT(x, '$.y'), '$[0]'), '$.z')",
|
"": "JSON_EXTRACT(JSON_EXTRACT(JSON_EXTRACT(x, '$.y'), '$[0]'), '$.z')",
|
||||||
"postgres": "JSON_EXTRACT_PATH(JSON_EXTRACT_PATH(JSON_EXTRACT_PATH(x, 'y'), '0'), 'z')",
|
"postgres": "x -> 'y' -> 0 -> 'z'",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"""JSON_EXTRACT_PATH('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4')""",
|
"""JSON_EXTRACT_PATH('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4')""",
|
||||||
write={
|
write={
|
||||||
|
"": """JSON_EXTRACT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', '$.f4')""",
|
||||||
"bigquery": """JSON_EXTRACT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', '$.f4')""",
|
"bigquery": """JSON_EXTRACT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', '$.f4')""",
|
||||||
"duckdb": """'{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}' -> '$.f4'""",
|
"duckdb": """'{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}' -> '$.f4'""",
|
||||||
"mysql": """JSON_EXTRACT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', '$.f4')""",
|
"mysql": """JSON_EXTRACT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', '$.f4')""",
|
||||||
|
@ -580,7 +581,7 @@ class TestPostgres(Validator):
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"""'{"a":1,"b":2}'::json->'b'""",
|
"""'{"a":1,"b":2}'::json->'b'""",
|
||||||
write={
|
write={
|
||||||
"postgres": """JSON_EXTRACT_PATH(CAST('{"a":1,"b":2}' AS JSON), 'b')""",
|
"postgres": """CAST('{"a":1,"b":2}' AS JSON) -> 'b'""",
|
||||||
"redshift": """JSON_EXTRACT_PATH_TEXT('{"a":1,"b":2}', 'b')""",
|
"redshift": """JSON_EXTRACT_PATH_TEXT('{"a":1,"b":2}', 'b')""",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -594,9 +594,9 @@ WHERE
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"SELECT TO_TIMESTAMP(16599817290000, 4)",
|
"SELECT TO_TIMESTAMP(16599817290000, 4)",
|
||||||
write={
|
write={
|
||||||
"bigquery": "SELECT TIMESTAMP_SECONDS(CAST(16599817290000 / POW(10, 4) AS INT64))",
|
"bigquery": "SELECT TIMESTAMP_SECONDS(CAST(16599817290000 / POWER(10, 4) AS INT64))",
|
||||||
"snowflake": "SELECT TO_TIMESTAMP(16599817290000, 4)",
|
"snowflake": "SELECT TO_TIMESTAMP(16599817290000, 4)",
|
||||||
"spark": "SELECT TIMESTAMP_SECONDS(16599817290000 / POW(10, 4))",
|
"spark": "SELECT TIMESTAMP_SECONDS(16599817290000 / POWER(10, 4))",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
|
@ -609,11 +609,11 @@ WHERE
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"SELECT TO_TIMESTAMP(1659981729000000000, 9)",
|
"SELECT TO_TIMESTAMP(1659981729000000000, 9)",
|
||||||
write={
|
write={
|
||||||
"bigquery": "SELECT TIMESTAMP_SECONDS(CAST(1659981729000000000 / POW(10, 9) AS INT64))",
|
"bigquery": "SELECT TIMESTAMP_SECONDS(CAST(1659981729000000000 / POWER(10, 9) AS INT64))",
|
||||||
"duckdb": "SELECT TO_TIMESTAMP(1659981729000000000 / POW(10, 9))",
|
"duckdb": "SELECT TO_TIMESTAMP(1659981729000000000 / POWER(10, 9))",
|
||||||
"presto": "SELECT FROM_UNIXTIME(CAST(1659981729000000000 AS DOUBLE) / POW(10, 9))",
|
"presto": "SELECT FROM_UNIXTIME(CAST(1659981729000000000 AS DOUBLE) / POW(10, 9))",
|
||||||
"snowflake": "SELECT TO_TIMESTAMP(1659981729000000000, 9)",
|
"snowflake": "SELECT TO_TIMESTAMP(1659981729000000000, 9)",
|
||||||
"spark": "SELECT TIMESTAMP_SECONDS(1659981729000000000 / POW(10, 9))",
|
"spark": "SELECT TIMESTAMP_SECONDS(1659981729000000000 / POWER(10, 9))",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
|
@ -1548,6 +1548,17 @@ MATCH_RECOGNIZE (
|
||||||
self.assertTrue(isinstance(users_exp, exp.Show))
|
self.assertTrue(isinstance(users_exp, exp.Show))
|
||||||
self.assertEqual(users_exp.this, "USERS")
|
self.assertEqual(users_exp.this, "USERS")
|
||||||
|
|
||||||
|
def test_storage_integration(self):
|
||||||
|
self.validate_identity(
|
||||||
|
"""CREATE STORAGE INTEGRATION s3_int
|
||||||
|
TYPE=EXTERNAL_STAGE
|
||||||
|
STORAGE_PROVIDER='S3'
|
||||||
|
STORAGE_AWS_ROLE_ARN='arn:aws:iam::001234567890:role/myrole'
|
||||||
|
ENABLED=TRUE
|
||||||
|
STORAGE_ALLOWED_LOCATIONS=('s3://mybucket1/path1/', 's3://mybucket2/path2/')""",
|
||||||
|
pretty=True,
|
||||||
|
)
|
||||||
|
|
||||||
def test_swap(self):
|
def test_swap(self):
|
||||||
ast = parse_one("ALTER TABLE a SWAP WITH b", read="snowflake")
|
ast = parse_one("ALTER TABLE a SWAP WITH b", read="snowflake")
|
||||||
assert isinstance(ast, exp.AlterTable)
|
assert isinstance(ast, exp.AlterTable)
|
||||||
|
|
|
@ -920,28 +920,48 @@ WHERE
|
||||||
self.assertEqual(expr.sql(dialect="tsql"), expected_sql)
|
self.assertEqual(expr.sql(dialect="tsql"), expected_sql)
|
||||||
|
|
||||||
def test_charindex(self):
|
def test_charindex(self):
|
||||||
|
self.validate_identity(
|
||||||
|
"SELECT CAST(SUBSTRING('ABCD~1234', CHARINDEX('~', 'ABCD~1234') + 1, LEN('ABCD~1234')) AS BIGINT)"
|
||||||
|
)
|
||||||
|
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"CHARINDEX(x, y, 9)",
|
"CHARINDEX(x, y, 9)",
|
||||||
|
read={
|
||||||
|
"spark": "LOCATE(x, y, 9)",
|
||||||
|
},
|
||||||
write={
|
write={
|
||||||
"spark": "LOCATE(x, y, 9)",
|
"spark": "LOCATE(x, y, 9)",
|
||||||
|
"tsql": "CHARINDEX(x, y, 9)",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"CHARINDEX(x, y)",
|
"CHARINDEX(x, y)",
|
||||||
|
read={
|
||||||
|
"spark": "LOCATE(x, y)",
|
||||||
|
},
|
||||||
write={
|
write={
|
||||||
"spark": "LOCATE(x, y)",
|
"spark": "LOCATE(x, y)",
|
||||||
|
"tsql": "CHARINDEX(x, y)",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"CHARINDEX('sub', 'testsubstring', 3)",
|
"CHARINDEX('sub', 'testsubstring', 3)",
|
||||||
|
read={
|
||||||
|
"spark": "LOCATE('sub', 'testsubstring', 3)",
|
||||||
|
},
|
||||||
write={
|
write={
|
||||||
"spark": "LOCATE('sub', 'testsubstring', 3)",
|
"spark": "LOCATE('sub', 'testsubstring', 3)",
|
||||||
|
"tsql": "CHARINDEX('sub', 'testsubstring', 3)",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
self.validate_all(
|
self.validate_all(
|
||||||
"CHARINDEX('sub', 'testsubstring')",
|
"CHARINDEX('sub', 'testsubstring')",
|
||||||
|
read={
|
||||||
|
"spark": "LOCATE('sub', 'testsubstring')",
|
||||||
|
},
|
||||||
write={
|
write={
|
||||||
"spark": "LOCATE('sub', 'testsubstring')",
|
"spark": "LOCATE('sub', 'testsubstring')",
|
||||||
|
"tsql": "CHARINDEX('sub', 'testsubstring')",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
76
tests/fixtures/optimizer/optimizer.sql
vendored
76
tests/fixtures/optimizer/optimizer.sql
vendored
|
@ -1311,3 +1311,79 @@ LEFT JOIN "_u_0" AS "_u_0"
|
||||||
ON "C"."EMAIL_DOMAIN" = "_u_0"."DOMAIN"
|
ON "C"."EMAIL_DOMAIN" = "_u_0"."DOMAIN"
|
||||||
WHERE
|
WHERE
|
||||||
NOT "_u_0"."DOMAIN" IS NULL;
|
NOT "_u_0"."DOMAIN" IS NULL;
|
||||||
|
|
||||||
|
# title: decorrelate subquery and transpile ArrayAny correctly when generating spark
|
||||||
|
# execute: false
|
||||||
|
# dialect: spark
|
||||||
|
SELECT
|
||||||
|
COUNT(DISTINCT cs1.cs_order_number) AS `order count`,
|
||||||
|
SUM(cs1.cs_ext_ship_cost) AS `total shipping cost`,
|
||||||
|
SUM(cs1.cs_net_profit) AS `total net profit`
|
||||||
|
FROM catalog_sales cs1, date_dim, customer_address, call_center
|
||||||
|
WHERE
|
||||||
|
date_dim.d_date BETWEEN '2002-02-01' AND (CAST('2002-02-01' AS DATE) + INTERVAL 60 days)
|
||||||
|
AND cs1.cs_ship_date_sk = date_dim.d_date_sk
|
||||||
|
AND cs1.cs_ship_addr_sk = customer_address.ca_address_sk
|
||||||
|
AND customer_address.ca_state = 'GA'
|
||||||
|
AND cs1.cs_call_center_sk = call_center.cc_call_center_sk
|
||||||
|
AND call_center.cc_county IN (
|
||||||
|
'Williamson County', 'Williamson County', 'Williamson County', 'Williamson County', 'Williamson County'
|
||||||
|
)
|
||||||
|
AND EXISTS(
|
||||||
|
SELECT *
|
||||||
|
FROM catalog_sales cs2
|
||||||
|
WHERE cs1.cs_order_number = cs2.cs_order_number
|
||||||
|
AND cs1.cs_warehouse_sk <> cs2.cs_warehouse_sk)
|
||||||
|
AND NOT EXISTS(
|
||||||
|
SELECT *
|
||||||
|
FROM catalog_returns cr1
|
||||||
|
WHERE cs1.cs_order_number = cr1.cr_order_number
|
||||||
|
)
|
||||||
|
ORDER BY COUNT(DISTINCT cs1.cs_order_number
|
||||||
|
)
|
||||||
|
LIMIT 100;
|
||||||
|
WITH `_u_0` AS (
|
||||||
|
SELECT
|
||||||
|
`cs2`.`cs_order_number` AS `_u_1`,
|
||||||
|
COLLECT_LIST(`cs2`.`cs_warehouse_sk`) AS `_u_2`
|
||||||
|
FROM `catalog_sales` AS `cs2`
|
||||||
|
GROUP BY
|
||||||
|
`cs2`.`cs_order_number`
|
||||||
|
), `_u_3` AS (
|
||||||
|
SELECT
|
||||||
|
`cr1`.`cr_order_number` AS `_u_4`
|
||||||
|
FROM `catalog_returns` AS `cr1`
|
||||||
|
GROUP BY
|
||||||
|
`cr1`.`cr_order_number`
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
COUNT(DISTINCT `cs1`.`cs_order_number`) AS `order count`,
|
||||||
|
SUM(`cs1`.`cs_ext_ship_cost`) AS `total shipping cost`,
|
||||||
|
SUM(`cs1`.`cs_net_profit`) AS `total net profit`
|
||||||
|
FROM `catalog_sales` AS `cs1`
|
||||||
|
LEFT JOIN `_u_0` AS `_u_0`
|
||||||
|
ON `_u_0`.`_u_1` = `cs1`.`cs_order_number`
|
||||||
|
LEFT JOIN `_u_3` AS `_u_3`
|
||||||
|
ON `_u_3`.`_u_4` = `cs1`.`cs_order_number`
|
||||||
|
JOIN `call_center` AS `call_center`
|
||||||
|
ON `call_center`.`cc_call_center_sk` = `cs1`.`cs_call_center_sk`
|
||||||
|
AND `call_center`.`cc_county` IN ('Williamson County', 'Williamson County', 'Williamson County', 'Williamson County', 'Williamson County')
|
||||||
|
JOIN `customer_address` AS `customer_address`
|
||||||
|
ON `cs1`.`cs_ship_addr_sk` = `customer_address`.`ca_address_sk`
|
||||||
|
AND `customer_address`.`ca_state` = 'GA'
|
||||||
|
JOIN `date_dim` AS `date_dim`
|
||||||
|
ON `cs1`.`cs_ship_date_sk` = `date_dim`.`d_date_sk`
|
||||||
|
AND `date_dim`.`d_date` <= (
|
||||||
|
CAST(CAST('2002-02-01' AS DATE) AS TIMESTAMP) + INTERVAL '60' DAYS
|
||||||
|
)
|
||||||
|
AND `date_dim`.`d_date` >= '2002-02-01'
|
||||||
|
WHERE
|
||||||
|
`_u_3`.`_u_4` IS NULL
|
||||||
|
AND NOT `_u_0`.`_u_1` IS NULL
|
||||||
|
AND (
|
||||||
|
SIZE(`_u_0`.`_u_2`) = 0
|
||||||
|
OR SIZE(FILTER(`_u_0`.`_u_2`, `_x` -> `cs1`.`cs_warehouse_sk` <> `_x`)) <> 0
|
||||||
|
)
|
||||||
|
ORDER BY
|
||||||
|
COUNT(DISTINCT `cs1`.`cs_order_number`)
|
||||||
|
LIMIT 100;
|
||||||
|
|
9
tests/fixtures/optimizer/qualify_columns.sql
vendored
9
tests/fixtures/optimizer/qualify_columns.sql
vendored
|
@ -354,10 +354,17 @@ SELECT x.b AS b, y.b AS b, y.c AS c FROM x AS x, y AS y;
|
||||||
SELECT * EXCEPT(a) FROM x;
|
SELECT * EXCEPT(a) FROM x;
|
||||||
SELECT x.b AS b FROM x AS x;
|
SELECT x.b AS b FROM x AS x;
|
||||||
|
|
||||||
|
# execute: false
|
||||||
|
SELECT * EXCEPT(x.a) FROM x AS x;
|
||||||
|
SELECT x.b AS b FROM x AS x;
|
||||||
|
|
||||||
# execute: false
|
# execute: false
|
||||||
# note: this query would fail in the engine level because there are 0 selected columns
|
# note: this query would fail in the engine level because there are 0 selected columns
|
||||||
SELECT * EXCEPT (a, b) FROM x;
|
SELECT * EXCEPT (a, b) FROM x;
|
||||||
SELECT * EXCEPT (x.a, x.b) FROM x AS x;
|
SELECT * EXCEPT (a, b) FROM x AS x;
|
||||||
|
|
||||||
|
SELECT x.a, * EXCEPT (a) FROM x AS x LEFT JOIN x AS y USING (a);
|
||||||
|
SELECT x.a AS a, x.b AS b, y.b AS b FROM x AS x LEFT JOIN x AS y ON x.a = y.a;
|
||||||
|
|
||||||
SELECT COALESCE(CAST(t1.a AS VARCHAR), '') AS a, t2.* EXCEPT (a) FROM x AS t1, x AS t2;
|
SELECT COALESCE(CAST(t1.a AS VARCHAR), '') AS a, t2.* EXCEPT (a) FROM x AS t1, x AS t2;
|
||||||
SELECT COALESCE(CAST(t1.a AS VARCHAR), '') AS a, t2.b AS b FROM x AS t1, x AS t2;
|
SELECT COALESCE(CAST(t1.a AS VARCHAR), '') AS a, t2.b AS b FROM x AS t1, x AS t2;
|
||||||
|
|
BIN
tests/fixtures/optimizer/tpc-ds/call_center.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/call_center.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/customer.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/customer.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/income_band.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/income_band.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/inventory.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/inventory.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/item.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/item.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/promotion.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/promotion.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/reason.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/reason.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/store.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/store.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/web_page.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/web_page.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/optimizer/tpc-ds/web_site.csv.gz
vendored
Normal file
BIN
tests/fixtures/optimizer/tpc-ds/web_site.csv.gz
vendored
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue