Merging upstream version 23.10.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
6cbc5d6f97
commit
49aa147013
91 changed files with 52881 additions and 50396 deletions
145
.github/workflows/python-publish.yml
vendored
145
.github/workflows/python-publish.yml
vendored
|
@ -9,6 +9,78 @@ permissions:
|
|||
contents: read
|
||||
|
||||
jobs:
|
||||
build-rs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [linux, macos, windows]
|
||||
target: [x86_64, aarch64]
|
||||
include:
|
||||
- os: linux
|
||||
target: i686
|
||||
- os: linux
|
||||
target: armv7
|
||||
- os: linux
|
||||
target: s390x
|
||||
- os: linux
|
||||
target: ppc64le
|
||||
- os: windows
|
||||
target: i686
|
||||
python-architecture: x86
|
||||
exclude:
|
||||
- os: windows
|
||||
target: aarch64
|
||||
runs-on: ${{ (matrix.os == 'linux' && 'ubuntu') || matrix.os }}-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
architecture: ${{ matrix.python-architecture || 'x64' }}
|
||||
- name: Build wheels
|
||||
uses: PyO3/maturin-action@v1
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
args: --release --out dist --interpreter 3.7 3.8 3.9 3.10 3.11 3.12
|
||||
sccache: 'true'
|
||||
manylinux: auto
|
||||
working-directory: ./sqlglotrs
|
||||
- name: Upload wheels
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: wheels
|
||||
path: sqlglotrs/dist
|
||||
|
||||
sdist-rs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build sdist
|
||||
uses: PyO3/maturin-action@v1
|
||||
with:
|
||||
command: sdist
|
||||
args: --out dist
|
||||
working-directory: ./sqlglotrs
|
||||
- name: Upload sdist
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: wheels
|
||||
path: sqlglotrs/dist
|
||||
|
||||
deploy-rs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-rs, sdist-rs]
|
||||
steps:
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: wheels
|
||||
- name: Publish to PyPI
|
||||
uses: PyO3/maturin-action@v1
|
||||
env:
|
||||
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
||||
with:
|
||||
command: upload
|
||||
args: --non-interactive --skip-existing *
|
||||
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
|
@ -50,76 +122,3 @@ jobs:
|
|||
branch: main
|
||||
commit_message: 'docs: update API docs, CHANGELOG.md for ${{ github.ref_name }} [skip ci]'
|
||||
file_pattern: 'docs CHANGELOG.md'
|
||||
build-rs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [linux, macos, windows]
|
||||
target: [x86_64, aarch64]
|
||||
include:
|
||||
- os: linux
|
||||
target: i686
|
||||
- os: linux
|
||||
target: armv7
|
||||
- os: linux
|
||||
target: s390x
|
||||
- os: linux
|
||||
target: ppc64le
|
||||
- os: windows
|
||||
target: i686
|
||||
python-architecture: x86
|
||||
exclude:
|
||||
- os: windows
|
||||
target: aarch64
|
||||
runs-on: ${{ (matrix.os == 'linux' && 'ubuntu') || matrix.os }}-latest
|
||||
needs: [deploy]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
architecture: ${{ matrix.python-architecture || 'x64' }}
|
||||
- name: Build wheels
|
||||
uses: PyO3/maturin-action@v1
|
||||
with:
|
||||
target: ${{ matrix.target }}
|
||||
args: --release --out dist --interpreter 3.7 3.8 3.9 3.10 3.11 3.12
|
||||
sccache: 'true'
|
||||
manylinux: auto
|
||||
working-directory: ./sqlglotrs
|
||||
- name: Upload wheels
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: wheels
|
||||
path: sqlglotrs/dist
|
||||
|
||||
sdist-rs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [deploy]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build sdist
|
||||
uses: PyO3/maturin-action@v1
|
||||
with:
|
||||
command: sdist
|
||||
args: --out dist
|
||||
working-directory: ./sqlglotrs
|
||||
- name: Upload sdist
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: wheels
|
||||
path: sqlglotrs/dist
|
||||
|
||||
deploy-rs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-rs, sdist-rs]
|
||||
steps:
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: wheels
|
||||
- name: Publish to PyPI
|
||||
uses: PyO3/maturin-action@v1
|
||||
env:
|
||||
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
||||
with:
|
||||
command: upload
|
||||
args: --non-interactive --skip-existing *
|
||||
|
|
99
CHANGELOG.md
99
CHANGELOG.md
|
@ -1,6 +1,100 @@
|
|||
Changelog
|
||||
=========
|
||||
|
||||
## [v23.9.0] - 2024-04-12
|
||||
### :boom: BREAKING CHANGES
|
||||
- due to [`32cdc36`](https://github.com/tobymao/sqlglot/commit/32cdc3635b22e3e5d0cd5caf5a6ad171ca7c34fb) - allow unions to be limited directly and stop subquerying since… *(PR [#3301](https://github.com/tobymao/sqlglot/pull/3301) by [@tobymao](https://github.com/tobymao))*:
|
||||
|
||||
allow unions to be limited directly and stop subquerying since… (#3301)
|
||||
|
||||
- due to [`3c97d34`](https://github.com/tobymao/sqlglot/commit/3c97d3437ea573fd3764eab05ed619353fced580) - parse right-hand side of <value> IN (<query>) as a Subquery *(PR [#3304](https://github.com/tobymao/sqlglot/pull/3304) by [@georgesittas](https://github.com/georgesittas))*:
|
||||
|
||||
parse right-hand side of <value> IN (<query>) as a Subquery (#3304)
|
||||
|
||||
- due to [`75e0c69`](https://github.com/tobymao/sqlglot/commit/75e0c69e33922168fcadb4e457ae93815bf533e1) - cast less aggressively *(PR [#3302](https://github.com/tobymao/sqlglot/pull/3302) by [@georgesittas](https://github.com/georgesittas))*:
|
||||
|
||||
cast less aggressively (#3302)
|
||||
|
||||
|
||||
### :sparkles: New Features
|
||||
- [`a721923`](https://github.com/tobymao/sqlglot/commit/a72192306c8fad6253ad9a03661edcfaa15757c7) - **prql**: Add support for SORT *(PR [#3297](https://github.com/tobymao/sqlglot/pull/3297) by [@fool1280](https://github.com/fool1280))*
|
||||
- [`2ea438b`](https://github.com/tobymao/sqlglot/commit/2ea438b89f76a357390d657fe3f9e01d2a79e7e4) - is_negative helper method *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
- [`b28cd89`](https://github.com/tobymao/sqlglot/commit/b28cd89823a38f3a90c57344a44719364d66d723) - improve transpilation of datetime functions to Teradata *(PR [#3295](https://github.com/tobymao/sqlglot/pull/3295) by [@maureen-daum](https://github.com/maureen-daum))*
|
||||
- [`32cdc36`](https://github.com/tobymao/sqlglot/commit/32cdc3635b22e3e5d0cd5caf5a6ad171ca7c34fb) - allow unions to be limited directly and stop subquerying since… *(PR [#3301](https://github.com/tobymao/sqlglot/pull/3301) by [@tobymao](https://github.com/tobymao))*
|
||||
- :arrow_lower_right: *addresses issue [#3300](https://github.com/tobymao/sqlglot/issues/3300) opened by [@williaster](https://github.com/williaster)*
|
||||
- [`1bc51df`](https://github.com/tobymao/sqlglot/commit/1bc51dfa9d8fd5d7dbea42d3d55aa1db66776ce5) - **teradata**: handle transpile of quarter function *(PR [#3303](https://github.com/tobymao/sqlglot/pull/3303) by [@maureen-daum](https://github.com/maureen-daum))*
|
||||
- [`4790414`](https://github.com/tobymao/sqlglot/commit/4790414b887b347cb94d810eeb3fe4713970984e) - **prql**: Handle DESC with sort *(PR [#3299](https://github.com/tobymao/sqlglot/pull/3299) by [@fool1280](https://github.com/fool1280))*
|
||||
|
||||
### :bug: Bug Fixes
|
||||
- [`3c97d34`](https://github.com/tobymao/sqlglot/commit/3c97d3437ea573fd3764eab05ed619353fced580) - parse right-hand side of <value> IN (<query>) as a Subquery *(PR [#3304](https://github.com/tobymao/sqlglot/pull/3304) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- [`75e0c69`](https://github.com/tobymao/sqlglot/commit/75e0c69e33922168fcadb4e457ae93815bf533e1) - cast less aggressively *(PR [#3302](https://github.com/tobymao/sqlglot/pull/3302) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- [`d3472c6`](https://github.com/tobymao/sqlglot/commit/d3472c664fdfb7c9cfa9a54c6b0491b605cf4913) - Add postgres transpilation for TIME_TO_UNIX *(PR [#3305](https://github.com/tobymao/sqlglot/pull/3305) by [@crericha](https://github.com/crericha))*
|
||||
- [`2224881`](https://github.com/tobymao/sqlglot/commit/2224881ed378abe075ebcd3bfbc3eee901f89d71) - case when / if should ignore null types *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
- [`5b2feb7`](https://github.com/tobymao/sqlglot/commit/5b2feb760ecd4c8ee64f8c464518e7e874f9b9bb) - allow unnesting to bring struct fields into scope *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
|
||||
### :wrench: Chores
|
||||
- [`b523bb6`](https://github.com/tobymao/sqlglot/commit/b523bb630b28866ebab581d43e99f0b2b821ec12) - cleanup teradata to simplify first *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
- [`6f73186`](https://github.com/tobymao/sqlglot/commit/6f73186681e8eb9f100a1fe4104c82cbae9d0f61) - refactor to use inline lambda *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
- [`6b21bba`](https://github.com/tobymao/sqlglot/commit/6b21bba378e411797a57d3de8bd06d3efb6afa8c) - make test runnable *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
|
||||
|
||||
## [v23.8.2] - 2024-04-10
|
||||
### :sparkles: New Features
|
||||
- [`eabb708`](https://github.com/tobymao/sqlglot/commit/eabb708db9ce7255f947542d57c31a6c93103985) - **prql**: add filter, set operations *(PR [#3291](https://github.com/tobymao/sqlglot/pull/3291) by [@fool1280](https://github.com/fool1280))*
|
||||
|
||||
### :bug: Bug Fixes
|
||||
- [`94c188d`](https://github.com/tobymao/sqlglot/commit/94c188d4920fd03e978253ed98711de259d6acb2) - **optimizer**: propagate recursive CTE source to children scopes early *(PR [#3294](https://github.com/tobymao/sqlglot/pull/3294) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- [`281db61`](https://github.com/tobymao/sqlglot/commit/281db61009ee01d10690dcc1f2039062b2a1a58c) - replace fully qualified columns with generated table aliases since they become invalid *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
|
||||
|
||||
## [v23.8.1] - 2024-04-09
|
||||
### :sparkles: New Features
|
||||
- [`942856d`](https://github.com/tobymao/sqlglot/commit/942856d1bdae43b13114a15a66c84467a0f90e75) - **postgres**: add COMMENT ON MATERIALIZED VIEW *(PR [#3293](https://github.com/tobymao/sqlglot/pull/3293) by [@l-vincent-l](https://github.com/l-vincent-l))*
|
||||
|
||||
### :bug: Bug Fixes
|
||||
- [`fd24b27`](https://github.com/tobymao/sqlglot/commit/fd24b2779fa962077e84d234b6821e67f3815551) - make exp.to_column more lenient *(PR [#3292](https://github.com/tobymao/sqlglot/pull/3292) by [@georgesittas](https://github.com/georgesittas))*
|
||||
|
||||
|
||||
## [v23.8.0] - 2024-04-08
|
||||
### :boom: BREAKING CHANGES
|
||||
- due to [`6bba030`](https://github.com/tobymao/sqlglot/commit/6bba0308b590aed73e454c2c40d600c670e0ad7f) - transpile map retrieval to duckdb, transpile TRY_ELEMENT_AT *(PR [#3277](https://github.com/tobymao/sqlglot/pull/3277) by [@georgesittas](https://github.com/georgesittas))*:
|
||||
|
||||
transpile map retrieval to duckdb, transpile TRY_ELEMENT_AT (#3277)
|
||||
|
||||
- due to [`02218fc`](https://github.com/tobymao/sqlglot/commit/02218fc4f75d22487976572f51bd131170a728e5) - allow to_column to properly parse quoted column paths, make types simpler *(PR [#3289](https://github.com/tobymao/sqlglot/pull/3289) by [@tobymao](https://github.com/tobymao))*:
|
||||
|
||||
allow to_column to properly parse quoted column paths, make types simpler (#3289)
|
||||
|
||||
|
||||
### :sparkles: New Features
|
||||
- [`08222c2`](https://github.com/tobymao/sqlglot/commit/08222c2c626353be108347b95644660fe04dfcd1) - **clickhouse**: add support for MATERIALIZED, EPHEMERAL column constraints *(PR [#3275](https://github.com/tobymao/sqlglot/pull/3275) by [@pkit](https://github.com/pkit))*
|
||||
- [`6bba030`](https://github.com/tobymao/sqlglot/commit/6bba0308b590aed73e454c2c40d600c670e0ad7f) - transpile map retrieval to duckdb, transpile TRY_ELEMENT_AT *(PR [#3277](https://github.com/tobymao/sqlglot/pull/3277) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- [`1726923`](https://github.com/tobymao/sqlglot/commit/17269232ea7f1f2ebf6daae7a49d55ccadc31798) - desc history databricks closes [#3280](https://github.com/tobymao/sqlglot/pull/3280) *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
- [`0690cbc`](https://github.com/tobymao/sqlglot/commit/0690cbc14f023589f38bcceea443642c5a9cc586) - **snowflake**: FINAL/RUNNING keywords in MATCH_RECOGNIZE MEASURES *(PR [#3284](https://github.com/tobymao/sqlglot/pull/3284) by [@VaggelisD](https://github.com/VaggelisD))*
|
||||
- :arrow_lower_right: *addresses issue [#3282](https://github.com/tobymao/sqlglot/issues/3282) opened by [@galunto](https://github.com/galunto)*
|
||||
- [`1311ba3`](https://github.com/tobymao/sqlglot/commit/1311ba3da3b5e05f148d602885fcc34cc73c3c6f) - **presto**: add support for DISTINCT / ALL after GROUP BY *(PR [#3290](https://github.com/tobymao/sqlglot/pull/3290) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- :arrow_lower_right: *addresses issue [#3286](https://github.com/tobymao/sqlglot/issues/3286) opened by [@bkyryliuk](https://github.com/bkyryliuk)*
|
||||
|
||||
### :bug: Bug Fixes
|
||||
- [`f65d812`](https://github.com/tobymao/sqlglot/commit/f65d8129b0ae887ff882cf5117f04f64b7e7db6f) - move EphemeralColumnConstraint generation to base generator *(commit by [@georgesittas](https://github.com/georgesittas))*
|
||||
- [`6d1c44d`](https://github.com/tobymao/sqlglot/commit/6d1c44d5b7ac9e3e929de84a761906ad42a07aee) - **optimizer**: unnest union subqueries *(PR [#3278](https://github.com/tobymao/sqlglot/pull/3278) by [@georgesittas](https://github.com/georgesittas))*
|
||||
- :arrow_lower_right: *fixes issue [#3276](https://github.com/tobymao/sqlglot/issues/3276) opened by [@khabiri](https://github.com/khabiri)*
|
||||
- [`a37d231`](https://github.com/tobymao/sqlglot/commit/a37d231200af1dc99fc45fc40627671ee82f6d5e) - **presto**: allow qualify to be an alias closes [#3287](https://github.com/tobymao/sqlglot/pull/3287) *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
- [`02218fc`](https://github.com/tobymao/sqlglot/commit/02218fc4f75d22487976572f51bd131170a728e5) - allow to_column to properly parse quoted column paths, make types simpler *(PR [#3289](https://github.com/tobymao/sqlglot/pull/3289) by [@tobymao](https://github.com/tobymao))*
|
||||
- [`fe0eb57`](https://github.com/tobymao/sqlglot/commit/fe0eb57feecce413e3e2992db73424c8cf585599) - pass quoted to the identifier *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
|
||||
### :wrench: Chores
|
||||
- [`c793629`](https://github.com/tobymao/sqlglot/commit/c79362953a5bf12278f861b8b5d39e6847b22e3b) - another test case *(commit by [@tobymao](https://github.com/tobymao))*
|
||||
|
||||
|
||||
## [v23.7.0] - 2024-04-04
|
||||
### :sparkles: New Features
|
||||
- [`e33fb01`](https://github.com/tobymao/sqlglot/commit/e33fb012b47892fab03fab7de896495951f23174) - **prql**: Add support for TAKE *(PR [#3258](https://github.com/tobymao/sqlglot/pull/3258) by [@fool1280](https://github.com/fool1280))*
|
||||
|
||||
### :bug: Bug Fixes
|
||||
- [`19302ab`](https://github.com/tobymao/sqlglot/commit/19302abe17a6828e1928075de45c1e2a4f3008ce) - **optimizer**: preserve the original type when creating a date literal *(PR [#3273](https://github.com/tobymao/sqlglot/pull/3273) by [@georgesittas](https://github.com/georgesittas))*
|
||||
|
||||
|
||||
## [v23.6.4] - 2024-04-03
|
||||
### :bug: Bug Fixes
|
||||
- [`803fc9e`](https://github.com/tobymao/sqlglot/commit/803fc9e8f245e48e8b0e13760c5fa60cd596a464) - allow placeholders in units closes [#3265](https://github.com/tobymao/sqlglot/pull/3265) *(PR [#3267](https://github.com/tobymao/sqlglot/pull/3267) by [@tobymao](https://github.com/tobymao))*
|
||||
|
@ -3160,3 +3254,8 @@ Changelog
|
|||
[v23.4.0]: https://github.com/tobymao/sqlglot/compare/v23.3.0...v23.4.0
|
||||
[v23.6.0]: https://github.com/tobymao/sqlglot/compare/v23.5.0...v23.6.0
|
||||
[v23.6.4]: https://github.com/tobymao/sqlglot/compare/v23.6.3...v23.6.4
|
||||
[v23.7.0]: https://github.com/tobymao/sqlglot/compare/v23.6.4...v23.7.0
|
||||
[v23.8.0]: https://github.com/tobymao/sqlglot/compare/v23.7.0...v23.8.0
|
||||
[v23.8.1]: https://github.com/tobymao/sqlglot/compare/v23.8.0...v23.8.1
|
||||
[v23.8.2]: https://github.com/tobymao/sqlglot/compare/v23.8.1...v23.8.2
|
||||
[v23.9.0]: https://github.com/tobymao/sqlglot/compare/v23.8.2...v23.9.0
|
|
@ -490,6 +490,7 @@ See also: [Writing a Python SQL engine from scratch](https://github.com/tobymao/
|
|||
|
||||
* [SQLMesh](https://github.com/TobikoData/sqlmesh)
|
||||
* [Apache Superset](https://github.com/apache/superset)
|
||||
* [Dagster](https://github.com/dagster-io/dagster)
|
||||
* [Fugue](https://github.com/fugue-project/fugue)
|
||||
* [ibis](https://github.com/ibis-project/ibis)
|
||||
* [mysql-mimic](https://github.com/kelsin/mysql-mimic)
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -629,6 +629,7 @@
|
|||
<ul>
|
||||
<li><a href="https://github.com/TobikoData/sqlmesh">SQLMesh</a></li>
|
||||
<li><a href="https://github.com/apache/superset">Apache Superset</a></li>
|
||||
<li><a href="https://github.com/dagster-io/dagster">Dagster</a></li>
|
||||
<li><a href="https://github.com/fugue-project/fugue">Fugue</a></li>
|
||||
<li><a href="https://github.com/ibis-project/ibis">ibis</a></li>
|
||||
<li><a href="https://github.com/kelsin/mysql-mimic">mysql-mimic</a></li>
|
||||
|
|
|
@ -76,8 +76,8 @@
|
|||
</span><span id="L-12"><a href="#L-12"><span class="linenos">12</span></a><span class="n">__version_tuple__</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
||||
</span><span id="L-13"><a href="#L-13"><span class="linenos">13</span></a><span class="n">version_tuple</span><span class="p">:</span> <span class="n">VERSION_TUPLE</span>
|
||||
</span><span id="L-14"><a href="#L-14"><span class="linenos">14</span></a>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'23.6.4'</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos">15</span></a><span class="n">__version__</span> <span class="o">=</span> <span class="n">version</span> <span class="o">=</span> <span class="s1">'23.9.0'</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos">16</span></a><span class="n">__version_tuple__</span> <span class="o">=</span> <span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -97,7 +97,7 @@
|
|||
<section id="version">
|
||||
<div class="attr variable">
|
||||
<span class="name">version</span><span class="annotation">: str</span> =
|
||||
<span class="default_value">'23.6.4'</span>
|
||||
<span class="default_value">'23.9.0'</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -109,7 +109,7 @@
|
|||
<section id="version_tuple">
|
||||
<div class="attr variable">
|
||||
<span class="name">version_tuple</span><span class="annotation">: object</span> =
|
||||
<span class="default_value">(23, 6, 4)</span>
|
||||
<span class="default_value">(23, 9, 0)</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
@ -791,7 +791,7 @@
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">createDataFrame</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">data</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844518578496'</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">'139844518578496'</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">'139844518514208'</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">'140525565941872'</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">'140525565941872'</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">'140525567126176'</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>
|
||||
|
||||
|
@ -1848,7 +1848,7 @@
|
|||
<input id="DataFrame.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<div class="attr function">
|
||||
|
||||
<span class="name">DataFrame</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">spark</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844522482208'</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">'139844523683472'</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">'140525568781152'</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">'140525570298720'</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>
|
||||
|
||||
|
@ -2096,7 +2096,7 @@
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">sql</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">dialect</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519222032'</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">'140525565635088'</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>
|
||||
|
||||
|
@ -2846,7 +2846,7 @@ is unlikely to come up.</p>
|
|||
<div class="decorator">@operation(Operation.FROM)</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">fillna</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844517633936'</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">'140525564319232'</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>
|
||||
|
||||
|
@ -2915,7 +2915,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="decorator">@operation(Operation.FROM)</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">replace</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">to_replace</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">]</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">NoneType</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>,</span><span class="param"> <span class="n">subset</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="n">Collection</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844517449296'</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">'139844517449296'</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">'140525564304720'</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">'140525564304720'</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>
|
||||
|
||||
|
@ -3120,7 +3120,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="decorator">@operation(Operation.NO_OP)</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">repartition</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">numPartitions</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844517449296'</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">'139844517449296'</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">'140525564304720'</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">'140525564304720'</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>
|
||||
|
||||
|
@ -3840,7 +3840,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<input id="Column.__init__-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<div class="attr function">
|
||||
|
||||
<span class="name">Column</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="n">expression</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -3884,7 +3884,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="decorator">@classmethod</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">ensure_col</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">value</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -3905,7 +3905,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="decorator">@classmethod</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">ensure_cols</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">args</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -3926,7 +3926,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="decorator">@classmethod</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">invoke_anonymous_function</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">column</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'139844519830208'</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">'140525566740416'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -3953,7 +3953,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="decorator">@classmethod</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">invoke_expression_over_column</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="n">column</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -3992,7 +3992,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">binary_op</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">klass</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="n">other</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -4013,7 +4013,7 @@ and check if it matches the type of the value provided. If not then make it null
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">inverse_binary_op</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">klass</span><span class="p">:</span> <span class="n">Callable</span>,</span><span class="param"> <span class="n">other</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -4607,7 +4607,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">isin</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'139844519830208'</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">'140525566740416'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -4628,7 +4628,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">between</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">lowerBound</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844519830208'</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">'139844519830208'</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">'140525566740416'</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">'140525566740416'</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>
|
||||
|
||||
|
@ -4663,7 +4663,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">over</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="n">window</span><span class="p">:</span> <span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844518160288'</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">'140525563380736'</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>
|
||||
|
||||
|
@ -4908,7 +4908,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
|||
<div class="decorator">@classmethod</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844516812000'</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">'139844516812000'</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">'140525563620288'</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">'140525563620288'</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>
|
||||
|
||||
|
@ -4929,7 +4929,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
|||
<div class="decorator">@classmethod</div>
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">cls</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844516812000'</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">'139844516812000'</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">'140525563620288'</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">'140525563620288'</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>
|
||||
|
||||
|
@ -5171,7 +5171,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">partitionBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844516812000'</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">'139844516812000'</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">'140525563620288'</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">'140525563620288'</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>
|
||||
|
||||
|
@ -5198,7 +5198,7 @@ Sqlglot doesn't currently replicate this class so it only accepts a string</p>
|
|||
<div class="attr function">
|
||||
|
||||
<span class="def">def</span>
|
||||
<span class="name">orderBy</span><span class="signature pdoc-code multiline">(<span class="param"> <span class="bp">self</span>,</span><span class="param"> <span class="o">*</span><span class="n">cols</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="o"><</span><span class="n">MagicMock</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'139844516812000'</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">'139844516812000'</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">'140525563620288'</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">'140525563620288'</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>
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -33,6 +33,9 @@
|
|||
<li>
|
||||
<a class="class" href="#PRQL">PRQL</a>
|
||||
<ul class="memberlist">
|
||||
<li>
|
||||
<a class="variable" href="#PRQL.DPIPE_IS_STRING_CONCAT">DPIPE_IS_STRING_CONCAT</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="class" href="#PRQL.Tokenizer">PRQL.Tokenizer</a>
|
||||
<ul class="memberlist">
|
||||
|
@ -54,6 +57,9 @@
|
|||
<li>
|
||||
<a class="class" href="#PRQL.Parser">PRQL.Parser</a>
|
||||
<ul class="memberlist">
|
||||
<li>
|
||||
<a class="variable" href="#PRQL.Parser.CONJUNCTION">CONJUNCTION</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="variable" href="#PRQL.Parser.TRANSFORM_PARSERS">TRANSFORM_PARSERS</a>
|
||||
</li>
|
||||
|
@ -161,103 +167,147 @@
|
|||
</span><span id="L-7"><a href="#L-7"><span class="linenos"> 7</span></a><span class="kn">from</span> <span class="nn">sqlglot.tokens</span> <span class="kn">import</span> <span class="n">TokenType</span>
|
||||
</span><span id="L-8"><a href="#L-8"><span class="linenos"> 8</span></a>
|
||||
</span><span id="L-9"><a href="#L-9"><span class="linenos"> 9</span></a>
|
||||
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="k">class</span> <span class="nc">PRQL</span><span class="p">(</span><span class="n">Dialect</span><span class="p">):</span>
|
||||
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a> <span class="k">class</span> <span class="nc">Tokenizer</span><span class="p">(</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="p">):</span>
|
||||
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a> <span class="n">IDENTIFIERS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"`"</span><span class="p">]</span>
|
||||
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a> <span class="n">QUOTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"'"</span><span class="p">,</span> <span class="s1">'"'</span><span class="p">]</span>
|
||||
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a> <span class="n">SINGLE_TOKENS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">SINGLE_TOKENS</span><span class="p">,</span>
|
||||
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a> <span class="s2">"="</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">,</span>
|
||||
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a> <span class="s2">"'"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a> <span class="s1">'"'</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a> <span class="s2">"`"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">IDENTIFIER</span><span class="p">,</span>
|
||||
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a> <span class="s2">"#"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">COMMENT</span><span class="p">,</span>
|
||||
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a> <span class="p">}</span>
|
||||
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a>
|
||||
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a> <span class="n">KEYWORDS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">KEYWORDS</span><span class="p">,</span>
|
||||
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="p">}</span>
|
||||
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a>
|
||||
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="k">class</span> <span class="nc">Parser</span><span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="p">):</span>
|
||||
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">TRANSFORM_PARSERS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="s2">"DERIVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="s2">"SELECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="k">def</span> <span class="nf">_select_all</span><span class="p">(</span><span class="n">table</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">)</span> <span class="o">-></span> <span class="n">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">Select</span><span class="p">]:</span>
|
||||
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">table</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">if</span> <span class="n">table</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a>
|
||||
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a>
|
||||
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="k">class</span> <span class="nc">PRQL</span><span class="p">(</span><span class="n">Dialect</span><span class="p">):</span>
|
||||
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a> <span class="n">DPIPE_IS_STRING_CONCAT</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a>
|
||||
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a> <span class="k">class</span> <span class="nc">Tokenizer</span><span class="p">(</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="p">):</span>
|
||||
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a> <span class="n">IDENTIFIERS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"`"</span><span class="p">]</span>
|
||||
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a> <span class="n">QUOTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"'"</span><span class="p">,</span> <span class="s1">'"'</span><span class="p">]</span>
|
||||
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a>
|
||||
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a> <span class="n">SINGLE_TOKENS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">SINGLE_TOKENS</span><span class="p">,</span>
|
||||
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a> <span class="s2">"="</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">,</span>
|
||||
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a> <span class="s2">"'"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a> <span class="s1">'"'</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a> <span class="s2">"`"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">IDENTIFIER</span><span class="p">,</span>
|
||||
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a> <span class="s2">"#"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">COMMENT</span><span class="p">,</span>
|
||||
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="p">}</span>
|
||||
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a>
|
||||
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a> <span class="n">KEYWORDS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">KEYWORDS</span><span class="p">,</span>
|
||||
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a> <span class="p">}</span>
|
||||
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a>
|
||||
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="k">def</span> <span class="nf">_parse_statement</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">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
|
||||
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a>
|
||||
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span>
|
||||
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
|
||||
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a>
|
||||
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a>
|
||||
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a>
|
||||
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
|
||||
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
|
||||
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a>
|
||||
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="k">return</span> <span class="n">query</span>
|
||||
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
|
||||
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
|
||||
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
|
||||
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
|
||||
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a> <span class="k">class</span> <span class="nc">Parser</span><span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="p">):</span>
|
||||
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a> <span class="n">CONJUNCTION</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a> <span class="o">**</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="o">.</span><span class="n">CONJUNCTION</span><span class="p">,</span>
|
||||
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a> <span class="n">TokenType</span><span class="o">.</span><span class="n">DAMP</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">,</span>
|
||||
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a> <span class="n">TokenType</span><span class="o">.</span><span class="n">DPIPE</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">,</span>
|
||||
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a> <span class="p">}</span>
|
||||
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a>
|
||||
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="n">TRANSFORM_PARSERS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a> <span class="s2">"DERIVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="s2">"SELECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="s2">"TAKE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_take</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="s2">"FILTER"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()),</span>
|
||||
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="s2">"APPEND"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">union</span><span class="p">(</span>
|
||||
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="p">),</span>
|
||||
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="s2">"REMOVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">except_</span><span class="p">(</span>
|
||||
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="p">),</span>
|
||||
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="s2">"INTERSECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">intersect</span><span class="p">(</span>
|
||||
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="p">),</span>
|
||||
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="s2">"SORT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_order_by</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="p">}</span>
|
||||
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
|
||||
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting ]"</span><span class="p">)</span>
|
||||
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
|
||||
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a>
|
||||
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span> <span class="k">else</span> <span class="n">select</span>
|
||||
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
|
||||
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="p">}</span>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">def</span> <span class="nf">_parse_statement</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">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
|
||||
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
|
||||
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
|
||||
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a>
|
||||
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a>
|
||||
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
|
||||
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
|
||||
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
|
||||
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
|
||||
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="p">)</span>
|
||||
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
|
||||
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="p">]</span>
|
||||
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a>
|
||||
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">def</span> <span class="nf">_parse_expression</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">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
|
||||
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a>
|
||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="p">)</span>
|
||||
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a>
|
||||
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
|
||||
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
|
||||
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
|
||||
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="k">return</span> <span class="n">query</span>
|
||||
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a>
|
||||
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
|
||||
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
|
||||
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
|
||||
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a>
|
||||
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting }"</span><span class="p">)</span>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
|
||||
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span> <span class="k">else</span> <span class="n">select</span>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="p">}</span>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="p">)</span>
|
||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="p">]</span>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a>
|
||||
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
|
||||
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
|
||||
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
|
||||
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
|
||||
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
|
||||
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"desc"</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"nulls_first"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">return</span> <span class="n">term</span>
|
||||
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a>
|
||||
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
|
||||
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
|
||||
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
|
||||
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting }"</span><span class="p">)</span>
|
||||
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
|
||||
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
|
||||
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
|
||||
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
|
||||
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a>
|
||||
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
|
||||
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
|
||||
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a>
|
||||
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
|
||||
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
|
||||
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
|
||||
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a>
|
||||
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
|
||||
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
|
||||
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -273,108 +323,162 @@
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#PRQL"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="PRQL-11"><a href="#PRQL-11"><span class="linenos"> 11</span></a><span class="k">class</span> <span class="nc">PRQL</span><span class="p">(</span><span class="n">Dialect</span><span class="p">):</span>
|
||||
</span><span id="PRQL-12"><a href="#PRQL-12"><span class="linenos"> 12</span></a> <span class="k">class</span> <span class="nc">Tokenizer</span><span class="p">(</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="p">):</span>
|
||||
</span><span id="PRQL-13"><a href="#PRQL-13"><span class="linenos"> 13</span></a> <span class="n">IDENTIFIERS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"`"</span><span class="p">]</span>
|
||||
</span><span id="PRQL-14"><a href="#PRQL-14"><span class="linenos"> 14</span></a> <span class="n">QUOTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"'"</span><span class="p">,</span> <span class="s1">'"'</span><span class="p">]</span>
|
||||
</span><span id="PRQL-15"><a href="#PRQL-15"><span class="linenos"> 15</span></a>
|
||||
</span><span id="PRQL-16"><a href="#PRQL-16"><span class="linenos"> 16</span></a> <span class="n">SINGLE_TOKENS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-17"><a href="#PRQL-17"><span class="linenos"> 17</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">SINGLE_TOKENS</span><span class="p">,</span>
|
||||
</span><span id="PRQL-18"><a href="#PRQL-18"><span class="linenos"> 18</span></a> <span class="s2">"="</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">,</span>
|
||||
</span><span id="PRQL-19"><a href="#PRQL-19"><span class="linenos"> 19</span></a> <span class="s2">"'"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL-20"><a href="#PRQL-20"><span class="linenos"> 20</span></a> <span class="s1">'"'</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL-21"><a href="#PRQL-21"><span class="linenos"> 21</span></a> <span class="s2">"`"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">IDENTIFIER</span><span class="p">,</span>
|
||||
</span><span id="PRQL-22"><a href="#PRQL-22"><span class="linenos"> 22</span></a> <span class="s2">"#"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">COMMENT</span><span class="p">,</span>
|
||||
</span><span id="PRQL-23"><a href="#PRQL-23"><span class="linenos"> 23</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-24"><a href="#PRQL-24"><span class="linenos"> 24</span></a>
|
||||
</span><span id="PRQL-25"><a href="#PRQL-25"><span class="linenos"> 25</span></a> <span class="n">KEYWORDS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-26"><a href="#PRQL-26"><span class="linenos"> 26</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">KEYWORDS</span><span class="p">,</span>
|
||||
</span><span id="PRQL-27"><a href="#PRQL-27"><span class="linenos"> 27</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-28"><a href="#PRQL-28"><span class="linenos"> 28</span></a>
|
||||
</span><span id="PRQL-29"><a href="#PRQL-29"><span class="linenos"> 29</span></a> <span class="k">class</span> <span class="nc">Parser</span><span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="p">):</span>
|
||||
</span><span id="PRQL-30"><a href="#PRQL-30"><span class="linenos"> 30</span></a> <span class="n">TRANSFORM_PARSERS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-31"><a href="#PRQL-31"><span class="linenos"> 31</span></a> <span class="s2">"DERIVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL-32"><a href="#PRQL-32"><span class="linenos"> 32</span></a> <span class="s2">"SELECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="PRQL-15"><a href="#PRQL-15"><span class="linenos"> 15</span></a><span class="k">class</span> <span class="nc">PRQL</span><span class="p">(</span><span class="n">Dialect</span><span class="p">):</span>
|
||||
</span><span id="PRQL-16"><a href="#PRQL-16"><span class="linenos"> 16</span></a> <span class="n">DPIPE_IS_STRING_CONCAT</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="PRQL-17"><a href="#PRQL-17"><span class="linenos"> 17</span></a>
|
||||
</span><span id="PRQL-18"><a href="#PRQL-18"><span class="linenos"> 18</span></a> <span class="k">class</span> <span class="nc">Tokenizer</span><span class="p">(</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="p">):</span>
|
||||
</span><span id="PRQL-19"><a href="#PRQL-19"><span class="linenos"> 19</span></a> <span class="n">IDENTIFIERS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"`"</span><span class="p">]</span>
|
||||
</span><span id="PRQL-20"><a href="#PRQL-20"><span class="linenos"> 20</span></a> <span class="n">QUOTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"'"</span><span class="p">,</span> <span class="s1">'"'</span><span class="p">]</span>
|
||||
</span><span id="PRQL-21"><a href="#PRQL-21"><span class="linenos"> 21</span></a>
|
||||
</span><span id="PRQL-22"><a href="#PRQL-22"><span class="linenos"> 22</span></a> <span class="n">SINGLE_TOKENS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-23"><a href="#PRQL-23"><span class="linenos"> 23</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">SINGLE_TOKENS</span><span class="p">,</span>
|
||||
</span><span id="PRQL-24"><a href="#PRQL-24"><span class="linenos"> 24</span></a> <span class="s2">"="</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">,</span>
|
||||
</span><span id="PRQL-25"><a href="#PRQL-25"><span class="linenos"> 25</span></a> <span class="s2">"'"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL-26"><a href="#PRQL-26"><span class="linenos"> 26</span></a> <span class="s1">'"'</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL-27"><a href="#PRQL-27"><span class="linenos"> 27</span></a> <span class="s2">"`"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">IDENTIFIER</span><span class="p">,</span>
|
||||
</span><span id="PRQL-28"><a href="#PRQL-28"><span class="linenos"> 28</span></a> <span class="s2">"#"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">COMMENT</span><span class="p">,</span>
|
||||
</span><span id="PRQL-29"><a href="#PRQL-29"><span class="linenos"> 29</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-30"><a href="#PRQL-30"><span class="linenos"> 30</span></a>
|
||||
</span><span id="PRQL-31"><a href="#PRQL-31"><span class="linenos"> 31</span></a> <span class="n">KEYWORDS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-32"><a href="#PRQL-32"><span class="linenos"> 32</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">KEYWORDS</span><span class="p">,</span>
|
||||
</span><span id="PRQL-33"><a href="#PRQL-33"><span class="linenos"> 33</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-34"><a href="#PRQL-34"><span class="linenos"> 34</span></a>
|
||||
</span><span id="PRQL-35"><a href="#PRQL-35"><span class="linenos"> 35</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-36"><a href="#PRQL-36"><span class="linenos"> 36</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL-37"><a href="#PRQL-37"><span class="linenos"> 37</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
|
||||
</span><span id="PRQL-38"><a href="#PRQL-38"><span class="linenos"> 38</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="PRQL-39"><a href="#PRQL-39"><span class="linenos"> 39</span></a>
|
||||
</span><span id="PRQL-40"><a href="#PRQL-40"><span class="linenos"> 40</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span>
|
||||
</span><span id="PRQL-41"><a href="#PRQL-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="PRQL-42"><a href="#PRQL-42"><span class="linenos"> 42</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-43"><a href="#PRQL-43"><span class="linenos"> 43</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
|
||||
</span><span id="PRQL-44"><a href="#PRQL-44"><span class="linenos"> 44</span></a>
|
||||
</span><span id="PRQL-45"><a href="#PRQL-45"><span class="linenos"> 45</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="PRQL-46"><a href="#PRQL-46"><span class="linenos"> 46</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL-47"><a href="#PRQL-47"><span class="linenos"> 47</span></a>
|
||||
</span><span id="PRQL-48"><a href="#PRQL-48"><span class="linenos"> 48</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL-49"><a href="#PRQL-49"><span class="linenos"> 49</span></a>
|
||||
</span><span id="PRQL-50"><a href="#PRQL-50"><span class="linenos"> 50</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
|
||||
</span><span id="PRQL-51"><a href="#PRQL-51"><span class="linenos"> 51</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
|
||||
</span><span id="PRQL-52"><a href="#PRQL-52"><span class="linenos"> 52</span></a>
|
||||
</span><span id="PRQL-53"><a href="#PRQL-53"><span class="linenos"> 53</span></a> <span class="k">return</span> <span class="n">query</span>
|
||||
</span><span id="PRQL-54"><a href="#PRQL-54"><span class="linenos"> 54</span></a>
|
||||
</span><span id="PRQL-55"><a href="#PRQL-55"><span class="linenos"> 55</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
|
||||
</span><span id="PRQL-56"><a href="#PRQL-56"><span class="linenos"> 56</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
|
||||
</span><span id="PRQL-57"><a href="#PRQL-57"><span class="linenos"> 57</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
|
||||
</span><span id="PRQL-35"><a href="#PRQL-35"><span class="linenos"> 35</span></a> <span class="k">class</span> <span class="nc">Parser</span><span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="p">):</span>
|
||||
</span><span id="PRQL-36"><a href="#PRQL-36"><span class="linenos"> 36</span></a> <span class="n">CONJUNCTION</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-37"><a href="#PRQL-37"><span class="linenos"> 37</span></a> <span class="o">**</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="o">.</span><span class="n">CONJUNCTION</span><span class="p">,</span>
|
||||
</span><span id="PRQL-38"><a href="#PRQL-38"><span class="linenos"> 38</span></a> <span class="n">TokenType</span><span class="o">.</span><span class="n">DAMP</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">,</span>
|
||||
</span><span id="PRQL-39"><a href="#PRQL-39"><span class="linenos"> 39</span></a> <span class="n">TokenType</span><span class="o">.</span><span class="n">DPIPE</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">,</span>
|
||||
</span><span id="PRQL-40"><a href="#PRQL-40"><span class="linenos"> 40</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-41"><a href="#PRQL-41"><span class="linenos"> 41</span></a>
|
||||
</span><span id="PRQL-42"><a href="#PRQL-42"><span class="linenos"> 42</span></a> <span class="n">TRANSFORM_PARSERS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-43"><a href="#PRQL-43"><span class="linenos"> 43</span></a> <span class="s2">"DERIVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL-44"><a href="#PRQL-44"><span class="linenos"> 44</span></a> <span class="s2">"SELECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="PRQL-45"><a href="#PRQL-45"><span class="linenos"> 45</span></a> <span class="s2">"TAKE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_take</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL-46"><a href="#PRQL-46"><span class="linenos"> 46</span></a> <span class="s2">"FILTER"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()),</span>
|
||||
</span><span id="PRQL-47"><a href="#PRQL-47"><span class="linenos"> 47</span></a> <span class="s2">"APPEND"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">union</span><span class="p">(</span>
|
||||
</span><span id="PRQL-48"><a href="#PRQL-48"><span class="linenos"> 48</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="PRQL-49"><a href="#PRQL-49"><span class="linenos"> 49</span></a> <span class="p">),</span>
|
||||
</span><span id="PRQL-50"><a href="#PRQL-50"><span class="linenos"> 50</span></a> <span class="s2">"REMOVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">except_</span><span class="p">(</span>
|
||||
</span><span id="PRQL-51"><a href="#PRQL-51"><span class="linenos"> 51</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="PRQL-52"><a href="#PRQL-52"><span class="linenos"> 52</span></a> <span class="p">),</span>
|
||||
</span><span id="PRQL-53"><a href="#PRQL-53"><span class="linenos"> 53</span></a> <span class="s2">"INTERSECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">intersect</span><span class="p">(</span>
|
||||
</span><span id="PRQL-54"><a href="#PRQL-54"><span class="linenos"> 54</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="PRQL-55"><a href="#PRQL-55"><span class="linenos"> 55</span></a> <span class="p">),</span>
|
||||
</span><span id="PRQL-56"><a href="#PRQL-56"><span class="linenos"> 56</span></a> <span class="s2">"SORT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_order_by</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL-57"><a href="#PRQL-57"><span class="linenos"> 57</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-58"><a href="#PRQL-58"><span class="linenos"> 58</span></a>
|
||||
</span><span id="PRQL-59"><a href="#PRQL-59"><span class="linenos"> 59</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
|
||||
</span><span id="PRQL-60"><a href="#PRQL-60"><span class="linenos"> 60</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting ]"</span><span class="p">)</span>
|
||||
</span><span id="PRQL-61"><a href="#PRQL-61"><span class="linenos"> 61</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="PRQL-62"><a href="#PRQL-62"><span class="linenos"> 62</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL-63"><a href="#PRQL-63"><span class="linenos"> 63</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
|
||||
</span><span id="PRQL-64"><a href="#PRQL-64"><span class="linenos"> 64</span></a>
|
||||
</span><span id="PRQL-65"><a href="#PRQL-65"><span class="linenos"> 65</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-66"><a href="#PRQL-66"><span class="linenos"> 66</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span> <span class="k">else</span> <span class="n">select</span>
|
||||
</span><span id="PRQL-67"><a href="#PRQL-67"><span class="linenos"> 67</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
|
||||
</span><span id="PRQL-68"><a href="#PRQL-68"><span class="linenos"> 68</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-59"><a href="#PRQL-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">_parse_statement</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">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-60"><a href="#PRQL-60"><span class="linenos"> 60</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL-61"><a href="#PRQL-61"><span class="linenos"> 61</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
|
||||
</span><span id="PRQL-62"><a href="#PRQL-62"><span class="linenos"> 62</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="PRQL-63"><a href="#PRQL-63"><span class="linenos"> 63</span></a>
|
||||
</span><span id="PRQL-64"><a href="#PRQL-64"><span class="linenos"> 64</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-65"><a href="#PRQL-65"><span class="linenos"> 65</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
|
||||
</span><span id="PRQL-66"><a href="#PRQL-66"><span class="linenos"> 66</span></a>
|
||||
</span><span id="PRQL-67"><a href="#PRQL-67"><span class="linenos"> 67</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="PRQL-68"><a href="#PRQL-68"><span class="linenos"> 68</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL-69"><a href="#PRQL-69"><span class="linenos"> 69</span></a>
|
||||
</span><span id="PRQL-70"><a href="#PRQL-70"><span class="linenos"> 70</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
|
||||
</span><span id="PRQL-71"><a href="#PRQL-71"><span class="linenos"> 71</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||
</span><span id="PRQL-72"><a href="#PRQL-72"><span class="linenos"> 72</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
|
||||
</span><span id="PRQL-73"><a href="#PRQL-73"><span class="linenos"> 73</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
|
||||
</span><span id="PRQL-74"><a href="#PRQL-74"><span class="linenos"> 74</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
|
||||
</span><span id="PRQL-75"><a href="#PRQL-75"><span class="linenos"> 75</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-76"><a href="#PRQL-76"><span class="linenos"> 76</span></a> <span class="p">)</span>
|
||||
</span><span id="PRQL-77"><a href="#PRQL-77"><span class="linenos"> 77</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
|
||||
</span><span id="PRQL-78"><a href="#PRQL-78"><span class="linenos"> 78</span></a> <span class="p">]</span>
|
||||
</span><span id="PRQL-79"><a href="#PRQL-79"><span class="linenos"> 79</span></a>
|
||||
</span><span id="PRQL-80"><a href="#PRQL-80"><span class="linenos"> 80</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL-81"><a href="#PRQL-81"><span class="linenos"> 81</span></a>
|
||||
</span><span id="PRQL-82"><a href="#PRQL-82"><span class="linenos"> 82</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-83"><a href="#PRQL-83"><span class="linenos"> 83</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
|
||||
</span><span id="PRQL-84"><a href="#PRQL-84"><span class="linenos"> 84</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="PRQL-85"><a href="#PRQL-85"><span class="linenos"> 85</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
|
||||
</span><span id="PRQL-86"><a href="#PRQL-86"><span class="linenos"> 86</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="PRQL-87"><a href="#PRQL-87"><span class="linenos"> 87</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
|
||||
</span><span id="PRQL-88"><a href="#PRQL-88"><span class="linenos"> 88</span></a>
|
||||
</span><span id="PRQL-89"><a href="#PRQL-89"><span class="linenos"> 89</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
|
||||
</span><span id="PRQL-90"><a href="#PRQL-90"><span class="linenos"> 90</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="PRQL-91"><a href="#PRQL-91"><span class="linenos"> 91</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-92"><a href="#PRQL-92"><span class="linenos"> 92</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-93"><a href="#PRQL-93"><span class="linenos"> 93</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="PRQL-94"><a href="#PRQL-94"><span class="linenos"> 94</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-95"><a href="#PRQL-95"><span class="linenos"> 95</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-96"><a href="#PRQL-96"><span class="linenos"> 96</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-97"><a href="#PRQL-97"><span class="linenos"> 97</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
|
||||
</span><span id="PRQL-98"><a href="#PRQL-98"><span class="linenos"> 98</span></a>
|
||||
</span><span id="PRQL-99"><a href="#PRQL-99"><span class="linenos"> 99</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
|
||||
</span><span id="PRQL-100"><a href="#PRQL-100"><span class="linenos">100</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="PRQL-101"><a href="#PRQL-101"><span class="linenos">101</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-102"><a href="#PRQL-102"><span class="linenos">102</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
|
||||
</span><span id="PRQL-103"><a href="#PRQL-103"><span class="linenos">103</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL-104"><a href="#PRQL-104"><span class="linenos">104</span></a>
|
||||
</span><span id="PRQL-105"><a href="#PRQL-105"><span class="linenos">105</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
|
||||
</span><span id="PRQL-106"><a href="#PRQL-106"><span class="linenos">106</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
|
||||
</span><span id="PRQL-107"><a href="#PRQL-107"><span class="linenos">107</span></a> <span class="p">)</span>
|
||||
</span><span id="PRQL-70"><a href="#PRQL-70"><span class="linenos"> 70</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL-71"><a href="#PRQL-71"><span class="linenos"> 71</span></a>
|
||||
</span><span id="PRQL-72"><a href="#PRQL-72"><span class="linenos"> 72</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
|
||||
</span><span id="PRQL-73"><a href="#PRQL-73"><span class="linenos"> 73</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
|
||||
</span><span id="PRQL-74"><a href="#PRQL-74"><span class="linenos"> 74</span></a>
|
||||
</span><span id="PRQL-75"><a href="#PRQL-75"><span class="linenos"> 75</span></a> <span class="k">return</span> <span class="n">query</span>
|
||||
</span><span id="PRQL-76"><a href="#PRQL-76"><span class="linenos"> 76</span></a>
|
||||
</span><span id="PRQL-77"><a href="#PRQL-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
|
||||
</span><span id="PRQL-78"><a href="#PRQL-78"><span class="linenos"> 78</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
|
||||
</span><span id="PRQL-79"><a href="#PRQL-79"><span class="linenos"> 79</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
|
||||
</span><span id="PRQL-80"><a href="#PRQL-80"><span class="linenos"> 80</span></a>
|
||||
</span><span id="PRQL-81"><a href="#PRQL-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
|
||||
</span><span id="PRQL-82"><a href="#PRQL-82"><span class="linenos"> 82</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting }"</span><span class="p">)</span>
|
||||
</span><span id="PRQL-83"><a href="#PRQL-83"><span class="linenos"> 83</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="PRQL-84"><a href="#PRQL-84"><span class="linenos"> 84</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL-85"><a href="#PRQL-85"><span class="linenos"> 85</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
|
||||
</span><span id="PRQL-86"><a href="#PRQL-86"><span class="linenos"> 86</span></a>
|
||||
</span><span id="PRQL-87"><a href="#PRQL-87"><span class="linenos"> 87</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL-88"><a href="#PRQL-88"><span class="linenos"> 88</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span> <span class="k">else</span> <span class="n">select</span>
|
||||
</span><span id="PRQL-89"><a href="#PRQL-89"><span class="linenos"> 89</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
|
||||
</span><span id="PRQL-90"><a href="#PRQL-90"><span class="linenos"> 90</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL-91"><a href="#PRQL-91"><span class="linenos"> 91</span></a>
|
||||
</span><span id="PRQL-92"><a href="#PRQL-92"><span class="linenos"> 92</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
|
||||
</span><span id="PRQL-93"><a href="#PRQL-93"><span class="linenos"> 93</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||
</span><span id="PRQL-94"><a href="#PRQL-94"><span class="linenos"> 94</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
|
||||
</span><span id="PRQL-95"><a href="#PRQL-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
|
||||
</span><span id="PRQL-96"><a href="#PRQL-96"><span class="linenos"> 96</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
|
||||
</span><span id="PRQL-97"><a href="#PRQL-97"><span class="linenos"> 97</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-98"><a href="#PRQL-98"><span class="linenos"> 98</span></a> <span class="p">)</span>
|
||||
</span><span id="PRQL-99"><a href="#PRQL-99"><span class="linenos"> 99</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
|
||||
</span><span id="PRQL-100"><a href="#PRQL-100"><span class="linenos">100</span></a> <span class="p">]</span>
|
||||
</span><span id="PRQL-101"><a href="#PRQL-101"><span class="linenos">101</span></a>
|
||||
</span><span id="PRQL-102"><a href="#PRQL-102"><span class="linenos">102</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL-103"><a href="#PRQL-103"><span class="linenos">103</span></a>
|
||||
</span><span id="PRQL-104"><a href="#PRQL-104"><span class="linenos">104</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-105"><a href="#PRQL-105"><span class="linenos">105</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
|
||||
</span><span id="PRQL-106"><a href="#PRQL-106"><span class="linenos">106</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL-107"><a href="#PRQL-107"><span class="linenos">107</span></a>
|
||||
</span><span id="PRQL-108"><a href="#PRQL-108"><span class="linenos">108</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
|
||||
</span><span id="PRQL-109"><a href="#PRQL-109"><span class="linenos">109</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL-110"><a href="#PRQL-110"><span class="linenos">110</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-111"><a href="#PRQL-111"><span class="linenos">111</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
|
||||
</span><span id="PRQL-112"><a href="#PRQL-112"><span class="linenos">112</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL-113"><a href="#PRQL-113"><span class="linenos">113</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
|
||||
</span><span id="PRQL-114"><a href="#PRQL-114"><span class="linenos">114</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
|
||||
</span><span id="PRQL-115"><a href="#PRQL-115"><span class="linenos">115</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"desc"</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="PRQL-116"><a href="#PRQL-116"><span class="linenos">116</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"nulls_first"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL-117"><a href="#PRQL-117"><span class="linenos">117</span></a> <span class="k">return</span> <span class="n">term</span>
|
||||
</span><span id="PRQL-118"><a href="#PRQL-118"><span class="linenos">118</span></a>
|
||||
</span><span id="PRQL-119"><a href="#PRQL-119"><span class="linenos">119</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-120"><a href="#PRQL-120"><span class="linenos">120</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
|
||||
</span><span id="PRQL-121"><a href="#PRQL-121"><span class="linenos">121</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
|
||||
</span><span id="PRQL-122"><a href="#PRQL-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
|
||||
</span><span id="PRQL-123"><a href="#PRQL-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting }"</span><span class="p">)</span>
|
||||
</span><span id="PRQL-124"><a href="#PRQL-124"><span class="linenos">124</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL-125"><a href="#PRQL-125"><span class="linenos">125</span></a>
|
||||
</span><span id="PRQL-126"><a href="#PRQL-126"><span class="linenos">126</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-127"><a href="#PRQL-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
|
||||
</span><span id="PRQL-128"><a href="#PRQL-128"><span class="linenos">128</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="PRQL-129"><a href="#PRQL-129"><span class="linenos">129</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
|
||||
</span><span id="PRQL-130"><a href="#PRQL-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="PRQL-131"><a href="#PRQL-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
|
||||
</span><span id="PRQL-132"><a href="#PRQL-132"><span class="linenos">132</span></a>
|
||||
</span><span id="PRQL-133"><a href="#PRQL-133"><span class="linenos">133</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
|
||||
</span><span id="PRQL-134"><a href="#PRQL-134"><span class="linenos">134</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="PRQL-135"><a href="#PRQL-135"><span class="linenos">135</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-136"><a href="#PRQL-136"><span class="linenos">136</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-137"><a href="#PRQL-137"><span class="linenos">137</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="PRQL-138"><a href="#PRQL-138"><span class="linenos">138</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-139"><a href="#PRQL-139"><span class="linenos">139</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL-140"><a href="#PRQL-140"><span class="linenos">140</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-141"><a href="#PRQL-141"><span class="linenos">141</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
|
||||
</span><span id="PRQL-142"><a href="#PRQL-142"><span class="linenos">142</span></a>
|
||||
</span><span id="PRQL-143"><a href="#PRQL-143"><span class="linenos">143</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
|
||||
</span><span id="PRQL-144"><a href="#PRQL-144"><span class="linenos">144</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="PRQL-145"><a href="#PRQL-145"><span class="linenos">145</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
|
||||
</span><span id="PRQL-146"><a href="#PRQL-146"><span class="linenos">146</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
|
||||
</span><span id="PRQL-147"><a href="#PRQL-147"><span class="linenos">147</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL-148"><a href="#PRQL-148"><span class="linenos">148</span></a>
|
||||
</span><span id="PRQL-149"><a href="#PRQL-149"><span class="linenos">149</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
|
||||
</span><span id="PRQL-150"><a href="#PRQL-150"><span class="linenos">150</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
|
||||
</span><span id="PRQL-151"><a href="#PRQL-151"><span class="linenos">151</span></a> <span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="PRQL.DPIPE_IS_STRING_CONCAT" class="classattr">
|
||||
<div class="attr variable">
|
||||
<span class="name">DPIPE_IS_STRING_CONCAT</span> =
|
||||
<span class="default_value">False</span>
|
||||
|
||||
|
||||
</div>
|
||||
<a class="headerlink" href="#PRQL.DPIPE_IS_STRING_CONCAT"></a>
|
||||
|
||||
<div class="docstring"><p>Whether the DPIPE token (<code>||</code>) is a string concatenation operator.</p>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div id="PRQL.tokenizer_class" class="classattr">
|
||||
<div class="attr variable">
|
||||
<span class="name">tokenizer_class</span> =
|
||||
|
@ -627,7 +731,6 @@
|
|||
<dd id="PRQL.TABLESAMPLE_SIZE_IS_PERCENT" class="variable"><a href="dialect.html#Dialect.TABLESAMPLE_SIZE_IS_PERCENT">TABLESAMPLE_SIZE_IS_PERCENT</a></dd>
|
||||
<dd id="PRQL.NORMALIZATION_STRATEGY" class="variable"><a href="dialect.html#Dialect.NORMALIZATION_STRATEGY">NORMALIZATION_STRATEGY</a></dd>
|
||||
<dd id="PRQL.IDENTIFIERS_CAN_START_WITH_DIGIT" class="variable"><a href="dialect.html#Dialect.IDENTIFIERS_CAN_START_WITH_DIGIT">IDENTIFIERS_CAN_START_WITH_DIGIT</a></dd>
|
||||
<dd id="PRQL.DPIPE_IS_STRING_CONCAT" class="variable"><a href="dialect.html#Dialect.DPIPE_IS_STRING_CONCAT">DPIPE_IS_STRING_CONCAT</a></dd>
|
||||
<dd id="PRQL.STRICT_STRING_CONCAT" class="variable"><a href="dialect.html#Dialect.STRICT_STRING_CONCAT">STRICT_STRING_CONCAT</a></dd>
|
||||
<dd id="PRQL.SUPPORTS_USER_DEFINED_TYPES" class="variable"><a href="dialect.html#Dialect.SUPPORTS_USER_DEFINED_TYPES">SUPPORTS_USER_DEFINED_TYPES</a></dd>
|
||||
<dd id="PRQL.SUPPORTS_SEMI_ANTI_JOIN" class="variable"><a href="dialect.html#Dialect.SUPPORTS_SEMI_ANTI_JOIN">SUPPORTS_SEMI_ANTI_JOIN</a></dd>
|
||||
|
@ -676,22 +779,22 @@
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#PRQL.Tokenizer"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="PRQL.Tokenizer-12"><a href="#PRQL.Tokenizer-12"><span class="linenos">12</span></a> <span class="k">class</span> <span class="nc">Tokenizer</span><span class="p">(</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Tokenizer-13"><a href="#PRQL.Tokenizer-13"><span class="linenos">13</span></a> <span class="n">IDENTIFIERS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"`"</span><span class="p">]</span>
|
||||
</span><span id="PRQL.Tokenizer-14"><a href="#PRQL.Tokenizer-14"><span class="linenos">14</span></a> <span class="n">QUOTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"'"</span><span class="p">,</span> <span class="s1">'"'</span><span class="p">]</span>
|
||||
</span><span id="PRQL.Tokenizer-15"><a href="#PRQL.Tokenizer-15"><span class="linenos">15</span></a>
|
||||
</span><span id="PRQL.Tokenizer-16"><a href="#PRQL.Tokenizer-16"><span class="linenos">16</span></a> <span class="n">SINGLE_TOKENS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Tokenizer-17"><a href="#PRQL.Tokenizer-17"><span class="linenos">17</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">SINGLE_TOKENS</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-18"><a href="#PRQL.Tokenizer-18"><span class="linenos">18</span></a> <span class="s2">"="</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-19"><a href="#PRQL.Tokenizer-19"><span class="linenos">19</span></a> <span class="s2">"'"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-20"><a href="#PRQL.Tokenizer-20"><span class="linenos">20</span></a> <span class="s1">'"'</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-21"><a href="#PRQL.Tokenizer-21"><span class="linenos">21</span></a> <span class="s2">"`"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">IDENTIFIER</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-22"><a href="#PRQL.Tokenizer-22"><span class="linenos">22</span></a> <span class="s2">"#"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">COMMENT</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-23"><a href="#PRQL.Tokenizer-23"><span class="linenos">23</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL.Tokenizer-24"><a href="#PRQL.Tokenizer-24"><span class="linenos">24</span></a>
|
||||
</span><span id="PRQL.Tokenizer-25"><a href="#PRQL.Tokenizer-25"><span class="linenos">25</span></a> <span class="n">KEYWORDS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Tokenizer-26"><a href="#PRQL.Tokenizer-26"><span class="linenos">26</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">KEYWORDS</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-27"><a href="#PRQL.Tokenizer-27"><span class="linenos">27</span></a> <span class="p">}</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="PRQL.Tokenizer-18"><a href="#PRQL.Tokenizer-18"><span class="linenos">18</span></a> <span class="k">class</span> <span class="nc">Tokenizer</span><span class="p">(</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Tokenizer-19"><a href="#PRQL.Tokenizer-19"><span class="linenos">19</span></a> <span class="n">IDENTIFIERS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"`"</span><span class="p">]</span>
|
||||
</span><span id="PRQL.Tokenizer-20"><a href="#PRQL.Tokenizer-20"><span class="linenos">20</span></a> <span class="n">QUOTES</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"'"</span><span class="p">,</span> <span class="s1">'"'</span><span class="p">]</span>
|
||||
</span><span id="PRQL.Tokenizer-21"><a href="#PRQL.Tokenizer-21"><span class="linenos">21</span></a>
|
||||
</span><span id="PRQL.Tokenizer-22"><a href="#PRQL.Tokenizer-22"><span class="linenos">22</span></a> <span class="n">SINGLE_TOKENS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Tokenizer-23"><a href="#PRQL.Tokenizer-23"><span class="linenos">23</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">SINGLE_TOKENS</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-24"><a href="#PRQL.Tokenizer-24"><span class="linenos">24</span></a> <span class="s2">"="</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-25"><a href="#PRQL.Tokenizer-25"><span class="linenos">25</span></a> <span class="s2">"'"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-26"><a href="#PRQL.Tokenizer-26"><span class="linenos">26</span></a> <span class="s1">'"'</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">QUOTE</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-27"><a href="#PRQL.Tokenizer-27"><span class="linenos">27</span></a> <span class="s2">"`"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">IDENTIFIER</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-28"><a href="#PRQL.Tokenizer-28"><span class="linenos">28</span></a> <span class="s2">"#"</span><span class="p">:</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">COMMENT</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-29"><a href="#PRQL.Tokenizer-29"><span class="linenos">29</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL.Tokenizer-30"><a href="#PRQL.Tokenizer-30"><span class="linenos">30</span></a>
|
||||
</span><span id="PRQL.Tokenizer-31"><a href="#PRQL.Tokenizer-31"><span class="linenos">31</span></a> <span class="n">KEYWORDS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Tokenizer-32"><a href="#PRQL.Tokenizer-32"><span class="linenos">32</span></a> <span class="o">**</span><span class="n">tokens</span><span class="o">.</span><span class="n">Tokenizer</span><span class="o">.</span><span class="n">KEYWORDS</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Tokenizer-33"><a href="#PRQL.Tokenizer-33"><span class="linenos">33</span></a> <span class="p">}</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -791,85 +894,123 @@
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#PRQL.Parser"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="PRQL.Parser-29"><a href="#PRQL.Parser-29"><span class="linenos"> 29</span></a> <span class="k">class</span> <span class="nc">Parser</span><span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-30"><a href="#PRQL.Parser-30"><span class="linenos"> 30</span></a> <span class="n">TRANSFORM_PARSERS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Parser-31"><a href="#PRQL.Parser-31"><span class="linenos"> 31</span></a> <span class="s2">"DERIVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-32"><a href="#PRQL.Parser-32"><span class="linenos"> 32</span></a> <span class="s2">"SELECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-33"><a href="#PRQL.Parser-33"><span class="linenos"> 33</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL.Parser-34"><a href="#PRQL.Parser-34"><span class="linenos"> 34</span></a>
|
||||
</span><span id="PRQL.Parser-35"><a href="#PRQL.Parser-35"><span class="linenos"> 35</span></a> <span class="k">def</span> <span class="nf">_parse_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-36"><a href="#PRQL.Parser-36"><span class="linenos"> 36</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-37"><a href="#PRQL.Parser-37"><span class="linenos"> 37</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-38"><a href="#PRQL.Parser-38"><span class="linenos"> 38</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="PRQL.Parser-39"><a href="#PRQL.Parser-39"><span class="linenos"> 39</span></a>
|
||||
</span><span id="PRQL.Parser-40"><a href="#PRQL.Parser-40"><span class="linenos"> 40</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-41"><a href="#PRQL.Parser-41"><span class="linenos"> 41</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-42"><a href="#PRQL.Parser-42"><span class="linenos"> 42</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-43"><a href="#PRQL.Parser-43"><span class="linenos"> 43</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-44"><a href="#PRQL.Parser-44"><span class="linenos"> 44</span></a>
|
||||
</span><span id="PRQL.Parser-45"><a href="#PRQL.Parser-45"><span class="linenos"> 45</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-46"><a href="#PRQL.Parser-46"><span class="linenos"> 46</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL.Parser-47"><a href="#PRQL.Parser-47"><span class="linenos"> 47</span></a>
|
||||
</span><span id="PRQL.Parser-48"><a href="#PRQL.Parser-48"><span class="linenos"> 48</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-49"><a href="#PRQL.Parser-49"><span class="linenos"> 49</span></a>
|
||||
</span><span id="PRQL.Parser-50"><a href="#PRQL.Parser-50"><span class="linenos"> 50</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-51"><a href="#PRQL.Parser-51"><span class="linenos"> 51</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-52"><a href="#PRQL.Parser-52"><span class="linenos"> 52</span></a>
|
||||
</span><span id="PRQL.Parser-53"><a href="#PRQL.Parser-53"><span class="linenos"> 53</span></a> <span class="k">return</span> <span class="n">query</span>
|
||||
</span><span id="PRQL.Parser-54"><a href="#PRQL.Parser-54"><span class="linenos"> 54</span></a>
|
||||
</span><span id="PRQL.Parser-55"><a href="#PRQL.Parser-55"><span class="linenos"> 55</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-56"><a href="#PRQL.Parser-56"><span class="linenos"> 56</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-57"><a href="#PRQL.Parser-57"><span class="linenos"> 57</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="PRQL.Parser-35"><a href="#PRQL.Parser-35"><span class="linenos"> 35</span></a> <span class="k">class</span> <span class="nc">Parser</span><span class="p">(</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-36"><a href="#PRQL.Parser-36"><span class="linenos"> 36</span></a> <span class="n">CONJUNCTION</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Parser-37"><a href="#PRQL.Parser-37"><span class="linenos"> 37</span></a> <span class="o">**</span><span class="n">parser</span><span class="o">.</span><span class="n">Parser</span><span class="o">.</span><span class="n">CONJUNCTION</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-38"><a href="#PRQL.Parser-38"><span class="linenos"> 38</span></a> <span class="n">TokenType</span><span class="o">.</span><span class="n">DAMP</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">And</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-39"><a href="#PRQL.Parser-39"><span class="linenos"> 39</span></a> <span class="n">TokenType</span><span class="o">.</span><span class="n">DPIPE</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-40"><a href="#PRQL.Parser-40"><span class="linenos"> 40</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL.Parser-41"><a href="#PRQL.Parser-41"><span class="linenos"> 41</span></a>
|
||||
</span><span id="PRQL.Parser-42"><a href="#PRQL.Parser-42"><span class="linenos"> 42</span></a> <span class="n">TRANSFORM_PARSERS</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Parser-43"><a href="#PRQL.Parser-43"><span class="linenos"> 43</span></a> <span class="s2">"DERIVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-44"><a href="#PRQL.Parser-44"><span class="linenos"> 44</span></a> <span class="s2">"SELECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-45"><a href="#PRQL.Parser-45"><span class="linenos"> 45</span></a> <span class="s2">"TAKE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_take</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-46"><a href="#PRQL.Parser-46"><span class="linenos"> 46</span></a> <span class="s2">"FILTER"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()),</span>
|
||||
</span><span id="PRQL.Parser-47"><a href="#PRQL.Parser-47"><span class="linenos"> 47</span></a> <span class="s2">"APPEND"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">union</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-48"><a href="#PRQL.Parser-48"><span class="linenos"> 48</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="PRQL.Parser-49"><a href="#PRQL.Parser-49"><span class="linenos"> 49</span></a> <span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-50"><a href="#PRQL.Parser-50"><span class="linenos"> 50</span></a> <span class="s2">"REMOVE"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">except_</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-51"><a href="#PRQL.Parser-51"><span class="linenos"> 51</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="PRQL.Parser-52"><a href="#PRQL.Parser-52"><span class="linenos"> 52</span></a> <span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-53"><a href="#PRQL.Parser-53"><span class="linenos"> 53</span></a> <span class="s2">"INTERSECT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">query</span><span class="o">.</span><span class="n">intersect</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-54"><a href="#PRQL.Parser-54"><span class="linenos"> 54</span></a> <span class="n">_select_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">()),</span> <span class="n">distinct</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span>
|
||||
</span><span id="PRQL.Parser-55"><a href="#PRQL.Parser-55"><span class="linenos"> 55</span></a> <span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-56"><a href="#PRQL.Parser-56"><span class="linenos"> 56</span></a> <span class="s2">"SORT"</span><span class="p">:</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_order_by</span><span class="p">(</span><span class="n">query</span><span class="p">),</span>
|
||||
</span><span id="PRQL.Parser-57"><a href="#PRQL.Parser-57"><span class="linenos"> 57</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL.Parser-58"><a href="#PRQL.Parser-58"><span class="linenos"> 58</span></a>
|
||||
</span><span id="PRQL.Parser-59"><a href="#PRQL.Parser-59"><span class="linenos"> 59</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-60"><a href="#PRQL.Parser-60"><span class="linenos"> 60</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting ]"</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-61"><a href="#PRQL.Parser-61"><span class="linenos"> 61</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-62"><a href="#PRQL.Parser-62"><span class="linenos"> 62</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-63"><a href="#PRQL.Parser-63"><span class="linenos"> 63</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
|
||||
</span><span id="PRQL.Parser-64"><a href="#PRQL.Parser-64"><span class="linenos"> 64</span></a>
|
||||
</span><span id="PRQL.Parser-65"><a href="#PRQL.Parser-65"><span class="linenos"> 65</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Parser-66"><a href="#PRQL.Parser-66"><span class="linenos"> 66</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span> <span class="k">else</span> <span class="n">select</span>
|
||||
</span><span id="PRQL.Parser-67"><a href="#PRQL.Parser-67"><span class="linenos"> 67</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
|
||||
</span><span id="PRQL.Parser-68"><a href="#PRQL.Parser-68"><span class="linenos"> 68</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL.Parser-59"><a href="#PRQL.Parser-59"><span class="linenos"> 59</span></a> <span class="k">def</span> <span class="nf">_parse_statement</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">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-60"><a href="#PRQL.Parser-60"><span class="linenos"> 60</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-61"><a href="#PRQL.Parser-61"><span class="linenos"> 61</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_query</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-62"><a href="#PRQL.Parser-62"><span class="linenos"> 62</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="PRQL.Parser-63"><a href="#PRQL.Parser-63"><span class="linenos"> 63</span></a>
|
||||
</span><span id="PRQL.Parser-64"><a href="#PRQL.Parser-64"><span class="linenos"> 64</span></a> <span class="k">def</span> <span class="nf">_parse_query</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-65"><a href="#PRQL.Parser-65"><span class="linenos"> 65</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_from</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-66"><a href="#PRQL.Parser-66"><span class="linenos"> 66</span></a>
|
||||
</span><span id="PRQL.Parser-67"><a href="#PRQL.Parser-67"><span class="linenos"> 67</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-68"><a href="#PRQL.Parser-68"><span class="linenos"> 68</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL.Parser-69"><a href="#PRQL.Parser-69"><span class="linenos"> 69</span></a>
|
||||
</span><span id="PRQL.Parser-70"><a href="#PRQL.Parser-70"><span class="linenos"> 70</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
|
||||
</span><span id="PRQL.Parser-71"><a href="#PRQL.Parser-71"><span class="linenos"> 71</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-72"><a href="#PRQL.Parser-72"><span class="linenos"> 72</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-73"><a href="#PRQL.Parser-73"><span class="linenos"> 73</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-74"><a href="#PRQL.Parser-74"><span class="linenos"> 74</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-75"><a href="#PRQL.Parser-75"><span class="linenos"> 75</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-76"><a href="#PRQL.Parser-76"><span class="linenos"> 76</span></a> <span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-77"><a href="#PRQL.Parser-77"><span class="linenos"> 77</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
|
||||
</span><span id="PRQL.Parser-78"><a href="#PRQL.Parser-78"><span class="linenos"> 78</span></a> <span class="p">]</span>
|
||||
</span><span id="PRQL.Parser-79"><a href="#PRQL.Parser-79"><span class="linenos"> 79</span></a>
|
||||
</span><span id="PRQL.Parser-80"><a href="#PRQL.Parser-80"><span class="linenos"> 80</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-81"><a href="#PRQL.Parser-81"><span class="linenos"> 81</span></a>
|
||||
</span><span id="PRQL.Parser-82"><a href="#PRQL.Parser-82"><span class="linenos"> 82</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-83"><a href="#PRQL.Parser-83"><span class="linenos"> 83</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-84"><a href="#PRQL.Parser-84"><span class="linenos"> 84</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-85"><a href="#PRQL.Parser-85"><span class="linenos"> 85</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-86"><a href="#PRQL.Parser-86"><span class="linenos"> 86</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-87"><a href="#PRQL.Parser-87"><span class="linenos"> 87</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-88"><a href="#PRQL.Parser-88"><span class="linenos"> 88</span></a>
|
||||
</span><span id="PRQL.Parser-89"><a href="#PRQL.Parser-89"><span class="linenos"> 89</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-90"><a href="#PRQL.Parser-90"><span class="linenos"> 90</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-91"><a href="#PRQL.Parser-91"><span class="linenos"> 91</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-92"><a href="#PRQL.Parser-92"><span class="linenos"> 92</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-93"><a href="#PRQL.Parser-93"><span class="linenos"> 93</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-94"><a href="#PRQL.Parser-94"><span class="linenos"> 94</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-95"><a href="#PRQL.Parser-95"><span class="linenos"> 95</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-96"><a href="#PRQL.Parser-96"><span class="linenos"> 96</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-97"><a href="#PRQL.Parser-97"><span class="linenos"> 97</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-98"><a href="#PRQL.Parser-98"><span class="linenos"> 98</span></a>
|
||||
</span><span id="PRQL.Parser-99"><a href="#PRQL.Parser-99"><span class="linenos"> 99</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-100"><a href="#PRQL.Parser-100"><span class="linenos">100</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="PRQL.Parser-101"><a href="#PRQL.Parser-101"><span class="linenos">101</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-102"><a href="#PRQL.Parser-102"><span class="linenos">102</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-103"><a href="#PRQL.Parser-103"><span class="linenos">103</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL.Parser-104"><a href="#PRQL.Parser-104"><span class="linenos">104</span></a>
|
||||
</span><span id="PRQL.Parser-105"><a href="#PRQL.Parser-105"><span class="linenos">105</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-106"><a href="#PRQL.Parser-106"><span class="linenos">106</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-107"><a href="#PRQL.Parser-107"><span class="linenos">107</span></a> <span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-70"><a href="#PRQL.Parser-70"><span class="linenos"> 70</span></a> <span class="n">query</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">"*"</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-71"><a href="#PRQL.Parser-71"><span class="linenos"> 71</span></a>
|
||||
</span><span id="PRQL.Parser-72"><a href="#PRQL.Parser-72"><span class="linenos"> 72</span></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_texts</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-73"><a href="#PRQL.Parser-73"><span class="linenos"> 73</span></a> <span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TRANSFORM_PARSERS</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">upper</span><span class="p">()](</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-74"><a href="#PRQL.Parser-74"><span class="linenos"> 74</span></a>
|
||||
</span><span id="PRQL.Parser-75"><a href="#PRQL.Parser-75"><span class="linenos"> 75</span></a> <span class="k">return</span> <span class="n">query</span>
|
||||
</span><span id="PRQL.Parser-76"><a href="#PRQL.Parser-76"><span class="linenos"> 76</span></a>
|
||||
</span><span id="PRQL.Parser-77"><a href="#PRQL.Parser-77"><span class="linenos"> 77</span></a> <span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">,</span> <span class="n">append</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-78"><a href="#PRQL.Parser-78"><span class="linenos"> 78</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-79"><a href="#PRQL.Parser-79"><span class="linenos"> 79</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-80"><a href="#PRQL.Parser-80"><span class="linenos"> 80</span></a>
|
||||
</span><span id="PRQL.Parser-81"><a href="#PRQL.Parser-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">,</span> <span class="n">expression</span><span class="o">=</span><span class="n">query</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-82"><a href="#PRQL.Parser-82"><span class="linenos"> 82</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting }"</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-83"><a href="#PRQL.Parser-83"><span class="linenos"> 83</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-84"><a href="#PRQL.Parser-84"><span class="linenos"> 84</span></a> <span class="n">expression</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_expression</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-85"><a href="#PRQL.Parser-85"><span class="linenos"> 85</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span><span class="n">expression</span><span class="p">]</span> <span class="k">if</span> <span class="n">expression</span> <span class="k">else</span> <span class="p">[]</span>
|
||||
</span><span id="PRQL.Parser-86"><a href="#PRQL.Parser-86"><span class="linenos"> 86</span></a>
|
||||
</span><span id="PRQL.Parser-87"><a href="#PRQL.Parser-87"><span class="linenos"> 87</span></a> <span class="n">projections</span> <span class="o">=</span> <span class="p">{</span>
|
||||
</span><span id="PRQL.Parser-88"><a href="#PRQL.Parser-88"><span class="linenos"> 88</span></a> <span class="n">select</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">:</span> <span class="n">select</span><span class="o">.</span><span class="n">this</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">)</span> <span class="k">else</span> <span class="n">select</span>
|
||||
</span><span id="PRQL.Parser-89"><a href="#PRQL.Parser-89"><span class="linenos"> 89</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">selects</span>
|
||||
</span><span id="PRQL.Parser-90"><a href="#PRQL.Parser-90"><span class="linenos"> 90</span></a> <span class="p">}</span>
|
||||
</span><span id="PRQL.Parser-91"><a href="#PRQL.Parser-91"><span class="linenos"> 91</span></a>
|
||||
</span><span id="PRQL.Parser-92"><a href="#PRQL.Parser-92"><span class="linenos"> 92</span></a> <span class="n">selects</span> <span class="o">=</span> <span class="p">[</span>
|
||||
</span><span id="PRQL.Parser-93"><a href="#PRQL.Parser-93"><span class="linenos"> 93</span></a> <span class="n">select</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-94"><a href="#PRQL.Parser-94"><span class="linenos"> 94</span></a> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="p">(</span><span class="n">projections</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">projections</span> <span class="k">else</span> <span class="n">s</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-95"><a href="#PRQL.Parser-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Column</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-96"><a href="#PRQL.Parser-96"><span class="linenos"> 96</span></a> <span class="k">else</span> <span class="n">s</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-97"><a href="#PRQL.Parser-97"><span class="linenos"> 97</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-98"><a href="#PRQL.Parser-98"><span class="linenos"> 98</span></a> <span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-99"><a href="#PRQL.Parser-99"><span class="linenos"> 99</span></a> <span class="k">for</span> <span class="n">select</span> <span class="ow">in</span> <span class="n">selects</span>
|
||||
</span><span id="PRQL.Parser-100"><a href="#PRQL.Parser-100"><span class="linenos">100</span></a> <span class="p">]</span>
|
||||
</span><span id="PRQL.Parser-101"><a href="#PRQL.Parser-101"><span class="linenos">101</span></a>
|
||||
</span><span id="PRQL.Parser-102"><a href="#PRQL.Parser-102"><span class="linenos">102</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">selects</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="n">append</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-103"><a href="#PRQL.Parser-103"><span class="linenos">103</span></a>
|
||||
</span><span id="PRQL.Parser-104"><a href="#PRQL.Parser-104"><span class="linenos">104</span></a> <span class="k">def</span> <span class="nf">_parse_take</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-105"><a href="#PRQL.Parser-105"><span class="linenos">105</span></a> <span class="n">num</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_number</span><span class="p">()</span> <span class="c1"># TODO: TAKE for ranges a..b</span>
|
||||
</span><span id="PRQL.Parser-106"><a href="#PRQL.Parser-106"><span class="linenos">106</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="k">if</span> <span class="n">num</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL.Parser-107"><a href="#PRQL.Parser-107"><span class="linenos">107</span></a>
|
||||
</span><span id="PRQL.Parser-108"><a href="#PRQL.Parser-108"><span class="linenos">108</span></a> <span class="k">def</span> <span class="nf">_parse_ordered</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-109"><a href="#PRQL.Parser-109"><span class="linenos">109</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">parse_method</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Callable</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL.Parser-110"><a href="#PRQL.Parser-110"><span class="linenos">110</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Ordered</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-111"><a href="#PRQL.Parser-111"><span class="linenos">111</span></a> <span class="n">asc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">PLUS</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-112"><a href="#PRQL.Parser-112"><span class="linenos">112</span></a> <span class="n">desc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">DASH</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">asc</span> <span class="ow">and</span> <span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-113"><a href="#PRQL.Parser-113"><span class="linenos">113</span></a> <span class="n">term</span> <span class="o">=</span> <span class="n">term</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">(</span><span class="n">parse_method</span><span class="o">=</span><span class="n">parse_method</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-114"><a href="#PRQL.Parser-114"><span class="linenos">114</span></a> <span class="k">if</span> <span class="n">term</span> <span class="ow">and</span> <span class="n">desc</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-115"><a href="#PRQL.Parser-115"><span class="linenos">115</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"desc"</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-116"><a href="#PRQL.Parser-116"><span class="linenos">116</span></a> <span class="n">term</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"nulls_first"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-117"><a href="#PRQL.Parser-117"><span class="linenos">117</span></a> <span class="k">return</span> <span class="n">term</span>
|
||||
</span><span id="PRQL.Parser-118"><a href="#PRQL.Parser-118"><span class="linenos">118</span></a>
|
||||
</span><span id="PRQL.Parser-119"><a href="#PRQL.Parser-119"><span class="linenos">119</span></a> <span class="k">def</span> <span class="nf">_parse_order_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Select</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-120"><a href="#PRQL.Parser-120"><span class="linenos">120</span></a> <span class="n">l_brace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">L_BRACE</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-121"><a href="#PRQL.Parser-121"><span class="linenos">121</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_csv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_ordered</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-122"><a href="#PRQL.Parser-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="n">l_brace</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">R_BRACE</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-123"><a href="#PRQL.Parser-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">raise_error</span><span class="p">(</span><span class="s2">"Expecting }"</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-124"><a href="#PRQL.Parser-124"><span class="linenos">124</span></a> <span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Order</span><span class="p">,</span> <span class="n">expressions</span><span class="o">=</span><span class="n">expressions</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-125"><a href="#PRQL.Parser-125"><span class="linenos">125</span></a>
|
||||
</span><span id="PRQL.Parser-126"><a href="#PRQL.Parser-126"><span class="linenos">126</span></a> <span class="k">def</span> <span class="nf">_parse_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-127"><a href="#PRQL.Parser-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_next</span><span class="o">.</span><span class="n">token_type</span> <span class="o">==</span> <span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">:</span>
|
||||
</span><span id="PRQL.Parser-128"><a href="#PRQL.Parser-128"><span class="linenos">128</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_id_var</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-129"><a href="#PRQL.Parser-129"><span class="linenos">129</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">ALIAS</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-130"><a href="#PRQL.Parser-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Alias</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">(),</span> <span class="n">alias</span><span class="o">=</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-131"><a href="#PRQL.Parser-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_conjunction</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-132"><a href="#PRQL.Parser-132"><span class="linenos">132</span></a>
|
||||
</span><span id="PRQL.Parser-133"><a href="#PRQL.Parser-133"><span class="linenos">133</span></a> <span class="k">def</span> <span class="nf">_parse_table</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-134"><a href="#PRQL.Parser-134"><span class="linenos">134</span></a> <span class="bp">self</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-135"><a href="#PRQL.Parser-135"><span class="linenos">135</span></a> <span class="n">schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-136"><a href="#PRQL.Parser-136"><span class="linenos">136</span></a> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-137"><a href="#PRQL.Parser-137"><span class="linenos">137</span></a> <span class="n">alias_tokens</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">Collection</span><span class="p">[</span><span class="n">TokenType</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-138"><a href="#PRQL.Parser-138"><span class="linenos">138</span></a> <span class="n">parse_bracket</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-139"><a href="#PRQL.Parser-139"><span class="linenos">139</span></a> <span class="n">is_db_reference</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="PRQL.Parser-140"><a href="#PRQL.Parser-140"><span class="linenos">140</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">Expression</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-141"><a href="#PRQL.Parser-141"><span class="linenos">141</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_table_parts</span><span class="p">()</span>
|
||||
</span><span id="PRQL.Parser-142"><a href="#PRQL.Parser-142"><span class="linenos">142</span></a>
|
||||
</span><span id="PRQL.Parser-143"><a href="#PRQL.Parser-143"><span class="linenos">143</span></a> <span class="k">def</span> <span class="nf">_parse_from</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-144"><a href="#PRQL.Parser-144"><span class="linenos">144</span></a> <span class="bp">self</span><span class="p">,</span> <span class="n">joins</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">skip_from_token</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="PRQL.Parser-145"><a href="#PRQL.Parser-145"><span class="linenos">145</span></a> <span class="p">)</span> <span class="o">-></span> <span class="n">t</span><span class="o">.</span><span class="n">Optional</span><span class="p">[</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">]:</span>
|
||||
</span><span id="PRQL.Parser-146"><a href="#PRQL.Parser-146"><span class="linenos">146</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">skip_from_token</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">TokenType</span><span class="o">.</span><span class="n">FROM</span><span class="p">):</span>
|
||||
</span><span id="PRQL.Parser-147"><a href="#PRQL.Parser-147"><span class="linenos">147</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="PRQL.Parser-148"><a href="#PRQL.Parser-148"><span class="linenos">148</span></a>
|
||||
</span><span id="PRQL.Parser-149"><a href="#PRQL.Parser-149"><span class="linenos">149</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">expression</span><span class="p">(</span>
|
||||
</span><span id="PRQL.Parser-150"><a href="#PRQL.Parser-150"><span class="linenos">150</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">comments</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prev_comments</span><span class="p">,</span> <span class="n">this</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_parse_table</span><span class="p">(</span><span class="n">joins</span><span class="o">=</span><span class="n">joins</span><span class="p">)</span>
|
||||
</span><span id="PRQL.Parser-151"><a href="#PRQL.Parser-151"><span class="linenos">151</span></a> <span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -890,10 +1031,24 @@ Default: 3</li>
|
|||
</div>
|
||||
|
||||
|
||||
<div id="PRQL.Parser.CONJUNCTION" class="classattr">
|
||||
<div class="attr variable">
|
||||
<span class="name">CONJUNCTION</span> =
|
||||
<input id="PRQL.Parser.CONJUNCTION-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="PRQL.Parser.CONJUNCTION-view-value"></label><span class="default_value">{<TokenType.AND: 'AND'>: <class '<a href="../expressions.html#And">sqlglot.expressions.And</a>'>, <TokenType.OR: 'OR'>: <class '<a href="../expressions.html#Or">sqlglot.expressions.Or</a>'>, <TokenType.DAMP: 'DAMP'>: <class '<a href="../expressions.html#And">sqlglot.expressions.And</a>'>, <TokenType.DPIPE: 'DPIPE'>: <class '<a href="../expressions.html#Or">sqlglot.expressions.Or</a>'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
<a class="headerlink" href="#PRQL.Parser.CONJUNCTION"></a>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div id="PRQL.Parser.TRANSFORM_PARSERS" class="classattr">
|
||||
<div class="attr variable">
|
||||
<span class="name">TRANSFORM_PARSERS</span> =
|
||||
<span class="default_value">{'DERIVE': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'SELECT': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>}</span>
|
||||
<input id="PRQL.Parser.TRANSFORM_PARSERS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="PRQL.Parser.TRANSFORM_PARSERS-view-value"></label><span class="default_value">{'DERIVE': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'SELECT': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'TAKE': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'FILTER': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'APPEND': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'REMOVE': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'INTERSECT': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>, 'SORT': <function <a href="#PRQL.Parser">PRQL.Parser</a>.<lambda>>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
@ -951,7 +1106,6 @@ Default: 3</li>
|
|||
<dd id="PRQL.Parser.UPDATE_ALIAS_TOKENS" class="variable"><a href="../parser.html#Parser.UPDATE_ALIAS_TOKENS">UPDATE_ALIAS_TOKENS</a></dd>
|
||||
<dd id="PRQL.Parser.TRIM_TYPES" class="variable"><a href="../parser.html#Parser.TRIM_TYPES">TRIM_TYPES</a></dd>
|
||||
<dd id="PRQL.Parser.FUNC_TOKENS" class="variable"><a href="../parser.html#Parser.FUNC_TOKENS">FUNC_TOKENS</a></dd>
|
||||
<dd id="PRQL.Parser.CONJUNCTION" class="variable"><a href="../parser.html#Parser.CONJUNCTION">CONJUNCTION</a></dd>
|
||||
<dd id="PRQL.Parser.EQUALITY" class="variable"><a href="../parser.html#Parser.EQUALITY">EQUALITY</a></dd>
|
||||
<dd id="PRQL.Parser.COMPARISON" class="variable"><a href="../parser.html#Parser.COMPARISON">COMPARISON</a></dd>
|
||||
<dd id="PRQL.Parser.BITWISE" class="variable"><a href="../parser.html#Parser.BITWISE">BITWISE</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 one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1893,7 +1893,7 @@ belong to some totally-ordered set.</p>
|
|||
<section id="DATE_UNITS">
|
||||
<div class="attr variable">
|
||||
<span class="name">DATE_UNITS</span> =
|
||||
<span class="default_value">{'day', 'quarter', 'week', 'year_month', 'year', 'month'}</span>
|
||||
<span class="default_value">{'year_month', 'quarter', 'week', 'day', 'year', 'month'}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
@ -577,7 +577,7 @@
|
|||
<div class="attr variable">
|
||||
<span class="name">ALL_JSON_PATH_PARTS</span> =
|
||||
<input id="ALL_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="ALL_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="expressions.html#JSONPathFilter">sqlglot.expressions.JSONPathFilter</a>'>, <class '<a href="expressions.html#JSONPathUnion">sqlglot.expressions.JSONPathUnion</a>'>, <class '<a href="expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="expressions.html#JSONPathSelector">sqlglot.expressions.JSONPathSelector</a>'>, <class '<a href="expressions.html#JSONPathSlice">sqlglot.expressions.JSONPathSlice</a>'>, <class '<a href="expressions.html#JSONPathScript">sqlglot.expressions.JSONPathScript</a>'>, <class '<a href="expressions.html#JSONPathWildcard">sqlglot.expressions.JSONPathWildcard</a>'>, <class '<a href="expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>, <class '<a href="expressions.html#JSONPathRecursive">sqlglot.expressions.JSONPathRecursive</a>'>, <class '<a href="expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="ALL_JSON_PATH_PARTS-view-value"></label><span class="default_value">{<class '<a href="expressions.html#JSONPathKey">sqlglot.expressions.JSONPathKey</a>'>, <class '<a href="expressions.html#JSONPathWildcard">sqlglot.expressions.JSONPathWildcard</a>'>, <class '<a href="expressions.html#JSONPathFilter">sqlglot.expressions.JSONPathFilter</a>'>, <class '<a href="expressions.html#JSONPathUnion">sqlglot.expressions.JSONPathUnion</a>'>, <class '<a href="expressions.html#JSONPathSubscript">sqlglot.expressions.JSONPathSubscript</a>'>, <class '<a href="expressions.html#JSONPathSelector">sqlglot.expressions.JSONPathSelector</a>'>, <class '<a href="expressions.html#JSONPathSlice">sqlglot.expressions.JSONPathSlice</a>'>, <class '<a href="expressions.html#JSONPathScript">sqlglot.expressions.JSONPathScript</a>'>, <class '<a href="expressions.html#JSONPathRoot">sqlglot.expressions.JSONPathRoot</a>'>, <class '<a href="expressions.html#JSONPathRecursive">sqlglot.expressions.JSONPathRecursive</a>'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -586,7 +586,7 @@ queries if it would result in multiple table selects in a single query:</p>
|
|||
<div class="attr variable">
|
||||
<span class="name">UNMERGABLE_ARGS</span> =
|
||||
<input id="UNMERGABLE_ARGS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'into', 'having', 'sort', 'match', 'locks', 'group', 'sample', 'prewhere', 'laterals', 'limit', 'kind', 'settings', 'with', 'options', 'qualify', 'offset', 'windows', 'connect', 'format', 'pivots', 'cluster', 'distribute', 'distinct'}</span>
|
||||
<label class="view-value-button pdoc-button" for="UNMERGABLE_ARGS-view-value"></label><span class="default_value">{'into', 'prewhere', 'limit', 'distribute', 'kind', 'offset', 'cluster', 'match', 'settings', 'with', 'sort', 'connect', 'qualify', 'having', 'sample', 'distinct', 'locks', 'group', 'pivots', 'options', 'windows', 'format', 'laterals'}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -113,7 +113,7 @@
|
|||
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">table</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"catalog"</span><span class="p">)</span> <span class="ow">and</span> <span class="n">table</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"db"</span><span class="p">):</span>
|
||||
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="n">table</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"catalog"</span><span class="p">,</span> <span class="n">catalog</span><span class="p">)</span>
|
||||
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">if</span> <span class="p">(</span><span class="n">db</span> <span class="ow">or</span> <span class="n">catalog</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
|
||||
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)):</span>
|
||||
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="n">_qualify</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
|
||||
|
@ -136,10 +136,10 @@
|
|||
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">if</span> <span class="n">pivots</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">())))</span>
|
||||
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</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">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="n">_qualify</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="n">table_aliases</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</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">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">pivots</span> <span class="o">=</span> <span class="n">pivots</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pivots"</span><span class="p">)</span>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">source</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="c1"># Don't add the pivot's alias to the pivoted table, use the table's name instead</span>
|
||||
|
@ -149,43 +149,58 @@
|
|||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="c1"># Mutates the source by attaching an alias to it</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">alias</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">name</span> <span class="ow">or</span> <span class="n">source</span><span class="o">.</span><span class="n">name</span> <span class="ow">or</span> <span class="n">next_alias_name</span><span class="p">(),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="n">pivots</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="s2">"alias"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="p">)</span>
|
||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">if</span> <span class="n">schema</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ReadCSV</span><span class="p">):</span>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">with</span> <span class="n">csv_reader</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">as</span> <span class="n">reader</span><span class="p">:</span>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">header</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">add_table</span><span class="p">(</span>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">source</span><span class="p">,</span>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">columns</span><span class="p">)},</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="n">match_depth</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="p">)</span>
|
||||
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="k">elif</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 class="ow">and</span> <span class="n">source</span><span class="o">.</span><span class="n">is_udtf</span><span class="p">:</span>
|
||||
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">udtf</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">expression</span>
|
||||
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">udtf</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span>
|
||||
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">())</span>
|
||||
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="p">)</span>
|
||||
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="n">udtf</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a>
|
||||
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
||||
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"this"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">udtf</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Values</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">udtf</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"columns"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="sa">f</span><span class="s2">"_col_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">))</span>
|
||||
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
|
||||
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span>
|
||||
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">node</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
|
||||
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="p">):</span>
|
||||
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="c1"># Mutates the table by attaching an alias to it</span>
|
||||
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="n">alias</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a>
|
||||
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">table_aliases</span><span class="p">[</span><span class="s2">"."</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">source</span><span class="o">.</span><span class="n">parts</span><span class="p">)]</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">source</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="p">)</span>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a>
|
||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="n">_qualify</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="n">pivots</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="s2">"alias"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="p">)</span>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="k">if</span> <span class="n">schema</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ReadCSV</span><span class="p">):</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="k">with</span> <span class="n">csv_reader</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">as</span> <span class="n">reader</span><span class="p">:</span>
|
||||
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="n">header</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">add_table</span><span class="p">(</span>
|
||||
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">source</span><span class="p">,</span>
|
||||
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">columns</span><span class="p">)},</span>
|
||||
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="n">match_depth</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="p">)</span>
|
||||
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="k">elif</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 class="ow">and</span> <span class="n">source</span><span class="o">.</span><span class="n">is_udtf</span><span class="p">:</span>
|
||||
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="n">udtf</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">expression</span>
|
||||
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">udtf</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span>
|
||||
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">())</span>
|
||||
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="p">)</span>
|
||||
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">udtf</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
|
||||
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
||||
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"this"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">udtf</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Values</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">udtf</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"columns"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="sa">f</span><span class="s2">"_col_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">))</span>
|
||||
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
|
||||
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span>
|
||||
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">node</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
|
||||
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="p">):</span>
|
||||
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="c1"># Mutates the table by attaching an alias to it</span>
|
||||
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">alias</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a>
|
||||
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
|
||||
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">table_aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"."</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">column</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
|
||||
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a>
|
||||
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">if</span> <span class="n">table_alias</span><span class="p">:</span>
|
||||
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">COLUMN_PARTS</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
||||
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"table"</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a>
|
||||
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -243,7 +258,7 @@
|
|||
</span><span id="qualify_tables-56"><a href="#qualify_tables-56"><span class="linenos"> 56</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">table</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"catalog"</span><span class="p">)</span> <span class="ow">and</span> <span class="n">table</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"db"</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-57"><a href="#qualify_tables-57"><span class="linenos"> 57</span></a> <span class="n">table</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"catalog"</span><span class="p">,</span> <span class="n">catalog</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-58"><a href="#qualify_tables-58"><span class="linenos"> 58</span></a>
|
||||
</span><span id="qualify_tables-59"><a href="#qualify_tables-59"><span class="linenos"> 59</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-59"><a href="#qualify_tables-59"><span class="linenos"> 59</span></a> <span class="k">if</span> <span class="p">(</span><span class="n">db</span> <span class="ow">or</span> <span class="n">catalog</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-60"><a href="#qualify_tables-60"><span class="linenos"> 60</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Query</span><span class="p">)):</span>
|
||||
</span><span id="qualify_tables-61"><a href="#qualify_tables-61"><span class="linenos"> 61</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-62"><a href="#qualify_tables-62"><span class="linenos"> 62</span></a> <span class="n">_qualify</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
|
||||
|
@ -266,10 +281,10 @@
|
|||
</span><span id="qualify_tables-79"><a href="#qualify_tables-79"><span class="linenos"> 79</span></a> <span class="k">if</span> <span class="n">pivots</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-80"><a href="#qualify_tables-80"><span class="linenos"> 80</span></a> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">())))</span>
|
||||
</span><span id="qualify_tables-81"><a href="#qualify_tables-81"><span class="linenos"> 81</span></a>
|
||||
</span><span id="qualify_tables-82"><a href="#qualify_tables-82"><span class="linenos"> 82</span></a> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="qualify_tables-83"><a href="#qualify_tables-83"><span class="linenos"> 83</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">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-84"><a href="#qualify_tables-84"><span class="linenos"> 84</span></a> <span class="n">_qualify</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-85"><a href="#qualify_tables-85"><span class="linenos"> 85</span></a>
|
||||
</span><span id="qualify_tables-82"><a href="#qualify_tables-82"><span class="linenos"> 82</span></a> <span class="n">table_aliases</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="qualify_tables-83"><a href="#qualify_tables-83"><span class="linenos"> 83</span></a>
|
||||
</span><span id="qualify_tables-84"><a href="#qualify_tables-84"><span class="linenos"> 84</span></a> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="qualify_tables-85"><a href="#qualify_tables-85"><span class="linenos"> 85</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">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-86"><a href="#qualify_tables-86"><span class="linenos"> 86</span></a> <span class="n">pivots</span> <span class="o">=</span> <span class="n">pivots</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pivots"</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-87"><a href="#qualify_tables-87"><span class="linenos"> 87</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">source</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-88"><a href="#qualify_tables-88"><span class="linenos"> 88</span></a> <span class="c1"># Don't add the pivot's alias to the pivoted table, use the table's name instead</span>
|
||||
|
@ -279,43 +294,58 @@
|
|||
</span><span id="qualify_tables-92"><a href="#qualify_tables-92"><span class="linenos"> 92</span></a> <span class="c1"># Mutates the source by attaching an alias to it</span>
|
||||
</span><span id="qualify_tables-93"><a href="#qualify_tables-93"><span class="linenos"> 93</span></a> <span class="n">alias</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">name</span> <span class="ow">or</span> <span class="n">source</span><span class="o">.</span><span class="n">name</span> <span class="ow">or</span> <span class="n">next_alias_name</span><span class="p">(),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-94"><a href="#qualify_tables-94"><span class="linenos"> 94</span></a>
|
||||
</span><span id="qualify_tables-95"><a href="#qualify_tables-95"><span class="linenos"> 95</span></a> <span class="k">if</span> <span class="n">pivots</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-96"><a href="#qualify_tables-96"><span class="linenos"> 96</span></a> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
||||
</span><span id="qualify_tables-97"><a href="#qualify_tables-97"><span class="linenos"> 97</span></a> <span class="s2">"alias"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="qualify_tables-98"><a href="#qualify_tables-98"><span class="linenos"> 98</span></a> <span class="p">)</span>
|
||||
</span><span id="qualify_tables-99"><a href="#qualify_tables-99"><span class="linenos"> 99</span></a>
|
||||
</span><span id="qualify_tables-100"><a href="#qualify_tables-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="n">schema</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ReadCSV</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-101"><a href="#qualify_tables-101"><span class="linenos">101</span></a> <span class="k">with</span> <span class="n">csv_reader</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">as</span> <span class="n">reader</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-102"><a href="#qualify_tables-102"><span class="linenos">102</span></a> <span class="n">header</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-103"><a href="#qualify_tables-103"><span class="linenos">103</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-104"><a href="#qualify_tables-104"><span class="linenos">104</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">add_table</span><span class="p">(</span>
|
||||
</span><span id="qualify_tables-105"><a href="#qualify_tables-105"><span class="linenos">105</span></a> <span class="n">source</span><span class="p">,</span>
|
||||
</span><span id="qualify_tables-106"><a href="#qualify_tables-106"><span class="linenos">106</span></a> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">columns</span><span class="p">)},</span>
|
||||
</span><span id="qualify_tables-107"><a href="#qualify_tables-107"><span class="linenos">107</span></a> <span class="n">match_depth</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="qualify_tables-108"><a href="#qualify_tables-108"><span class="linenos">108</span></a> <span class="p">)</span>
|
||||
</span><span id="qualify_tables-109"><a href="#qualify_tables-109"><span class="linenos">109</span></a> <span class="k">elif</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 class="ow">and</span> <span class="n">source</span><span class="o">.</span><span class="n">is_udtf</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-110"><a href="#qualify_tables-110"><span class="linenos">110</span></a> <span class="n">udtf</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">expression</span>
|
||||
</span><span id="qualify_tables-111"><a href="#qualify_tables-111"><span class="linenos">111</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">udtf</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span>
|
||||
</span><span id="qualify_tables-112"><a href="#qualify_tables-112"><span class="linenos">112</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">())</span>
|
||||
</span><span id="qualify_tables-113"><a href="#qualify_tables-113"><span class="linenos">113</span></a> <span class="p">)</span>
|
||||
</span><span id="qualify_tables-114"><a href="#qualify_tables-114"><span class="linenos">114</span></a> <span class="n">udtf</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-115"><a href="#qualify_tables-115"><span class="linenos">115</span></a>
|
||||
</span><span id="qualify_tables-116"><a href="#qualify_tables-116"><span class="linenos">116</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-117"><a href="#qualify_tables-117"><span class="linenos">117</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"this"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="qualify_tables-118"><a href="#qualify_tables-118"><span class="linenos">118</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">udtf</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Values</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-119"><a href="#qualify_tables-119"><span class="linenos">119</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">udtf</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-120"><a href="#qualify_tables-120"><span class="linenos">120</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"columns"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="sa">f</span><span class="s2">"_col_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">))</span>
|
||||
</span><span id="qualify_tables-121"><a href="#qualify_tables-121"><span class="linenos">121</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-122"><a href="#qualify_tables-122"><span class="linenos">122</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
|
||||
</span><span id="qualify_tables-123"><a href="#qualify_tables-123"><span class="linenos">123</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="qualify_tables-124"><a href="#qualify_tables-124"><span class="linenos">124</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-125"><a href="#qualify_tables-125"><span class="linenos">125</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">node</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="qualify_tables-126"><a href="#qualify_tables-126"><span class="linenos">126</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
|
||||
</span><span id="qualify_tables-127"><a href="#qualify_tables-127"><span class="linenos">127</span></a> <span class="p">):</span>
|
||||
</span><span id="qualify_tables-128"><a href="#qualify_tables-128"><span class="linenos">128</span></a> <span class="c1"># Mutates the table by attaching an alias to it</span>
|
||||
</span><span id="qualify_tables-129"><a href="#qualify_tables-129"><span class="linenos">129</span></a> <span class="n">alias</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-130"><a href="#qualify_tables-130"><span class="linenos">130</span></a>
|
||||
</span><span id="qualify_tables-131"><a href="#qualify_tables-131"><span class="linenos">131</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span><span id="qualify_tables-95"><a href="#qualify_tables-95"><span class="linenos"> 95</span></a> <span class="n">table_aliases</span><span class="p">[</span><span class="s2">"."</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">source</span><span class="o">.</span><span class="n">parts</span><span class="p">)]</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span>
|
||||
</span><span id="qualify_tables-96"><a href="#qualify_tables-96"><span class="linenos"> 96</span></a> <span class="n">source</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="qualify_tables-97"><a href="#qualify_tables-97"><span class="linenos"> 97</span></a> <span class="p">)</span>
|
||||
</span><span id="qualify_tables-98"><a href="#qualify_tables-98"><span class="linenos"> 98</span></a>
|
||||
</span><span id="qualify_tables-99"><a href="#qualify_tables-99"><span class="linenos"> 99</span></a> <span class="n">_qualify</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-100"><a href="#qualify_tables-100"><span class="linenos">100</span></a>
|
||||
</span><span id="qualify_tables-101"><a href="#qualify_tables-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="n">pivots</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-102"><a href="#qualify_tables-102"><span class="linenos">102</span></a> <span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span>
|
||||
</span><span id="qualify_tables-103"><a href="#qualify_tables-103"><span class="linenos">103</span></a> <span class="s2">"alias"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="qualify_tables-104"><a href="#qualify_tables-104"><span class="linenos">104</span></a> <span class="p">)</span>
|
||||
</span><span id="qualify_tables-105"><a href="#qualify_tables-105"><span class="linenos">105</span></a>
|
||||
</span><span id="qualify_tables-106"><a href="#qualify_tables-106"><span class="linenos">106</span></a> <span class="k">if</span> <span class="n">schema</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">ReadCSV</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-107"><a href="#qualify_tables-107"><span class="linenos">107</span></a> <span class="k">with</span> <span class="n">csv_reader</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">this</span><span class="p">)</span> <span class="k">as</span> <span class="n">reader</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-108"><a href="#qualify_tables-108"><span class="linenos">108</span></a> <span class="n">header</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-109"><a href="#qualify_tables-109"><span class="linenos">109</span></a> <span class="n">columns</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">reader</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-110"><a href="#qualify_tables-110"><span class="linenos">110</span></a> <span class="n">schema</span><span class="o">.</span><span class="n">add_table</span><span class="p">(</span>
|
||||
</span><span id="qualify_tables-111"><a href="#qualify_tables-111"><span class="linenos">111</span></a> <span class="n">source</span><span class="p">,</span>
|
||||
</span><span id="qualify_tables-112"><a href="#qualify_tables-112"><span class="linenos">112</span></a> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="n">columns</span><span class="p">)},</span>
|
||||
</span><span id="qualify_tables-113"><a href="#qualify_tables-113"><span class="linenos">113</span></a> <span class="n">match_depth</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="qualify_tables-114"><a href="#qualify_tables-114"><span class="linenos">114</span></a> <span class="p">)</span>
|
||||
</span><span id="qualify_tables-115"><a href="#qualify_tables-115"><span class="linenos">115</span></a> <span class="k">elif</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 class="ow">and</span> <span class="n">source</span><span class="o">.</span><span class="n">is_udtf</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-116"><a href="#qualify_tables-116"><span class="linenos">116</span></a> <span class="n">udtf</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">expression</span>
|
||||
</span><span id="qualify_tables-117"><a href="#qualify_tables-117"><span class="linenos">117</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">udtf</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">exp</span><span class="o">.</span><span class="n">TableAlias</span><span class="p">(</span>
|
||||
</span><span id="qualify_tables-118"><a href="#qualify_tables-118"><span class="linenos">118</span></a> <span class="n">this</span><span class="o">=</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">())</span>
|
||||
</span><span id="qualify_tables-119"><a href="#qualify_tables-119"><span class="linenos">119</span></a> <span class="p">)</span>
|
||||
</span><span id="qualify_tables-120"><a href="#qualify_tables-120"><span class="linenos">120</span></a> <span class="n">udtf</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"alias"</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-121"><a href="#qualify_tables-121"><span class="linenos">121</span></a>
|
||||
</span><span id="qualify_tables-122"><a href="#qualify_tables-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-123"><a href="#qualify_tables-123"><span class="linenos">123</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"this"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="qualify_tables-124"><a href="#qualify_tables-124"><span class="linenos">124</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">udtf</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Values</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">table_alias</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-125"><a href="#qualify_tables-125"><span class="linenos">125</span></a> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">udtf</span><span class="o">.</span><span class="n">expressions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="qualify_tables-126"><a href="#qualify_tables-126"><span class="linenos">126</span></a> <span class="n">table_alias</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"columns"</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="sa">f</span><span class="s2">"_col_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">))</span>
|
||||
</span><span id="qualify_tables-127"><a href="#qualify_tables-127"><span class="linenos">127</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-128"><a href="#qualify_tables-128"><span class="linenos">128</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
|
||||
</span><span id="qualify_tables-129"><a href="#qualify_tables-129"><span class="linenos">129</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="qualify_tables-130"><a href="#qualify_tables-130"><span class="linenos">130</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-131"><a href="#qualify_tables-131"><span class="linenos">131</span></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">node</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="qualify_tables-132"><a href="#qualify_tables-132"><span class="linenos">132</span></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">))</span>
|
||||
</span><span id="qualify_tables-133"><a href="#qualify_tables-133"><span class="linenos">133</span></a> <span class="p">):</span>
|
||||
</span><span id="qualify_tables-134"><a href="#qualify_tables-134"><span class="linenos">134</span></a> <span class="c1"># Mutates the table by attaching an alias to it</span>
|
||||
</span><span id="qualify_tables-135"><a href="#qualify_tables-135"><span class="linenos">135</span></a> <span class="n">alias</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">table</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-136"><a href="#qualify_tables-136"><span class="linenos">136</span></a>
|
||||
</span><span id="qualify_tables-137"><a href="#qualify_tables-137"><span class="linenos">137</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-138"><a href="#qualify_tables-138"><span class="linenos">138</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-139"><a href="#qualify_tables-139"><span class="linenos">139</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">table_aliases</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"."</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">column</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]))</span>
|
||||
</span><span id="qualify_tables-140"><a href="#qualify_tables-140"><span class="linenos">140</span></a>
|
||||
</span><span id="qualify_tables-141"><a href="#qualify_tables-141"><span class="linenos">141</span></a> <span class="k">if</span> <span class="n">table_alias</span><span class="p">:</span>
|
||||
</span><span id="qualify_tables-142"><a href="#qualify_tables-142"><span class="linenos">142</span></a> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">exp</span><span class="o">.</span><span class="n">COLUMN_PARTS</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
|
||||
</span><span id="qualify_tables-143"><a href="#qualify_tables-143"><span class="linenos">143</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-144"><a href="#qualify_tables-144"><span class="linenos">144</span></a> <span class="n">column</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"table"</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="qualify_tables-145"><a href="#qualify_tables-145"><span class="linenos">145</span></a>
|
||||
</span><span id="qualify_tables-146"><a href="#qualify_tables-146"><span class="linenos">146</span></a> <span class="k">return</span> <span class="n">expression</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
|
|
@ -838,7 +838,7 @@
|
|||
</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-601"><a href="#L-601"><span class="linenos">601</span></a>
|
||||
</span><span id="L-602"><a href="#L-602"><span class="linenos">602</span></a> <span class="k">for</span> <span class="n">cte</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">ctes</span><span class="p">:</span>
|
||||
</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a> <span class="n">recursive_scope</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a> <span class="n">cte_name</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="L-604"><a href="#L-604"><span class="linenos">604</span></a>
|
||||
</span><span id="L-605"><a href="#L-605"><span class="linenos">605</span></a> <span class="c1"># if the scope is a recursive cte, it must be in the form of base_case UNION recursive.</span>
|
||||
</span><span id="L-606"><a href="#L-606"><span class="linenos">606</span></a> <span class="c1"># thus the recursive scope is the first section of the union.</span>
|
||||
|
@ -847,7 +847,7 @@
|
|||
</span><span id="L-609"><a href="#L-609"><span class="linenos">609</span></a> <span class="n">union</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">this</span>
|
||||
</span><span id="L-610"><a href="#L-610"><span class="linenos">610</span></a>
|
||||
</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Union</span><span class="p">):</span>
|
||||
</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a> <span class="n">recursive_scope</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">union</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
|
||||
</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">cte_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">union</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
|
||||
</span><span id="L-613"><a href="#L-613"><span class="linenos">613</span></a>
|
||||
</span><span id="L-614"><a href="#L-614"><span class="linenos">614</span></a> <span class="n">child_scope</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-615"><a href="#L-615"><span class="linenos">615</span></a>
|
||||
|
@ -861,233 +861,227 @@
|
|||
</span><span id="L-623"><a href="#L-623"><span class="linenos">623</span></a> <span class="p">):</span>
|
||||
</span><span id="L-624"><a href="#L-624"><span class="linenos">624</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-625"><a href="#L-625"><span class="linenos">625</span></a>
|
||||
</span><span id="L-626"><a href="#L-626"><span class="linenos">626</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">cte</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="L-627"><a href="#L-627"><span class="linenos">627</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-628"><a href="#L-628"><span class="linenos">628</span></a>
|
||||
</span><span id="L-629"><a href="#L-629"><span class="linenos">629</span></a> <span class="k">if</span> <span class="n">recursive_scope</span><span class="p">:</span>
|
||||
</span><span id="L-630"><a href="#L-630"><span class="linenos">630</span></a> <span class="n">child_scope</span><span class="o">.</span><span class="n">add_source</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">recursive_scope</span><span class="p">)</span>
|
||||
</span><span id="L-631"><a href="#L-631"><span class="linenos">631</span></a> <span class="n">child_scope</span><span class="o">.</span><span class="n">cte_sources</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">recursive_scope</span>
|
||||
</span><span id="L-632"><a href="#L-632"><span class="linenos">632</span></a>
|
||||
</span><span id="L-633"><a href="#L-633"><span class="linenos">633</span></a> <span class="c1"># append the final child_scope yielded</span>
|
||||
</span><span id="L-634"><a href="#L-634"><span class="linenos">634</span></a> <span class="k">if</span> <span class="n">child_scope</span><span class="p">:</span>
|
||||
</span><span id="L-635"><a href="#L-635"><span class="linenos">635</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">cte_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
|
||||
</span><span id="L-636"><a href="#L-636"><span class="linenos">636</span></a>
|
||||
</span><span id="L-637"><a href="#L-637"><span class="linenos">637</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-638"><a href="#L-638"><span class="linenos">638</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">cte_sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-639"><a href="#L-639"><span class="linenos">639</span></a>
|
||||
</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a>
|
||||
</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a><span class="k">def</span> <span class="nf">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||||
</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a><span class="sd"> We represent (tbl1 JOIN tbl2) as a Subquery, but it's not really a "derived table",</span>
|
||||
</span><span id="L-644"><a href="#L-644"><span class="linenos">644</span></a><span class="sd"> as it doesn't introduce a new scope. If an alias is present, it shadows all names</span>
|
||||
</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a><span class="sd"> under the Subquery, so that's one exception to this rule.</span>
|
||||
</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-647"><a href="#L-647"><span class="linenos">647</span></a> <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">bool</span><span class="p">(</span>
|
||||
</span><span id="L-648"><a href="#L-648"><span class="linenos">648</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">alias</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UNWRAPPED_QUERIES</span><span class="p">)</span>
|
||||
</span><span id="L-649"><a href="#L-649"><span class="linenos">649</span></a> <span class="p">)</span>
|
||||
</span><span id="L-650"><a href="#L-650"><span class="linenos">650</span></a>
|
||||
</span><span id="L-651"><a href="#L-651"><span class="linenos">651</span></a>
|
||||
</span><span id="L-652"><a href="#L-652"><span class="linenos">652</span></a><span class="k">def</span> <span class="nf">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
|
||||
</span><span id="L-653"><a href="#L-653"><span class="linenos">653</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-626"><a href="#L-626"><span class="linenos">626</span></a> <span class="c1"># append the final child_scope yielded</span>
|
||||
</span><span id="L-627"><a href="#L-627"><span class="linenos">627</span></a> <span class="k">if</span> <span class="n">child_scope</span><span class="p">:</span>
|
||||
</span><span id="L-628"><a href="#L-628"><span class="linenos">628</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">cte_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-629"><a href="#L-629"><span class="linenos">629</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">cte_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
|
||||
</span><span id="L-630"><a href="#L-630"><span class="linenos">630</span></a>
|
||||
</span><span id="L-631"><a href="#L-631"><span class="linenos">631</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-632"><a href="#L-632"><span class="linenos">632</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">cte_sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-633"><a href="#L-633"><span class="linenos">633</span></a>
|
||||
</span><span id="L-634"><a href="#L-634"><span class="linenos">634</span></a>
|
||||
</span><span id="L-635"><a href="#L-635"><span class="linenos">635</span></a><span class="k">def</span> <span class="nf">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">:</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||||
</span><span id="L-636"><a href="#L-636"><span class="linenos">636</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-637"><a href="#L-637"><span class="linenos">637</span></a><span class="sd"> We represent (tbl1 JOIN tbl2) as a Subquery, but it's not really a "derived table",</span>
|
||||
</span><span id="L-638"><a href="#L-638"><span class="linenos">638</span></a><span class="sd"> as it doesn't introduce a new scope. If an alias is present, it shadows all names</span>
|
||||
</span><span id="L-639"><a href="#L-639"><span class="linenos">639</span></a><span class="sd"> under the Subquery, so that's one exception to this rule.</span>
|
||||
</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a> <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">bool</span><span class="p">(</span>
|
||||
</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">alias</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UNWRAPPED_QUERIES</span><span class="p">)</span>
|
||||
</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a> <span class="p">)</span>
|
||||
</span><span id="L-644"><a href="#L-644"><span class="linenos">644</span></a>
|
||||
</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a>
|
||||
</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a><span class="k">def</span> <span class="nf">_traverse_tables</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
|
||||
</span><span id="L-647"><a href="#L-647"><span class="linenos">647</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-648"><a href="#L-648"><span class="linenos">648</span></a>
|
||||
</span><span id="L-649"><a href="#L-649"><span class="linenos">649</span></a> <span class="c1"># Traverse FROMs, JOINs, and LATERALs in the order they are defined</span>
|
||||
</span><span id="L-650"><a href="#L-650"><span class="linenos">650</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-651"><a href="#L-651"><span class="linenos">651</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"from"</span><span class="p">)</span>
|
||||
</span><span id="L-652"><a href="#L-652"><span class="linenos">652</span></a> <span class="k">if</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="L-653"><a href="#L-653"><span class="linenos">653</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">from_</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||
</span><span id="L-654"><a href="#L-654"><span class="linenos">654</span></a>
|
||||
</span><span id="L-655"><a href="#L-655"><span class="linenos">655</span></a> <span class="c1"># Traverse FROMs, JOINs, and LATERALs in the order they are defined</span>
|
||||
</span><span id="L-656"><a href="#L-656"><span class="linenos">656</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-657"><a href="#L-657"><span class="linenos">657</span></a> <span class="n">from_</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"from"</span><span class="p">)</span>
|
||||
</span><span id="L-658"><a href="#L-658"><span class="linenos">658</span></a> <span class="k">if</span> <span class="n">from_</span><span class="p">:</span>
|
||||
</span><span id="L-659"><a href="#L-659"><span class="linenos">659</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">from_</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||
</span><span id="L-655"><a href="#L-655"><span class="linenos">655</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
|
||||
</span><span id="L-656"><a href="#L-656"><span class="linenos">656</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||
</span><span id="L-657"><a href="#L-657"><span class="linenos">657</span></a>
|
||||
</span><span id="L-658"><a href="#L-658"><span class="linenos">658</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="L-659"><a href="#L-659"><span class="linenos">659</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
|
||||
</span><span id="L-660"><a href="#L-660"><span class="linenos">660</span></a>
|
||||
</span><span id="L-661"><a href="#L-661"><span class="linenos">661</span></a> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
|
||||
</span><span id="L-662"><a href="#L-662"><span class="linenos">662</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||
</span><span id="L-663"><a href="#L-663"><span class="linenos">663</span></a>
|
||||
</span><span id="L-664"><a href="#L-664"><span class="linenos">664</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
|
||||
</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a>
|
||||
</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"laterals"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a>
|
||||
</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
|
||||
</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="n">table_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span>
|
||||
</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a> <span class="n">source_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">alias_or_name</span>
|
||||
</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a>
|
||||
</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="k">if</span> <span class="n">table_name</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
|
||||
</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="c1"># This is a reference to a parent source (e.g. a CTE), not an actual table, unless</span>
|
||||
</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="c1"># it is pivoted, because then we get back a new table and hence a new source.</span>
|
||||
</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a> <span class="n">pivots</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pivots"</span><span class="p">)</span>
|
||||
</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="k">if</span> <span class="n">pivots</span><span class="p">:</span>
|
||||
</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</span>
|
||||
</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">table_name</span><span class="p">]</span>
|
||||
</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a> <span class="k">elif</span> <span class="n">source_name</span> <span class="ow">in</span> <span class="n">sources</span><span class="p">:</span>
|
||||
</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">find_new_name</span><span class="p">(</span><span class="n">sources</span><span class="p">,</span> <span class="n">table_name</span><span class="p">)]</span> <span class="o">=</span> <span class="n">expression</span>
|
||||
</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</span>
|
||||
</span><span id="L-661"><a href="#L-661"><span class="linenos">661</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"laterals"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-662"><a href="#L-662"><span class="linenos">662</span></a>
|
||||
</span><span id="L-663"><a href="#L-663"><span class="linenos">663</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
|
||||
</span><span id="L-664"><a href="#L-664"><span class="linenos">664</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Table</span><span class="p">):</span>
|
||||
</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a> <span class="n">table_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">name</span>
|
||||
</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a> <span class="n">source_name</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">alias_or_name</span>
|
||||
</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a>
|
||||
</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a> <span class="k">if</span> <span class="n">table_name</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">expression</span><span class="o">.</span><span class="n">db</span><span class="p">:</span>
|
||||
</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a> <span class="c1"># This is a reference to a parent source (e.g. a CTE), not an actual table, unless</span>
|
||||
</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a> <span class="c1"># it is pivoted, because then we get back a new table and hence a new source.</span>
|
||||
</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a> <span class="n">pivots</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pivots"</span><span class="p">)</span>
|
||||
</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a> <span class="k">if</span> <span class="n">pivots</span><span class="p">:</span>
|
||||
</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">pivots</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</span>
|
||||
</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="p">[</span><span class="n">table_name</span><span class="p">]</span>
|
||||
</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a> <span class="k">elif</span> <span class="n">source_name</span> <span class="ow">in</span> <span class="n">sources</span><span class="p">:</span>
|
||||
</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">find_new_name</span><span class="p">(</span><span class="n">sources</span><span class="p">,</span> <span class="n">table_name</span><span class="p">)]</span> <span class="o">=</span> <span class="n">expression</span>
|
||||
</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">source_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">expression</span>
|
||||
</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a>
|
||||
</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a> <span class="c1"># Make sure to not include the joins twice</span>
|
||||
</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a> <span class="k">if</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">:</span>
|
||||
</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a>
|
||||
</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a>
|
||||
</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a> <span class="c1"># Make sure to not include the joins twice</span>
|
||||
</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a> <span class="k">if</span> <span class="n">expression</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">:</span>
|
||||
</span><span id="L-689"><a href="#L-689"><span class="linenos">689</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a>
|
||||
</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a>
|
||||
</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DerivedTable</span><span class="p">):</span>
|
||||
</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a>
|
||||
</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">):</span>
|
||||
</span><span id="L-697"><a href="#L-697"><span class="linenos">697</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="n">sources</span>
|
||||
</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">UDTF</span>
|
||||
</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">udtf_scopes</span>
|
||||
</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="k">elif</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||
</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span>
|
||||
</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">derived_table_scopes</span>
|
||||
</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="c1"># Makes sure we check for possible sources in nested table constructs</span>
|
||||
</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||
</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a>
|
||||
</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
|
||||
</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
|
||||
</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a> <span class="n">expression</span><span class="p">,</span>
|
||||
</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a> <span class="n">lateral_sources</span><span class="o">=</span><span class="n">lateral_sources</span><span class="p">,</span>
|
||||
</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a> <span class="n">outer_columns</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
|
||||
</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">scope_type</span><span class="p">,</span>
|
||||
</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="p">)</span>
|
||||
</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a> <span class="p">):</span>
|
||||
</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">DerivedTable</span><span class="p">):</span>
|
||||
</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-689"><a href="#L-689"><span class="linenos">689</span></a>
|
||||
</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">):</span>
|
||||
</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="n">sources</span>
|
||||
</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">UDTF</span>
|
||||
</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">udtf_scopes</span>
|
||||
</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a> <span class="k">elif</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||
</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a> <span class="n">lateral_sources</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a> <span class="n">scope_type</span> <span class="o">=</span> <span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span>
|
||||
</span><span id="L-697"><a href="#L-697"><span class="linenos">697</span></a> <span class="n">scopes</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">derived_table_scopes</span>
|
||||
</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a> <span class="c1"># Makes sure we check for possible sources in nested table constructs</span>
|
||||
</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">)</span>
|
||||
</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a> <span class="n">expressions</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join</span><span class="o">.</span><span class="n">this</span> <span class="k">for</span> <span class="n">join</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"joins"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[])</span>
|
||||
</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a>
|
||||
</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
|
||||
</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
|
||||
</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a> <span class="n">expression</span><span class="p">,</span>
|
||||
</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a> <span class="n">lateral_sources</span><span class="o">=</span><span class="n">lateral_sources</span><span class="p">,</span>
|
||||
</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a> <span class="n">outer_columns</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
|
||||
</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">scope_type</span><span class="p">,</span>
|
||||
</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a> <span class="p">)</span>
|
||||
</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a> <span class="p">):</span>
|
||||
</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a>
|
||||
</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a> <span class="c1"># Tables without aliases will be set as ""</span>
|
||||
</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a> <span class="c1"># This shouldn't be a problem once qualify_columns runs, as it adds aliases on everything.</span>
|
||||
</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a> <span class="c1"># Until then, this means that only a single, unaliased derived table is allowed (rather,</span>
|
||||
</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a> <span class="c1"># the latest one wins.</span>
|
||||
</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</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="c1"># Tables without aliases will be set as ""</span>
|
||||
</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a> <span class="c1"># This shouldn't be a problem once qualify_columns runs, as it adds aliases on everything.</span>
|
||||
</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a> <span class="c1"># Until then, this means that only a single, unaliased derived table is allowed (rather,</span>
|
||||
</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a> <span class="c1"># the latest one wins.</span>
|
||||
</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-721"><a href="#L-721"><span class="linenos">721</span></a> <span class="c1"># append the final child_scope yielded</span>
|
||||
</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a> <span class="n">scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
|
||||
</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</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="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-726"><a href="#L-726"><span class="linenos">726</span></a>
|
||||
</span><span id="L-727"><a href="#L-727"><span class="linenos">727</span></a> <span class="c1"># append the final child_scope yielded</span>
|
||||
</span><span id="L-728"><a href="#L-728"><span class="linenos">728</span></a> <span class="n">scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
|
||||
</span><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child_scope</span><span class="p">)</span>
|
||||
</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a>
|
||||
</span><span id="L-731"><a href="#L-731"><span class="linenos">731</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-732"><a href="#L-732"><span class="linenos">732</span></a>
|
||||
</span><span id="L-733"><a href="#L-733"><span class="linenos">733</span></a>
|
||||
</span><span id="L-734"><a href="#L-734"><span class="linenos">734</span></a><span class="k">def</span> <span class="nf">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
|
||||
</span><span id="L-735"><a href="#L-735"><span class="linenos">735</span></a> <span class="k">for</span> <span class="n">subquery</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">subqueries</span><span class="p">:</span>
|
||||
</span><span id="L-736"><a href="#L-736"><span class="linenos">736</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-737"><a href="#L-737"><span class="linenos">737</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">subquery</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">SUBQUERY</span><span class="p">)):</span>
|
||||
</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-739"><a href="#L-739"><span class="linenos">739</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">subquery_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
|
||||
</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a>
|
||||
</span><span id="L-742"><a href="#L-742"><span class="linenos">742</span></a>
|
||||
</span><span id="L-743"><a href="#L-743"><span class="linenos">743</span></a><span class="k">def</span> <span class="nf">_traverse_udtfs</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
|
||||
</span><span id="L-744"><a href="#L-744"><span class="linenos">744</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">):</span>
|
||||
</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
|
||||
</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">):</span>
|
||||
</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">]</span>
|
||||
</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-749"><a href="#L-749"><span class="linenos">749</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a>
|
||||
</span><span id="L-751"><a href="#L-751"><span class="linenos">751</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
|
||||
</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a> <span class="k">if</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||
</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-755"><a href="#L-755"><span class="linenos">755</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
|
||||
</span><span id="L-756"><a href="#L-756"><span class="linenos">756</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
|
||||
</span><span id="L-757"><a href="#L-757"><span class="linenos">757</span></a> <span class="n">expression</span><span class="p">,</span>
|
||||
</span><span id="L-758"><a href="#L-758"><span class="linenos">758</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span><span class="p">,</span>
|
||||
</span><span id="L-759"><a href="#L-759"><span class="linenos">759</span></a> <span class="n">outer_columns</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
|
||||
</span><span id="L-760"><a href="#L-760"><span class="linenos">760</span></a> <span class="p">)</span>
|
||||
</span><span id="L-761"><a href="#L-761"><span class="linenos">761</span></a> <span class="p">):</span>
|
||||
</span><span id="L-762"><a href="#L-762"><span class="linenos">762</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-763"><a href="#L-763"><span class="linenos">763</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-764"><a href="#L-764"><span class="linenos">764</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-727"><a href="#L-727"><span class="linenos">727</span></a>
|
||||
</span><span id="L-728"><a href="#L-728"><span class="linenos">728</span></a><span class="k">def</span> <span class="nf">_traverse_subqueries</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
|
||||
</span><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a> <span class="k">for</span> <span class="n">subquery</span> <span class="ow">in</span> <span class="n">scope</span><span class="o">.</span><span class="n">subqueries</span><span class="p">:</span>
|
||||
</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-731"><a href="#L-731"><span class="linenos">731</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span><span class="n">subquery</span><span class="p">,</span> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">SUBQUERY</span><span class="p">)):</span>
|
||||
</span><span id="L-732"><a href="#L-732"><span class="linenos">732</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-733"><a href="#L-733"><span class="linenos">733</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-734"><a href="#L-734"><span class="linenos">734</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">subquery_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
|
||||
</span><span id="L-735"><a href="#L-735"><span class="linenos">735</span></a>
|
||||
</span><span id="L-736"><a href="#L-736"><span class="linenos">736</span></a>
|
||||
</span><span id="L-737"><a href="#L-737"><span class="linenos">737</span></a><span class="k">def</span> <span class="nf">_traverse_udtfs</span><span class="p">(</span><span class="n">scope</span><span class="p">):</span>
|
||||
</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Unnest</span><span class="p">):</span>
|
||||
</span><span id="L-739"><a href="#L-739"><span class="linenos">739</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">expressions</span>
|
||||
</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Lateral</span><span class="p">):</span>
|
||||
</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[</span><span class="n">scope</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">this</span><span class="p">]</span>
|
||||
</span><span id="L-742"><a href="#L-742"><span class="linenos">742</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-743"><a href="#L-743"><span class="linenos">743</span></a> <span class="n">expressions</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-744"><a href="#L-744"><span class="linenos">744</span></a>
|
||||
</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a> <span class="n">sources</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">expressions</span><span class="p">:</span>
|
||||
</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a> <span class="k">if</span> <span class="n">_is_derived_table</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||
</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a> <span class="n">top</span> <span class="o">=</span> <span class="kc">None</span>
|
||||
</span><span id="L-749"><a href="#L-749"><span class="linenos">749</span></a> <span class="k">for</span> <span class="n">child_scope</span> <span class="ow">in</span> <span class="n">_traverse_scope</span><span class="p">(</span>
|
||||
</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">branch</span><span class="p">(</span>
|
||||
</span><span id="L-751"><a href="#L-751"><span class="linenos">751</span></a> <span class="n">expression</span><span class="p">,</span>
|
||||
</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a> <span class="n">scope_type</span><span class="o">=</span><span class="n">ScopeType</span><span class="o">.</span><span class="n">DERIVED_TABLE</span><span class="p">,</span>
|
||||
</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a> <span class="n">outer_columns</span><span class="o">=</span><span class="n">expression</span><span class="o">.</span><span class="n">alias_column_names</span><span class="p">,</span>
|
||||
</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a> <span class="p">)</span>
|
||||
</span><span id="L-755"><a href="#L-755"><span class="linenos">755</span></a> <span class="p">):</span>
|
||||
</span><span id="L-756"><a href="#L-756"><span class="linenos">756</span></a> <span class="k">yield</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-757"><a href="#L-757"><span class="linenos">757</span></a> <span class="n">top</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-758"><a href="#L-758"><span class="linenos">758</span></a> <span class="n">sources</span><span class="p">[</span><span class="n">expression</span><span class="o">.</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">child_scope</span>
|
||||
</span><span id="L-759"><a href="#L-759"><span class="linenos">759</span></a>
|
||||
</span><span id="L-760"><a href="#L-760"><span class="linenos">760</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">derived_table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
|
||||
</span><span id="L-761"><a href="#L-761"><span class="linenos">761</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
|
||||
</span><span id="L-762"><a href="#L-762"><span class="linenos">762</span></a>
|
||||
</span><span id="L-763"><a href="#L-763"><span class="linenos">763</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-764"><a href="#L-764"><span class="linenos">764</span></a>
|
||||
</span><span id="L-765"><a href="#L-765"><span class="linenos">765</span></a>
|
||||
</span><span id="L-766"><a href="#L-766"><span class="linenos">766</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">derived_table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
|
||||
</span><span id="L-767"><a href="#L-767"><span class="linenos">767</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">table_scopes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">top</span><span class="p">)</span>
|
||||
</span><span id="L-768"><a href="#L-768"><span class="linenos">768</span></a>
|
||||
</span><span id="L-769"><a href="#L-769"><span class="linenos">769</span></a> <span class="n">scope</span><span class="o">.</span><span class="n">sources</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
|
||||
</span><span id="L-766"><a href="#L-766"><span class="linenos">766</span></a><span class="k">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||
</span><span id="L-767"><a href="#L-767"><span class="linenos">767</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-768"><a href="#L-768"><span class="linenos">768</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
|
||||
</span><span id="L-769"><a href="#L-769"><span class="linenos">769</span></a><span class="sd"> nodes that start child scopes.</span>
|
||||
</span><span id="L-770"><a href="#L-770"><span class="linenos">770</span></a>
|
||||
</span><span id="L-771"><a href="#L-771"><span class="linenos">771</span></a>
|
||||
</span><span id="L-772"><a href="#L-772"><span class="linenos">772</span></a><span class="k">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||
</span><span id="L-773"><a href="#L-773"><span class="linenos">773</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-774"><a href="#L-774"><span class="linenos">774</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
|
||||
</span><span id="L-775"><a href="#L-775"><span class="linenos">775</span></a><span class="sd"> nodes that start child scopes.</span>
|
||||
</span><span id="L-776"><a href="#L-776"><span class="linenos">776</span></a>
|
||||
</span><span id="L-777"><a href="#L-777"><span class="linenos">777</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-778"><a href="#L-778"><span class="linenos">778</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="L-779"><a href="#L-779"><span class="linenos">779</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
|
||||
</span><span id="L-780"><a href="#L-780"><span class="linenos">780</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
|
||||
</span><span id="L-781"><a href="#L-781"><span class="linenos">781</span></a><span class="sd"> prune ((node, parent, arg_key) -> bool): callable that returns True if</span>
|
||||
</span><span id="L-782"><a href="#L-782"><span class="linenos">782</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
|
||||
</span><span id="L-783"><a href="#L-783"><span class="linenos">783</span></a>
|
||||
</span><span id="L-784"><a href="#L-784"><span class="linenos">784</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="L-785"><a href="#L-785"><span class="linenos">785</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
|
||||
</span><span id="L-786"><a href="#L-786"><span class="linenos">786</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-787"><a href="#L-787"><span class="linenos">787</span></a> <span class="c1"># We'll use this variable to pass state into the dfs generator.</span>
|
||||
</span><span id="L-788"><a href="#L-788"><span class="linenos">788</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
|
||||
</span><span id="L-789"><a href="#L-789"><span class="linenos">789</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="L-790"><a href="#L-790"><span class="linenos">790</span></a>
|
||||
</span><span id="L-791"><a href="#L-791"><span class="linenos">791</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span>
|
||||
</span><span id="L-792"><a href="#L-792"><span class="linenos">792</span></a> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
|
||||
</span><span id="L-793"><a href="#L-793"><span class="linenos">793</span></a> <span class="p">):</span>
|
||||
</span><span id="L-794"><a href="#L-794"><span class="linenos">794</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="L-795"><a href="#L-795"><span class="linenos">795</span></a>
|
||||
</span><span id="L-796"><a href="#L-796"><span class="linenos">796</span></a> <span class="k">yield</span> <span class="n">node</span>
|
||||
</span><span id="L-797"><a href="#L-797"><span class="linenos">797</span></a>
|
||||
</span><span id="L-798"><a href="#L-798"><span class="linenos">798</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
|
||||
</span><span id="L-799"><a href="#L-799"><span class="linenos">799</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-800"><a href="#L-800"><span class="linenos">800</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="L-801"><a href="#L-801"><span class="linenos">801</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
|
||||
</span><span id="L-802"><a href="#L-802"><span class="linenos">802</span></a> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="L-803"><a href="#L-803"><span class="linenos">803</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
|
||||
</span><span id="L-804"><a href="#L-804"><span class="linenos">804</span></a> <span class="ow">and</span> <span class="p">(</span><span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">))</span>
|
||||
</span><span id="L-805"><a href="#L-805"><span class="linenos">805</span></a> <span class="p">)</span>
|
||||
</span><span id="L-806"><a href="#L-806"><span class="linenos">806</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UNWRAPPED_QUERIES</span><span class="p">)</span>
|
||||
</span><span id="L-807"><a href="#L-807"><span class="linenos">807</span></a> <span class="p">):</span>
|
||||
</span><span id="L-808"><a href="#L-808"><span class="linenos">808</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</span>
|
||||
</span><span id="L-771"><a href="#L-771"><span class="linenos">771</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-772"><a href="#L-772"><span class="linenos">772</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="L-773"><a href="#L-773"><span class="linenos">773</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
|
||||
</span><span id="L-774"><a href="#L-774"><span class="linenos">774</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
|
||||
</span><span id="L-775"><a href="#L-775"><span class="linenos">775</span></a><span class="sd"> prune ((node, parent, arg_key) -> bool): callable that returns True if</span>
|
||||
</span><span id="L-776"><a href="#L-776"><span class="linenos">776</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
|
||||
</span><span id="L-777"><a href="#L-777"><span class="linenos">777</span></a>
|
||||
</span><span id="L-778"><a href="#L-778"><span class="linenos">778</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="L-779"><a href="#L-779"><span class="linenos">779</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
|
||||
</span><span id="L-780"><a href="#L-780"><span class="linenos">780</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-781"><a href="#L-781"><span class="linenos">781</span></a> <span class="c1"># We'll use this variable to pass state into the dfs generator.</span>
|
||||
</span><span id="L-782"><a href="#L-782"><span class="linenos">782</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
|
||||
</span><span id="L-783"><a href="#L-783"><span class="linenos">783</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="L-784"><a href="#L-784"><span class="linenos">784</span></a>
|
||||
</span><span id="L-785"><a href="#L-785"><span class="linenos">785</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span>
|
||||
</span><span id="L-786"><a href="#L-786"><span class="linenos">786</span></a> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
|
||||
</span><span id="L-787"><a href="#L-787"><span class="linenos">787</span></a> <span class="p">):</span>
|
||||
</span><span id="L-788"><a href="#L-788"><span class="linenos">788</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="L-789"><a href="#L-789"><span class="linenos">789</span></a>
|
||||
</span><span id="L-790"><a href="#L-790"><span class="linenos">790</span></a> <span class="k">yield</span> <span class="n">node</span>
|
||||
</span><span id="L-791"><a href="#L-791"><span class="linenos">791</span></a>
|
||||
</span><span id="L-792"><a href="#L-792"><span class="linenos">792</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
|
||||
</span><span id="L-793"><a href="#L-793"><span class="linenos">793</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-794"><a href="#L-794"><span class="linenos">794</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="L-795"><a href="#L-795"><span class="linenos">795</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
|
||||
</span><span id="L-796"><a href="#L-796"><span class="linenos">796</span></a> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="L-797"><a href="#L-797"><span class="linenos">797</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
|
||||
</span><span id="L-798"><a href="#L-798"><span class="linenos">798</span></a> <span class="ow">and</span> <span class="p">(</span><span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">))</span>
|
||||
</span><span id="L-799"><a href="#L-799"><span class="linenos">799</span></a> <span class="p">)</span>
|
||||
</span><span id="L-800"><a href="#L-800"><span class="linenos">800</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UNWRAPPED_QUERIES</span><span class="p">)</span>
|
||||
</span><span id="L-801"><a href="#L-801"><span class="linenos">801</span></a> <span class="p">):</span>
|
||||
</span><span id="L-802"><a href="#L-802"><span class="linenos">802</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</span>
|
||||
</span><span id="L-803"><a href="#L-803"><span class="linenos">803</span></a>
|
||||
</span><span id="L-804"><a href="#L-804"><span class="linenos">804</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
|
||||
</span><span id="L-805"><a href="#L-805"><span class="linenos">805</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
|
||||
</span><span id="L-806"><a href="#L-806"><span class="linenos">806</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"joins"</span><span class="p">,</span> <span class="s2">"laterals"</span><span class="p">,</span> <span class="s2">"pivots"</span><span class="p">):</span>
|
||||
</span><span id="L-807"><a href="#L-807"><span class="linenos">807</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
|
||||
</span><span id="L-808"><a href="#L-808"><span class="linenos">808</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
|
||||
</span><span id="L-809"><a href="#L-809"><span class="linenos">809</span></a>
|
||||
</span><span id="L-810"><a href="#L-810"><span class="linenos">810</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
|
||||
</span><span id="L-811"><a href="#L-811"><span class="linenos">811</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
|
||||
</span><span id="L-812"><a href="#L-812"><span class="linenos">812</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"joins"</span><span class="p">,</span> <span class="s2">"laterals"</span><span class="p">,</span> <span class="s2">"pivots"</span><span class="p">):</span>
|
||||
</span><span id="L-813"><a href="#L-813"><span class="linenos">813</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
|
||||
</span><span id="L-814"><a href="#L-814"><span class="linenos">814</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
|
||||
</span><span id="L-810"><a href="#L-810"><span class="linenos">810</span></a>
|
||||
</span><span id="L-811"><a href="#L-811"><span class="linenos">811</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="L-812"><a href="#L-812"><span class="linenos">812</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-813"><a href="#L-813"><span class="linenos">813</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
|
||||
</span><span id="L-814"><a href="#L-814"><span class="linenos">814</span></a><span class="sd"> match at least one of the specified expression types.</span>
|
||||
</span><span id="L-815"><a href="#L-815"><span class="linenos">815</span></a>
|
||||
</span><span id="L-816"><a href="#L-816"><span class="linenos">816</span></a>
|
||||
</span><span id="L-817"><a href="#L-817"><span class="linenos">817</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="L-818"><a href="#L-818"><span class="linenos">818</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-819"><a href="#L-819"><span class="linenos">819</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
|
||||
</span><span id="L-820"><a href="#L-820"><span class="linenos">820</span></a><span class="sd"> match at least one of the specified expression types.</span>
|
||||
</span><span id="L-821"><a href="#L-821"><span class="linenos">821</span></a>
|
||||
</span><span id="L-822"><a href="#L-822"><span class="linenos">822</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="L-823"><a href="#L-823"><span class="linenos">823</span></a>
|
||||
</span><span id="L-824"><a href="#L-824"><span class="linenos">824</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-825"><a href="#L-825"><span class="linenos">825</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="L-826"><a href="#L-826"><span class="linenos">826</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="L-827"><a href="#L-827"><span class="linenos">827</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="L-828"><a href="#L-828"><span class="linenos">828</span></a>
|
||||
</span><span id="L-829"><a href="#L-829"><span class="linenos">829</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="L-830"><a href="#L-830"><span class="linenos">830</span></a><span class="sd"> exp.Expression: nodes</span>
|
||||
</span><span id="L-831"><a href="#L-831"><span class="linenos">831</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-832"><a href="#L-832"><span class="linenos">832</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">):</span>
|
||||
</span><span id="L-833"><a href="#L-833"><span class="linenos">833</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
|
||||
</span><span id="L-834"><a href="#L-834"><span class="linenos">834</span></a> <span class="k">yield</span> <span class="n">expression</span>
|
||||
</span><span id="L-835"><a href="#L-835"><span class="linenos">835</span></a>
|
||||
</span><span id="L-816"><a href="#L-816"><span class="linenos">816</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="L-817"><a href="#L-817"><span class="linenos">817</span></a>
|
||||
</span><span id="L-818"><a href="#L-818"><span class="linenos">818</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-819"><a href="#L-819"><span class="linenos">819</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="L-820"><a href="#L-820"><span class="linenos">820</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="L-821"><a href="#L-821"><span class="linenos">821</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="L-822"><a href="#L-822"><span class="linenos">822</span></a>
|
||||
</span><span id="L-823"><a href="#L-823"><span class="linenos">823</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="L-824"><a href="#L-824"><span class="linenos">824</span></a><span class="sd"> exp.Expression: nodes</span>
|
||||
</span><span id="L-825"><a href="#L-825"><span class="linenos">825</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-826"><a href="#L-826"><span class="linenos">826</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">):</span>
|
||||
</span><span id="L-827"><a href="#L-827"><span class="linenos">827</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
|
||||
</span><span id="L-828"><a href="#L-828"><span class="linenos">828</span></a> <span class="k">yield</span> <span class="n">expression</span>
|
||||
</span><span id="L-829"><a href="#L-829"><span class="linenos">829</span></a>
|
||||
</span><span id="L-830"><a href="#L-830"><span class="linenos">830</span></a>
|
||||
</span><span id="L-831"><a href="#L-831"><span class="linenos">831</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="L-832"><a href="#L-832"><span class="linenos">832</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-833"><a href="#L-833"><span class="linenos">833</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
|
||||
</span><span id="L-834"><a href="#L-834"><span class="linenos">834</span></a>
|
||||
</span><span id="L-835"><a href="#L-835"><span class="linenos">835</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="L-836"><a href="#L-836"><span class="linenos">836</span></a>
|
||||
</span><span id="L-837"><a href="#L-837"><span class="linenos">837</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="L-838"><a href="#L-838"><span class="linenos">838</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="L-839"><a href="#L-839"><span class="linenos">839</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
|
||||
</span><span id="L-840"><a href="#L-840"><span class="linenos">840</span></a>
|
||||
</span><span id="L-841"><a href="#L-841"><span class="linenos">841</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="L-842"><a href="#L-842"><span class="linenos">842</span></a>
|
||||
</span><span id="L-843"><a href="#L-843"><span class="linenos">843</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-844"><a href="#L-844"><span class="linenos">844</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="L-845"><a href="#L-845"><span class="linenos">845</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="L-846"><a href="#L-846"><span class="linenos">846</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="L-847"><a href="#L-847"><span class="linenos">847</span></a>
|
||||
</span><span id="L-848"><a href="#L-848"><span class="linenos">848</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="L-849"><a href="#L-849"><span class="linenos">849</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
|
||||
</span><span id="L-850"><a href="#L-850"><span class="linenos">850</span></a><span class="sd"> the criteria was found.</span>
|
||||
</span><span id="L-851"><a href="#L-851"><span class="linenos">851</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-852"><a href="#L-852"><span class="linenos">852</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
|
||||
</span><span id="L-837"><a href="#L-837"><span class="linenos">837</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="L-838"><a href="#L-838"><span class="linenos">838</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="L-839"><a href="#L-839"><span class="linenos">839</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="L-840"><a href="#L-840"><span class="linenos">840</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="L-841"><a href="#L-841"><span class="linenos">841</span></a>
|
||||
</span><span id="L-842"><a href="#L-842"><span class="linenos">842</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="L-843"><a href="#L-843"><span class="linenos">843</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
|
||||
</span><span id="L-844"><a href="#L-844"><span class="linenos">844</span></a><span class="sd"> the criteria was found.</span>
|
||||
</span><span id="L-845"><a href="#L-845"><span class="linenos">845</span></a><span class="sd"> """</span>
|
||||
</span><span id="L-846"><a href="#L-846"><span class="linenos">846</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -3009,49 +3003,49 @@ incomplete properties which is confusing.</p>
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#walk_in_scope"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="walk_in_scope-773"><a href="#walk_in_scope-773"><span class="linenos">773</span></a><span class="k">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||
</span><span id="walk_in_scope-774"><a href="#walk_in_scope-774"><span class="linenos">774</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="walk_in_scope-775"><a href="#walk_in_scope-775"><span class="linenos">775</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
|
||||
</span><span id="walk_in_scope-776"><a href="#walk_in_scope-776"><span class="linenos">776</span></a><span class="sd"> nodes that start child scopes.</span>
|
||||
</span><span id="walk_in_scope-777"><a href="#walk_in_scope-777"><span class="linenos">777</span></a>
|
||||
</span><span id="walk_in_scope-778"><a href="#walk_in_scope-778"><span class="linenos">778</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="walk_in_scope-779"><a href="#walk_in_scope-779"><span class="linenos">779</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="walk_in_scope-780"><a href="#walk_in_scope-780"><span class="linenos">780</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
|
||||
</span><span id="walk_in_scope-781"><a href="#walk_in_scope-781"><span class="linenos">781</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
|
||||
</span><span id="walk_in_scope-782"><a href="#walk_in_scope-782"><span class="linenos">782</span></a><span class="sd"> prune ((node, parent, arg_key) -> bool): callable that returns True if</span>
|
||||
</span><span id="walk_in_scope-783"><a href="#walk_in_scope-783"><span class="linenos">783</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
|
||||
</span><span id="walk_in_scope-784"><a href="#walk_in_scope-784"><span class="linenos">784</span></a>
|
||||
</span><span id="walk_in_scope-785"><a href="#walk_in_scope-785"><span class="linenos">785</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="walk_in_scope-786"><a href="#walk_in_scope-786"><span class="linenos">786</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
|
||||
</span><span id="walk_in_scope-787"><a href="#walk_in_scope-787"><span class="linenos">787</span></a><span class="sd"> """</span>
|
||||
</span><span id="walk_in_scope-788"><a href="#walk_in_scope-788"><span class="linenos">788</span></a> <span class="c1"># We'll use this variable to pass state into the dfs generator.</span>
|
||||
</span><span id="walk_in_scope-789"><a href="#walk_in_scope-789"><span class="linenos">789</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
|
||||
</span><span id="walk_in_scope-790"><a href="#walk_in_scope-790"><span class="linenos">790</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="walk_in_scope-791"><a href="#walk_in_scope-791"><span class="linenos">791</span></a>
|
||||
</span><span id="walk_in_scope-792"><a href="#walk_in_scope-792"><span class="linenos">792</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span>
|
||||
</span><span id="walk_in_scope-793"><a href="#walk_in_scope-793"><span class="linenos">793</span></a> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
|
||||
</span><span id="walk_in_scope-794"><a href="#walk_in_scope-794"><span class="linenos">794</span></a> <span class="p">):</span>
|
||||
</span><span id="walk_in_scope-795"><a href="#walk_in_scope-795"><span class="linenos">795</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="walk_in_scope-796"><a href="#walk_in_scope-796"><span class="linenos">796</span></a>
|
||||
</span><span id="walk_in_scope-797"><a href="#walk_in_scope-797"><span class="linenos">797</span></a> <span class="k">yield</span> <span class="n">node</span>
|
||||
</span><span id="walk_in_scope-798"><a href="#walk_in_scope-798"><span class="linenos">798</span></a>
|
||||
</span><span id="walk_in_scope-799"><a href="#walk_in_scope-799"><span class="linenos">799</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
|
||||
</span><span id="walk_in_scope-800"><a href="#walk_in_scope-800"><span class="linenos">800</span></a> <span class="k">continue</span>
|
||||
</span><span id="walk_in_scope-801"><a href="#walk_in_scope-801"><span class="linenos">801</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="walk_in_scope-802"><a href="#walk_in_scope-802"><span class="linenos">802</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
|
||||
</span><span id="walk_in_scope-803"><a href="#walk_in_scope-803"><span class="linenos">803</span></a> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="walk_in_scope-804"><a href="#walk_in_scope-804"><span class="linenos">804</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
|
||||
</span><span id="walk_in_scope-805"><a href="#walk_in_scope-805"><span class="linenos">805</span></a> <span class="ow">and</span> <span class="p">(</span><span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">))</span>
|
||||
</span><span id="walk_in_scope-806"><a href="#walk_in_scope-806"><span class="linenos">806</span></a> <span class="p">)</span>
|
||||
</span><span id="walk_in_scope-807"><a href="#walk_in_scope-807"><span class="linenos">807</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UNWRAPPED_QUERIES</span><span class="p">)</span>
|
||||
</span><span id="walk_in_scope-808"><a href="#walk_in_scope-808"><span class="linenos">808</span></a> <span class="p">):</span>
|
||||
</span><span id="walk_in_scope-809"><a href="#walk_in_scope-809"><span class="linenos">809</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</span>
|
||||
</span><span id="walk_in_scope-810"><a href="#walk_in_scope-810"><span class="linenos">810</span></a>
|
||||
</span><span id="walk_in_scope-811"><a href="#walk_in_scope-811"><span class="linenos">811</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
|
||||
</span><span id="walk_in_scope-812"><a href="#walk_in_scope-812"><span class="linenos">812</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
|
||||
</span><span id="walk_in_scope-813"><a href="#walk_in_scope-813"><span class="linenos">813</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"joins"</span><span class="p">,</span> <span class="s2">"laterals"</span><span class="p">,</span> <span class="s2">"pivots"</span><span class="p">):</span>
|
||||
</span><span id="walk_in_scope-814"><a href="#walk_in_scope-814"><span class="linenos">814</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
|
||||
</span><span id="walk_in_scope-815"><a href="#walk_in_scope-815"><span class="linenos">815</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="walk_in_scope-767"><a href="#walk_in_scope-767"><span class="linenos">767</span></a><span class="k">def</span> <span class="nf">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||||
</span><span id="walk_in_scope-768"><a href="#walk_in_scope-768"><span class="linenos">768</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="walk_in_scope-769"><a href="#walk_in_scope-769"><span class="linenos">769</span></a><span class="sd"> Returns a generator object which visits all nodes in the syntrax tree, stopping at</span>
|
||||
</span><span id="walk_in_scope-770"><a href="#walk_in_scope-770"><span class="linenos">770</span></a><span class="sd"> nodes that start child scopes.</span>
|
||||
</span><span id="walk_in_scope-771"><a href="#walk_in_scope-771"><span class="linenos">771</span></a>
|
||||
</span><span id="walk_in_scope-772"><a href="#walk_in_scope-772"><span class="linenos">772</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="walk_in_scope-773"><a href="#walk_in_scope-773"><span class="linenos">773</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="walk_in_scope-774"><a href="#walk_in_scope-774"><span class="linenos">774</span></a><span class="sd"> bfs (bool): if set to True the BFS traversal order will be applied,</span>
|
||||
</span><span id="walk_in_scope-775"><a href="#walk_in_scope-775"><span class="linenos">775</span></a><span class="sd"> otherwise the DFS traversal will be used instead.</span>
|
||||
</span><span id="walk_in_scope-776"><a href="#walk_in_scope-776"><span class="linenos">776</span></a><span class="sd"> prune ((node, parent, arg_key) -> bool): callable that returns True if</span>
|
||||
</span><span id="walk_in_scope-777"><a href="#walk_in_scope-777"><span class="linenos">777</span></a><span class="sd"> the generator should stop traversing this branch of the tree.</span>
|
||||
</span><span id="walk_in_scope-778"><a href="#walk_in_scope-778"><span class="linenos">778</span></a>
|
||||
</span><span id="walk_in_scope-779"><a href="#walk_in_scope-779"><span class="linenos">779</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="walk_in_scope-780"><a href="#walk_in_scope-780"><span class="linenos">780</span></a><span class="sd"> tuple[exp.Expression, Optional[exp.Expression], str]: node, parent, arg key</span>
|
||||
</span><span id="walk_in_scope-781"><a href="#walk_in_scope-781"><span class="linenos">781</span></a><span class="sd"> """</span>
|
||||
</span><span id="walk_in_scope-782"><a href="#walk_in_scope-782"><span class="linenos">782</span></a> <span class="c1"># We'll use this variable to pass state into the dfs generator.</span>
|
||||
</span><span id="walk_in_scope-783"><a href="#walk_in_scope-783"><span class="linenos">783</span></a> <span class="c1"># Whenever we set it to True, we exclude a subtree from traversal.</span>
|
||||
</span><span id="walk_in_scope-784"><a href="#walk_in_scope-784"><span class="linenos">784</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="walk_in_scope-785"><a href="#walk_in_scope-785"><span class="linenos">785</span></a>
|
||||
</span><span id="walk_in_scope-786"><a href="#walk_in_scope-786"><span class="linenos">786</span></a> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">expression</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span>
|
||||
</span><span id="walk_in_scope-787"><a href="#walk_in_scope-787"><span class="linenos">787</span></a> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">,</span> <span class="n">prune</span><span class="o">=</span><span class="k">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">crossed_scope_boundary</span> <span class="ow">or</span> <span class="p">(</span><span class="n">prune</span> <span class="ow">and</span> <span class="n">prune</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
|
||||
</span><span id="walk_in_scope-788"><a href="#walk_in_scope-788"><span class="linenos">788</span></a> <span class="p">):</span>
|
||||
</span><span id="walk_in_scope-789"><a href="#walk_in_scope-789"><span class="linenos">789</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">False</span>
|
||||
</span><span id="walk_in_scope-790"><a href="#walk_in_scope-790"><span class="linenos">790</span></a>
|
||||
</span><span id="walk_in_scope-791"><a href="#walk_in_scope-791"><span class="linenos">791</span></a> <span class="k">yield</span> <span class="n">node</span>
|
||||
</span><span id="walk_in_scope-792"><a href="#walk_in_scope-792"><span class="linenos">792</span></a>
|
||||
</span><span id="walk_in_scope-793"><a href="#walk_in_scope-793"><span class="linenos">793</span></a> <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="n">expression</span><span class="p">:</span>
|
||||
</span><span id="walk_in_scope-794"><a href="#walk_in_scope-794"><span class="linenos">794</span></a> <span class="k">continue</span>
|
||||
</span><span id="walk_in_scope-795"><a href="#walk_in_scope-795"><span class="linenos">795</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="walk_in_scope-796"><a href="#walk_in_scope-796"><span class="linenos">796</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">CTE</span><span class="p">)</span>
|
||||
</span><span id="walk_in_scope-797"><a href="#walk_in_scope-797"><span class="linenos">797</span></a> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="walk_in_scope-798"><a href="#walk_in_scope-798"><span class="linenos">798</span></a> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">From</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">))</span>
|
||||
</span><span id="walk_in_scope-799"><a href="#walk_in_scope-799"><span class="linenos">799</span></a> <span class="ow">and</span> <span class="p">(</span><span class="n">_is_derived_table</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">))</span>
|
||||
</span><span id="walk_in_scope-800"><a href="#walk_in_scope-800"><span class="linenos">800</span></a> <span class="p">)</span>
|
||||
</span><span id="walk_in_scope-801"><a href="#walk_in_scope-801"><span class="linenos">801</span></a> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UNWRAPPED_QUERIES</span><span class="p">)</span>
|
||||
</span><span id="walk_in_scope-802"><a href="#walk_in_scope-802"><span class="linenos">802</span></a> <span class="p">):</span>
|
||||
</span><span id="walk_in_scope-803"><a href="#walk_in_scope-803"><span class="linenos">803</span></a> <span class="n">crossed_scope_boundary</span> <span class="o">=</span> <span class="kc">True</span>
|
||||
</span><span id="walk_in_scope-804"><a href="#walk_in_scope-804"><span class="linenos">804</span></a>
|
||||
</span><span id="walk_in_scope-805"><a href="#walk_in_scope-805"><span class="linenos">805</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">UDTF</span><span class="p">)):</span>
|
||||
</span><span id="walk_in_scope-806"><a href="#walk_in_scope-806"><span class="linenos">806</span></a> <span class="c1"># The following args are not actually in the inner scope, so we should visit them</span>
|
||||
</span><span id="walk_in_scope-807"><a href="#walk_in_scope-807"><span class="linenos">807</span></a> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"joins"</span><span class="p">,</span> <span class="s2">"laterals"</span><span class="p">,</span> <span class="s2">"pivots"</span><span class="p">):</span>
|
||||
</span><span id="walk_in_scope-808"><a href="#walk_in_scope-808"><span class="linenos">808</span></a> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]:</span>
|
||||
</span><span id="walk_in_scope-809"><a href="#walk_in_scope-809"><span class="linenos">809</span></a> <span class="k">yield from</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -3088,24 +3082,24 @@ the generator should stop traversing this branch of the tree.</li>
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#find_all_in_scope"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="find_all_in_scope-818"><a href="#find_all_in_scope-818"><span class="linenos">818</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="find_all_in_scope-819"><a href="#find_all_in_scope-819"><span class="linenos">819</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="find_all_in_scope-820"><a href="#find_all_in_scope-820"><span class="linenos">820</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
|
||||
</span><span id="find_all_in_scope-821"><a href="#find_all_in_scope-821"><span class="linenos">821</span></a><span class="sd"> match at least one of the specified expression types.</span>
|
||||
</span><span id="find_all_in_scope-822"><a href="#find_all_in_scope-822"><span class="linenos">822</span></a>
|
||||
</span><span id="find_all_in_scope-823"><a href="#find_all_in_scope-823"><span class="linenos">823</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="find_all_in_scope-824"><a href="#find_all_in_scope-824"><span class="linenos">824</span></a>
|
||||
</span><span id="find_all_in_scope-825"><a href="#find_all_in_scope-825"><span class="linenos">825</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="find_all_in_scope-826"><a href="#find_all_in_scope-826"><span class="linenos">826</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="find_all_in_scope-827"><a href="#find_all_in_scope-827"><span class="linenos">827</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="find_all_in_scope-828"><a href="#find_all_in_scope-828"><span class="linenos">828</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="find_all_in_scope-829"><a href="#find_all_in_scope-829"><span class="linenos">829</span></a>
|
||||
</span><span id="find_all_in_scope-830"><a href="#find_all_in_scope-830"><span class="linenos">830</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="find_all_in_scope-831"><a href="#find_all_in_scope-831"><span class="linenos">831</span></a><span class="sd"> exp.Expression: nodes</span>
|
||||
</span><span id="find_all_in_scope-832"><a href="#find_all_in_scope-832"><span class="linenos">832</span></a><span class="sd"> """</span>
|
||||
</span><span id="find_all_in_scope-833"><a href="#find_all_in_scope-833"><span class="linenos">833</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">):</span>
|
||||
</span><span id="find_all_in_scope-834"><a href="#find_all_in_scope-834"><span class="linenos">834</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
|
||||
</span><span id="find_all_in_scope-835"><a href="#find_all_in_scope-835"><span class="linenos">835</span></a> <span class="k">yield</span> <span class="n">expression</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="find_all_in_scope-812"><a href="#find_all_in_scope-812"><span class="linenos">812</span></a><span class="k">def</span> <span class="nf">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="find_all_in_scope-813"><a href="#find_all_in_scope-813"><span class="linenos">813</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="find_all_in_scope-814"><a href="#find_all_in_scope-814"><span class="linenos">814</span></a><span class="sd"> Returns a generator object which visits all nodes in this scope and only yields those that</span>
|
||||
</span><span id="find_all_in_scope-815"><a href="#find_all_in_scope-815"><span class="linenos">815</span></a><span class="sd"> match at least one of the specified expression types.</span>
|
||||
</span><span id="find_all_in_scope-816"><a href="#find_all_in_scope-816"><span class="linenos">816</span></a>
|
||||
</span><span id="find_all_in_scope-817"><a href="#find_all_in_scope-817"><span class="linenos">817</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="find_all_in_scope-818"><a href="#find_all_in_scope-818"><span class="linenos">818</span></a>
|
||||
</span><span id="find_all_in_scope-819"><a href="#find_all_in_scope-819"><span class="linenos">819</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="find_all_in_scope-820"><a href="#find_all_in_scope-820"><span class="linenos">820</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="find_all_in_scope-821"><a href="#find_all_in_scope-821"><span class="linenos">821</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="find_all_in_scope-822"><a href="#find_all_in_scope-822"><span class="linenos">822</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="find_all_in_scope-823"><a href="#find_all_in_scope-823"><span class="linenos">823</span></a>
|
||||
</span><span id="find_all_in_scope-824"><a href="#find_all_in_scope-824"><span class="linenos">824</span></a><span class="sd"> Yields:</span>
|
||||
</span><span id="find_all_in_scope-825"><a href="#find_all_in_scope-825"><span class="linenos">825</span></a><span class="sd"> exp.Expression: nodes</span>
|
||||
</span><span id="find_all_in_scope-826"><a href="#find_all_in_scope-826"><span class="linenos">826</span></a><span class="sd"> """</span>
|
||||
</span><span id="find_all_in_scope-827"><a href="#find_all_in_scope-827"><span class="linenos">827</span></a> <span class="k">for</span> <span class="n">expression</span> <span class="ow">in</span> <span class="n">walk_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">):</span>
|
||||
</span><span id="find_all_in_scope-828"><a href="#find_all_in_scope-828"><span class="linenos">828</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">ensure_collection</span><span class="p">(</span><span class="n">expression_types</span><span class="p">))):</span>
|
||||
</span><span id="find_all_in_scope-829"><a href="#find_all_in_scope-829"><span class="linenos">829</span></a> <span class="k">yield</span> <span class="n">expression</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -3142,22 +3136,22 @@ match at least one of the specified expression types.</p>
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#find_in_scope"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="find_in_scope-838"><a href="#find_in_scope-838"><span class="linenos">838</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="find_in_scope-839"><a href="#find_in_scope-839"><span class="linenos">839</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="find_in_scope-840"><a href="#find_in_scope-840"><span class="linenos">840</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
|
||||
</span><span id="find_in_scope-841"><a href="#find_in_scope-841"><span class="linenos">841</span></a>
|
||||
</span><span id="find_in_scope-842"><a href="#find_in_scope-842"><span class="linenos">842</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="find_in_scope-843"><a href="#find_in_scope-843"><span class="linenos">843</span></a>
|
||||
</span><span id="find_in_scope-844"><a href="#find_in_scope-844"><span class="linenos">844</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="find_in_scope-845"><a href="#find_in_scope-845"><span class="linenos">845</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="find_in_scope-846"><a href="#find_in_scope-846"><span class="linenos">846</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="find_in_scope-847"><a href="#find_in_scope-847"><span class="linenos">847</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="find_in_scope-848"><a href="#find_in_scope-848"><span class="linenos">848</span></a>
|
||||
</span><span id="find_in_scope-849"><a href="#find_in_scope-849"><span class="linenos">849</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="find_in_scope-850"><a href="#find_in_scope-850"><span class="linenos">850</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
|
||||
</span><span id="find_in_scope-851"><a href="#find_in_scope-851"><span class="linenos">851</span></a><span class="sd"> the criteria was found.</span>
|
||||
</span><span id="find_in_scope-852"><a href="#find_in_scope-852"><span class="linenos">852</span></a><span class="sd"> """</span>
|
||||
</span><span id="find_in_scope-853"><a href="#find_in_scope-853"><span class="linenos">853</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="find_in_scope-832"><a href="#find_in_scope-832"><span class="linenos">832</span></a><span class="k">def</span> <span class="nf">find_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||||
</span><span id="find_in_scope-833"><a href="#find_in_scope-833"><span class="linenos">833</span></a><span class="w"> </span><span class="sd">"""</span>
|
||||
</span><span id="find_in_scope-834"><a href="#find_in_scope-834"><span class="linenos">834</span></a><span class="sd"> Returns the first node in this scope which matches at least one of the specified types.</span>
|
||||
</span><span id="find_in_scope-835"><a href="#find_in_scope-835"><span class="linenos">835</span></a>
|
||||
</span><span id="find_in_scope-836"><a href="#find_in_scope-836"><span class="linenos">836</span></a><span class="sd"> This does NOT traverse into subscopes.</span>
|
||||
</span><span id="find_in_scope-837"><a href="#find_in_scope-837"><span class="linenos">837</span></a>
|
||||
</span><span id="find_in_scope-838"><a href="#find_in_scope-838"><span class="linenos">838</span></a><span class="sd"> Args:</span>
|
||||
</span><span id="find_in_scope-839"><a href="#find_in_scope-839"><span class="linenos">839</span></a><span class="sd"> expression (exp.Expression):</span>
|
||||
</span><span id="find_in_scope-840"><a href="#find_in_scope-840"><span class="linenos">840</span></a><span class="sd"> expression_types (tuple[type]|type): the expression type(s) to match.</span>
|
||||
</span><span id="find_in_scope-841"><a href="#find_in_scope-841"><span class="linenos">841</span></a><span class="sd"> bfs (bool): True to use breadth-first search, False to use depth-first.</span>
|
||||
</span><span id="find_in_scope-842"><a href="#find_in_scope-842"><span class="linenos">842</span></a>
|
||||
</span><span id="find_in_scope-843"><a href="#find_in_scope-843"><span class="linenos">843</span></a><span class="sd"> Returns:</span>
|
||||
</span><span id="find_in_scope-844"><a href="#find_in_scope-844"><span class="linenos">844</span></a><span class="sd"> exp.Expression: the node which matches the criteria or None if no node matching</span>
|
||||
</span><span id="find_in_scope-845"><a href="#find_in_scope-845"><span class="linenos">845</span></a><span class="sd"> the criteria was found.</span>
|
||||
</span><span id="find_in_scope-846"><a href="#find_in_scope-846"><span class="linenos">846</span></a><span class="sd"> """</span>
|
||||
</span><span id="find_in_scope-847"><a href="#find_in_scope-847"><span class="linenos">847</span></a> <span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">find_all_in_scope</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">expression_types</span><span class="p">,</span> <span class="n">bfs</span><span class="o">=</span><span class="n">bfs</span><span class="p">),</span> <span class="kc">None</span><span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -105,256 +105,258 @@
|
|||
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a> <span class="k">return</span>
|
||||
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a>
|
||||
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Condition</span><span class="p">)</span>
|
||||
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a>
|
||||
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="ow">not</span> <span class="n">predicate</span>
|
||||
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span>
|
||||
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"from"</span><span class="p">)</span>
|
||||
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a> <span class="p">):</span>
|
||||
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">return</span>
|
||||
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a>
|
||||
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a> <span class="n">clause</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">)</span>
|
||||
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a>
|
||||
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="c1"># This subquery returns a scalar and can just be converted to a cross join</span>
|
||||
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">)):</span>
|
||||
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>
|
||||
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">clause_parent_select</span> <span class="o">=</span> <span class="n">clause</span><span class="o">.</span><span class="n">parent_select</span> <span class="k">if</span> <span class="n">clause</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a> <span class="ow">not</span> <span class="n">predicate</span>
|
||||
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span>
|
||||
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"from"</span><span class="p">)</span>
|
||||
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a> <span class="p">):</span>
|
||||
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a> <span class="k">return</span>
|
||||
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a>
|
||||
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Union</span><span class="p">):</span>
|
||||
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>
|
||||
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a> <span class="n">clause</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">)</span>
|
||||
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a>
|
||||
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a> <span class="c1"># This subquery returns a scalar and can just be converted to a cross join</span>
|
||||
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">)):</span>
|
||||
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a>
|
||||
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">)</span> <span class="ow">and</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="n">parent_select</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a> <span class="p">(</span><span class="ow">not</span> <span class="n">clause</span> <span class="ow">or</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="p">)</span>
|
||||
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="ow">and</span> <span class="p">(</span>
|
||||
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">projection</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="k">for</span> <span class="n">projection</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span><span class="p">)</span>
|
||||
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="p">)</span>
|
||||
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="p">):</span>
|
||||
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">):</span>
|
||||
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="k">return</span>
|
||||
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
|
||||
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</span><span class="p">,</span> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="k">return</span>
|
||||
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a>
|
||||
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">if</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">return</span>
|
||||
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a>
|
||||
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span><span class="p">:</span>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a> <span class="k">return</span>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a>
|
||||
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">predicate</span><span class="p">)</span>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">join_key</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a> <span class="n">join_key_not_null</span> <span class="o">=</span> <span class="n">join_key</span><span class="o">.</span><span class="n">is_</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">())</span><span class="o">.</span><span class="n">not_</span><span class="p">()</span>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">join_key_not_null</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">join_key_not_null</span><span class="p">)</span>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">group</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a> <span class="n">clause_parent_select</span> <span class="o">=</span> <span class="n">clause</span><span class="o">.</span><span class="n">parent_select</span> <span class="k">if</span> <span class="n">clause</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>
|
||||
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">)</span> <span class="ow">and</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="n">parent_select</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="p">(</span><span class="ow">not</span> <span class="n">clause</span> <span class="ow">or</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="p">)</span>
|
||||
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a> <span class="ow">and</span> <span class="p">(</span>
|
||||
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">projection</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="k">for</span> <span class="n">projection</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span><span class="p">)</span>
|
||||
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="p">)</span>
|
||||
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="p">):</span>
|
||||
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">):</span>
|
||||
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a> <span class="k">return</span>
|
||||
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a>
|
||||
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</span><span class="p">,</span> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">return</span>
|
||||
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a>
|
||||
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="k">if</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">return</span>
|
||||
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
|
||||
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span>
|
||||
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a>
|
||||
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span><span class="p">:</span>
|
||||
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a> <span class="k">return</span>
|
||||
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a>
|
||||
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">predicate</span><span class="p">)</span>
|
||||
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
|
||||
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a> <span class="n">join_key</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a> <span class="n">join_key_not_null</span> <span class="o">=</span> <span class="n">join_key</span><span class="o">.</span><span class="n">is_</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">())</span><span class="o">.</span><span class="n">not_</span><span class="p">()</span>
|
||||
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a>
|
||||
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
|
||||
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">join_key_not_null</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">join_key_not_null</span><span class="p">)</span>
|
||||
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">if</span> <span class="n">group</span><span class="p">:</span>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="p">{</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">}</span> <span class="o">!=</span> <span class="nb">set</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">select</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">))</span>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="s2">"_q"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="p">)</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a>
|
||||
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="n">select</span><span class="p">,</span>
|
||||
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">on</span><span class="o">=</span><span class="n">column</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">join_key</span><span class="p">),</span>
|
||||
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="p">)</span>
|
||||
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a>
|
||||
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a>
|
||||
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="k">def</span> <span class="nf">decorrelate</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">parent_select</span><span class="p">,</span> <span class="n">external_columns</span><span class="p">,</span> <span class="n">next_alias_name</span><span class="p">):</span>
|
||||
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"where"</span><span class="p">)</span>
|
||||
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
|
||||
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="n">where</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span> <span class="ow">or</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="k">return</span>
|
||||
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a>
|
||||
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="n">keys</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a>
|
||||
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="c1"># for all external columns in the where statement, find the relevant predicate</span>
|
||||
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="c1"># keys to convert it into a join</span>
|
||||
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">external_columns</span><span class="p">:</span>
|
||||
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="k">return</span>
|
||||
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a>
|
||||
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="n">group</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a>
|
||||
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="n">group</span><span class="p">:</span>
|
||||
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="k">if</span> <span class="p">{</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">}</span> <span class="o">!=</span> <span class="nb">set</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="n">select</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">))</span>
|
||||
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="s2">"_q"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="p">)</span>
|
||||
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a>
|
||||
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="n">select</span><span class="p">,</span>
|
||||
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="n">on</span><span class="o">=</span><span class="n">column</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">join_key</span><span class="p">),</span>
|
||||
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="p">)</span>
|
||||
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a>
|
||||
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a>
|
||||
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a><span class="k">def</span> <span class="nf">decorrelate</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">parent_select</span><span class="p">,</span> <span class="n">external_columns</span><span class="p">,</span> <span class="n">next_alias_name</span><span class="p">):</span>
|
||||
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"where"</span><span class="p">)</span>
|
||||
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a>
|
||||
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="n">where</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span> <span class="ow">or</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="k">return</span>
|
||||
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a>
|
||||
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="n">keys</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a>
|
||||
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="c1"># for all external columns in the where statement, find the relevant predicate</span>
|
||||
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="c1"># keys to convert it into a join</span>
|
||||
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">external_columns</span><span class="p">:</span>
|
||||
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="k">return</span>
|
||||
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a>
|
||||
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="k">return</span>
|
||||
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a>
|
||||
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">):</span>
|
||||
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">right</span>
|
||||
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">node</span> <span class="ow">is</span> <span class="n">column</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">walk</span><span class="p">())</span>
|
||||
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">else</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span>
|
||||
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="p">)</span>
|
||||
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">return</span>
|
||||
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a>
|
||||
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="n">keys</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span><span class="p">))</span>
|
||||
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a>
|
||||
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">return</span>
|
||||
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a>
|
||||
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">):</span>
|
||||
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">right</span>
|
||||
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">node</span> <span class="ow">is</span> <span class="n">column</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">walk</span><span class="p">())</span>
|
||||
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="k">else</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span>
|
||||
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="p">)</span>
|
||||
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a> <span class="k">return</span>
|
||||
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a>
|
||||
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">):</span>
|
||||
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a> <span class="k">return</span>
|
||||
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a>
|
||||
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="n">is_subquery_projection</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
|
||||
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">node</span> <span class="ow">is</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
|
||||
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="p">)</span>
|
||||
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a>
|
||||
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="n">key_aliases</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="n">group_by</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a>
|
||||
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="c1"># if we filter on the value of the subquery, it needs to be unique</span>
|
||||
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="p">:</span>
|
||||
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="c1"># all predicates that are equalities must also be in the unique</span>
|
||||
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="c1"># so that we don't do a many to many join</span>
|
||||
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="ow">and</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a>
|
||||
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a> <span class="n">keys</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span><span class="p">))</span>
|
||||
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a>
|
||||
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">):</span>
|
||||
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="k">return</span>
|
||||
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a>
|
||||
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="n">is_subquery_projection</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
|
||||
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="n">node</span> <span class="ow">is</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
|
||||
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="p">)</span>
|
||||
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a>
|
||||
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="n">key_aliases</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="n">group_by</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a>
|
||||
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="c1"># if we filter on the value of the subquery, it needs to be unique</span>
|
||||
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="p">:</span>
|
||||
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a> <span class="c1"># all predicates that are equalities must also be in the unique</span>
|
||||
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a> <span class="c1"># so that we don't do a many to many join</span>
|
||||
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="ow">and</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a>
|
||||
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="c1"># if the value of the subquery is not an agg or a key, we need to collect it into an array</span>
|
||||
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="c1"># so that it can be grouped. For subquery projections, we use a MAX aggregation instead.</span>
|
||||
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="n">agg_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span> <span class="k">if</span> <span class="n">is_subquery_projection</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayAgg</span>
|
||||
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span>
|
||||
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">),</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="p">)</span>
|
||||
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a>
|
||||
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="c1"># exists queries should not have any selects as it only checks if there are any rows</span>
|
||||
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="c1"># all selects will be added by the optimizer and only used for join keys</span>
|
||||
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"expressions"</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a>
|
||||
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="c1"># add all keys to the projections of the subquery</span>
|
||||
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="c1"># so that we can use it as a join key</span>
|
||||
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">)</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">!=</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">copy</span><span class="p">()),</span> <span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a>
|
||||
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="n">other</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">)</span>
|
||||
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a>
|
||||
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">key_aliases</span><span class="o">.</span><span class="n">values</span><span class="p">())[</span><span class="mi">0</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"NOT </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2"> IS NULL"</span><span class="p">)</span>
|
||||
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">):</span>
|
||||
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ALL(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span>
|
||||
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="p">)</span>
|
||||
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
|
||||
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">):</span>
|
||||
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">this</span><span class="si">}</span><span class="s2">)"</span><span class="p">,</span>
|
||||
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a> <span class="p">)</span>
|
||||
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a>
|
||||
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a> <span class="c1"># COUNT always returns 0 on empty datasets, so we need take that into consideration here</span>
|
||||
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a> <span class="c1"># by transforming all counts into 0 and using that as the coalesced value</span>
|
||||
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a>
|
||||
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="k">def</span> <span class="nf">remove_aggs</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
|
||||
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||||
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">):</span>
|
||||
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">()</span>
|
||||
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="k">return</span> <span class="n">node</span>
|
||||
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a>
|
||||
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Coalesce</span><span class="p">(</span>
|
||||
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">remove_aggs</span><span class="p">)],</span>
|
||||
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="p">)</span>
|
||||
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a>
|
||||
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a>
|
||||
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="c1"># if the value of the subquery is not an agg or a key, we need to collect it into an array</span>
|
||||
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="c1"># so that it can be grouped. For subquery projections, we use a MAX aggregation instead.</span>
|
||||
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="n">agg_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span> <span class="k">if</span> <span class="n">is_subquery_projection</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayAgg</span>
|
||||
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span>
|
||||
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">),</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="p">)</span>
|
||||
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a>
|
||||
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="c1"># exists queries should not have any selects as it only checks if there are any rows</span>
|
||||
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="c1"># all selects will be added by the optimizer and only used for join keys</span>
|
||||
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"expressions"</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a>
|
||||
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a> <span class="c1"># add all keys to the projections of the subquery</span>
|
||||
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a> <span class="c1"># so that we can use it as a join key</span>
|
||||
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">)</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">!=</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">copy</span><span class="p">()),</span> <span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a>
|
||||
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a> <span class="n">other</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">)</span>
|
||||
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a>
|
||||
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">key_aliases</span><span class="o">.</span><span class="n">values</span><span class="p">())[</span><span class="mi">0</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"NOT </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2"> IS NULL"</span><span class="p">)</span>
|
||||
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">):</span>
|
||||
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ALL(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span>
|
||||
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="p">)</span>
|
||||
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</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-215"><a href="#L-215"><span class="linenos">215</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
|
||||
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">):</span>
|
||||
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">this</span><span class="si">}</span><span class="s2">)"</span><span class="p">,</span>
|
||||
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="p">)</span>
|
||||
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a>
|
||||
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="c1"># COUNT always returns 0 on empty datasets, so we need take that into consideration here</span>
|
||||
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="c1"># by transforming all counts into 0 and using that as the coalesced value</span>
|
||||
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a>
|
||||
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="k">def</span> <span class="nf">remove_aggs</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
|
||||
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||||
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">):</span>
|
||||
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">()</span>
|
||||
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="k">return</span> <span class="n">node</span>
|
||||
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a>
|
||||
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Coalesce</span><span class="p">(</span>
|
||||
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">remove_aggs</span><span class="p">)],</span>
|
||||
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="p">)</span>
|
||||
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a>
|
||||
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="n">nested</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a>
|
||||
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a>
|
||||
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">):</span>
|
||||
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_CONTAINS(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2">))"</span><span class="p">,</span>
|
||||
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="p">)</span>
|
||||
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="s2">"_x"</span><span class="p">))</span>
|
||||
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_ANY(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, _x -> </span><span class="si">{</span><span class="n">predicate</span><span class="si">}</span><span class="s2">))"</span><span class="p">,</span>
|
||||
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="p">)</span>
|
||||
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a>
|
||||
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="o">*</span><span class="n">group_by</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="n">on</span><span class="o">=</span><span class="p">[</span><span class="n">predicate</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)],</span>
|
||||
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">table_alias</span><span class="p">,</span>
|
||||
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <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><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a><span class="k">def</span> <span class="nf">_replace</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">condition</span><span class="p">):</span>
|
||||
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">condition</span><span class="p">(</span><span class="n">condition</span><span class="p">))</span>
|
||||
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a>
|
||||
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a>
|
||||
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a><span class="k">def</span> <span class="nf">_other_operand</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">):</span>
|
||||
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
|
||||
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a>
|
||||
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">)):</span>
|
||||
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a> <span class="k">return</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="p">)</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="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">):</span>
|
||||
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a> <span class="k">return</span> <span class="p">(</span>
|
||||
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">right</span>
|
||||
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">))</span>
|
||||
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a> <span class="k">else</span> <span class="n">expression</span><span class="o">.</span><span class="n">left</span>
|
||||
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a> <span class="p">)</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="k">return</span> <span class="kc">None</span>
|
||||
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a>
|
||||
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a> <span class="n">nested</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a>
|
||||
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a> <span class="k">continue</span>
|
||||
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a>
|
||||
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">):</span>
|
||||
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_CONTAINS(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2">))"</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="k">else</span><span class="p">:</span>
|
||||
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="s2">"_x"</span><span class="p">))</span>
|
||||
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_ANY(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, _x -> </span><span class="si">{</span><span class="n">predicate</span><span class="si">}</span><span class="s2">))"</span><span class="p">,</span>
|
||||
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="p">)</span>
|
||||
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a>
|
||||
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="o">*</span><span class="n">group_by</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">on</span><span class="o">=</span><span class="p">[</span><span class="n">predicate</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)],</span>
|
||||
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">table_alias</span><span class="p">,</span>
|
||||
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a> <span class="p">)</span>
|
||||
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a>
|
||||
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a>
|
||||
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a><span class="k">def</span> <span class="nf">_replace</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">condition</span><span class="p">):</span>
|
||||
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">condition</span><span class="p">(</span><span class="n">condition</span><span class="p">))</span>
|
||||
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a>
|
||||
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a>
|
||||
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a><span class="k">def</span> <span class="nf">_other_operand</span><span class="p">(</span><span class="n">expression</span><span class="p">):</span>
|
||||
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">):</span>
|
||||
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a> <span class="k">return</span> <span class="n">expression</span><span class="o">.</span><span class="n">this</span>
|
||||
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a>
|
||||
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">)):</span>
|
||||
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a> <span class="k">return</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span>
|
||||
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a>
|
||||
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">):</span>
|
||||
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a> <span class="k">return</span> <span class="p">(</span>
|
||||
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a> <span class="n">expression</span><span class="o">.</span><span class="n">right</span>
|
||||
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expression</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">))</span>
|
||||
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a> <span class="k">else</span> <span class="n">expression</span><span class="o">.</span><span class="n">left</span>
|
||||
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a> <span class="p">)</span>
|
||||
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a>
|
||||
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a> <span class="k">return</span> <span class="kc">None</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -452,78 +454,80 @@ Convert correlated or vectorized subqueries into a group by so it is not a many
|
|||
</span><span id="unnest-42"><a href="#unnest-42"><span class="linenos"> 42</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-43"><a href="#unnest-43"><span class="linenos"> 43</span></a>
|
||||
</span><span id="unnest-44"><a href="#unnest-44"><span class="linenos"> 44</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Condition</span><span class="p">)</span>
|
||||
</span><span id="unnest-45"><a href="#unnest-45"><span class="linenos"> 45</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="unnest-46"><a href="#unnest-46"><span class="linenos"> 46</span></a>
|
||||
</span><span id="unnest-47"><a href="#unnest-47"><span class="linenos"> 47</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="unnest-48"><a href="#unnest-48"><span class="linenos"> 48</span></a> <span class="ow">not</span> <span class="n">predicate</span>
|
||||
</span><span id="unnest-49"><a href="#unnest-49"><span class="linenos"> 49</span></a> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span>
|
||||
</span><span id="unnest-50"><a href="#unnest-50"><span class="linenos"> 50</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"from"</span><span class="p">)</span>
|
||||
</span><span id="unnest-51"><a href="#unnest-51"><span class="linenos"> 51</span></a> <span class="p">):</span>
|
||||
</span><span id="unnest-52"><a href="#unnest-52"><span class="linenos"> 52</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-53"><a href="#unnest-53"><span class="linenos"> 53</span></a>
|
||||
</span><span id="unnest-54"><a href="#unnest-54"><span class="linenos"> 54</span></a> <span class="n">clause</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">)</span>
|
||||
</span><span id="unnest-55"><a href="#unnest-55"><span class="linenos"> 55</span></a>
|
||||
</span><span id="unnest-56"><a href="#unnest-56"><span class="linenos"> 56</span></a> <span class="c1"># This subquery returns a scalar and can just be converted to a cross join</span>
|
||||
</span><span id="unnest-57"><a href="#unnest-57"><span class="linenos"> 57</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">)):</span>
|
||||
</span><span id="unnest-58"><a href="#unnest-58"><span class="linenos"> 58</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="unnest-59"><a href="#unnest-59"><span class="linenos"> 59</span></a>
|
||||
</span><span id="unnest-60"><a href="#unnest-60"><span class="linenos"> 60</span></a> <span class="n">clause_parent_select</span> <span class="o">=</span> <span class="n">clause</span><span class="o">.</span><span class="n">parent_select</span> <span class="k">if</span> <span class="n">clause</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="unnest-45"><a href="#unnest-45"><span class="linenos"> 45</span></a> <span class="k">if</span> <span class="p">(</span>
|
||||
</span><span id="unnest-46"><a href="#unnest-46"><span class="linenos"> 46</span></a> <span class="ow">not</span> <span class="n">predicate</span>
|
||||
</span><span id="unnest-47"><a href="#unnest-47"><span class="linenos"> 47</span></a> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span>
|
||||
</span><span id="unnest-48"><a href="#unnest-48"><span class="linenos"> 48</span></a> <span class="ow">or</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"from"</span><span class="p">)</span>
|
||||
</span><span id="unnest-49"><a href="#unnest-49"><span class="linenos"> 49</span></a> <span class="p">):</span>
|
||||
</span><span id="unnest-50"><a href="#unnest-50"><span class="linenos"> 50</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-51"><a href="#unnest-51"><span class="linenos"> 51</span></a>
|
||||
</span><span id="unnest-52"><a href="#unnest-52"><span class="linenos"> 52</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Union</span><span class="p">):</span>
|
||||
</span><span id="unnest-53"><a href="#unnest-53"><span class="linenos"> 53</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">*</span><span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">)</span><span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="n">next_alias_name</span><span class="p">()))</span>
|
||||
</span><span id="unnest-54"><a href="#unnest-54"><span class="linenos"> 54</span></a>
|
||||
</span><span id="unnest-55"><a href="#unnest-55"><span class="linenos"> 55</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="unnest-56"><a href="#unnest-56"><span class="linenos"> 56</span></a> <span class="n">clause</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">)</span>
|
||||
</span><span id="unnest-57"><a href="#unnest-57"><span class="linenos"> 57</span></a>
|
||||
</span><span id="unnest-58"><a href="#unnest-58"><span class="linenos"> 58</span></a> <span class="c1"># This subquery returns a scalar and can just be converted to a cross join</span>
|
||||
</span><span id="unnest-59"><a href="#unnest-59"><span class="linenos"> 59</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">)):</span>
|
||||
</span><span id="unnest-60"><a href="#unnest-60"><span class="linenos"> 60</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">alias_or_name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="unnest-61"><a href="#unnest-61"><span class="linenos"> 61</span></a>
|
||||
</span><span id="unnest-62"><a href="#unnest-62"><span class="linenos"> 62</span></a> <span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">)</span> <span class="ow">and</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="n">parent_select</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="unnest-63"><a href="#unnest-63"><span class="linenos"> 63</span></a> <span class="p">(</span><span class="ow">not</span> <span class="n">clause</span> <span class="ow">or</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="p">)</span>
|
||||
</span><span id="unnest-64"><a href="#unnest-64"><span class="linenos"> 64</span></a> <span class="ow">and</span> <span class="p">(</span>
|
||||
</span><span id="unnest-65"><a href="#unnest-65"><span class="linenos"> 65</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="unnest-66"><a href="#unnest-66"><span class="linenos"> 66</span></a> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">projection</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="k">for</span> <span class="n">projection</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span><span class="p">)</span>
|
||||
</span><span id="unnest-67"><a href="#unnest-67"><span class="linenos"> 67</span></a> <span class="p">)</span>
|
||||
</span><span id="unnest-68"><a href="#unnest-68"><span class="linenos"> 68</span></a> <span class="p">):</span>
|
||||
</span><span id="unnest-69"><a href="#unnest-69"><span class="linenos"> 69</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="unnest-70"><a href="#unnest-70"><span class="linenos"> 70</span></a> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">):</span>
|
||||
</span><span id="unnest-71"><a href="#unnest-71"><span class="linenos"> 71</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-72"><a href="#unnest-72"><span class="linenos"> 72</span></a>
|
||||
</span><span id="unnest-73"><a href="#unnest-73"><span class="linenos"> 73</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="unnest-74"><a href="#unnest-74"><span class="linenos"> 74</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</span><span class="p">,</span> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-75"><a href="#unnest-75"><span class="linenos"> 75</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-76"><a href="#unnest-76"><span class="linenos"> 76</span></a>
|
||||
</span><span id="unnest-77"><a href="#unnest-77"><span class="linenos"> 77</span></a> <span class="k">if</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="unnest-78"><a href="#unnest-78"><span class="linenos"> 78</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-79"><a href="#unnest-79"><span class="linenos"> 79</span></a>
|
||||
</span><span id="unnest-80"><a href="#unnest-80"><span class="linenos"> 80</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="unnest-81"><a href="#unnest-81"><span class="linenos"> 81</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span>
|
||||
</span><span id="unnest-82"><a href="#unnest-82"><span class="linenos"> 82</span></a>
|
||||
</span><span id="unnest-83"><a href="#unnest-83"><span class="linenos"> 83</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span><span class="p">:</span>
|
||||
</span><span id="unnest-84"><a href="#unnest-84"><span class="linenos"> 84</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-85"><a href="#unnest-85"><span class="linenos"> 85</span></a>
|
||||
</span><span id="unnest-86"><a href="#unnest-86"><span class="linenos"> 86</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">predicate</span><span class="p">)</span>
|
||||
</span><span id="unnest-87"><a href="#unnest-87"><span class="linenos"> 87</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="unnest-88"><a href="#unnest-88"><span class="linenos"> 88</span></a>
|
||||
</span><span id="unnest-89"><a href="#unnest-89"><span class="linenos"> 89</span></a> <span class="n">join_key</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="unnest-90"><a href="#unnest-90"><span class="linenos"> 90</span></a> <span class="n">join_key_not_null</span> <span class="o">=</span> <span class="n">join_key</span><span class="o">.</span><span class="n">is_</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">())</span><span class="o">.</span><span class="n">not_</span><span class="p">()</span>
|
||||
</span><span id="unnest-91"><a href="#unnest-91"><span class="linenos"> 91</span></a>
|
||||
</span><span id="unnest-92"><a href="#unnest-92"><span class="linenos"> 92</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
|
||||
</span><span id="unnest-93"><a href="#unnest-93"><span class="linenos"> 93</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="unnest-94"><a href="#unnest-94"><span class="linenos"> 94</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">join_key_not_null</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-95"><a href="#unnest-95"><span class="linenos"> 95</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="unnest-96"><a href="#unnest-96"><span class="linenos"> 96</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">join_key_not_null</span><span class="p">)</span>
|
||||
</span><span id="unnest-97"><a href="#unnest-97"><span class="linenos"> 97</span></a>
|
||||
</span><span id="unnest-98"><a href="#unnest-98"><span class="linenos"> 98</span></a> <span class="n">group</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="unnest-62"><a href="#unnest-62"><span class="linenos"> 62</span></a> <span class="n">clause_parent_select</span> <span class="o">=</span> <span class="n">clause</span><span class="o">.</span><span class="n">parent_select</span> <span class="k">if</span> <span class="n">clause</span> <span class="k">else</span> <span class="kc">None</span>
|
||||
</span><span id="unnest-63"><a href="#unnest-63"><span class="linenos"> 63</span></a>
|
||||
</span><span id="unnest-64"><a href="#unnest-64"><span class="linenos"> 64</span></a> <span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Having</span><span class="p">)</span> <span class="ow">and</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="n">parent_select</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span>
|
||||
</span><span id="unnest-65"><a href="#unnest-65"><span class="linenos"> 65</span></a> <span class="p">(</span><span class="ow">not</span> <span class="n">clause</span> <span class="ow">or</span> <span class="n">clause_parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">parent_select</span><span class="p">)</span>
|
||||
</span><span id="unnest-66"><a href="#unnest-66"><span class="linenos"> 66</span></a> <span class="ow">and</span> <span class="p">(</span>
|
||||
</span><span id="unnest-67"><a href="#unnest-67"><span class="linenos"> 67</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="unnest-68"><a href="#unnest-68"><span class="linenos"> 68</span></a> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">projection</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="k">for</span> <span class="n">projection</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span><span class="p">)</span>
|
||||
</span><span id="unnest-69"><a href="#unnest-69"><span class="linenos"> 69</span></a> <span class="p">)</span>
|
||||
</span><span id="unnest-70"><a href="#unnest-70"><span class="linenos"> 70</span></a> <span class="p">):</span>
|
||||
</span><span id="unnest-71"><a href="#unnest-71"><span class="linenos"> 71</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="unnest-72"><a href="#unnest-72"><span class="linenos"> 72</span></a> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">):</span>
|
||||
</span><span id="unnest-73"><a href="#unnest-73"><span class="linenos"> 73</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-74"><a href="#unnest-74"><span class="linenos"> 74</span></a>
|
||||
</span><span id="unnest-75"><a href="#unnest-75"><span class="linenos"> 75</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span>
|
||||
</span><span id="unnest-76"><a href="#unnest-76"><span class="linenos"> 76</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">join_type</span><span class="o">=</span><span class="s2">"CROSS"</span><span class="p">,</span> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-77"><a href="#unnest-77"><span class="linenos"> 77</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-78"><a href="#unnest-78"><span class="linenos"> 78</span></a>
|
||||
</span><span id="unnest-79"><a href="#unnest-79"><span class="linenos"> 79</span></a> <span class="k">if</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="unnest-80"><a href="#unnest-80"><span class="linenos"> 80</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-81"><a href="#unnest-81"><span class="linenos"> 81</span></a>
|
||||
</span><span id="unnest-82"><a href="#unnest-82"><span class="linenos"> 82</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="unnest-83"><a href="#unnest-83"><span class="linenos"> 83</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span>
|
||||
</span><span id="unnest-84"><a href="#unnest-84"><span class="linenos"> 84</span></a>
|
||||
</span><span id="unnest-85"><a href="#unnest-85"><span class="linenos"> 85</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">parent_select</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">predicate</span><span class="o">.</span><span class="n">parent_select</span><span class="p">:</span>
|
||||
</span><span id="unnest-86"><a href="#unnest-86"><span class="linenos"> 86</span></a> <span class="k">return</span>
|
||||
</span><span id="unnest-87"><a href="#unnest-87"><span class="linenos"> 87</span></a>
|
||||
</span><span id="unnest-88"><a href="#unnest-88"><span class="linenos"> 88</span></a> <span class="n">column</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">predicate</span><span class="p">)</span>
|
||||
</span><span id="unnest-89"><a href="#unnest-89"><span class="linenos"> 89</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="unnest-90"><a href="#unnest-90"><span class="linenos"> 90</span></a>
|
||||
</span><span id="unnest-91"><a href="#unnest-91"><span class="linenos"> 91</span></a> <span class="n">join_key</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="unnest-92"><a href="#unnest-92"><span class="linenos"> 92</span></a> <span class="n">join_key_not_null</span> <span class="o">=</span> <span class="n">join_key</span><span class="o">.</span><span class="n">is_</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">())</span><span class="o">.</span><span class="n">not_</span><span class="p">()</span>
|
||||
</span><span id="unnest-93"><a href="#unnest-93"><span class="linenos"> 93</span></a>
|
||||
</span><span id="unnest-94"><a href="#unnest-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">clause</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Join</span><span class="p">):</span>
|
||||
</span><span id="unnest-95"><a href="#unnest-95"><span class="linenos"> 95</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="unnest-96"><a href="#unnest-96"><span class="linenos"> 96</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">join_key_not_null</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-97"><a href="#unnest-97"><span class="linenos"> 97</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="unnest-98"><a href="#unnest-98"><span class="linenos"> 98</span></a> <span class="n">_replace</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">join_key_not_null</span><span class="p">)</span>
|
||||
</span><span id="unnest-99"><a href="#unnest-99"><span class="linenos"> 99</span></a>
|
||||
</span><span id="unnest-100"><a href="#unnest-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="n">group</span><span class="p">:</span>
|
||||
</span><span id="unnest-101"><a href="#unnest-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="p">{</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">}</span> <span class="o">!=</span> <span class="nb">set</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="unnest-102"><a href="#unnest-102"><span class="linenos">102</span></a> <span class="n">select</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="unnest-103"><a href="#unnest-103"><span class="linenos">103</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">))</span>
|
||||
</span><span id="unnest-104"><a href="#unnest-104"><span class="linenos">104</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="s2">"_q"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-105"><a href="#unnest-105"><span class="linenos">105</span></a> <span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-106"><a href="#unnest-106"><span class="linenos">106</span></a> <span class="p">)</span>
|
||||
</span><span id="unnest-107"><a href="#unnest-107"><span class="linenos">107</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="unnest-108"><a href="#unnest-108"><span class="linenos">108</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-109"><a href="#unnest-109"><span class="linenos">109</span></a>
|
||||
</span><span id="unnest-110"><a href="#unnest-110"><span class="linenos">110</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="unnest-111"><a href="#unnest-111"><span class="linenos">111</span></a> <span class="n">select</span><span class="p">,</span>
|
||||
</span><span id="unnest-112"><a href="#unnest-112"><span class="linenos">112</span></a> <span class="n">on</span><span class="o">=</span><span class="n">column</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">join_key</span><span class="p">),</span>
|
||||
</span><span id="unnest-113"><a href="#unnest-113"><span class="linenos">113</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="unnest-114"><a href="#unnest-114"><span class="linenos">114</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="unnest-115"><a href="#unnest-115"><span class="linenos">115</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="unnest-116"><a href="#unnest-116"><span class="linenos">116</span></a> <span class="p">)</span>
|
||||
</span><span id="unnest-100"><a href="#unnest-100"><span class="linenos">100</span></a> <span class="n">group</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"group"</span><span class="p">)</span>
|
||||
</span><span id="unnest-101"><a href="#unnest-101"><span class="linenos">101</span></a>
|
||||
</span><span id="unnest-102"><a href="#unnest-102"><span class="linenos">102</span></a> <span class="k">if</span> <span class="n">group</span><span class="p">:</span>
|
||||
</span><span id="unnest-103"><a href="#unnest-103"><span class="linenos">103</span></a> <span class="k">if</span> <span class="p">{</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">}</span> <span class="o">!=</span> <span class="nb">set</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">expressions</span><span class="p">):</span>
|
||||
</span><span id="unnest-104"><a href="#unnest-104"><span class="linenos">104</span></a> <span class="n">select</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="unnest-105"><a href="#unnest-105"><span class="linenos">105</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">))</span>
|
||||
</span><span id="unnest-106"><a href="#unnest-106"><span class="linenos">106</span></a> <span class="o">.</span><span class="n">from_</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">subquery</span><span class="p">(</span><span class="s2">"_q"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-107"><a href="#unnest-107"><span class="linenos">107</span></a> <span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="s2">"_q"</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-108"><a href="#unnest-108"><span class="linenos">108</span></a> <span class="p">)</span>
|
||||
</span><span id="unnest-109"><a href="#unnest-109"><span class="linenos">109</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="unnest-110"><a href="#unnest-110"><span class="linenos">110</span></a> <span class="n">select</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="unnest-111"><a href="#unnest-111"><span class="linenos">111</span></a>
|
||||
</span><span id="unnest-112"><a href="#unnest-112"><span class="linenos">112</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="unnest-113"><a href="#unnest-113"><span class="linenos">113</span></a> <span class="n">select</span><span class="p">,</span>
|
||||
</span><span id="unnest-114"><a href="#unnest-114"><span class="linenos">114</span></a> <span class="n">on</span><span class="o">=</span><span class="n">column</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="n">join_key</span><span class="p">),</span>
|
||||
</span><span id="unnest-115"><a href="#unnest-115"><span class="linenos">115</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="unnest-116"><a href="#unnest-116"><span class="linenos">116</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="unnest-117"><a href="#unnest-117"><span class="linenos">117</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="unnest-118"><a href="#unnest-118"><span class="linenos">118</span></a> <span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
@ -541,161 +545,161 @@ Convert correlated or vectorized subqueries into a group by so it is not a many
|
|||
|
||||
</div>
|
||||
<a class="headerlink" href="#decorrelate"></a>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="decorrelate-119"><a href="#decorrelate-119"><span class="linenos">119</span></a><span class="k">def</span> <span class="nf">decorrelate</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">parent_select</span><span class="p">,</span> <span class="n">external_columns</span><span class="p">,</span> <span class="n">next_alias_name</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-120"><a href="#decorrelate-120"><span class="linenos">120</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"where"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-121"><a href="#decorrelate-121"><span class="linenos">121</span></a>
|
||||
</span><span id="decorrelate-122"><a href="#decorrelate-122"><span class="linenos">122</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="n">where</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span> <span class="ow">or</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-123"><a href="#decorrelate-123"><span class="linenos">123</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-124"><a href="#decorrelate-124"><span class="linenos">124</span></a>
|
||||
</span><span id="decorrelate-125"><a href="#decorrelate-125"><span class="linenos">125</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="decorrelate-126"><a href="#decorrelate-126"><span class="linenos">126</span></a> <span class="n">keys</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="decorrelate-127"><a href="#decorrelate-127"><span class="linenos">127</span></a>
|
||||
</span><span id="decorrelate-128"><a href="#decorrelate-128"><span class="linenos">128</span></a> <span class="c1"># for all external columns in the where statement, find the relevant predicate</span>
|
||||
</span><span id="decorrelate-129"><a href="#decorrelate-129"><span class="linenos">129</span></a> <span class="c1"># keys to convert it into a join</span>
|
||||
</span><span id="decorrelate-130"><a href="#decorrelate-130"><span class="linenos">130</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">external_columns</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-131"><a href="#decorrelate-131"><span class="linenos">131</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-132"><a href="#decorrelate-132"><span class="linenos">132</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-133"><a href="#decorrelate-133"><span class="linenos">133</span></a>
|
||||
</span><span id="decorrelate-134"><a href="#decorrelate-134"><span class="linenos">134</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
<div class="pdoc-code codehilite"><pre><span></span><span id="decorrelate-121"><a href="#decorrelate-121"><span class="linenos">121</span></a><span class="k">def</span> <span class="nf">decorrelate</span><span class="p">(</span><span class="n">select</span><span class="p">,</span> <span class="n">parent_select</span><span class="p">,</span> <span class="n">external_columns</span><span class="p">,</span> <span class="n">next_alias_name</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-122"><a href="#decorrelate-122"><span class="linenos">122</span></a> <span class="n">where</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"where"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-123"><a href="#decorrelate-123"><span class="linenos">123</span></a>
|
||||
</span><span id="decorrelate-124"><a href="#decorrelate-124"><span class="linenos">124</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">where</span> <span class="ow">or</span> <span class="n">where</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Or</span><span class="p">)</span> <span class="ow">or</span> <span class="n">select</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Limit</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Offset</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-125"><a href="#decorrelate-125"><span class="linenos">125</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-126"><a href="#decorrelate-126"><span class="linenos">126</span></a>
|
||||
</span><span id="decorrelate-127"><a href="#decorrelate-127"><span class="linenos">127</span></a> <span class="n">table_alias</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="decorrelate-128"><a href="#decorrelate-128"><span class="linenos">128</span></a> <span class="n">keys</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="decorrelate-129"><a href="#decorrelate-129"><span class="linenos">129</span></a>
|
||||
</span><span id="decorrelate-130"><a href="#decorrelate-130"><span class="linenos">130</span></a> <span class="c1"># for all external columns in the where statement, find the relevant predicate</span>
|
||||
</span><span id="decorrelate-131"><a href="#decorrelate-131"><span class="linenos">131</span></a> <span class="c1"># keys to convert it into a join</span>
|
||||
</span><span id="decorrelate-132"><a href="#decorrelate-132"><span class="linenos">132</span></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">external_columns</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-133"><a href="#decorrelate-133"><span class="linenos">133</span></a> <span class="k">if</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-134"><a href="#decorrelate-134"><span class="linenos">134</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-135"><a href="#decorrelate-135"><span class="linenos">135</span></a>
|
||||
</span><span id="decorrelate-136"><a href="#decorrelate-136"><span class="linenos">136</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-137"><a href="#decorrelate-137"><span class="linenos">137</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-138"><a href="#decorrelate-138"><span class="linenos">138</span></a>
|
||||
</span><span id="decorrelate-139"><a href="#decorrelate-139"><span class="linenos">139</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-140"><a href="#decorrelate-140"><span class="linenos">140</span></a> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="decorrelate-141"><a href="#decorrelate-141"><span class="linenos">141</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">right</span>
|
||||
</span><span id="decorrelate-142"><a href="#decorrelate-142"><span class="linenos">142</span></a> <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">node</span> <span class="ow">is</span> <span class="n">column</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">walk</span><span class="p">())</span>
|
||||
</span><span id="decorrelate-143"><a href="#decorrelate-143"><span class="linenos">143</span></a> <span class="k">else</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span>
|
||||
</span><span id="decorrelate-144"><a href="#decorrelate-144"><span class="linenos">144</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-145"><a href="#decorrelate-145"><span class="linenos">145</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-146"><a href="#decorrelate-146"><span class="linenos">146</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-147"><a href="#decorrelate-147"><span class="linenos">147</span></a>
|
||||
</span><span id="decorrelate-148"><a href="#decorrelate-148"><span class="linenos">148</span></a> <span class="n">keys</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span><span class="p">))</span>
|
||||
</span><span id="decorrelate-136"><a href="#decorrelate-136"><span class="linenos">136</span></a> <span class="n">predicate</span> <span class="o">=</span> <span class="n">column</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-137"><a href="#decorrelate-137"><span class="linenos">137</span></a>
|
||||
</span><span id="decorrelate-138"><a href="#decorrelate-138"><span class="linenos">138</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">predicate</span> <span class="ow">or</span> <span class="n">predicate</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Where</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">where</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-139"><a href="#decorrelate-139"><span class="linenos">139</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-140"><a href="#decorrelate-140"><span class="linenos">140</span></a>
|
||||
</span><span id="decorrelate-141"><a href="#decorrelate-141"><span class="linenos">141</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Binary</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-142"><a href="#decorrelate-142"><span class="linenos">142</span></a> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span>
|
||||
</span><span id="decorrelate-143"><a href="#decorrelate-143"><span class="linenos">143</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">right</span>
|
||||
</span><span id="decorrelate-144"><a href="#decorrelate-144"><span class="linenos">144</span></a> <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">node</span> <span class="ow">is</span> <span class="n">column</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span><span class="o">.</span><span class="n">walk</span><span class="p">())</span>
|
||||
</span><span id="decorrelate-145"><a href="#decorrelate-145"><span class="linenos">145</span></a> <span class="k">else</span> <span class="n">predicate</span><span class="o">.</span><span class="n">left</span>
|
||||
</span><span id="decorrelate-146"><a href="#decorrelate-146"><span class="linenos">146</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-147"><a href="#decorrelate-147"><span class="linenos">147</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-148"><a href="#decorrelate-148"><span class="linenos">148</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-149"><a href="#decorrelate-149"><span class="linenos">149</span></a>
|
||||
</span><span id="decorrelate-150"><a href="#decorrelate-150"><span class="linenos">150</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-151"><a href="#decorrelate-151"><span class="linenos">151</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-152"><a href="#decorrelate-152"><span class="linenos">152</span></a>
|
||||
</span><span id="decorrelate-153"><a href="#decorrelate-153"><span class="linenos">153</span></a> <span class="n">is_subquery_projection</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-154"><a href="#decorrelate-154"><span class="linenos">154</span></a> <span class="n">node</span> <span class="ow">is</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-155"><a href="#decorrelate-155"><span class="linenos">155</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-156"><a href="#decorrelate-156"><span class="linenos">156</span></a>
|
||||
</span><span id="decorrelate-157"><a href="#decorrelate-157"><span class="linenos">157</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="decorrelate-158"><a href="#decorrelate-158"><span class="linenos">158</span></a> <span class="n">key_aliases</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="decorrelate-159"><a href="#decorrelate-159"><span class="linenos">159</span></a> <span class="n">group_by</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="decorrelate-160"><a href="#decorrelate-160"><span class="linenos">160</span></a>
|
||||
</span><span id="decorrelate-161"><a href="#decorrelate-161"><span class="linenos">161</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-162"><a href="#decorrelate-162"><span class="linenos">162</span></a> <span class="c1"># if we filter on the value of the subquery, it needs to be unique</span>
|
||||
</span><span id="decorrelate-163"><a href="#decorrelate-163"><span class="linenos">163</span></a> <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-164"><a href="#decorrelate-164"><span class="linenos">164</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="decorrelate-165"><a href="#decorrelate-165"><span class="linenos">165</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-166"><a href="#decorrelate-166"><span class="linenos">166</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-167"><a href="#decorrelate-167"><span class="linenos">167</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-168"><a href="#decorrelate-168"><span class="linenos">168</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="decorrelate-169"><a href="#decorrelate-169"><span class="linenos">169</span></a> <span class="c1"># all predicates that are equalities must also be in the unique</span>
|
||||
</span><span id="decorrelate-170"><a href="#decorrelate-170"><span class="linenos">170</span></a> <span class="c1"># so that we don't do a many to many join</span>
|
||||
</span><span id="decorrelate-171"><a href="#decorrelate-171"><span class="linenos">171</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="ow">and</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-172"><a href="#decorrelate-172"><span class="linenos">172</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-173"><a href="#decorrelate-173"><span class="linenos">173</span></a>
|
||||
</span><span id="decorrelate-174"><a href="#decorrelate-174"><span class="linenos">174</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-150"><a href="#decorrelate-150"><span class="linenos">150</span></a> <span class="n">keys</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span><span class="p">))</span>
|
||||
</span><span id="decorrelate-151"><a href="#decorrelate-151"><span class="linenos">151</span></a>
|
||||
</span><span id="decorrelate-152"><a href="#decorrelate-152"><span class="linenos">152</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-153"><a href="#decorrelate-153"><span class="linenos">153</span></a> <span class="k">return</span>
|
||||
</span><span id="decorrelate-154"><a href="#decorrelate-154"><span class="linenos">154</span></a>
|
||||
</span><span id="decorrelate-155"><a href="#decorrelate-155"><span class="linenos">155</span></a> <span class="n">is_subquery_projection</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-156"><a href="#decorrelate-156"><span class="linenos">156</span></a> <span class="n">node</span> <span class="ow">is</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span> <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">parent_select</span><span class="o">.</span><span class="n">selects</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Subquery</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-157"><a href="#decorrelate-157"><span class="linenos">157</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-158"><a href="#decorrelate-158"><span class="linenos">158</span></a>
|
||||
</span><span id="decorrelate-159"><a href="#decorrelate-159"><span class="linenos">159</span></a> <span class="n">value</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">selects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
</span><span id="decorrelate-160"><a href="#decorrelate-160"><span class="linenos">160</span></a> <span class="n">key_aliases</span> <span class="o">=</span> <span class="p">{}</span>
|
||||
</span><span id="decorrelate-161"><a href="#decorrelate-161"><span class="linenos">161</span></a> <span class="n">group_by</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="decorrelate-162"><a href="#decorrelate-162"><span class="linenos">162</span></a>
|
||||
</span><span id="decorrelate-163"><a href="#decorrelate-163"><span class="linenos">163</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-164"><a href="#decorrelate-164"><span class="linenos">164</span></a> <span class="c1"># if we filter on the value of the subquery, it needs to be unique</span>
|
||||
</span><span id="decorrelate-165"><a href="#decorrelate-165"><span class="linenos">165</span></a> <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-166"><a href="#decorrelate-166"><span class="linenos">166</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span>
|
||||
</span><span id="decorrelate-167"><a href="#decorrelate-167"><span class="linenos">167</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-168"><a href="#decorrelate-168"><span class="linenos">168</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-169"><a href="#decorrelate-169"><span class="linenos">169</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-170"><a href="#decorrelate-170"><span class="linenos">170</span></a> <span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">next_alias_name</span><span class="p">()</span>
|
||||
</span><span id="decorrelate-171"><a href="#decorrelate-171"><span class="linenos">171</span></a> <span class="c1"># all predicates that are equalities must also be in the unique</span>
|
||||
</span><span id="decorrelate-172"><a href="#decorrelate-172"><span class="linenos">172</span></a> <span class="c1"># so that we don't do a many to many join</span>
|
||||
</span><span id="decorrelate-173"><a href="#decorrelate-173"><span class="linenos">173</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)</span> <span class="ow">and</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-174"><a href="#decorrelate-174"><span class="linenos">174</span></a> <span class="n">group_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-175"><a href="#decorrelate-175"><span class="linenos">175</span></a>
|
||||
</span><span id="decorrelate-176"><a href="#decorrelate-176"><span class="linenos">176</span></a> <span class="c1"># if the value of the subquery is not an agg or a key, we need to collect it into an array</span>
|
||||
</span><span id="decorrelate-177"><a href="#decorrelate-177"><span class="linenos">177</span></a> <span class="c1"># so that it can be grouped. For subquery projections, we use a MAX aggregation instead.</span>
|
||||
</span><span id="decorrelate-178"><a href="#decorrelate-178"><span class="linenos">178</span></a> <span class="n">agg_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span> <span class="k">if</span> <span class="n">is_subquery_projection</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayAgg</span>
|
||||
</span><span id="decorrelate-179"><a href="#decorrelate-179"><span class="linenos">179</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-180"><a href="#decorrelate-180"><span class="linenos">180</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-181"><a href="#decorrelate-181"><span class="linenos">181</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">),</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="decorrelate-182"><a href="#decorrelate-182"><span class="linenos">182</span></a> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-183"><a href="#decorrelate-183"><span class="linenos">183</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-184"><a href="#decorrelate-184"><span class="linenos">184</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-185"><a href="#decorrelate-185"><span class="linenos">185</span></a>
|
||||
</span><span id="decorrelate-186"><a href="#decorrelate-186"><span class="linenos">186</span></a> <span class="c1"># exists queries should not have any selects as it only checks if there are any rows</span>
|
||||
</span><span id="decorrelate-187"><a href="#decorrelate-187"><span class="linenos">187</span></a> <span class="c1"># all selects will be added by the optimizer and only used for join keys</span>
|
||||
</span><span id="decorrelate-188"><a href="#decorrelate-188"><span class="linenos">188</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-189"><a href="#decorrelate-189"><span class="linenos">189</span></a> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"expressions"</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="decorrelate-190"><a href="#decorrelate-190"><span class="linenos">190</span></a>
|
||||
</span><span id="decorrelate-191"><a href="#decorrelate-191"><span class="linenos">191</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="decorrelate-192"><a href="#decorrelate-192"><span class="linenos">192</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-193"><a href="#decorrelate-193"><span class="linenos">193</span></a> <span class="c1"># add all keys to the projections of the subquery</span>
|
||||
</span><span id="decorrelate-194"><a href="#decorrelate-194"><span class="linenos">194</span></a> <span class="c1"># so that we can use it as a join key</span>
|
||||
</span><span id="decorrelate-195"><a href="#decorrelate-195"><span class="linenos">195</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">)</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">!=</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-196"><a href="#decorrelate-196"><span class="linenos">196</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-197"><a href="#decorrelate-197"><span class="linenos">197</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-198"><a href="#decorrelate-198"><span class="linenos">198</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">copy</span><span class="p">()),</span> <span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-199"><a href="#decorrelate-199"><span class="linenos">199</span></a>
|
||||
</span><span id="decorrelate-200"><a href="#decorrelate-200"><span class="linenos">200</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-201"><a href="#decorrelate-201"><span class="linenos">201</span></a> <span class="n">other</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-202"><a href="#decorrelate-202"><span class="linenos">202</span></a>
|
||||
</span><span id="decorrelate-203"><a href="#decorrelate-203"><span class="linenos">203</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-204"><a href="#decorrelate-204"><span class="linenos">204</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">key_aliases</span><span class="o">.</span><span class="n">values</span><span class="p">())[</span><span class="mi">0</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-205"><a href="#decorrelate-205"><span class="linenos">205</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"NOT </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2"> IS NULL"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-206"><a href="#decorrelate-206"><span class="linenos">206</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-207"><a href="#decorrelate-207"><span class="linenos">207</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-208"><a href="#decorrelate-208"><span class="linenos">208</span></a> <span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ALL(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span>
|
||||
</span><span id="decorrelate-209"><a href="#decorrelate-209"><span class="linenos">209</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-210"><a href="#decorrelate-210"><span class="linenos">210</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-211"><a href="#decorrelate-211"><span class="linenos">211</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-212"><a href="#decorrelate-212"><span class="linenos">212</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-213"><a href="#decorrelate-213"><span class="linenos">213</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-214"><a href="#decorrelate-214"><span class="linenos">214</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-215"><a href="#decorrelate-215"><span class="linenos">215</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-216"><a href="#decorrelate-216"><span class="linenos">216</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-217"><a href="#decorrelate-217"><span class="linenos">217</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-218"><a href="#decorrelate-218"><span class="linenos">218</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-219"><a href="#decorrelate-219"><span class="linenos">219</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-220"><a href="#decorrelate-220"><span class="linenos">220</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-221"><a href="#decorrelate-221"><span class="linenos">221</span></a> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">this</span><span class="si">}</span><span class="s2">)"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-222"><a href="#decorrelate-222"><span class="linenos">222</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-223"><a href="#decorrelate-223"><span class="linenos">223</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-224"><a href="#decorrelate-224"><span class="linenos">224</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-225"><a href="#decorrelate-225"><span class="linenos">225</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-226"><a href="#decorrelate-226"><span class="linenos">226</span></a>
|
||||
</span><span id="decorrelate-227"><a href="#decorrelate-227"><span class="linenos">227</span></a> <span class="c1"># COUNT always returns 0 on empty datasets, so we need take that into consideration here</span>
|
||||
</span><span id="decorrelate-228"><a href="#decorrelate-228"><span class="linenos">228</span></a> <span class="c1"># by transforming all counts into 0 and using that as the coalesced value</span>
|
||||
</span><span id="decorrelate-229"><a href="#decorrelate-229"><span class="linenos">229</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-230"><a href="#decorrelate-230"><span class="linenos">230</span></a>
|
||||
</span><span id="decorrelate-231"><a href="#decorrelate-231"><span class="linenos">231</span></a> <span class="k">def</span> <span class="nf">remove_aggs</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-232"><a href="#decorrelate-232"><span class="linenos">232</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-233"><a href="#decorrelate-233"><span class="linenos">233</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-234"><a href="#decorrelate-234"><span class="linenos">234</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-235"><a href="#decorrelate-235"><span class="linenos">235</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">()</span>
|
||||
</span><span id="decorrelate-236"><a href="#decorrelate-236"><span class="linenos">236</span></a> <span class="k">return</span> <span class="n">node</span>
|
||||
</span><span id="decorrelate-237"><a href="#decorrelate-237"><span class="linenos">237</span></a>
|
||||
</span><span id="decorrelate-238"><a href="#decorrelate-238"><span class="linenos">238</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Coalesce</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-239"><a href="#decorrelate-239"><span class="linenos">239</span></a> <span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-240"><a href="#decorrelate-240"><span class="linenos">240</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">remove_aggs</span><span class="p">)],</span>
|
||||
</span><span id="decorrelate-241"><a href="#decorrelate-241"><span class="linenos">241</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-242"><a href="#decorrelate-242"><span class="linenos">242</span></a>
|
||||
</span><span id="decorrelate-243"><a href="#decorrelate-243"><span class="linenos">243</span></a> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-176"><a href="#decorrelate-176"><span class="linenos">176</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">find_ancestor</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Predicate</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-177"><a href="#decorrelate-177"><span class="linenos">177</span></a>
|
||||
</span><span id="decorrelate-178"><a href="#decorrelate-178"><span class="linenos">178</span></a> <span class="c1"># if the value of the subquery is not an agg or a key, we need to collect it into an array</span>
|
||||
</span><span id="decorrelate-179"><a href="#decorrelate-179"><span class="linenos">179</span></a> <span class="c1"># so that it can be grouped. For subquery projections, we use a MAX aggregation instead.</span>
|
||||
</span><span id="decorrelate-180"><a href="#decorrelate-180"><span class="linenos">180</span></a> <span class="n">agg_func</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Max</span> <span class="k">if</span> <span class="n">is_subquery_projection</span> <span class="k">else</span> <span class="n">exp</span><span class="o">.</span><span class="n">ArrayAgg</span>
|
||||
</span><span id="decorrelate-181"><a href="#decorrelate-181"><span class="linenos">181</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">)</span> <span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-182"><a href="#decorrelate-182"><span class="linenos">182</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-183"><a href="#decorrelate-183"><span class="linenos">183</span></a> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">),</span> <span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="decorrelate-184"><a href="#decorrelate-184"><span class="linenos">184</span></a> <span class="n">append</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-185"><a href="#decorrelate-185"><span class="linenos">185</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-186"><a href="#decorrelate-186"><span class="linenos">186</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-187"><a href="#decorrelate-187"><span class="linenos">187</span></a>
|
||||
</span><span id="decorrelate-188"><a href="#decorrelate-188"><span class="linenos">188</span></a> <span class="c1"># exists queries should not have any selects as it only checks if there are any rows</span>
|
||||
</span><span id="decorrelate-189"><a href="#decorrelate-189"><span class="linenos">189</span></a> <span class="c1"># all selects will be added by the optimizer and only used for join keys</span>
|
||||
</span><span id="decorrelate-190"><a href="#decorrelate-190"><span class="linenos">190</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-191"><a href="#decorrelate-191"><span class="linenos">191</span></a> <span class="n">select</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"expressions"</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
</span><span id="decorrelate-192"><a href="#decorrelate-192"><span class="linenos">192</span></a>
|
||||
</span><span id="decorrelate-193"><a href="#decorrelate-193"><span class="linenos">193</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">key_aliases</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||||
</span><span id="decorrelate-194"><a href="#decorrelate-194"><span class="linenos">194</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-195"><a href="#decorrelate-195"><span class="linenos">195</span></a> <span class="c1"># add all keys to the projections of the subquery</span>
|
||||
</span><span id="decorrelate-196"><a href="#decorrelate-196"><span class="linenos">196</span></a> <span class="c1"># so that we can use it as a join key</span>
|
||||
</span><span id="decorrelate-197"><a href="#decorrelate-197"><span class="linenos">197</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">)</span> <span class="ow">or</span> <span class="n">key</span> <span class="o">!=</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-198"><a href="#decorrelate-198"><span class="linenos">198</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> AS </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-199"><a href="#decorrelate-199"><span class="linenos">199</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-200"><a href="#decorrelate-200"><span class="linenos">200</span></a> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">agg_func</span><span class="p">(</span><span class="n">this</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">copy</span><span class="p">()),</span> <span class="n">alias</span><span class="p">,</span> <span class="n">quoted</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-201"><a href="#decorrelate-201"><span class="linenos">201</span></a>
|
||||
</span><span id="decorrelate-202"><a href="#decorrelate-202"><span class="linenos">202</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">alias</span><span class="p">,</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-203"><a href="#decorrelate-203"><span class="linenos">203</span></a> <span class="n">other</span> <span class="o">=</span> <span class="n">_other_operand</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-204"><a href="#decorrelate-204"><span class="linenos">204</span></a>
|
||||
</span><span id="decorrelate-205"><a href="#decorrelate-205"><span class="linenos">205</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Exists</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-206"><a href="#decorrelate-206"><span class="linenos">206</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">key_aliases</span><span class="o">.</span><span class="n">values</span><span class="p">())[</span><span class="mi">0</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-207"><a href="#decorrelate-207"><span class="linenos">207</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"NOT </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2"> IS NULL"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-208"><a href="#decorrelate-208"><span class="linenos">208</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">All</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-209"><a href="#decorrelate-209"><span class="linenos">209</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-210"><a href="#decorrelate-210"><span class="linenos">210</span></a> <span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ALL(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span>
|
||||
</span><span id="decorrelate-211"><a href="#decorrelate-211"><span class="linenos">211</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-212"><a href="#decorrelate-212"><span class="linenos">212</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Any</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-213"><a href="#decorrelate-213"><span class="linenos">213</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-214"><a href="#decorrelate-214"><span class="linenos">214</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-215"><a href="#decorrelate-215"><span class="linenos">215</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-216"><a href="#decorrelate-216"><span class="linenos">216</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-217"><a href="#decorrelate-217"><span class="linenos">217</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">In</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-218"><a href="#decorrelate-218"><span class="linenos">218</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">this</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-219"><a href="#decorrelate-219"><span class="linenos">219</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span><span class="n">parent_predicate</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">other</span><span class="si">}</span><span class="s2"> = </span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-220"><a href="#decorrelate-220"><span class="linenos">220</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-221"><a href="#decorrelate-221"><span class="linenos">221</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-222"><a href="#decorrelate-222"><span class="linenos">222</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-223"><a href="#decorrelate-223"><span class="linenos">223</span></a> <span class="sa">f</span><span class="s2">"ARRAY_ANY(</span><span class="si">{</span><span class="n">alias</span><span class="si">}</span><span class="s2">, _x -> _x = </span><span class="si">{</span><span class="n">parent_predicate</span><span class="o">.</span><span class="n">this</span><span class="si">}</span><span class="s2">)"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-224"><a href="#decorrelate-224"><span class="linenos">224</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-225"><a href="#decorrelate-225"><span class="linenos">225</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-226"><a href="#decorrelate-226"><span class="linenos">226</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-227"><a href="#decorrelate-227"><span class="linenos">227</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">alias_</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-228"><a href="#decorrelate-228"><span class="linenos">228</span></a>
|
||||
</span><span id="decorrelate-229"><a href="#decorrelate-229"><span class="linenos">229</span></a> <span class="c1"># COUNT always returns 0 on empty datasets, so we need take that into consideration here</span>
|
||||
</span><span id="decorrelate-230"><a href="#decorrelate-230"><span class="linenos">230</span></a> <span class="c1"># by transforming all counts into 0 and using that as the coalesced value</span>
|
||||
</span><span id="decorrelate-231"><a href="#decorrelate-231"><span class="linenos">231</span></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-232"><a href="#decorrelate-232"><span class="linenos">232</span></a>
|
||||
</span><span id="decorrelate-233"><a href="#decorrelate-233"><span class="linenos">233</span></a> <span class="k">def</span> <span class="nf">remove_aggs</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-234"><a href="#decorrelate-234"><span class="linenos">234</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">Count</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-235"><a href="#decorrelate-235"><span class="linenos">235</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">Literal</span><span class="o">.</span><span class="n">number</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-236"><a href="#decorrelate-236"><span class="linenos">236</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">AggFunc</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-237"><a href="#decorrelate-237"><span class="linenos">237</span></a> <span class="k">return</span> <span class="n">exp</span><span class="o">.</span><span class="n">null</span><span class="p">()</span>
|
||||
</span><span id="decorrelate-238"><a href="#decorrelate-238"><span class="linenos">238</span></a> <span class="k">return</span> <span class="n">node</span>
|
||||
</span><span id="decorrelate-239"><a href="#decorrelate-239"><span class="linenos">239</span></a>
|
||||
</span><span id="decorrelate-240"><a href="#decorrelate-240"><span class="linenos">240</span></a> <span class="n">alias</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">Coalesce</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-241"><a href="#decorrelate-241"><span class="linenos">241</span></a> <span class="n">this</span><span class="o">=</span><span class="n">alias</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-242"><a href="#decorrelate-242"><span class="linenos">242</span></a> <span class="n">expressions</span><span class="o">=</span><span class="p">[</span><span class="n">value</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">remove_aggs</span><span class="p">)],</span>
|
||||
</span><span id="decorrelate-243"><a href="#decorrelate-243"><span class="linenos">243</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-244"><a href="#decorrelate-244"><span class="linenos">244</span></a>
|
||||
</span><span id="decorrelate-245"><a href="#decorrelate-245"><span class="linenos">245</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-246"><a href="#decorrelate-246"><span class="linenos">246</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="decorrelate-247"><a href="#decorrelate-247"><span class="linenos">247</span></a> <span class="n">nested</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-248"><a href="#decorrelate-248"><span class="linenos">248</span></a>
|
||||
</span><span id="decorrelate-249"><a href="#decorrelate-249"><span class="linenos">249</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-250"><a href="#decorrelate-250"><span class="linenos">250</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-251"><a href="#decorrelate-251"><span class="linenos">251</span></a> <span class="k">continue</span>
|
||||
</span><span id="decorrelate-252"><a href="#decorrelate-252"><span class="linenos">252</span></a>
|
||||
</span><span id="decorrelate-253"><a href="#decorrelate-253"><span class="linenos">253</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-254"><a href="#decorrelate-254"><span class="linenos">254</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-255"><a href="#decorrelate-255"><span class="linenos">255</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-256"><a href="#decorrelate-256"><span class="linenos">256</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-257"><a href="#decorrelate-257"><span class="linenos">257</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-258"><a href="#decorrelate-258"><span class="linenos">258</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_CONTAINS(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2">))"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-259"><a href="#decorrelate-259"><span class="linenos">259</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-260"><a href="#decorrelate-260"><span class="linenos">260</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-261"><a href="#decorrelate-261"><span class="linenos">261</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="s2">"_x"</span><span class="p">))</span>
|
||||
</span><span id="decorrelate-262"><a href="#decorrelate-262"><span class="linenos">262</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-263"><a href="#decorrelate-263"><span class="linenos">263</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-264"><a href="#decorrelate-264"><span class="linenos">264</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_ANY(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, _x -> </span><span class="si">{</span><span class="n">predicate</span><span class="si">}</span><span class="s2">))"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-265"><a href="#decorrelate-265"><span class="linenos">265</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-266"><a href="#decorrelate-266"><span class="linenos">266</span></a>
|
||||
</span><span id="decorrelate-267"><a href="#decorrelate-267"><span class="linenos">267</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-268"><a href="#decorrelate-268"><span class="linenos">268</span></a> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="o">*</span><span class="n">group_by</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="decorrelate-269"><a href="#decorrelate-269"><span class="linenos">269</span></a> <span class="n">on</span><span class="o">=</span><span class="p">[</span><span class="n">predicate</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)],</span>
|
||||
</span><span id="decorrelate-270"><a href="#decorrelate-270"><span class="linenos">270</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-271"><a href="#decorrelate-271"><span class="linenos">271</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">table_alias</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-272"><a href="#decorrelate-272"><span class="linenos">272</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-273"><a href="#decorrelate-273"><span class="linenos">273</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-245"><a href="#decorrelate-245"><span class="linenos">245</span></a> <span class="n">select</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-246"><a href="#decorrelate-246"><span class="linenos">246</span></a>
|
||||
</span><span id="decorrelate-247"><a href="#decorrelate-247"><span class="linenos">247</span></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-248"><a href="#decorrelate-248"><span class="linenos">248</span></a> <span class="n">predicate</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">true</span><span class="p">())</span>
|
||||
</span><span id="decorrelate-249"><a href="#decorrelate-249"><span class="linenos">249</span></a> <span class="n">nested</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">column</span><span class="p">(</span><span class="n">key_aliases</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">table_alias</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-250"><a href="#decorrelate-250"><span class="linenos">250</span></a>
|
||||
</span><span id="decorrelate-251"><a href="#decorrelate-251"><span class="linenos">251</span></a> <span class="k">if</span> <span class="n">is_subquery_projection</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-252"><a href="#decorrelate-252"><span class="linenos">252</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-253"><a href="#decorrelate-253"><span class="linenos">253</span></a> <span class="k">continue</span>
|
||||
</span><span id="decorrelate-254"><a href="#decorrelate-254"><span class="linenos">254</span></a>
|
||||
</span><span id="decorrelate-255"><a href="#decorrelate-255"><span class="linenos">255</span></a> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">group_by</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-256"><a href="#decorrelate-256"><span class="linenos">256</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">nested</span><span class="p">)</span>
|
||||
</span><span id="decorrelate-257"><a href="#decorrelate-257"><span class="linenos">257</span></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">):</span>
|
||||
</span><span id="decorrelate-258"><a href="#decorrelate-258"><span class="linenos">258</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-259"><a href="#decorrelate-259"><span class="linenos">259</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-260"><a href="#decorrelate-260"><span class="linenos">260</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_CONTAINS(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">column</span><span class="si">}</span><span class="s2">))"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-261"><a href="#decorrelate-261"><span class="linenos">261</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-262"><a href="#decorrelate-262"><span class="linenos">262</span></a> <span class="k">else</span><span class="p">:</span>
|
||||
</span><span id="decorrelate-263"><a href="#decorrelate-263"><span class="linenos">263</span></a> <span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">exp</span><span class="o">.</span><span class="n">to_identifier</span><span class="p">(</span><span class="s2">"_x"</span><span class="p">))</span>
|
||||
</span><span id="decorrelate-264"><a href="#decorrelate-264"><span class="linenos">264</span></a> <span class="n">parent_predicate</span> <span class="o">=</span> <span class="n">_replace</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-265"><a href="#decorrelate-265"><span class="linenos">265</span></a> <span class="n">parent_predicate</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-266"><a href="#decorrelate-266"><span class="linenos">266</span></a> <span class="sa">f</span><span class="s2">"(</span><span class="si">{</span><span class="n">parent_predicate</span><span class="si">}</span><span class="s2"> AND ARRAY_ANY(</span><span class="si">{</span><span class="n">nested</span><span class="si">}</span><span class="s2">, _x -> </span><span class="si">{</span><span class="n">predicate</span><span class="si">}</span><span class="s2">))"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-267"><a href="#decorrelate-267"><span class="linenos">267</span></a> <span class="p">)</span>
|
||||
</span><span id="decorrelate-268"><a href="#decorrelate-268"><span class="linenos">268</span></a>
|
||||
</span><span id="decorrelate-269"><a href="#decorrelate-269"><span class="linenos">269</span></a> <span class="n">parent_select</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
||||
</span><span id="decorrelate-270"><a href="#decorrelate-270"><span class="linenos">270</span></a> <span class="n">select</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="o">*</span><span class="n">group_by</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
|
||||
</span><span id="decorrelate-271"><a href="#decorrelate-271"><span class="linenos">271</span></a> <span class="n">on</span><span class="o">=</span><span class="p">[</span><span class="n">predicate</span> <span class="k">for</span> <span class="o">*</span><span class="n">_</span><span class="p">,</span> <span class="n">predicate</span> <span class="ow">in</span> <span class="n">keys</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">predicate</span><span class="p">,</span> <span class="n">exp</span><span class="o">.</span><span class="n">EQ</span><span class="p">)],</span>
|
||||
</span><span id="decorrelate-272"><a href="#decorrelate-272"><span class="linenos">272</span></a> <span class="n">join_type</span><span class="o">=</span><span class="s2">"LEFT"</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-273"><a href="#decorrelate-273"><span class="linenos">273</span></a> <span class="n">join_alias</span><span class="o">=</span><span class="n">table_alias</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-274"><a href="#decorrelate-274"><span class="linenos">274</span></a> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||||
</span><span id="decorrelate-275"><a href="#decorrelate-275"><span class="linenos">275</span></a> <span class="p">)</span>
|
||||
</span></pre></div>
|
||||
|
||||
|
||||
|
|
23048
docs/sqlglot/parser.html
23048
docs/sqlglot/parser.html
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -8533,7 +8533,7 @@
|
|||
<div class="attr variable">
|
||||
<span class="name">COMMANDS</span> =
|
||||
<input id="Tokenizer.COMMANDS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
||||
<label class="view-value-button pdoc-button" for="Tokenizer.COMMANDS-view-value"></label><span class="default_value">{<<a href="#TokenType.FETCH">TokenType.FETCH</a>: 'FETCH'>, <<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: 'COMMAND'>, <<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: 'EXECUTE'>, <<a href="#TokenType.SHOW">TokenType.SHOW</a>: 'SHOW'>}</span>
|
||||
<label class="view-value-button pdoc-button" for="Tokenizer.COMMANDS-view-value"></label><span class="default_value">{<<a href="#TokenType.COMMAND">TokenType.COMMAND</a>: 'COMMAND'>, <<a href="#TokenType.FETCH">TokenType.FETCH</a>: 'FETCH'>, <<a href="#TokenType.SHOW">TokenType.SHOW</a>: 'SHOW'>, <<a href="#TokenType.EXECUTE">TokenType.EXECUTE</a>: 'EXECUTE'>}</span>
|
||||
|
||||
|
||||
</div>
|
||||
|
|
|
@ -536,7 +536,7 @@ def year(col: ColumnOrName) -> Column:
|
|||
|
||||
|
||||
def quarter(col: ColumnOrName) -> Column:
|
||||
return Column.invoke_anonymous_function(col, "QUARTER")
|
||||
return Column.invoke_expression_over_column(col, expression.Quarter)
|
||||
|
||||
|
||||
def month(col: ColumnOrName) -> Column:
|
||||
|
|
|
@ -15,7 +15,7 @@ from sqlglot.dialects.dialect import (
|
|||
build_formatted_time,
|
||||
filter_array_using_unnest,
|
||||
if_sql,
|
||||
inline_array_sql,
|
||||
inline_array_unless_query,
|
||||
max_or_greatest,
|
||||
min_or_least,
|
||||
no_ilike_sql,
|
||||
|
@ -80,29 +80,6 @@ def _create_sql(self: BigQuery.Generator, expression: exp.Create) -> str:
|
|||
return self.create_sql(expression)
|
||||
|
||||
|
||||
def _unqualify_unnest(expression: exp.Expression) -> exp.Expression:
|
||||
"""Remove references to unnest table aliases since bigquery doesn't allow them.
|
||||
|
||||
These are added by the optimizer's qualify_column step.
|
||||
"""
|
||||
from sqlglot.optimizer.scope import find_all_in_scope
|
||||
|
||||
if isinstance(expression, exp.Select):
|
||||
unnest_aliases = {
|
||||
unnest.alias
|
||||
for unnest in find_all_in_scope(expression, exp.Unnest)
|
||||
if isinstance(unnest.parent, (exp.From, exp.Join))
|
||||
}
|
||||
if unnest_aliases:
|
||||
for column in expression.find_all(exp.Column):
|
||||
if column.table in unnest_aliases:
|
||||
column.set("table", None)
|
||||
elif column.db in unnest_aliases:
|
||||
column.set("db", None)
|
||||
|
||||
return expression
|
||||
|
||||
|
||||
# https://issuetracker.google.com/issues/162294746
|
||||
# workaround for bigquery bug when grouping by an expression and then ordering
|
||||
# WITH x AS (SELECT 1 y)
|
||||
|
@ -197,8 +174,8 @@ def _ts_or_ds_add_sql(self: BigQuery.Generator, expression: exp.TsOrDsAdd) -> st
|
|||
|
||||
|
||||
def _ts_or_ds_diff_sql(self: BigQuery.Generator, expression: exp.TsOrDsDiff) -> str:
|
||||
expression.this.replace(exp.cast(expression.this, "TIMESTAMP", copy=True))
|
||||
expression.expression.replace(exp.cast(expression.expression, "TIMESTAMP", copy=True))
|
||||
expression.this.replace(exp.cast(expression.this, exp.DataType.Type.TIMESTAMP))
|
||||
expression.expression.replace(exp.cast(expression.expression, exp.DataType.Type.TIMESTAMP))
|
||||
unit = unit_to_var(expression)
|
||||
return self.func("DATE_DIFF", expression.this, expression.expression, unit)
|
||||
|
||||
|
@ -214,7 +191,9 @@ def _unix_to_time_sql(self: BigQuery.Generator, expression: exp.UnixToTime) -> s
|
|||
if scale == exp.UnixToTime.MICROS:
|
||||
return self.func("TIMESTAMP_MICROS", timestamp)
|
||||
|
||||
unix_seconds = exp.cast(exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)), "int64")
|
||||
unix_seconds = exp.cast(
|
||||
exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)), exp.DataType.Type.BIGINT
|
||||
)
|
||||
return self.func("TIMESTAMP_SECONDS", unix_seconds)
|
||||
|
||||
|
||||
|
@ -576,6 +555,7 @@ class BigQuery(Dialect):
|
|||
exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
|
||||
exp.ArgMax: arg_max_or_min_no_count("MAX_BY"),
|
||||
exp.ArgMin: arg_max_or_min_no_count("MIN_BY"),
|
||||
exp.Array: inline_array_unless_query,
|
||||
exp.ArrayContains: _array_contains_sql,
|
||||
exp.ArrayFilter: filter_array_using_unnest,
|
||||
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
||||
|
@ -629,7 +609,7 @@ class BigQuery(Dialect):
|
|||
exp.Select: transforms.preprocess(
|
||||
[
|
||||
transforms.explode_to_unnest(),
|
||||
_unqualify_unnest,
|
||||
transforms.unqualify_unnest,
|
||||
transforms.eliminate_distinct_on,
|
||||
_alias_ordered_group,
|
||||
transforms.eliminate_semi_and_anti_joins,
|
||||
|
@ -843,13 +823,6 @@ class BigQuery(Dialect):
|
|||
def trycast_sql(self, expression: exp.TryCast) -> str:
|
||||
return self.cast_sql(expression, safe_prefix="SAFE_")
|
||||
|
||||
def array_sql(self, expression: exp.Array) -> str:
|
||||
first_arg = seq_get(expression.expressions, 0)
|
||||
if isinstance(first_arg, exp.Query):
|
||||
return f"ARRAY{self.wrap(self.sql(first_arg))}"
|
||||
|
||||
return inline_array_sql(self, expression)
|
||||
|
||||
def bracket_sql(self, expression: exp.Bracket) -> str:
|
||||
this = expression.this
|
||||
expressions = expression.expressions
|
||||
|
|
|
@ -629,7 +629,8 @@ class ClickHouse(Dialect):
|
|||
exp.CountIf: rename_func("countIf"),
|
||||
exp.CompressColumnConstraint: lambda self,
|
||||
e: f"CODEC({self.expressions(e, key='this', flat=True)})",
|
||||
exp.ComputedColumnConstraint: lambda self, e: f"ALIAS {self.sql(e, 'this')}",
|
||||
exp.ComputedColumnConstraint: lambda self,
|
||||
e: f"{'MATERIALIZED' if e.args.get('persisted') else 'ALIAS'} {self.sql(e, 'this')}",
|
||||
exp.CurrentDate: lambda self, e: self.func("CURRENT_DATE"),
|
||||
exp.DateAdd: date_delta_sql("DATE_ADD"),
|
||||
exp.DateDiff: date_delta_sql("DATE_DIFF"),
|
||||
|
@ -667,6 +668,7 @@ class ClickHouse(Dialect):
|
|||
TABLE_HINTS = False
|
||||
EXPLICIT_UNION = True
|
||||
GROUPINGS_SEP = ""
|
||||
OUTER_UNION_MODIFIERS = False
|
||||
|
||||
# there's no list in docs, but it can be found in Clickhouse code
|
||||
# see `ClickHouse/src/Parsers/ParserCreate*.cpp`
|
||||
|
|
|
@ -562,7 +562,7 @@ def if_sql(
|
|||
def arrow_json_extract_sql(self: Generator, expression: JSON_EXTRACT_TYPE) -> str:
|
||||
this = expression.this
|
||||
if self.JSON_TYPE_REQUIRED_FOR_EXTRACTION and isinstance(this, exp.Literal) and this.is_string:
|
||||
this.replace(exp.cast(this, "json"))
|
||||
this.replace(exp.cast(this, exp.DataType.Type.JSON))
|
||||
|
||||
return self.binary(expression, "->" if isinstance(expression, exp.JSONExtract) else "->>")
|
||||
|
||||
|
@ -571,6 +571,13 @@ def inline_array_sql(self: Generator, expression: exp.Array) -> str:
|
|||
return f"[{self.expressions(expression, flat=True)}]"
|
||||
|
||||
|
||||
def inline_array_unless_query(self: Generator, expression: exp.Array) -> str:
|
||||
elem = seq_get(expression.expressions, 0)
|
||||
if isinstance(elem, exp.Expression) and elem.find(exp.Query):
|
||||
return self.func("ARRAY", elem)
|
||||
return inline_array_sql(self, expression)
|
||||
|
||||
|
||||
def no_ilike_sql(self: Generator, expression: exp.ILike) -> str:
|
||||
return self.like_sql(
|
||||
exp.Like(this=exp.Lower(this=expression.this), expression=expression.expression)
|
||||
|
@ -765,11 +772,11 @@ def no_timestamp_sql(self: Generator, expression: exp.Timestamp) -> str:
|
|||
from sqlglot.optimizer.annotate_types import annotate_types
|
||||
|
||||
target_type = annotate_types(expression).type or exp.DataType.Type.TIMESTAMP
|
||||
return self.sql(exp.cast(expression.this, to=target_type))
|
||||
return self.sql(exp.cast(expression.this, target_type))
|
||||
if expression.text("expression").lower() in TIMEZONES:
|
||||
return self.sql(
|
||||
exp.AtTimeZone(
|
||||
this=exp.cast(expression.this, to=exp.DataType.Type.TIMESTAMP),
|
||||
this=exp.cast(expression.this, exp.DataType.Type.TIMESTAMP),
|
||||
zone=expression.expression,
|
||||
)
|
||||
)
|
||||
|
@ -806,11 +813,11 @@ def right_to_substring_sql(self: Generator, expression: exp.Left) -> str:
|
|||
|
||||
|
||||
def timestrtotime_sql(self: Generator, expression: exp.TimeStrToTime) -> str:
|
||||
return self.sql(exp.cast(expression.this, "timestamp"))
|
||||
return self.sql(exp.cast(expression.this, exp.DataType.Type.TIMESTAMP))
|
||||
|
||||
|
||||
def datestrtodate_sql(self: Generator, expression: exp.DateStrToDate) -> str:
|
||||
return self.sql(exp.cast(expression.this, "date"))
|
||||
return self.sql(exp.cast(expression.this, exp.DataType.Type.DATE))
|
||||
|
||||
|
||||
# Used for Presto and Duckdb which use functions that don't support charset, and assume utf-8
|
||||
|
@ -1023,7 +1030,7 @@ def no_last_day_sql(self: Generator, expression: exp.LastDay) -> str:
|
|||
plus_one_month = exp.func("date_add", trunc_curr_date, 1, "month")
|
||||
minus_one_day = exp.func("date_sub", plus_one_month, 1, "day")
|
||||
|
||||
return self.sql(exp.cast(minus_one_day, "date"))
|
||||
return self.sql(exp.cast(minus_one_day, exp.DataType.Type.DATE))
|
||||
|
||||
|
||||
def merge_without_target_sql(self: Generator, expression: exp.Merge) -> str:
|
||||
|
|
|
@ -19,7 +19,7 @@ def _str_to_date(self: Drill.Generator, expression: exp.StrToDate) -> str:
|
|||
this = self.sql(expression, "this")
|
||||
time_format = self.format_time(expression)
|
||||
if time_format == Drill.DATE_FORMAT:
|
||||
return self.sql(exp.cast(this, "date"))
|
||||
return self.sql(exp.cast(this, exp.DataType.Type.DATE))
|
||||
return self.func("TO_DATE", this, time_format)
|
||||
|
||||
|
||||
|
@ -134,7 +134,7 @@ class Drill(Dialect):
|
|||
[transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins]
|
||||
),
|
||||
exp.StrToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this, self.format_time(e)),
|
||||
exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, "date")),
|
||||
exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)),
|
||||
exp.TimeStrToTime: timestrtotime_sql,
|
||||
exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
|
||||
exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)),
|
||||
|
|
|
@ -15,7 +15,7 @@ from sqlglot.dialects.dialect import (
|
|||
datestrtodate_sql,
|
||||
encode_decode_sql,
|
||||
build_formatted_time,
|
||||
inline_array_sql,
|
||||
inline_array_unless_query,
|
||||
no_comment_column_constraint_sql,
|
||||
no_safe_divide_sql,
|
||||
no_timestamp_sql,
|
||||
|
@ -312,6 +312,15 @@ class DuckDB(Dialect):
|
|||
),
|
||||
}
|
||||
|
||||
def _parse_bracket(
|
||||
self, this: t.Optional[exp.Expression] = None
|
||||
) -> t.Optional[exp.Expression]:
|
||||
bracket = super()._parse_bracket(this)
|
||||
if isinstance(bracket, exp.Bracket):
|
||||
bracket.set("returns_list_for_maps", True)
|
||||
|
||||
return bracket
|
||||
|
||||
def _parse_map(self) -> exp.ToMap | exp.Map:
|
||||
if self._match(TokenType.L_BRACE, advance=False):
|
||||
return self.expression(exp.ToMap, this=self._parse_bracket())
|
||||
|
@ -370,11 +379,7 @@ class DuckDB(Dialect):
|
|||
TRANSFORMS = {
|
||||
**generator.Generator.TRANSFORMS,
|
||||
exp.ApproxDistinct: approx_count_distinct_sql,
|
||||
exp.Array: lambda self, e: (
|
||||
self.func("ARRAY", e.expressions[0])
|
||||
if e.expressions and e.expressions[0].find(exp.Select)
|
||||
else inline_array_sql(self, e)
|
||||
),
|
||||
exp.Array: inline_array_unless_query,
|
||||
exp.ArrayFilter: rename_func("LIST_FILTER"),
|
||||
exp.ArraySize: rename_func("ARRAY_LENGTH"),
|
||||
exp.ArgMax: arg_max_or_min_no_count("ARG_MAX"),
|
||||
|
@ -416,8 +421,8 @@ class DuckDB(Dialect):
|
|||
exp.MonthsBetween: lambda self, e: self.func(
|
||||
"DATEDIFF",
|
||||
"'month'",
|
||||
exp.cast(e.expression, "timestamp", copy=True),
|
||||
exp.cast(e.this, "timestamp", copy=True),
|
||||
exp.cast(e.expression, exp.DataType.Type.TIMESTAMP, copy=True),
|
||||
exp.cast(e.this, exp.DataType.Type.TIMESTAMP, copy=True),
|
||||
),
|
||||
exp.ParseJSON: rename_func("JSON"),
|
||||
exp.PercentileCont: _rename_unless_within_group("PERCENTILE_CONT", "QUANTILE_CONT"),
|
||||
|
@ -452,9 +457,11 @@ class DuckDB(Dialect):
|
|||
"DATE_DIFF", exp.Literal.string(e.unit), e.expression, e.this
|
||||
),
|
||||
exp.TimestampTrunc: timestamptrunc_sql,
|
||||
exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, "date")),
|
||||
exp.TimeStrToDate: lambda self, e: self.sql(exp.cast(e.this, exp.DataType.Type.DATE)),
|
||||
exp.TimeStrToTime: timestrtotime_sql,
|
||||
exp.TimeStrToUnix: lambda self, e: self.func("EPOCH", exp.cast(e.this, "timestamp")),
|
||||
exp.TimeStrToUnix: lambda self, e: self.func(
|
||||
"EPOCH", exp.cast(e.this, exp.DataType.Type.TIMESTAMP)
|
||||
),
|
||||
exp.TimeToStr: lambda self, e: self.func("STRFTIME", e.this, self.format_time(e)),
|
||||
exp.TimeToUnix: rename_func("EPOCH"),
|
||||
exp.TsOrDiToDi: lambda self,
|
||||
|
@ -463,8 +470,8 @@ class DuckDB(Dialect):
|
|||
exp.TsOrDsDiff: lambda self, e: self.func(
|
||||
"DATE_DIFF",
|
||||
f"'{e.args.get('unit') or 'DAY'}'",
|
||||
exp.cast(e.expression, "TIMESTAMP"),
|
||||
exp.cast(e.this, "TIMESTAMP"),
|
||||
exp.cast(e.expression, exp.DataType.Type.TIMESTAMP),
|
||||
exp.cast(e.this, exp.DataType.Type.TIMESTAMP),
|
||||
),
|
||||
exp.UnixToStr: lambda self, e: self.func(
|
||||
"STRFTIME", self.func("TO_TIMESTAMP", e.this), self.format_time(e)
|
||||
|
@ -593,7 +600,19 @@ class DuckDB(Dialect):
|
|||
return super().generateseries_sql(expression)
|
||||
|
||||
def bracket_sql(self, expression: exp.Bracket) -> str:
|
||||
if isinstance(expression.this, exp.Array):
|
||||
expression.this.replace(exp.paren(expression.this))
|
||||
this = expression.this
|
||||
if isinstance(this, exp.Array):
|
||||
this.replace(exp.paren(this))
|
||||
|
||||
return super().bracket_sql(expression)
|
||||
bracket = super().bracket_sql(expression)
|
||||
|
||||
if not expression.args.get("returns_list_for_maps"):
|
||||
if not this.type:
|
||||
from sqlglot.optimizer.annotate_types import annotate_types
|
||||
|
||||
this = annotate_types(this)
|
||||
|
||||
if this.is_type(exp.DataType.Type.MAP):
|
||||
bracket = f"({bracket})[1]"
|
||||
|
||||
return bracket
|
||||
|
|
|
@ -710,7 +710,9 @@ class MySQL(Dialect):
|
|||
),
|
||||
exp.TimestampSub: date_add_interval_sql("DATE", "SUB"),
|
||||
exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
|
||||
exp.TimeStrToTime: lambda self, e: self.sql(exp.cast(e.this, "datetime", copy=True)),
|
||||
exp.TimeStrToTime: lambda self, e: self.sql(
|
||||
exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True)
|
||||
),
|
||||
exp.TimeToStr: _remove_ts_or_ds_to_date(
|
||||
lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e))
|
||||
),
|
||||
|
|
|
@ -510,6 +510,9 @@ class Postgres(Dialect):
|
|||
exp.TsOrDsAdd: _date_add_sql("+"),
|
||||
exp.TsOrDsDiff: _date_diff_sql,
|
||||
exp.UnixToTime: lambda self, e: self.func("TO_TIMESTAMP", e.this),
|
||||
exp.TimeToUnix: lambda self, e: self.func(
|
||||
"DATE_PART", exp.Literal.string("epoch"), e.this
|
||||
),
|
||||
exp.VariancePop: rename_func("VAR_POP"),
|
||||
exp.Variance: rename_func("VAR_SAMP"),
|
||||
exp.Xor: bool_xor_sql,
|
||||
|
|
|
@ -90,8 +90,10 @@ def _str_to_time_sql(
|
|||
def _ts_or_ds_to_date_sql(self: Presto.Generator, expression: exp.TsOrDsToDate) -> str:
|
||||
time_format = self.format_time(expression)
|
||||
if time_format and time_format not in (Presto.TIME_FORMAT, Presto.DATE_FORMAT):
|
||||
return self.sql(exp.cast(_str_to_time_sql(self, expression), "DATE"))
|
||||
return self.sql(exp.cast(exp.cast(expression.this, "TIMESTAMP"), "DATE"))
|
||||
return self.sql(exp.cast(_str_to_time_sql(self, expression), exp.DataType.Type.DATE))
|
||||
return self.sql(
|
||||
exp.cast(exp.cast(expression.this, exp.DataType.Type.TIMESTAMP), exp.DataType.Type.DATE)
|
||||
)
|
||||
|
||||
|
||||
def _ts_or_ds_add_sql(self: Presto.Generator, expression: exp.TsOrDsAdd) -> str:
|
||||
|
@ -101,8 +103,8 @@ def _ts_or_ds_add_sql(self: Presto.Generator, expression: exp.TsOrDsAdd) -> str:
|
|||
|
||||
|
||||
def _ts_or_ds_diff_sql(self: Presto.Generator, expression: exp.TsOrDsDiff) -> str:
|
||||
this = exp.cast(expression.this, "TIMESTAMP")
|
||||
expr = exp.cast(expression.expression, "TIMESTAMP")
|
||||
this = exp.cast(expression.this, exp.DataType.Type.TIMESTAMP)
|
||||
expr = exp.cast(expression.expression, exp.DataType.Type.TIMESTAMP)
|
||||
unit = unit_to_str(expression)
|
||||
return self.func("DATE_DIFF", unit, expr, this)
|
||||
|
||||
|
@ -222,6 +224,8 @@ class Presto(Dialect):
|
|||
"IPPREFIX": TokenType.IPPREFIX,
|
||||
}
|
||||
|
||||
KEYWORDS.pop("QUALIFY")
|
||||
|
||||
class Parser(parser.Parser):
|
||||
VALUES_FOLLOWED_BY_PAREN = False
|
||||
|
||||
|
@ -445,7 +449,7 @@ class Presto(Dialect):
|
|||
# timezone involved, we wrap it in a `TRY` call and use `PARSE_DATETIME` as a fallback,
|
||||
# which seems to be using the same time mapping as Hive, as per:
|
||||
# https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html
|
||||
value_as_text = exp.cast(expression.this, "text")
|
||||
value_as_text = exp.cast(expression.this, exp.DataType.Type.TEXT)
|
||||
parse_without_tz = self.func("DATE_PARSE", value_as_text, self.format_time(expression))
|
||||
parse_with_tz = self.func(
|
||||
"PARSE_DATETIME",
|
||||
|
|
|
@ -7,7 +7,13 @@ from sqlglot.dialects.dialect import Dialect
|
|||
from sqlglot.tokens import TokenType
|
||||
|
||||
|
||||
def _select_all(table: exp.Expression) -> t.Optional[exp.Select]:
|
||||
return exp.select("*").from_(table, copy=False) if table else None
|
||||
|
||||
|
||||
class PRQL(Dialect):
|
||||
DPIPE_IS_STRING_CONCAT = False
|
||||
|
||||
class Tokenizer(tokens.Tokenizer):
|
||||
IDENTIFIERS = ["`"]
|
||||
QUOTES = ["'", '"']
|
||||
|
@ -26,10 +32,27 @@ class PRQL(Dialect):
|
|||
}
|
||||
|
||||
class Parser(parser.Parser):
|
||||
CONJUNCTION = {
|
||||
**parser.Parser.CONJUNCTION,
|
||||
TokenType.DAMP: exp.And,
|
||||
TokenType.DPIPE: exp.Or,
|
||||
}
|
||||
|
||||
TRANSFORM_PARSERS = {
|
||||
"DERIVE": lambda self, query: self._parse_selection(query),
|
||||
"SELECT": lambda self, query: self._parse_selection(query, append=False),
|
||||
"TAKE": lambda self, query: self._parse_take(query),
|
||||
"FILTER": lambda self, query: query.where(self._parse_conjunction()),
|
||||
"APPEND": lambda self, query: query.union(
|
||||
_select_all(self._parse_table()), distinct=False, copy=False
|
||||
),
|
||||
"REMOVE": lambda self, query: query.except_(
|
||||
_select_all(self._parse_table()), distinct=False, copy=False
|
||||
),
|
||||
"INTERSECT": lambda self, query: query.intersect(
|
||||
_select_all(self._parse_table()), distinct=False, copy=False
|
||||
),
|
||||
"SORT": lambda self, query: self._parse_order_by(query),
|
||||
}
|
||||
|
||||
def _parse_statement(self) -> t.Optional[exp.Expression]:
|
||||
|
@ -81,6 +104,24 @@ class PRQL(Dialect):
|
|||
num = self._parse_number() # TODO: TAKE for ranges a..b
|
||||
return query.limit(num) if num else None
|
||||
|
||||
def _parse_ordered(
|
||||
self, parse_method: t.Optional[t.Callable] = None
|
||||
) -> t.Optional[exp.Ordered]:
|
||||
asc = self._match(TokenType.PLUS)
|
||||
desc = self._match(TokenType.DASH) or (asc and False)
|
||||
term = term = super()._parse_ordered(parse_method=parse_method)
|
||||
if term and desc:
|
||||
term.set("desc", True)
|
||||
term.set("nulls_first", False)
|
||||
return term
|
||||
|
||||
def _parse_order_by(self, query: exp.Select) -> t.Optional[exp.Query]:
|
||||
l_brace = self._match(TokenType.L_BRACE)
|
||||
expressions = self._parse_csv(self._parse_ordered)
|
||||
if l_brace and not self._match(TokenType.R_BRACE):
|
||||
self.raise_error("Expecting }")
|
||||
return query.order_by(self.expression(exp.Order, expressions=expressions), copy=False)
|
||||
|
||||
def _parse_expression(self) -> t.Optional[exp.Expression]:
|
||||
if self._next and self._next.token_type == TokenType.ALIAS:
|
||||
alias = self._parse_id_var(True)
|
||||
|
|
|
@ -167,7 +167,11 @@ class Redshift(Postgres):
|
|||
exp.GroupConcat: rename_func("LISTAGG"),
|
||||
exp.ParseJSON: rename_func("JSON_PARSE"),
|
||||
exp.Select: transforms.preprocess(
|
||||
[transforms.eliminate_distinct_on, transforms.eliminate_semi_and_anti_joins]
|
||||
[
|
||||
transforms.eliminate_distinct_on,
|
||||
transforms.eliminate_semi_and_anti_joins,
|
||||
transforms.unqualify_unnest,
|
||||
]
|
||||
),
|
||||
exp.SortKeyProperty: lambda self,
|
||||
e: f"{'COMPOUND ' if e.args['compound'] else ''}SORTKEY({self.format_args(*e.this)})",
|
||||
|
@ -203,7 +207,7 @@ class Redshift(Postgres):
|
|||
return ""
|
||||
|
||||
arg = self.sql(seq_get(args, 0))
|
||||
alias = self.expressions(expression.args.get("alias"), key="columns")
|
||||
alias = self.expressions(expression.args.get("alias"), key="columns", flat=True)
|
||||
return f"{arg} AS {alias}" if alias else arg
|
||||
|
||||
def with_properties(self, properties: exp.Properties) -> str:
|
||||
|
|
|
@ -818,7 +818,7 @@ class Snowflake(Dialect):
|
|||
exp.TimestampTrunc: timestamptrunc_sql,
|
||||
exp.TimeStrToTime: timestrtotime_sql,
|
||||
exp.TimeToStr: lambda self, e: self.func(
|
||||
"TO_CHAR", exp.cast(e.this, "timestamp"), self.format_time(e)
|
||||
"TO_CHAR", exp.cast(e.this, exp.DataType.Type.TIMESTAMP), self.format_time(e)
|
||||
),
|
||||
exp.TimeToUnix: lambda self, e: f"EXTRACT(epoch_second FROM {self.sql(e, 'this')})",
|
||||
exp.ToArray: rename_func("TO_ARRAY"),
|
||||
|
|
|
@ -6,7 +6,7 @@ from sqlglot import exp
|
|||
from sqlglot.dialects.dialect import rename_func, unit_to_var
|
||||
from sqlglot.dialects.hive import _build_with_ignore_nulls
|
||||
from sqlglot.dialects.spark2 import Spark2, temporary_storage_provider
|
||||
from sqlglot.helper import seq_get
|
||||
from sqlglot.helper import ensure_list, seq_get
|
||||
from sqlglot.transforms import (
|
||||
ctas_with_tmp_tables_to_create_tmp_view,
|
||||
remove_unique_constraints,
|
||||
|
@ -63,6 +63,9 @@ class Spark(Spark2):
|
|||
**Spark2.Parser.FUNCTIONS,
|
||||
"ANY_VALUE": _build_with_ignore_nulls(exp.AnyValue),
|
||||
"DATEDIFF": _build_datediff,
|
||||
"TRY_ELEMENT_AT": lambda args: exp.Bracket(
|
||||
this=seq_get(args, 0), expressions=ensure_list(seq_get(args, 1)), safe=True
|
||||
),
|
||||
}
|
||||
|
||||
def _parse_generated_as_identity(
|
||||
|
@ -112,6 +115,13 @@ class Spark(Spark2):
|
|||
TRANSFORMS.pop(exp.DateDiff)
|
||||
TRANSFORMS.pop(exp.Group)
|
||||
|
||||
def bracket_sql(self, expression: exp.Bracket) -> str:
|
||||
if expression.args.get("safe"):
|
||||
key = seq_get(self.bracket_offset_expressions(expression), 0)
|
||||
return self.func("TRY_ELEMENT_AT", expression.this, key)
|
||||
|
||||
return super().bracket_sql(expression)
|
||||
|
||||
def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str:
|
||||
return f"GENERATED ALWAYS AS ({self.sql(expression, 'this')})"
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ def _unix_to_time_sql(self: Spark2.Generator, expression: exp.UnixToTime) -> str
|
|||
timestamp = expression.this
|
||||
|
||||
if scale is None:
|
||||
return self.sql(exp.cast(exp.func("from_unixtime", timestamp), "timestamp"))
|
||||
return self.sql(exp.cast(exp.func("from_unixtime", timestamp), exp.DataType.Type.TIMESTAMP))
|
||||
if scale == exp.UnixToTime.SECONDS:
|
||||
return self.func("TIMESTAMP_SECONDS", timestamp)
|
||||
if scale == exp.UnixToTime.MILLIS:
|
||||
|
@ -129,11 +129,7 @@ class Spark2(Hive):
|
|||
"DOUBLE": _build_as_cast("double"),
|
||||
"FLOAT": _build_as_cast("float"),
|
||||
"FROM_UTC_TIMESTAMP": lambda args: exp.AtTimeZone(
|
||||
this=exp.cast_unless(
|
||||
seq_get(args, 0) or exp.Var(this=""),
|
||||
exp.DataType.build("timestamp"),
|
||||
exp.DataType.build("timestamp"),
|
||||
),
|
||||
this=exp.cast(seq_get(args, 0) or exp.Var(this=""), exp.DataType.Type.TIMESTAMP),
|
||||
zone=seq_get(args, 1),
|
||||
),
|
||||
"INT": _build_as_cast("int"),
|
||||
|
@ -150,11 +146,7 @@ class Spark2(Hive):
|
|||
),
|
||||
"TO_UNIX_TIMESTAMP": exp.StrToUnix.from_arg_list,
|
||||
"TO_UTC_TIMESTAMP": lambda args: exp.FromTimeZone(
|
||||
this=exp.cast_unless(
|
||||
seq_get(args, 0) or exp.Var(this=""),
|
||||
exp.DataType.build("timestamp"),
|
||||
exp.DataType.build("timestamp"),
|
||||
),
|
||||
this=exp.cast(seq_get(args, 0) or exp.Var(this=""), exp.DataType.Type.TIMESTAMP),
|
||||
zone=seq_get(args, 1),
|
||||
),
|
||||
"TRUNC": lambda args: exp.DateTrunc(unit=seq_get(args, 1), this=seq_get(args, 0)),
|
||||
|
|
|
@ -13,6 +13,29 @@ from sqlglot.dialects.dialect import (
|
|||
from sqlglot.tokens import TokenType
|
||||
|
||||
|
||||
def _date_add_sql(
|
||||
kind: t.Literal["+", "-"],
|
||||
) -> t.Callable[[Teradata.Generator, exp.DateAdd | exp.DateSub], str]:
|
||||
def func(self: Teradata.Generator, expression: exp.DateAdd | exp.DateSub) -> str:
|
||||
this = self.sql(expression, "this")
|
||||
unit = expression.args.get("unit")
|
||||
value = self._simplify_unless_literal(expression.expression)
|
||||
|
||||
if not isinstance(value, exp.Literal):
|
||||
self.unsupported("Cannot add non literal")
|
||||
|
||||
if value.is_negative:
|
||||
kind_to_op = {"+": "-", "-": "+"}
|
||||
value = exp.Literal.string(value.name[1:])
|
||||
else:
|
||||
kind_to_op = {"+": "+", "-": "-"}
|
||||
value.set("is_string", True)
|
||||
|
||||
return f"{this} {kind_to_op[kind]} {self.sql(exp.Interval(this=value, unit=unit))}"
|
||||
|
||||
return func
|
||||
|
||||
|
||||
class Teradata(Dialect):
|
||||
SUPPORTS_SEMI_ANTI_JOIN = False
|
||||
TYPED_DIVISION = True
|
||||
|
@ -189,6 +212,7 @@ class Teradata(Dialect):
|
|||
TYPE_MAPPING = {
|
||||
**generator.Generator.TYPE_MAPPING,
|
||||
exp.DataType.Type.GEOMETRY: "ST_GEOMETRY",
|
||||
exp.DataType.Type.DOUBLE: "DOUBLE PRECISION",
|
||||
}
|
||||
|
||||
PROPERTIES_LOCATION = {
|
||||
|
@ -214,6 +238,10 @@ class Teradata(Dialect):
|
|||
exp.ToChar: lambda self, e: self.function_fallback_sql(e),
|
||||
exp.ToNumber: to_number_with_nls_param,
|
||||
exp.Use: lambda self, e: f"DATABASE {self.sql(e, 'this')}",
|
||||
exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
|
||||
exp.DateAdd: _date_add_sql("+"),
|
||||
exp.DateSub: _date_add_sql("-"),
|
||||
exp.Quarter: lambda self, e: self.sql(exp.Extract(this="QUARTER", expression=e.this)),
|
||||
}
|
||||
|
||||
def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str:
|
||||
|
@ -276,3 +304,25 @@ class Teradata(Dialect):
|
|||
return f"{this_name}{this_properties}{self.sep()}{this_schema}"
|
||||
|
||||
return super().createable_sql(expression, locations)
|
||||
|
||||
def extract_sql(self, expression: exp.Extract) -> str:
|
||||
this = self.sql(expression, "this")
|
||||
if this.upper() != "QUARTER":
|
||||
return super().extract_sql(expression)
|
||||
|
||||
to_char = exp.func("to_char", expression.expression, exp.Literal.string("Q"))
|
||||
return self.sql(exp.cast(to_char, exp.DataType.Type.INT))
|
||||
|
||||
def interval_sql(self, expression: exp.Interval) -> str:
|
||||
multiplier = 0
|
||||
unit = expression.text("unit")
|
||||
|
||||
if unit.startswith("WEEK"):
|
||||
multiplier = 7
|
||||
elif unit.startswith("QUARTER"):
|
||||
multiplier = 90
|
||||
|
||||
if multiplier:
|
||||
return f"({multiplier} * {super().interval_sql(exp.Interval(this=expression.this, unit=exp.var('DAY')))})"
|
||||
|
||||
return super().interval_sql(expression)
|
||||
|
|
|
@ -109,7 +109,7 @@ def _build_formatted_time(
|
|||
assert len(args) == 2
|
||||
|
||||
return exp_class(
|
||||
this=exp.cast(args[1], "datetime"),
|
||||
this=exp.cast(args[1], exp.DataType.Type.DATETIME),
|
||||
format=exp.Literal.string(
|
||||
format_time(
|
||||
args[0].name.lower(),
|
||||
|
@ -726,6 +726,7 @@ class TSQL(Dialect):
|
|||
SUPPORTS_SELECT_INTO = True
|
||||
JSON_PATH_BRACKETED_KEY_SUPPORTED = False
|
||||
SUPPORTS_TO_NUMBER = False
|
||||
OUTER_UNION_MODIFIERS = False
|
||||
|
||||
EXPRESSIONS_WITHOUT_NESTED_CTES = {
|
||||
exp.Delete,
|
||||
|
@ -882,13 +883,6 @@ class TSQL(Dialect):
|
|||
|
||||
return rename_func("DATETIMEFROMPARTS")(self, expression)
|
||||
|
||||
def set_operations(self, expression: exp.Union) -> str:
|
||||
limit = expression.args.get("limit")
|
||||
if limit:
|
||||
return self.sql(expression.limit(limit.pop(), copy=False))
|
||||
|
||||
return super().set_operations(expression)
|
||||
|
||||
def setitem_sql(self, expression: exp.SetItem) -> str:
|
||||
this = expression.this
|
||||
if isinstance(this, exp.EQ) and not isinstance(this.left, exp.Parameter):
|
||||
|
|
|
@ -58,6 +58,7 @@ class _Expression(type):
|
|||
|
||||
SQLGLOT_META = "sqlglot.meta"
|
||||
TABLE_PARTS = ("this", "db", "catalog")
|
||||
COLUMN_PARTS = ("this", "table", "db", "catalog")
|
||||
|
||||
|
||||
class Expression(metaclass=_Expression):
|
||||
|
@ -175,6 +176,15 @@ class Expression(metaclass=_Expression):
|
|||
"""
|
||||
return isinstance(self, Literal) and not self.args["is_string"]
|
||||
|
||||
@property
|
||||
def is_negative(self) -> bool:
|
||||
"""
|
||||
Checks whether an expression is negative.
|
||||
|
||||
Handles both exp.Neg and Literal numbers with "-" which come from optimizer.simplify.
|
||||
"""
|
||||
return isinstance(self, Neg) or (self.is_number and self.this.startswith("-"))
|
||||
|
||||
@property
|
||||
def is_int(self) -> bool:
|
||||
"""
|
||||
|
@ -845,10 +855,14 @@ class Expression(metaclass=_Expression):
|
|||
copy: bool = True,
|
||||
**opts,
|
||||
) -> In:
|
||||
subquery = maybe_parse(query, copy=copy, **opts) if query else None
|
||||
if subquery and not isinstance(subquery, Subquery):
|
||||
subquery = subquery.subquery(copy=False)
|
||||
|
||||
return In(
|
||||
this=maybe_copy(self, copy),
|
||||
expressions=[convert(e, copy=copy) for e in expressions],
|
||||
query=maybe_parse(query, copy=copy, **opts) if query else None,
|
||||
query=subquery,
|
||||
unnest=(
|
||||
Unnest(
|
||||
expressions=[
|
||||
|
@ -1018,14 +1032,14 @@ class Query(Expression):
|
|||
return Subquery(this=instance, alias=alias)
|
||||
|
||||
def limit(
|
||||
self, expression: ExpOrStr | int, dialect: DialectType = None, copy: bool = True, **opts
|
||||
) -> Select:
|
||||
self: Q, expression: ExpOrStr | int, dialect: DialectType = None, copy: bool = True, **opts
|
||||
) -> Q:
|
||||
"""
|
||||
Adds a LIMIT clause to this query.
|
||||
|
||||
Example:
|
||||
>>> select("1").union(select("1")).limit(1).sql()
|
||||
'SELECT * FROM (SELECT 1 UNION SELECT 1) AS _l_0 LIMIT 1'
|
||||
'SELECT 1 UNION SELECT 1 LIMIT 1'
|
||||
|
||||
Args:
|
||||
expression: the SQL code string to parse.
|
||||
|
@ -1039,10 +1053,90 @@ class Query(Expression):
|
|||
Returns:
|
||||
A limited Select expression.
|
||||
"""
|
||||
return (
|
||||
select("*")
|
||||
.from_(self.subquery(alias="_l_0", copy=copy))
|
||||
.limit(expression, dialect=dialect, copy=False, **opts)
|
||||
return _apply_builder(
|
||||
expression=expression,
|
||||
instance=self,
|
||||
arg="limit",
|
||||
into=Limit,
|
||||
prefix="LIMIT",
|
||||
dialect=dialect,
|
||||
copy=copy,
|
||||
into_arg="expression",
|
||||
**opts,
|
||||
)
|
||||
|
||||
def offset(
|
||||
self: Q, expression: ExpOrStr | int, dialect: DialectType = None, copy: bool = True, **opts
|
||||
) -> Q:
|
||||
"""
|
||||
Set the OFFSET expression.
|
||||
|
||||
Example:
|
||||
>>> Select().from_("tbl").select("x").offset(10).sql()
|
||||
'SELECT x FROM tbl OFFSET 10'
|
||||
|
||||
Args:
|
||||
expression: the SQL code string to parse.
|
||||
This can also be an integer.
|
||||
If a `Offset` instance is passed, this is used as-is.
|
||||
If another `Expression` instance is passed, it will be wrapped in a `Offset`.
|
||||
dialect: the dialect used to parse the input expression.
|
||||
copy: if `False`, modify this expression instance in-place.
|
||||
opts: other options to use to parse the input expressions.
|
||||
|
||||
Returns:
|
||||
The modified Select expression.
|
||||
"""
|
||||
return _apply_builder(
|
||||
expression=expression,
|
||||
instance=self,
|
||||
arg="offset",
|
||||
into=Offset,
|
||||
prefix="OFFSET",
|
||||
dialect=dialect,
|
||||
copy=copy,
|
||||
into_arg="expression",
|
||||
**opts,
|
||||
)
|
||||
|
||||
def order_by(
|
||||
self: Q,
|
||||
*expressions: t.Optional[ExpOrStr],
|
||||
append: bool = True,
|
||||
dialect: DialectType = None,
|
||||
copy: bool = True,
|
||||
**opts,
|
||||
) -> Q:
|
||||
"""
|
||||
Set the ORDER BY expression.
|
||||
|
||||
Example:
|
||||
>>> Select().from_("tbl").select("x").order_by("x DESC").sql()
|
||||
'SELECT x FROM tbl ORDER BY x DESC'
|
||||
|
||||
Args:
|
||||
*expressions: the SQL code strings to parse.
|
||||
If a `Group` instance is passed, this is used as-is.
|
||||
If another `Expression` instance is passed, it will be wrapped in a `Order`.
|
||||
append: if `True`, add to any existing expressions.
|
||||
Otherwise, this flattens all the `Order` expression into a single expression.
|
||||
dialect: the dialect used to parse the input expression.
|
||||
copy: if `False`, modify this expression instance in-place.
|
||||
opts: other options to use to parse the input expressions.
|
||||
|
||||
Returns:
|
||||
The modified Select expression.
|
||||
"""
|
||||
return _apply_child_list_builder(
|
||||
*expressions,
|
||||
instance=self,
|
||||
arg="order",
|
||||
append=append,
|
||||
copy=copy,
|
||||
prefix="ORDER BY",
|
||||
into=Order,
|
||||
dialect=dialect,
|
||||
**opts,
|
||||
)
|
||||
|
||||
@property
|
||||
|
@ -1536,7 +1630,13 @@ class SwapTable(Expression):
|
|||
|
||||
|
||||
class Comment(Expression):
|
||||
arg_types = {"this": True, "kind": True, "expression": True, "exists": False}
|
||||
arg_types = {
|
||||
"this": True,
|
||||
"kind": True,
|
||||
"expression": True,
|
||||
"exists": False,
|
||||
"materialized": False,
|
||||
}
|
||||
|
||||
|
||||
class Comprehension(Expression):
|
||||
|
@ -1642,6 +1742,10 @@ class ExcludeColumnConstraint(ColumnConstraintKind):
|
|||
pass
|
||||
|
||||
|
||||
class EphemeralColumnConstraint(ColumnConstraintKind):
|
||||
arg_types = {"this": False}
|
||||
|
||||
|
||||
class WithOperator(Expression):
|
||||
arg_types = {"this": True, "op": True}
|
||||
|
||||
|
@ -2221,6 +2325,13 @@ class Lateral(UDTF):
|
|||
}
|
||||
|
||||
|
||||
class MatchRecognizeMeasure(Expression):
|
||||
arg_types = {
|
||||
"this": True,
|
||||
"window_frame": False,
|
||||
}
|
||||
|
||||
|
||||
class MatchRecognize(Expression):
|
||||
arg_types = {
|
||||
"partition_by": False,
|
||||
|
@ -3051,46 +3162,6 @@ class Select(Query):
|
|||
**opts,
|
||||
)
|
||||
|
||||
def order_by(
|
||||
self,
|
||||
*expressions: t.Optional[ExpOrStr],
|
||||
append: bool = True,
|
||||
dialect: DialectType = None,
|
||||
copy: bool = True,
|
||||
**opts,
|
||||
) -> Select:
|
||||
"""
|
||||
Set the ORDER BY expression.
|
||||
|
||||
Example:
|
||||
>>> Select().from_("tbl").select("x").order_by("x DESC").sql()
|
||||
'SELECT x FROM tbl ORDER BY x DESC'
|
||||
|
||||
Args:
|
||||
*expressions: the SQL code strings to parse.
|
||||
If a `Group` instance is passed, this is used as-is.
|
||||
If another `Expression` instance is passed, it will be wrapped in a `Order`.
|
||||
append: if `True`, add to any existing expressions.
|
||||
Otherwise, this flattens all the `Order` expression into a single expression.
|
||||
dialect: the dialect used to parse the input expression.
|
||||
copy: if `False`, modify this expression instance in-place.
|
||||
opts: other options to use to parse the input expressions.
|
||||
|
||||
Returns:
|
||||
The modified Select expression.
|
||||
"""
|
||||
return _apply_child_list_builder(
|
||||
*expressions,
|
||||
instance=self,
|
||||
arg="order",
|
||||
append=append,
|
||||
copy=copy,
|
||||
prefix="ORDER BY",
|
||||
into=Order,
|
||||
dialect=dialect,
|
||||
**opts,
|
||||
)
|
||||
|
||||
def sort_by(
|
||||
self,
|
||||
*expressions: t.Optional[ExpOrStr],
|
||||
|
@ -3171,55 +3242,6 @@ class Select(Query):
|
|||
**opts,
|
||||
)
|
||||
|
||||
def limit(
|
||||
self, expression: ExpOrStr | int, dialect: DialectType = None, copy: bool = True, **opts
|
||||
) -> Select:
|
||||
return _apply_builder(
|
||||
expression=expression,
|
||||
instance=self,
|
||||
arg="limit",
|
||||
into=Limit,
|
||||
prefix="LIMIT",
|
||||
dialect=dialect,
|
||||
copy=copy,
|
||||
into_arg="expression",
|
||||
**opts,
|
||||
)
|
||||
|
||||
def offset(
|
||||
self, expression: ExpOrStr | int, dialect: DialectType = None, copy: bool = True, **opts
|
||||
) -> Select:
|
||||
"""
|
||||
Set the OFFSET expression.
|
||||
|
||||
Example:
|
||||
>>> Select().from_("tbl").select("x").offset(10).sql()
|
||||
'SELECT x FROM tbl OFFSET 10'
|
||||
|
||||
Args:
|
||||
expression: the SQL code string to parse.
|
||||
This can also be an integer.
|
||||
If a `Offset` instance is passed, this is used as-is.
|
||||
If another `Expression` instance is passed, it will be wrapped in a `Offset`.
|
||||
dialect: the dialect used to parse the input expression.
|
||||
copy: if `False`, modify this expression instance in-place.
|
||||
opts: other options to use to parse the input expressions.
|
||||
|
||||
Returns:
|
||||
The modified Select expression.
|
||||
"""
|
||||
return _apply_builder(
|
||||
expression=expression,
|
||||
instance=self,
|
||||
arg="offset",
|
||||
into=Offset,
|
||||
prefix="OFFSET",
|
||||
dialect=dialect,
|
||||
copy=copy,
|
||||
into_arg="expression",
|
||||
**opts,
|
||||
)
|
||||
|
||||
def select(
|
||||
self,
|
||||
*expressions: t.Optional[ExpOrStr],
|
||||
|
@ -4214,7 +4236,7 @@ class Dot(Binary):
|
|||
|
||||
parts.reverse()
|
||||
|
||||
for arg in ("this", "table", "db", "catalog"):
|
||||
for arg in COLUMN_PARTS:
|
||||
part = this.args.get(arg)
|
||||
|
||||
if isinstance(part, Expression):
|
||||
|
@ -4395,7 +4417,13 @@ class Between(Predicate):
|
|||
|
||||
class Bracket(Condition):
|
||||
# https://cloud.google.com/bigquery/docs/reference/standard-sql/operators#array_subscript_operator
|
||||
arg_types = {"this": True, "expressions": True, "offset": False, "safe": False}
|
||||
arg_types = {
|
||||
"this": True,
|
||||
"expressions": True,
|
||||
"offset": False,
|
||||
"safe": False,
|
||||
"returns_list_for_maps": False,
|
||||
}
|
||||
|
||||
@property
|
||||
def output_name(self) -> str:
|
||||
|
@ -5458,6 +5486,10 @@ class ApproxQuantile(Quantile):
|
|||
arg_types = {"this": True, "quantile": True, "accuracy": False, "weight": False}
|
||||
|
||||
|
||||
class Quarter(Func):
|
||||
pass
|
||||
|
||||
|
||||
class Rand(Func):
|
||||
_sql_names = ["RAND", "RANDOM"]
|
||||
arg_types = {"this": False}
|
||||
|
@ -6620,17 +6652,9 @@ def to_interval(interval: str | Literal) -> Interval:
|
|||
)
|
||||
|
||||
|
||||
@t.overload
|
||||
def to_table(sql_path: str | Table, **kwargs) -> Table: ...
|
||||
|
||||
|
||||
@t.overload
|
||||
def to_table(sql_path: None, **kwargs) -> None: ...
|
||||
|
||||
|
||||
def to_table(
|
||||
sql_path: t.Optional[str | Table], dialect: DialectType = None, copy: bool = True, **kwargs
|
||||
) -> t.Optional[Table]:
|
||||
sql_path: str | Table, dialect: DialectType = None, copy: bool = True, **kwargs
|
||||
) -> Table:
|
||||
"""
|
||||
Create a table expression from a `[catalog].[schema].[table]` sql path. Catalog and schema are optional.
|
||||
If a table is passed in then that table is returned.
|
||||
|
@ -6644,35 +6668,54 @@ def to_table(
|
|||
Returns:
|
||||
A table expression.
|
||||
"""
|
||||
if sql_path is None or isinstance(sql_path, Table):
|
||||
if isinstance(sql_path, Table):
|
||||
return maybe_copy(sql_path, copy=copy)
|
||||
if not isinstance(sql_path, str):
|
||||
raise ValueError(f"Invalid type provided for a table: {type(sql_path)}")
|
||||
|
||||
table = maybe_parse(sql_path, into=Table, dialect=dialect)
|
||||
if table:
|
||||
for k, v in kwargs.items():
|
||||
table.set(k, v)
|
||||
|
||||
for k, v in kwargs.items():
|
||||
table.set(k, v)
|
||||
|
||||
return table
|
||||
|
||||
|
||||
def to_column(sql_path: str | Column, **kwargs) -> Column:
|
||||
def to_column(
|
||||
sql_path: str | Column,
|
||||
quoted: t.Optional[bool] = None,
|
||||
dialect: DialectType = None,
|
||||
copy: bool = True,
|
||||
**kwargs,
|
||||
) -> Column:
|
||||
"""
|
||||
Create a column from a `[table].[column]` sql path. Schema is optional.
|
||||
|
||||
Create a column from a `[table].[column]` sql path. Table is optional.
|
||||
If a column is passed in then that column is returned.
|
||||
|
||||
Args:
|
||||
sql_path: `[table].[column]` string
|
||||
sql_path: a `[table].[column]` string.
|
||||
quoted: Whether or not to force quote identifiers.
|
||||
dialect: the source dialect according to which the column name will be parsed.
|
||||
copy: Whether to copy a column if it is passed in.
|
||||
kwargs: the kwargs to instantiate the resulting `Column` expression with.
|
||||
|
||||
Returns:
|
||||
Table: A column expression
|
||||
A column expression.
|
||||
"""
|
||||
if sql_path is None or isinstance(sql_path, Column):
|
||||
return sql_path
|
||||
if not isinstance(sql_path, str):
|
||||
raise ValueError(f"Invalid type provided for column: {type(sql_path)}")
|
||||
return column(*reversed(sql_path.split(".")), **kwargs) # type: ignore
|
||||
if isinstance(sql_path, Column):
|
||||
return maybe_copy(sql_path, copy=copy)
|
||||
|
||||
try:
|
||||
col = maybe_parse(sql_path, into=Column, dialect=dialect)
|
||||
except ParseError:
|
||||
return column(*reversed(sql_path.split(".")), quoted=quoted, **kwargs)
|
||||
|
||||
for k, v in kwargs.items():
|
||||
col.set(k, v)
|
||||
|
||||
if quoted:
|
||||
for i in col.find_all(Identifier):
|
||||
i.set("quoted", True)
|
||||
|
||||
return col
|
||||
|
||||
|
||||
def alias_(
|
||||
|
@ -6756,7 +6799,7 @@ def subquery(
|
|||
A new Select instance with the subquery expression included.
|
||||
"""
|
||||
|
||||
expression = maybe_parse(expression, dialect=dialect, **opts).subquery(alias)
|
||||
expression = maybe_parse(expression, dialect=dialect, **opts).subquery(alias, **opts)
|
||||
return Select().from_(expression, dialect=dialect, **opts)
|
||||
|
||||
|
||||
|
@ -6821,7 +6864,9 @@ def column(
|
|||
)
|
||||
|
||||
if fields:
|
||||
this = Dot.build((this, *(to_identifier(field, copy=copy) for field in fields)))
|
||||
this = Dot.build(
|
||||
(this, *(to_identifier(field, quoted=quoted, copy=copy) for field in fields))
|
||||
)
|
||||
return this
|
||||
|
||||
|
||||
|
@ -6840,11 +6885,16 @@ def cast(expression: ExpOrStr, to: DATA_TYPE, copy: bool = True, **opts) -> Cast
|
|||
Returns:
|
||||
The new Cast instance.
|
||||
"""
|
||||
expression = maybe_parse(expression, copy=copy, **opts)
|
||||
expr = maybe_parse(expression, copy=copy, **opts)
|
||||
data_type = DataType.build(to, copy=copy, **opts)
|
||||
expression = Cast(this=expression, to=data_type)
|
||||
expression.type = data_type
|
||||
return expression
|
||||
|
||||
if expr.is_type(data_type):
|
||||
return expr
|
||||
|
||||
expr = Cast(this=expr, to=data_type)
|
||||
expr.type = data_type
|
||||
|
||||
return expr
|
||||
|
||||
|
||||
def table_(
|
||||
|
@ -6931,18 +6981,23 @@ def var(name: t.Optional[ExpOrStr]) -> Var:
|
|||
return Var(this=name)
|
||||
|
||||
|
||||
def rename_table(old_name: str | Table, new_name: str | Table) -> AlterTable:
|
||||
def rename_table(
|
||||
old_name: str | Table,
|
||||
new_name: str | Table,
|
||||
dialect: DialectType = None,
|
||||
) -> AlterTable:
|
||||
"""Build ALTER TABLE... RENAME... expression
|
||||
|
||||
Args:
|
||||
old_name: The old name of the table
|
||||
new_name: The new name of the table
|
||||
dialect: The dialect to parse the table.
|
||||
|
||||
Returns:
|
||||
Alter table expression
|
||||
"""
|
||||
old_table = to_table(old_name)
|
||||
new_table = to_table(new_name)
|
||||
old_table = to_table(old_name, dialect=dialect)
|
||||
new_table = to_table(new_name, dialect=dialect)
|
||||
return AlterTable(
|
||||
this=old_table,
|
||||
actions=[
|
||||
|
@ -6956,6 +7011,7 @@ def rename_column(
|
|||
old_column_name: str | Column,
|
||||
new_column_name: str | Column,
|
||||
exists: t.Optional[bool] = None,
|
||||
dialect: DialectType = None,
|
||||
) -> AlterTable:
|
||||
"""Build ALTER TABLE... RENAME COLUMN... expression
|
||||
|
||||
|
@ -6964,13 +7020,14 @@ def rename_column(
|
|||
old_column: The old name of the column
|
||||
new_column: The new name of the column
|
||||
exists: Whether to add the `IF EXISTS` clause
|
||||
dialect: The dialect to parse the table/column.
|
||||
|
||||
Returns:
|
||||
Alter table expression
|
||||
"""
|
||||
table = to_table(table_name)
|
||||
old_column = to_column(old_column_name)
|
||||
new_column = to_column(new_column_name)
|
||||
table = to_table(table_name, dialect=dialect)
|
||||
old_column = to_column(old_column_name, dialect=dialect)
|
||||
new_column = to_column(new_column_name, dialect=dialect)
|
||||
return AlterTable(
|
||||
this=table,
|
||||
actions=[
|
||||
|
@ -7366,27 +7423,6 @@ def case(
|
|||
return Case(this=this, ifs=[])
|
||||
|
||||
|
||||
def cast_unless(
|
||||
expression: ExpOrStr,
|
||||
to: DATA_TYPE,
|
||||
*types: DATA_TYPE,
|
||||
**opts: t.Any,
|
||||
) -> Expression | Cast:
|
||||
"""
|
||||
Cast an expression to a data type unless it is a specified type.
|
||||
|
||||
Args:
|
||||
expression: The expression to cast.
|
||||
to: The data type to cast to.
|
||||
**types: The types to exclude from casting.
|
||||
**opts: Extra keyword arguments for parsing `expression`
|
||||
"""
|
||||
expr = maybe_parse(expression, **opts)
|
||||
if expr.is_type(*types):
|
||||
return expr
|
||||
return cast(expr, to, **opts)
|
||||
|
||||
|
||||
def array(
|
||||
*expressions: ExpOrStr, copy: bool = True, dialect: DialectType = None, **kwargs
|
||||
) -> Array:
|
||||
|
|
|
@ -89,6 +89,8 @@ class Generator(metaclass=_Generator):
|
|||
exp.DateFormatColumnConstraint: lambda self, e: f"FORMAT {self.sql(e, 'this')}",
|
||||
exp.DefaultColumnConstraint: lambda self, e: f"DEFAULT {self.sql(e, 'this')}",
|
||||
exp.EncodeColumnConstraint: lambda self, e: f"ENCODE {self.sql(e, 'this')}",
|
||||
exp.EphemeralColumnConstraint: lambda self,
|
||||
e: f"EPHEMERAL{(' ' + self.sql(e, 'this')) if e.this else ''}",
|
||||
exp.ExcludeColumnConstraint: lambda self, e: f"EXCLUDE {self.sql(e, 'this').lstrip()}",
|
||||
exp.ExecuteAsProperty: lambda self, e: self.naked_property(e),
|
||||
exp.ExternalProperty: lambda *_: "EXTERNAL",
|
||||
|
@ -332,6 +334,11 @@ class Generator(metaclass=_Generator):
|
|||
# Whether the function TO_NUMBER is supported
|
||||
SUPPORTS_TO_NUMBER = True
|
||||
|
||||
# Whether or not union modifiers apply to the outer union or select.
|
||||
# SELECT * FROM x UNION SELECT * FROM y LIMIT 1
|
||||
# True means limit 1 happens after the union, False means it it happens on y.
|
||||
OUTER_UNION_MODIFIERS = True
|
||||
|
||||
TYPE_MAPPING = {
|
||||
exp.DataType.Type.NCHAR: "CHAR",
|
||||
exp.DataType.Type.NVARCHAR: "VARCHAR",
|
||||
|
@ -1801,10 +1808,15 @@ class Generator(metaclass=_Generator):
|
|||
return f"{self.seg('FROM')} {self.sql(expression, 'this')}"
|
||||
|
||||
def group_sql(self, expression: exp.Group) -> str:
|
||||
group_by = self.op_expressions("GROUP BY", expression)
|
||||
group_by_all = expression.args.get("all")
|
||||
if group_by_all is True:
|
||||
modifier = " ALL"
|
||||
elif group_by_all is False:
|
||||
modifier = " DISTINCT"
|
||||
else:
|
||||
modifier = ""
|
||||
|
||||
if expression.args.get("all"):
|
||||
return f"{group_by} ALL"
|
||||
group_by = self.op_expressions(f"GROUP BY{modifier}", expression)
|
||||
|
||||
grouping_sets = self.expressions(expression, key="grouping_sets", indent=False)
|
||||
grouping_sets = (
|
||||
|
@ -2109,6 +2121,14 @@ class Generator(metaclass=_Generator):
|
|||
|
||||
return f"{this}{sort_order}{nulls_sort_change}{with_fill}"
|
||||
|
||||
def matchrecognizemeasure_sql(self, expression: exp.MatchRecognizeMeasure) -> str:
|
||||
window_frame = self.sql(expression, "window_frame")
|
||||
window_frame = f"{window_frame} " if window_frame else ""
|
||||
|
||||
this = self.sql(expression, "this")
|
||||
|
||||
return f"{window_frame}{this}"
|
||||
|
||||
def matchrecognize_sql(self, expression: exp.MatchRecognize) -> str:
|
||||
partition = self.partition_by_sql(expression)
|
||||
order = self.sql(expression, "order")
|
||||
|
@ -2297,6 +2317,19 @@ class Generator(metaclass=_Generator):
|
|||
return f"{self.seg('QUALIFY')}{self.sep()}{this}"
|
||||
|
||||
def set_operations(self, expression: exp.Union) -> str:
|
||||
if not self.OUTER_UNION_MODIFIERS:
|
||||
limit = expression.args.get("limit")
|
||||
order = expression.args.get("order")
|
||||
|
||||
if limit or order:
|
||||
select = exp.subquery(expression, "_l_0", copy=False).select("*", copy=False)
|
||||
|
||||
if limit:
|
||||
select = select.limit(limit.pop(), copy=False)
|
||||
if order:
|
||||
select = select.order_by(order.pop(), copy=False)
|
||||
return self.sql(select)
|
||||
|
||||
sqls: t.List[str] = []
|
||||
stack: t.List[t.Union[str, exp.Expression]] = [expression]
|
||||
|
||||
|
@ -2412,12 +2445,15 @@ class Generator(metaclass=_Generator):
|
|||
high = self.sql(expression, "high")
|
||||
return f"{this} BETWEEN {low} AND {high}"
|
||||
|
||||
def bracket_sql(self, expression: exp.Bracket) -> str:
|
||||
expressions = apply_index_offset(
|
||||
def bracket_offset_expressions(self, expression: exp.Bracket) -> t.List[exp.Expression]:
|
||||
return apply_index_offset(
|
||||
expression.this,
|
||||
expression.expressions,
|
||||
self.dialect.INDEX_OFFSET - expression.args.get("offset", 0),
|
||||
)
|
||||
|
||||
def bracket_sql(self, expression: exp.Bracket) -> str:
|
||||
expressions = self.bracket_offset_expressions(expression)
|
||||
expressions_sql = ", ".join(self.sql(e) for e in expressions)
|
||||
return f"{self.sql(expression, 'this')}[{expressions_sql}]"
|
||||
|
||||
|
@ -2486,7 +2522,7 @@ class Generator(metaclass=_Generator):
|
|||
args = args[1:] # Skip the delimiter
|
||||
|
||||
if self.dialect.STRICT_STRING_CONCAT and expression.args.get("safe"):
|
||||
args = [exp.cast(e, "text") for e in args]
|
||||
args = [exp.cast(e, exp.DataType.Type.TEXT) for e in args]
|
||||
|
||||
if not self.dialect.CONCAT_COALESCE and expression.args.get("coalesce"):
|
||||
args = [exp.func("coalesce", e, exp.Literal.string("")) for e in args]
|
||||
|
@ -2670,7 +2706,7 @@ class Generator(metaclass=_Generator):
|
|||
is_global = " GLOBAL" if expression.args.get("is_global") else ""
|
||||
|
||||
if query:
|
||||
in_sql = self.wrap(self.sql(query))
|
||||
in_sql = self.sql(query)
|
||||
elif unnest:
|
||||
in_sql = self.in_unnest_op(unnest)
|
||||
elif field:
|
||||
|
@ -2859,9 +2895,10 @@ class Generator(metaclass=_Generator):
|
|||
def comment_sql(self, expression: exp.Comment) -> str:
|
||||
this = self.sql(expression, "this")
|
||||
kind = expression.args["kind"]
|
||||
materialized = " MATERIALIZED" if expression.args.get("materialized") else ""
|
||||
exists_sql = " IF EXISTS " if expression.args.get("exists") else " "
|
||||
expression_sql = self.sql(expression, "expression")
|
||||
return f"COMMENT{exists_sql}ON {kind} {this} IS {expression_sql}"
|
||||
return f"COMMENT{exists_sql}ON{materialized} {kind} {this} IS {expression_sql}"
|
||||
|
||||
def mergetreettlaction_sql(self, expression: exp.MergeTreeTTLAction) -> str:
|
||||
this = self.sql(expression, "this")
|
||||
|
@ -3011,7 +3048,9 @@ class Generator(metaclass=_Generator):
|
|||
|
||||
def dpipe_sql(self, expression: exp.DPipe) -> str:
|
||||
if self.dialect.STRICT_STRING_CONCAT and expression.args.get("safe"):
|
||||
return self.func("CONCAT", *(exp.cast(e, "text") for e in expression.flatten()))
|
||||
return self.func(
|
||||
"CONCAT", *(exp.cast(e, exp.DataType.Type.TEXT) for e in expression.flatten())
|
||||
)
|
||||
return self.binary(expression, "||")
|
||||
|
||||
def div_sql(self, expression: exp.Div) -> str:
|
||||
|
@ -3210,11 +3249,8 @@ class Generator(metaclass=_Generator):
|
|||
num_sqls = len(expressions)
|
||||
|
||||
# These are calculated once in case we have the leading_comma / pretty option set, correspondingly
|
||||
if self.pretty:
|
||||
if self.leading_comma:
|
||||
pad = " " * len(sep)
|
||||
else:
|
||||
stripped_sep = sep.strip()
|
||||
if self.pretty and not self.leading_comma:
|
||||
stripped_sep = sep.strip()
|
||||
|
||||
result_sqls = []
|
||||
for i, e in enumerate(expressions):
|
||||
|
@ -3226,7 +3262,7 @@ class Generator(metaclass=_Generator):
|
|||
|
||||
if self.pretty:
|
||||
if self.leading_comma:
|
||||
result_sqls.append(f"{sep if i > 0 else pad}{prefix}{sql}{comments}")
|
||||
result_sqls.append(f"{sep if i > 0 else ''}{prefix}{sql}{comments}")
|
||||
else:
|
||||
result_sqls.append(
|
||||
f"{prefix}{sql}{stripped_sep if i + 1 < num_sqls else ''}{comments}"
|
||||
|
@ -3314,17 +3350,17 @@ class Generator(metaclass=_Generator):
|
|||
if expression.args.get("format"):
|
||||
self.unsupported("Format argument unsupported for TO_CHAR/TO_VARCHAR function")
|
||||
|
||||
return self.sql(exp.cast(expression.this, "text"))
|
||||
return self.sql(exp.cast(expression.this, exp.DataType.Type.TEXT))
|
||||
|
||||
def tonumber_sql(self, expression: exp.ToNumber) -> str:
|
||||
if not self.SUPPORTS_TO_NUMBER:
|
||||
self.unsupported("Unsupported TO_NUMBER function")
|
||||
return self.sql(exp.cast(expression.this, "double"))
|
||||
return self.sql(exp.cast(expression.this, exp.DataType.Type.DOUBLE))
|
||||
|
||||
fmt = expression.args.get("format")
|
||||
if not fmt:
|
||||
self.unsupported("Conversion format is required for TO_NUMBER")
|
||||
return self.sql(exp.cast(expression.this, "double"))
|
||||
return self.sql(exp.cast(expression.this, exp.DataType.Type.DOUBLE))
|
||||
|
||||
return self.func("TO_NUMBER", expression.this, fmt)
|
||||
|
||||
|
@ -3495,14 +3531,14 @@ class Generator(metaclass=_Generator):
|
|||
if isinstance(this, exp.TsOrDsToTime) or this.is_type(exp.DataType.Type.TIME):
|
||||
return self.sql(this)
|
||||
|
||||
return self.sql(exp.cast(this, "time"))
|
||||
return self.sql(exp.cast(this, exp.DataType.Type.TIME))
|
||||
|
||||
def tsordstotimestamp_sql(self, expression: exp.TsOrDsToTimestamp) -> str:
|
||||
this = expression.this
|
||||
if isinstance(this, exp.TsOrDsToTimestamp) or this.is_type(exp.DataType.Type.TIMESTAMP):
|
||||
return self.sql(this)
|
||||
|
||||
return self.sql(exp.cast(this, "timestamp"))
|
||||
return self.sql(exp.cast(this, exp.DataType.Type.TIMESTAMP))
|
||||
|
||||
def tsordstodate_sql(self, expression: exp.TsOrDsToDate) -> str:
|
||||
this = expression.this
|
||||
|
@ -3510,20 +3546,23 @@ class Generator(metaclass=_Generator):
|
|||
|
||||
if time_format and time_format not in (self.dialect.TIME_FORMAT, self.dialect.DATE_FORMAT):
|
||||
return self.sql(
|
||||
exp.cast(exp.StrToTime(this=this, format=expression.args["format"]), "date")
|
||||
exp.cast(
|
||||
exp.StrToTime(this=this, format=expression.args["format"]),
|
||||
exp.DataType.Type.DATE,
|
||||
)
|
||||
)
|
||||
|
||||
if isinstance(this, exp.TsOrDsToDate) or this.is_type(exp.DataType.Type.DATE):
|
||||
return self.sql(this)
|
||||
|
||||
return self.sql(exp.cast(this, "date"))
|
||||
return self.sql(exp.cast(this, exp.DataType.Type.DATE))
|
||||
|
||||
def unixdate_sql(self, expression: exp.UnixDate) -> str:
|
||||
return self.sql(
|
||||
exp.func(
|
||||
"DATEDIFF",
|
||||
expression.this,
|
||||
exp.cast(exp.Literal.string("1970-01-01"), "date"),
|
||||
exp.cast(exp.Literal.string("1970-01-01"), exp.DataType.Type.DATE),
|
||||
"day",
|
||||
)
|
||||
)
|
||||
|
|
|
@ -212,6 +212,7 @@ class TypeAnnotator(metaclass=_TypeAnnotator):
|
|||
exp.Month,
|
||||
exp.Week,
|
||||
exp.Year,
|
||||
exp.Quarter,
|
||||
},
|
||||
exp.DataType.Type.VARCHAR: {
|
||||
exp.ArrayConcat,
|
||||
|
@ -504,7 +505,8 @@ class TypeAnnotator(metaclass=_TypeAnnotator):
|
|||
last_datatype = expr_type
|
||||
break
|
||||
|
||||
last_datatype = self._maybe_coerce(last_datatype or expr_type, expr_type)
|
||||
if not expr_type.is_type(exp.DataType.Type.NULL, exp.DataType.Type.UNKNOWN):
|
||||
last_datatype = self._maybe_coerce(last_datatype or expr_type, expr_type)
|
||||
|
||||
self._set_type(expression, last_datatype or exp.DataType.Type.UNKNOWN)
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ def qualify(
|
|||
"""
|
||||
schema = ensure_schema(schema, dialect=dialect)
|
||||
expression = normalize_identifiers(expression, dialect=dialect)
|
||||
expression = qualify_tables(expression, db=db, catalog=catalog, schema=schema)
|
||||
expression = qualify_tables(expression, db=db, catalog=catalog, schema=schema, dialect=dialect)
|
||||
|
||||
if isolate_tables:
|
||||
expression = isolate_table_selects(expression, schema=schema)
|
||||
|
|
|
@ -7,6 +7,7 @@ from sqlglot import alias, exp
|
|||
from sqlglot.dialects.dialect import Dialect, DialectType
|
||||
from sqlglot.errors import OptimizeError
|
||||
from sqlglot.helper import seq_get, SingleValuedMapping
|
||||
from sqlglot.optimizer.annotate_types import annotate_types
|
||||
from sqlglot.optimizer.scope import Scope, build_scope, traverse_scope, walk_in_scope
|
||||
from sqlglot.optimizer.simplify import simplify_parens
|
||||
from sqlglot.schema import Schema, ensure_schema
|
||||
|
@ -652,8 +653,19 @@ class Resolver:
|
|||
|
||||
if isinstance(source, exp.Table):
|
||||
columns = self.schema.column_names(source, only_visible)
|
||||
elif isinstance(source, Scope) and isinstance(source.expression, exp.Values):
|
||||
columns = source.expression.alias_column_names
|
||||
elif isinstance(source, Scope) and isinstance(source.expression, (exp.Values, exp.Unnest)):
|
||||
columns = source.expression.named_selects
|
||||
|
||||
# in bigquery, unnest structs are automatically scoped as tables, so you can
|
||||
# directly select a struct field in a query.
|
||||
# this handles the case where the unnest is statically defined.
|
||||
if self.schema.dialect == "bigquery":
|
||||
expression = source.expression
|
||||
annotate_types(expression)
|
||||
|
||||
if expression.is_type(exp.DataType.Type.STRUCT):
|
||||
for k in expression.type.expressions: # type: ignore
|
||||
columns.append(k.name)
|
||||
else:
|
||||
columns = source.expression.named_selects
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ def qualify_tables(
|
|||
if not table.args.get("catalog") and table.args.get("db"):
|
||||
table.set("catalog", catalog)
|
||||
|
||||
if not isinstance(expression, exp.Query):
|
||||
if (db or catalog) and not isinstance(expression, exp.Query):
|
||||
for node in expression.walk(prune=lambda n: isinstance(n, exp.Query)):
|
||||
if isinstance(node, exp.Table):
|
||||
_qualify(node)
|
||||
|
@ -78,10 +78,10 @@ def qualify_tables(
|
|||
if pivots and not pivots[0].alias:
|
||||
pivots[0].set("alias", exp.TableAlias(this=exp.to_identifier(next_alias_name())))
|
||||
|
||||
table_aliases = {}
|
||||
|
||||
for name, source in scope.sources.items():
|
||||
if isinstance(source, exp.Table):
|
||||
_qualify(source)
|
||||
|
||||
pivots = pivots = source.args.get("pivots")
|
||||
if not source.alias:
|
||||
# Don't add the pivot's alias to the pivoted table, use the table's name instead
|
||||
|
@ -91,6 +91,12 @@ def qualify_tables(
|
|||
# Mutates the source by attaching an alias to it
|
||||
alias(source, name or source.name or next_alias_name(), copy=False, table=True)
|
||||
|
||||
table_aliases[".".join(p.name for p in source.parts)] = exp.to_identifier(
|
||||
source.alias
|
||||
)
|
||||
|
||||
_qualify(source)
|
||||
|
||||
if pivots and not pivots[0].alias:
|
||||
pivots[0].set(
|
||||
"alias", exp.TableAlias(this=exp.to_identifier(next_alias_name()))
|
||||
|
@ -127,4 +133,13 @@ def qualify_tables(
|
|||
# Mutates the table by attaching an alias to it
|
||||
alias(node, node.name, copy=False, table=True)
|
||||
|
||||
for column in scope.columns:
|
||||
if column.db:
|
||||
table_alias = table_aliases.get(".".join(p.name for p in column.parts[0:-1]))
|
||||
|
||||
if table_alias:
|
||||
for p in exp.COLUMN_PARTS[1:]:
|
||||
column.set(p, None)
|
||||
column.set("table", table_alias)
|
||||
|
||||
return expression
|
||||
|
|
|
@ -600,7 +600,7 @@ def _traverse_ctes(scope):
|
|||
sources = {}
|
||||
|
||||
for cte in scope.ctes:
|
||||
recursive_scope = None
|
||||
cte_name = cte.alias
|
||||
|
||||
# if the scope is a recursive cte, it must be in the form of base_case UNION recursive.
|
||||
# thus the recursive scope is the first section of the union.
|
||||
|
@ -609,7 +609,7 @@ def _traverse_ctes(scope):
|
|||
union = cte.this
|
||||
|
||||
if isinstance(union, exp.Union):
|
||||
recursive_scope = scope.branch(union.this, scope_type=ScopeType.CTE)
|
||||
sources[cte_name] = scope.branch(union.this, scope_type=ScopeType.CTE)
|
||||
|
||||
child_scope = None
|
||||
|
||||
|
@ -623,15 +623,9 @@ def _traverse_ctes(scope):
|
|||
):
|
||||
yield child_scope
|
||||
|
||||
alias = cte.alias
|
||||
sources[alias] = child_scope
|
||||
|
||||
if recursive_scope:
|
||||
child_scope.add_source(alias, recursive_scope)
|
||||
child_scope.cte_sources[alias] = recursive_scope
|
||||
|
||||
# append the final child_scope yielded
|
||||
if child_scope:
|
||||
sources[cte_name] = child_scope
|
||||
scope.cte_scopes.append(child_scope)
|
||||
|
||||
scope.sources.update(sources)
|
||||
|
|
|
@ -41,8 +41,6 @@ def unnest(select, parent_select, next_alias_name):
|
|||
return
|
||||
|
||||
predicate = select.find_ancestor(exp.Condition)
|
||||
alias = next_alias_name()
|
||||
|
||||
if (
|
||||
not predicate
|
||||
or parent_select is not predicate.parent_select
|
||||
|
@ -50,6 +48,10 @@ def unnest(select, parent_select, next_alias_name):
|
|||
):
|
||||
return
|
||||
|
||||
if isinstance(select, exp.Union):
|
||||
select = exp.select(*select.selects).from_(select.subquery(next_alias_name()))
|
||||
|
||||
alias = next_alias_name()
|
||||
clause = predicate.find_ancestor(exp.Having, exp.Where, exp.Join)
|
||||
|
||||
# This subquery returns a scalar and can just be converted to a cross join
|
||||
|
|
|
@ -344,6 +344,7 @@ class Parser(metaclass=_Parser):
|
|||
TokenType.FINAL,
|
||||
TokenType.FORMAT,
|
||||
TokenType.FULL,
|
||||
TokenType.IDENTIFIER,
|
||||
TokenType.IS,
|
||||
TokenType.ISNULL,
|
||||
TokenType.INTERVAL,
|
||||
|
@ -852,6 +853,9 @@ class Parser(metaclass=_Parser):
|
|||
exp.DefaultColumnConstraint, this=self._parse_bitwise()
|
||||
),
|
||||
"ENCODE": lambda self: self.expression(exp.EncodeColumnConstraint, this=self._parse_var()),
|
||||
"EPHEMERAL": lambda self: self.expression(
|
||||
exp.EphemeralColumnConstraint, this=self._parse_bitwise()
|
||||
),
|
||||
"EXCLUDE": lambda self: self.expression(
|
||||
exp.ExcludeColumnConstraint, this=self._parse_index_params()
|
||||
),
|
||||
|
@ -1384,6 +1388,7 @@ class Parser(metaclass=_Parser):
|
|||
|
||||
self._match(TokenType.ON)
|
||||
|
||||
materialized = self._match_text_seq("MATERIALIZED")
|
||||
kind = self._match_set(self.CREATABLES) and self._prev
|
||||
if not kind:
|
||||
return self._parse_as_command(start)
|
||||
|
@ -1400,7 +1405,12 @@ class Parser(metaclass=_Parser):
|
|||
self._match(TokenType.IS)
|
||||
|
||||
return self.expression(
|
||||
exp.Comment, this=this, kind=kind.text, expression=self._parse_string(), exists=exists
|
||||
exp.Comment,
|
||||
this=this,
|
||||
kind=kind.text,
|
||||
expression=self._parse_string(),
|
||||
exists=exists,
|
||||
materialized=materialized,
|
||||
)
|
||||
|
||||
def _parse_to_table(
|
||||
|
@ -2188,7 +2198,10 @@ class Parser(metaclass=_Parser):
|
|||
|
||||
def _parse_describe(self) -> exp.Describe:
|
||||
kind = self._match_set(self.CREATABLES) and self._prev.text
|
||||
style = self._match_texts(("EXTENDED", "FORMATTED")) and self._prev.text.upper()
|
||||
style = self._match_texts(("EXTENDED", "FORMATTED", "HISTORY")) and self._prev.text.upper()
|
||||
if not self._match_set(self.ID_VAR_TOKENS, advance=False):
|
||||
style = None
|
||||
self._retreat(self._index - 1)
|
||||
this = self._parse_table(schema=True)
|
||||
properties = self._parse_properties()
|
||||
expressions = properties.expressions if properties else None
|
||||
|
@ -2731,6 +2744,13 @@ class Parser(metaclass=_Parser):
|
|||
exp.From, comments=self._prev_comments, this=self._parse_table(joins=joins)
|
||||
)
|
||||
|
||||
def _parse_match_recognize_measure(self) -> exp.MatchRecognizeMeasure:
|
||||
return self.expression(
|
||||
exp.MatchRecognizeMeasure,
|
||||
window_frame=self._match_texts(("FINAL", "RUNNING")) and self._prev.text.upper(),
|
||||
this=self._parse_expression(),
|
||||
)
|
||||
|
||||
def _parse_match_recognize(self) -> t.Optional[exp.MatchRecognize]:
|
||||
if not self._match(TokenType.MATCH_RECOGNIZE):
|
||||
return None
|
||||
|
@ -2739,7 +2759,12 @@ class Parser(metaclass=_Parser):
|
|||
|
||||
partition = self._parse_partition_by()
|
||||
order = self._parse_order()
|
||||
measures = self._parse_expressions() if self._match_text_seq("MEASURES") else None
|
||||
|
||||
measures = (
|
||||
self._parse_csv(self._parse_match_recognize_measure)
|
||||
if self._match_text_seq("MEASURES")
|
||||
else None
|
||||
)
|
||||
|
||||
if self._match_text_seq("ONE", "ROW", "PER", "MATCH"):
|
||||
rows = exp.var("ONE ROW PER MATCH")
|
||||
|
@ -3444,10 +3469,12 @@ class Parser(metaclass=_Parser):
|
|||
if not skip_group_by_token and not self._match(TokenType.GROUP_BY):
|
||||
return None
|
||||
|
||||
elements = defaultdict(list)
|
||||
elements: t.Dict[str, t.Any] = defaultdict(list)
|
||||
|
||||
if self._match(TokenType.ALL):
|
||||
return self.expression(exp.Group, all=True)
|
||||
elements["all"] = True
|
||||
elif self._match(TokenType.DISTINCT):
|
||||
elements["all"] = False
|
||||
|
||||
while True:
|
||||
expressions = self._parse_csv(self._parse_conjunction)
|
||||
|
@ -3808,7 +3835,7 @@ class Parser(metaclass=_Parser):
|
|||
expressions = self._parse_csv(lambda: self._parse_select_or_expression(alias=alias))
|
||||
|
||||
if len(expressions) == 1 and isinstance(expressions[0], exp.Query):
|
||||
this = self.expression(exp.In, this=this, query=expressions[0])
|
||||
this = self.expression(exp.In, this=this, query=expressions[0].subquery(copy=False))
|
||||
else:
|
||||
this = self.expression(exp.In, this=this, expressions=expressions)
|
||||
|
||||
|
@ -4504,12 +4531,15 @@ class Parser(metaclass=_Parser):
|
|||
|
||||
constraints: t.List[exp.Expression] = []
|
||||
|
||||
if (not kind and self._match(TokenType.ALIAS)) or self._match_text_seq("ALIAS"):
|
||||
if (not kind and self._match(TokenType.ALIAS)) or self._match_texts(
|
||||
("ALIAS", "MATERIALIZED")
|
||||
):
|
||||
persisted = self._prev.text.upper() == "MATERIALIZED"
|
||||
constraints.append(
|
||||
self.expression(
|
||||
exp.ComputedColumnConstraint,
|
||||
this=self._parse_conjunction(),
|
||||
persisted=self._match_text_seq("PERSISTED"),
|
||||
persisted=persisted or self._match_text_seq("PERSISTED"),
|
||||
not_null=self._match_pair(TokenType.NOT, TokenType.NULL),
|
||||
)
|
||||
)
|
||||
|
|
|
@ -140,6 +140,26 @@ def remove_precision_parameterized_types(expression: exp.Expression) -> exp.Expr
|
|||
return expression
|
||||
|
||||
|
||||
def unqualify_unnest(expression: exp.Expression) -> exp.Expression:
|
||||
"""Remove references to unnest table aliases, added by the optimizer's qualify_columns step."""
|
||||
from sqlglot.optimizer.scope import find_all_in_scope
|
||||
|
||||
if isinstance(expression, exp.Select):
|
||||
unnest_aliases = {
|
||||
unnest.alias
|
||||
for unnest in find_all_in_scope(expression, exp.Unnest)
|
||||
if isinstance(unnest.parent, (exp.From, exp.Join))
|
||||
}
|
||||
if unnest_aliases:
|
||||
for column in expression.find_all(exp.Column):
|
||||
if column.table in unnest_aliases:
|
||||
column.set("table", None)
|
||||
elif column.db in unnest_aliases:
|
||||
column.set("db", None)
|
||||
|
||||
return expression
|
||||
|
||||
|
||||
def unnest_to_explode(expression: exp.Expression) -> exp.Expression:
|
||||
"""Convert cross join unnest into lateral view explode."""
|
||||
if isinstance(expression, exp.Select):
|
||||
|
|
|
@ -810,3 +810,6 @@ LIFETIME(MIN 0 MAX 0)""",
|
|||
},
|
||||
pretty=True,
|
||||
)
|
||||
self.validate_identity(
|
||||
"CREATE TABLE t1 (a String EPHEMERAL, b String EPHEMERAL func(), c String MATERIALIZED func(), d String ALIAS func()) ENGINE=TinyLog()"
|
||||
)
|
||||
|
|
|
@ -7,6 +7,8 @@ class TestDatabricks(Validator):
|
|||
dialect = "databricks"
|
||||
|
||||
def test_databricks(self):
|
||||
self.validate_identity("DESCRIBE HISTORY a.b")
|
||||
self.validate_identity("DESCRIBE history.tbl")
|
||||
self.validate_identity("CREATE TABLE t (c STRUCT<interval: DOUBLE COMMENT 'aaa'>)")
|
||||
self.validate_identity("CREATE TABLE my_table TBLPROPERTIES (a.b=15)")
|
||||
self.validate_identity("CREATE TABLE my_table TBLPROPERTIES ('a.b'=15)")
|
||||
|
@ -23,6 +25,9 @@ class TestDatabricks(Validator):
|
|||
self.validate_identity("CREATE FUNCTION a AS b")
|
||||
self.validate_identity("SELECT ${x} FROM ${y} WHERE ${z} > 1")
|
||||
self.validate_identity("CREATE TABLE foo (x DATE GENERATED ALWAYS AS (CAST(y AS DATE)))")
|
||||
self.validate_identity(
|
||||
"SELECT DATE_FORMAT(CAST(FROM_UTC_TIMESTAMP(CAST(foo AS TIMESTAMP), 'America/Los_Angeles') AS TIMESTAMP), 'yyyy-MM-dd HH:mm:ss') AS foo FROM t"
|
||||
)
|
||||
self.validate_identity(
|
||||
"SELECT * FROM sales UNPIVOT INCLUDE NULLS (sales FOR quarter IN (q1 AS `Jan-Mar`))"
|
||||
)
|
||||
|
|
|
@ -1332,6 +1332,15 @@ class TestDialect(Validator):
|
|||
)
|
||||
|
||||
def test_set_operators(self):
|
||||
self.validate_all(
|
||||
"SELECT * FROM a UNION SELECT * FROM b ORDER BY x LIMIT 1",
|
||||
write={
|
||||
"": "SELECT * FROM a UNION SELECT * FROM b ORDER BY x LIMIT 1",
|
||||
"clickhouse": "SELECT * FROM (SELECT * FROM a UNION DISTINCT SELECT * FROM b) AS _l_0 ORDER BY x NULLS FIRST LIMIT 1",
|
||||
"tsql": "SELECT TOP 1 * FROM (SELECT * FROM a UNION SELECT * FROM b) AS _l_0 ORDER BY x",
|
||||
},
|
||||
)
|
||||
|
||||
self.validate_all(
|
||||
"SELECT * FROM a UNION SELECT * FROM b",
|
||||
read={
|
||||
|
@ -1667,7 +1676,7 @@ class TestDialect(Validator):
|
|||
"presto": "CAST(a AS DOUBLE) / b",
|
||||
"redshift": "CAST(a AS DOUBLE PRECISION) / b",
|
||||
"sqlite": "CAST(a AS REAL) / b",
|
||||
"teradata": "CAST(a AS DOUBLE) / b",
|
||||
"teradata": "CAST(a AS DOUBLE PRECISION) / b",
|
||||
"trino": "CAST(a AS DOUBLE) / b",
|
||||
"tsql": "CAST(a AS FLOAT) / b",
|
||||
},
|
||||
|
|
|
@ -240,6 +240,7 @@ class TestDuckDB(Validator):
|
|||
|
||||
self.validate_identity("SELECT MAP(['key1', 'key2', 'key3'], [10, 20, 30])")
|
||||
self.validate_identity("SELECT MAP {'x': 1}")
|
||||
self.validate_identity("SELECT (MAP {'x': 1})['x']")
|
||||
self.validate_identity("SELECT df1.*, df2.* FROM df1 POSITIONAL JOIN df2")
|
||||
self.validate_identity("MAKE_TIMESTAMP(1992, 9, 20, 13, 34, 27.123456)")
|
||||
self.validate_identity("MAKE_TIMESTAMP(1667810584123456)")
|
||||
|
|
|
@ -1103,7 +1103,7 @@ COMMENT='客户账户表'"""
|
|||
"presto": "CAST(a AS DOUBLE) / NULLIF(b, 0)",
|
||||
"redshift": "CAST(a AS DOUBLE PRECISION) / NULLIF(b, 0)",
|
||||
"sqlite": "CAST(a AS REAL) / b",
|
||||
"teradata": "CAST(a AS DOUBLE) / NULLIF(b, 0)",
|
||||
"teradata": "CAST(a AS DOUBLE PRECISION) / NULLIF(b, 0)",
|
||||
"trino": "CAST(a AS DOUBLE) / NULLIF(b, 0)",
|
||||
"tsql": "CAST(a AS FLOAT) / NULLIF(b, 0)",
|
||||
},
|
||||
|
|
|
@ -50,6 +50,7 @@ class TestPostgres(Validator):
|
|||
self.validate_identity("STRING_AGG(DISTINCT x, ',' ORDER BY y DESC)")
|
||||
self.validate_identity("SELECT CASE WHEN SUBSTRING('abcdefg') IN ('ab') THEN 1 ELSE 0 END")
|
||||
self.validate_identity("COMMENT ON TABLE mytable IS 'this'")
|
||||
self.validate_identity("COMMENT ON MATERIALIZED VIEW my_view IS 'this'")
|
||||
self.validate_identity("SELECT e'\\xDEADBEEF'")
|
||||
self.validate_identity("SELECT CAST(e'\\176' AS BYTEA)")
|
||||
self.validate_identity("SELECT * FROM x WHERE SUBSTRING('Thomas' FROM '...$') IN ('mas')")
|
||||
|
@ -466,6 +467,12 @@ class TestPostgres(Validator):
|
|||
"tsql": "SELECT (CAST('2016-01-10' AS DATE), CAST('2016-02-01' AS DATE)) OVERLAPS (CAST('2016-01-20' AS DATE), CAST('2016-02-10' AS DATE))",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT DATE_PART('epoch', CAST('2023-01-04 04:05:06.789' AS TIMESTAMP))",
|
||||
read={
|
||||
"": "SELECT TIME_TO_UNIX(TIMESTAMP '2023-01-04 04:05:06.789')",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"x ^ y",
|
||||
write={
|
||||
|
|
|
@ -7,6 +7,7 @@ class TestPresto(Validator):
|
|||
dialect = "presto"
|
||||
|
||||
def test_cast(self):
|
||||
self.validate_identity("SELECT * FROM x qualify", "SELECT * FROM x AS qualify")
|
||||
self.validate_identity("CAST(x AS IPADDRESS)")
|
||||
self.validate_identity("CAST(x AS IPPREFIX)")
|
||||
|
||||
|
@ -611,6 +612,15 @@ class TestPresto(Validator):
|
|||
self.validate_identity(
|
||||
"SELECT * FROM example.testdb.customer_orders FOR TIMESTAMP AS OF CAST('2022-03-23 09:59:29.803 Europe/Vienna' AS TIMESTAMP)"
|
||||
)
|
||||
self.validate_identity(
|
||||
"SELECT origin_state, destination_state, origin_zip, SUM(package_weight) FROM shipping GROUP BY ALL CUBE (origin_state, destination_state), ROLLUP (origin_state, origin_zip)"
|
||||
)
|
||||
self.validate_identity(
|
||||
"SELECT origin_state, destination_state, origin_zip, SUM(package_weight) FROM shipping GROUP BY DISTINCT CUBE (origin_state, destination_state), ROLLUP (origin_state, origin_zip)"
|
||||
)
|
||||
self.validate_identity(
|
||||
"SELECT JSON_EXTRACT_SCALAR(CAST(extra AS JSON), '$.value_b'), COUNT(*) FROM table_a GROUP BY DISTINCT (JSON_EXTRACT_SCALAR(CAST(extra AS JSON), '$.value_b'))"
|
||||
)
|
||||
|
||||
self.validate_all(
|
||||
"SELECT LAST_DAY_OF_MONTH(CAST('2008-11-25' AS DATE))",
|
||||
|
|
|
@ -5,13 +5,56 @@ class TestPRQL(Validator):
|
|||
dialect = "prql"
|
||||
|
||||
def test_prql(self):
|
||||
self.validate_identity("FROM x", "SELECT * FROM x")
|
||||
self.validate_identity("FROM x DERIVE a + 1", "SELECT *, a + 1 FROM x")
|
||||
self.validate_identity("FROM x DERIVE x = a + 1", "SELECT *, a + 1 AS x FROM x")
|
||||
self.validate_identity("FROM x DERIVE {a + 1}", "SELECT *, a + 1 FROM x")
|
||||
self.validate_identity("FROM x DERIVE {x = a + 1, b}", "SELECT *, a + 1 AS x, b FROM x")
|
||||
self.validate_identity("FROM x TAKE 10", "SELECT * FROM x LIMIT 10")
|
||||
self.validate_identity("FROM x TAKE 10 TAKE 5", "SELECT * FROM x LIMIT 5")
|
||||
self.validate_identity("from x", "SELECT * FROM x")
|
||||
self.validate_identity("from x derive a + 1", "SELECT *, a + 1 FROM x")
|
||||
self.validate_identity("from x derive x = a + 1", "SELECT *, a + 1 AS x FROM x")
|
||||
self.validate_identity("from x derive {a + 1}", "SELECT *, a + 1 FROM x")
|
||||
self.validate_identity("from x derive {x = a + 1, b}", "SELECT *, a + 1 AS x, b FROM x")
|
||||
self.validate_identity(
|
||||
"FROM x DERIVE {x = a + 1, b} SELECT {y = x, 2}", "SELECT a + 1 AS y, 2 FROM x"
|
||||
"from x derive {x = a + 1, b} select {y = x, 2}", "SELECT a + 1 AS y, 2 FROM x"
|
||||
)
|
||||
self.validate_identity("from x take 10", "SELECT * FROM x LIMIT 10")
|
||||
self.validate_identity("from x take 10 take 5", "SELECT * FROM x LIMIT 5")
|
||||
self.validate_identity("from x filter age > 25", "SELECT * FROM x WHERE age > 25")
|
||||
self.validate_identity(
|
||||
"from x derive {x = a + 1, b} filter age > 25",
|
||||
"SELECT *, a + 1 AS x, b FROM x WHERE age > 25",
|
||||
)
|
||||
self.validate_identity("from x filter dept != 'IT'", "SELECT * FROM x WHERE dept <> 'IT'")
|
||||
self.validate_identity(
|
||||
"from x filter p == 'product' select { a, b }", "SELECT a, b FROM x WHERE p = 'product'"
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x filter age > 25 filter age < 27", "SELECT * FROM x WHERE age > 25 AND age < 27"
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x filter (age > 25 && age < 27)", "SELECT * FROM x WHERE (age > 25 AND age < 27)"
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x filter (age > 25 || age < 27)", "SELECT * FROM x WHERE (age > 25 OR age < 27)"
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x filter (age > 25 || age < 22) filter age > 26 filter age < 27",
|
||||
"SELECT * FROM x WHERE ((age > 25 OR age < 22) AND age > 26) AND age < 27",
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x sort age",
|
||||
"SELECT * FROM x ORDER BY age",
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x sort {-age}",
|
||||
"SELECT * FROM x ORDER BY age DESC",
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x sort {age, name}",
|
||||
"SELECT * FROM x ORDER BY age, name",
|
||||
)
|
||||
self.validate_identity(
|
||||
"from x sort {-age, +name}",
|
||||
"SELECT * FROM x ORDER BY age DESC, name",
|
||||
)
|
||||
self.validate_identity("from x append y", "SELECT * FROM x UNION ALL SELECT * FROM y")
|
||||
self.validate_identity("from x remove y", "SELECT * FROM x EXCEPT ALL SELECT * FROM y")
|
||||
self.validate_identity(
|
||||
"from x intersect y", "SELECT * FROM x INTERSECT ALL SELECT * FROM y"
|
||||
)
|
||||
|
|
|
@ -66,6 +66,7 @@ WHERE
|
|||
self.validate_identity("SELECT DAYOFYEAR(CURRENT_TIMESTAMP())")
|
||||
self.validate_identity("LISTAGG(data['some_field'], ',')")
|
||||
self.validate_identity("WEEKOFYEAR(tstamp)")
|
||||
self.validate_identity("SELECT QUARTER(CURRENT_TIMESTAMP())")
|
||||
self.validate_identity("SELECT SUM(amount) FROM mytable GROUP BY ALL")
|
||||
self.validate_identity("WITH x AS (SELECT 1 AS foo) SELECT foo FROM IDENTIFIER('x')")
|
||||
self.validate_identity("WITH x AS (SELECT 1 AS foo) SELECT IDENTIFIER('foo') FROM x")
|
||||
|
@ -1575,22 +1576,26 @@ FROM persons AS p, LATERAL FLATTEN(input => p.c, path => 'contact') AS _flattene
|
|||
)
|
||||
|
||||
def test_match_recognize(self):
|
||||
for row in (
|
||||
"ONE ROW PER MATCH",
|
||||
"ALL ROWS PER MATCH",
|
||||
"ALL ROWS PER MATCH SHOW EMPTY MATCHES",
|
||||
"ALL ROWS PER MATCH OMIT EMPTY MATCHES",
|
||||
"ALL ROWS PER MATCH WITH UNMATCHED ROWS",
|
||||
):
|
||||
for after in (
|
||||
"AFTER MATCH SKIP",
|
||||
"AFTER MATCH SKIP PAST LAST ROW",
|
||||
"AFTER MATCH SKIP TO NEXT ROW",
|
||||
"AFTER MATCH SKIP TO FIRST x",
|
||||
"AFTER MATCH SKIP TO LAST x",
|
||||
for window_frame in ("", "FINAL ", "RUNNING "):
|
||||
for row in (
|
||||
"ONE ROW PER MATCH",
|
||||
"ALL ROWS PER MATCH",
|
||||
"ALL ROWS PER MATCH SHOW EMPTY MATCHES",
|
||||
"ALL ROWS PER MATCH OMIT EMPTY MATCHES",
|
||||
"ALL ROWS PER MATCH WITH UNMATCHED ROWS",
|
||||
):
|
||||
self.validate_identity(
|
||||
f"""SELECT
|
||||
for after in (
|
||||
"AFTER MATCH SKIP",
|
||||
"AFTER MATCH SKIP PAST LAST ROW",
|
||||
"AFTER MATCH SKIP TO NEXT ROW",
|
||||
"AFTER MATCH SKIP TO FIRST x",
|
||||
"AFTER MATCH SKIP TO LAST x",
|
||||
):
|
||||
with self.subTest(
|
||||
f"MATCH_RECOGNIZE with window frame {window_frame}, rows {row}, after {after}: "
|
||||
):
|
||||
self.validate_identity(
|
||||
f"""SELECT
|
||||
*
|
||||
FROM x
|
||||
MATCH_RECOGNIZE (
|
||||
|
@ -1598,15 +1603,15 @@ MATCH_RECOGNIZE (
|
|||
ORDER BY
|
||||
x DESC
|
||||
MEASURES
|
||||
y AS b
|
||||
{window_frame}y AS b
|
||||
{row}
|
||||
{after}
|
||||
PATTERN (^ S1 S2*? ( {{- S3 -}} S4 )+ | PERMUTE(S1, S2){{1,2}} $)
|
||||
DEFINE
|
||||
x AS y
|
||||
)""",
|
||||
pretty=True,
|
||||
)
|
||||
pretty=True,
|
||||
)
|
||||
|
||||
def test_show_users(self):
|
||||
self.validate_identity("SHOW USERS")
|
||||
|
|
|
@ -2,6 +2,7 @@ from unittest import mock
|
|||
|
||||
from sqlglot import exp, parse_one
|
||||
from sqlglot.dialects.dialect import Dialects
|
||||
from sqlglot.helper import logger as helper_logger
|
||||
from tests.dialects.test_dialect import Validator
|
||||
|
||||
|
||||
|
@ -223,17 +224,16 @@ TBLPROPERTIES (
|
|||
)
|
||||
|
||||
def test_spark(self):
|
||||
self.validate_identity("any_value(col, true)", "ANY_VALUE(col) IGNORE NULLS")
|
||||
self.validate_identity("first(col, true)", "FIRST(col) IGNORE NULLS")
|
||||
self.validate_identity("first_value(col, true)", "FIRST_VALUE(col) IGNORE NULLS")
|
||||
self.validate_identity("last(col, true)", "LAST(col) IGNORE NULLS")
|
||||
self.validate_identity("last_value(col, true)", "LAST_VALUE(col) IGNORE NULLS")
|
||||
|
||||
self.assertEqual(
|
||||
parse_one("REFRESH TABLE t", read="spark").assert_is(exp.Refresh).sql(dialect="spark"),
|
||||
"REFRESH TABLE t",
|
||||
)
|
||||
|
||||
self.validate_identity("any_value(col, true)", "ANY_VALUE(col) IGNORE NULLS")
|
||||
self.validate_identity("first(col, true)", "FIRST(col) IGNORE NULLS")
|
||||
self.validate_identity("first_value(col, true)", "FIRST_VALUE(col) IGNORE NULLS")
|
||||
self.validate_identity("last(col, true)", "LAST(col) IGNORE NULLS")
|
||||
self.validate_identity("last_value(col, true)", "LAST_VALUE(col) IGNORE NULLS")
|
||||
self.validate_identity("DESCRIBE EXTENDED db.table")
|
||||
self.validate_identity("SELECT * FROM test TABLESAMPLE (50 PERCENT)")
|
||||
self.validate_identity("SELECT * FROM test TABLESAMPLE (5 ROWS)")
|
||||
|
@ -284,6 +284,30 @@ TBLPROPERTIES (
|
|||
"SELECT STR_TO_MAP('a:1,b:2,c:3', ',', ':')",
|
||||
)
|
||||
|
||||
with self.assertLogs(helper_logger):
|
||||
self.validate_all(
|
||||
"SELECT TRY_ELEMENT_AT(ARRAY(1, 2, 3), 2)",
|
||||
read={
|
||||
"databricks": "SELECT TRY_ELEMENT_AT(ARRAY(1, 2, 3), 2)",
|
||||
},
|
||||
write={
|
||||
"databricks": "SELECT TRY_ELEMENT_AT(ARRAY(1, 2, 3), 2)",
|
||||
"duckdb": "SELECT ([1, 2, 3])[3]",
|
||||
"spark": "SELECT TRY_ELEMENT_AT(ARRAY(1, 2, 3), 2)",
|
||||
},
|
||||
)
|
||||
|
||||
self.validate_all(
|
||||
"SELECT TRY_ELEMENT_AT(MAP(1, 'a', 2, 'b'), 2)",
|
||||
read={
|
||||
"databricks": "SELECT TRY_ELEMENT_AT(MAP(1, 'a', 2, 'b'), 2)",
|
||||
},
|
||||
write={
|
||||
"databricks": "SELECT TRY_ELEMENT_AT(MAP(1, 'a', 2, 'b'), 2)",
|
||||
"duckdb": "SELECT (MAP([1, 2], ['a', 'b'])[2])[1]",
|
||||
"spark": "SELECT TRY_ELEMENT_AT(MAP(1, 'a', 2, 'b'), 2)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT SPLIT('123|789', '\\\\|')",
|
||||
read={
|
||||
|
|
|
@ -210,3 +210,92 @@ class TestTeradata(Validator):
|
|||
"teradata": "TRYCAST('-2.5' AS DECIMAL(5, 2))",
|
||||
},
|
||||
)
|
||||
|
||||
def test_time(self):
|
||||
self.validate_all(
|
||||
"CURRENT_TIMESTAMP",
|
||||
read={
|
||||
"teradata": "CURRENT_TIMESTAMP",
|
||||
"snowflake": "CURRENT_TIMESTAMP()",
|
||||
},
|
||||
)
|
||||
|
||||
self.validate_all(
|
||||
"SELECT '2023-01-01' + INTERVAL '5' YEAR",
|
||||
read={
|
||||
"teradata": "SELECT '2023-01-01' + INTERVAL '5' YEAR",
|
||||
"snowflake": "SELECT DATEADD(YEAR, 5, '2023-01-01')",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT '2023-01-01' - INTERVAL '5' YEAR",
|
||||
read={
|
||||
"teradata": "SELECT '2023-01-01' - INTERVAL '5' YEAR",
|
||||
"snowflake": "SELECT DATEADD(YEAR, -5, '2023-01-01')",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT '2023-01-01' - INTERVAL '5' YEAR",
|
||||
read={
|
||||
"teradata": "SELECT '2023-01-01' - INTERVAL '5' YEAR",
|
||||
"sqlite": "SELECT DATE_SUB('2023-01-01', 5, YEAR)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT '2023-01-01' + INTERVAL '5' YEAR",
|
||||
read={
|
||||
"teradata": "SELECT '2023-01-01' + INTERVAL '5' YEAR",
|
||||
"sqlite": "SELECT DATE_SUB('2023-01-01', -5, YEAR)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT (90 * INTERVAL '1' DAY)",
|
||||
read={
|
||||
"teradata": "SELECT (90 * INTERVAL '1' DAY)",
|
||||
"snowflake": "SELECT INTERVAL '1' QUARTER",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT (7 * INTERVAL '1' DAY)",
|
||||
read={
|
||||
"teradata": "SELECT (7 * INTERVAL '1' DAY)",
|
||||
"snowflake": "SELECT INTERVAL '1' WEEK",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT '2023-01-01' + (90 * INTERVAL '5' DAY)",
|
||||
read={
|
||||
"teradata": "SELECT '2023-01-01' + (90 * INTERVAL '5' DAY)",
|
||||
"snowflake": "SELECT DATEADD(QUARTER, 5, '2023-01-01')",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"SELECT '2023-01-01' + (7 * INTERVAL '5' DAY)",
|
||||
read={
|
||||
"teradata": "SELECT '2023-01-01' + (7 * INTERVAL '5' DAY)",
|
||||
"snowflake": "SELECT DATEADD(WEEK, 5, '2023-01-01')",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"CAST(TO_CHAR(x, 'Q') AS INT)",
|
||||
read={
|
||||
"teradata": "CAST(TO_CHAR(x, 'Q') AS INT)",
|
||||
"snowflake": "DATE_PART(QUARTER, x)",
|
||||
"bigquery": "EXTRACT(QUARTER FROM x)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"EXTRACT(MONTH FROM x)",
|
||||
read={
|
||||
"teradata": "EXTRACT(MONTH FROM x)",
|
||||
"snowflake": "DATE_PART(MONTH, x)",
|
||||
"bigquery": "EXTRACT(MONTH FROM x)",
|
||||
},
|
||||
)
|
||||
self.validate_all(
|
||||
"CAST(TO_CHAR(x, 'Q') AS INT)",
|
||||
read={
|
||||
"snowflake": "quarter(x)",
|
||||
"teradata": "CAST(TO_CHAR(x, 'Q') AS INT)",
|
||||
},
|
||||
)
|
||||
|
|
57
tests/fixtures/optimizer/annotate_types.sql
vendored
Normal file
57
tests/fixtures/optimizer/annotate_types.sql
vendored
Normal file
|
@ -0,0 +1,57 @@
|
|||
5;
|
||||
INT;
|
||||
|
||||
5.3;
|
||||
DOUBLE;
|
||||
|
||||
'bla';
|
||||
VARCHAR;
|
||||
|
||||
True;
|
||||
bool;
|
||||
|
||||
false;
|
||||
bool;
|
||||
|
||||
null;
|
||||
null;
|
||||
CASE WHEN x THEN NULL ELSE 1 END;
|
||||
INT;
|
||||
|
||||
CASE WHEN x THEN 1 ELSE NULL END;
|
||||
INT;
|
||||
|
||||
IF(true, 1, null);
|
||||
INT;
|
||||
|
||||
IF(true, null, 1);
|
||||
INT;
|
||||
|
||||
STRUCT(1 AS col);
|
||||
STRUCT<col INT>;
|
||||
|
||||
STRUCT(1 AS col, 2.5 AS row);
|
||||
STRUCT<col INT, row DOUBLE>;
|
||||
|
||||
STRUCT(1);
|
||||
STRUCT<INT>;
|
||||
|
||||
STRUCT(1 AS col, 2.5 AS row, struct(3.5 AS inner_col, 4 AS inner_row) AS nested_struct);
|
||||
STRUCT<col INT, row DOUBLE, nested_struct STRUCT<inner_col DOUBLE, inner_row INT>>;
|
||||
|
||||
STRUCT(1 AS col, 2.5, ARRAY[1, 2, 3] AS nested_array, 'foo');
|
||||
STRUCT<col INT, DOUBLE, nested_array ARRAY<INT>, VARCHAR>;
|
||||
|
||||
STRUCT(1, 2.5, 'bar');
|
||||
STRUCT<INT, DOUBLE, VARCHAR>;
|
||||
|
||||
STRUCT(1 AS "CaseSensitive");
|
||||
STRUCT<"CaseSensitive" INT>;
|
||||
|
||||
# dialect: duckdb
|
||||
STRUCT_PACK(a := 1, b := 2.5);
|
||||
STRUCT<a INT, b DOUBLE>;
|
||||
|
||||
# dialect: presto
|
||||
ROW(1, 2.5, 'foo');
|
||||
STRUCT<INT, DOUBLE, VARCHAR>;
|
42
tests/fixtures/optimizer/optimizer.sql
vendored
42
tests/fixtures/optimizer/optimizer.sql
vendored
|
@ -1388,3 +1388,45 @@ WHERE
|
|||
ORDER BY
|
||||
COUNT(DISTINCT `cs1`.`cs_order_number`)
|
||||
LIMIT 100;
|
||||
|
||||
# execute: false
|
||||
SELECT
|
||||
*
|
||||
FROM event
|
||||
WHERE priority = 'High' AND tagname IN (
|
||||
SELECT
|
||||
tag_input AS tagname
|
||||
FROM cascade
|
||||
WHERE tag_input = 'XXX' OR tag_output = 'XXX'
|
||||
UNION
|
||||
SELECT
|
||||
tag_output AS tagname
|
||||
FROM cascade
|
||||
WHERE tag_input = 'XXX' OR tag_output = 'XXX'
|
||||
);
|
||||
WITH "_u_0" AS (
|
||||
SELECT
|
||||
"cascade"."tag_input" AS "tagname"
|
||||
FROM "cascade" AS "cascade"
|
||||
WHERE
|
||||
"cascade"."tag_input" = 'XXX' OR "cascade"."tag_output" = 'XXX'
|
||||
UNION
|
||||
SELECT
|
||||
"cascade"."tag_output" AS "tagname"
|
||||
FROM "cascade" AS "cascade"
|
||||
WHERE
|
||||
"cascade"."tag_input" = 'XXX' OR "cascade"."tag_output" = 'XXX'
|
||||
), "_u_1" AS (
|
||||
SELECT
|
||||
"cascade"."tag_input" AS "tagname"
|
||||
FROM "_u_0" AS "_u_0"
|
||||
GROUP BY
|
||||
"cascade"."tag_input"
|
||||
)
|
||||
SELECT
|
||||
*
|
||||
FROM "event" AS "event"
|
||||
LEFT JOIN "_u_1" AS "_u_1"
|
||||
ON "_u_1"."tagname" = "event"."tagname"
|
||||
WHERE
|
||||
"event"."priority" = 'High' AND NOT "_u_1"."tagname" IS NULL;
|
||||
|
|
10
tests/fixtures/optimizer/qualify_columns.sql
vendored
10
tests/fixtures/optimizer/qualify_columns.sql
vendored
|
@ -492,6 +492,11 @@ SELECT x AS x, offset AS offset FROM UNNEST([1, 2]) AS x WITH OFFSET AS offset;
|
|||
select * from unnest ([1, 2]) as x with offset as y;
|
||||
SELECT x AS x, y AS y FROM UNNEST([1, 2]) AS x WITH OFFSET AS y;
|
||||
|
||||
# dialect: bigquery
|
||||
# execute: false
|
||||
select x, a, x.a from unnest([STRUCT(1 AS a)]) as x;
|
||||
SELECT x AS x, a AS a, x.a AS a FROM UNNEST([STRUCT(1 AS a)]) AS x;
|
||||
|
||||
# dialect: presto
|
||||
SELECT x.a, i.b FROM x CROSS JOIN UNNEST(SPLIT(CAST(b AS VARCHAR), ',')) AS i(b);
|
||||
SELECT x.a AS a, i.b AS b FROM x AS x CROSS JOIN UNNEST(SPLIT(CAST(x.b AS VARCHAR), ',')) AS i(b);
|
||||
|
@ -508,6 +513,11 @@ SELECT t.c1 AS c1, t.c2 AS c2, t.c3 AS c3 FROM FOO(bar) AS t(c1, c2, c3);
|
|||
SELECT c1, c3 FROM foo(bar) AS t(c1, c2, c3);
|
||||
SELECT t.c1 AS c1, t.c3 AS c3 FROM FOO(bar) AS t(c1, c2, c3);
|
||||
|
||||
# dialect: redshift
|
||||
# execute: false
|
||||
SELECT c.f::VARCHAR(MAX) AS f, e AS e FROM a.b AS c, c.d AS e;
|
||||
SELECT CAST(c.f AS VARCHAR(MAX)) AS f, e AS e FROM a.b AS c, c.d AS e;
|
||||
|
||||
--------------------------------------
|
||||
-- Window functions
|
||||
--------------------------------------
|
||||
|
|
7
tests/fixtures/optimizer/qualify_tables.sql
vendored
7
tests/fixtures/optimizer/qualify_tables.sql
vendored
|
@ -166,3 +166,10 @@ WITH cte AS (SELECT b FROM c.db.y AS y) INSERT INTO c.db.s SELECT * FROM cte AS
|
|||
# title: qualify wrapped query
|
||||
(SELECT x FROM t);
|
||||
(SELECT x FROM c.db.t AS t);
|
||||
|
||||
# title: replace columns with db/catalog refs
|
||||
SELECT db1.a.id, db2.a.id FROM db1.a JOIN db2.a ON db1.a.id = db2.a.id;
|
||||
SELECT a.id, a_2.id FROM c.db1.a AS a JOIN c.db2.a AS a_2 ON a.id = a_2.id;
|
||||
|
||||
SELECT cat.db1.a.id, db2.a.id FROM cat.db1.a JOIN db2.a ON cat.db1.a.id = db2.a.id;
|
||||
SELECT a.id, a_2.id FROM cat.db1.a AS a JOIN c.db2.a AS a_2 ON a.id = a_2.id;
|
||||
|
|
|
@ -300,6 +300,10 @@ class TestBuild(unittest.TestCase):
|
|||
lambda: select("x").from_("tbl").order_by("y"),
|
||||
"SELECT x FROM tbl ORDER BY y",
|
||||
),
|
||||
(
|
||||
lambda: parse_one("select * from x union select * from y").order_by("y"),
|
||||
"SELECT * FROM x UNION SELECT * FROM y ORDER BY y",
|
||||
),
|
||||
(
|
||||
lambda: select("x").from_("tbl").cluster_by("y"),
|
||||
"SELECT x FROM tbl CLUSTER BY y",
|
||||
|
@ -505,15 +509,19 @@ class TestBuild(unittest.TestCase):
|
|||
(lambda: parse_one("(SELECT 1)").select("2"), "(SELECT 1, 2)"),
|
||||
(
|
||||
lambda: parse_one("(SELECT 1)").limit(1),
|
||||
"SELECT * FROM ((SELECT 1)) AS _l_0 LIMIT 1",
|
||||
"(SELECT 1) LIMIT 1",
|
||||
),
|
||||
(
|
||||
lambda: parse_one("WITH t AS (SELECT 1) (SELECT 1)").limit(1),
|
||||
"SELECT * FROM (WITH t AS (SELECT 1) (SELECT 1)) AS _l_0 LIMIT 1",
|
||||
"WITH t AS (SELECT 1) (SELECT 1) LIMIT 1",
|
||||
),
|
||||
(
|
||||
lambda: parse_one("(SELECT 1 LIMIT 2)").limit(1),
|
||||
"SELECT * FROM ((SELECT 1 LIMIT 2)) AS _l_0 LIMIT 1",
|
||||
"(SELECT 1 LIMIT 2) LIMIT 1",
|
||||
),
|
||||
(
|
||||
lambda: parse_one("SELECT 1 UNION SELECT 2").limit(5).offset(2),
|
||||
"SELECT 1 UNION SELECT 2 LIMIT 5 OFFSET 2",
|
||||
),
|
||||
(lambda: parse_one("(SELECT 1)").subquery(), "((SELECT 1))"),
|
||||
(lambda: parse_one("(SELECT 1)").subquery("alias"), "((SELECT 1)) AS alias"),
|
||||
|
@ -665,14 +673,8 @@ class TestBuild(unittest.TestCase):
|
|||
"(x, y) IN ((1, 2), (3, 4))",
|
||||
"postgres",
|
||||
),
|
||||
(
|
||||
lambda: exp.cast_unless("CAST(x AS INT)", "int", "int"),
|
||||
"CAST(x AS INT)",
|
||||
),
|
||||
(
|
||||
lambda: exp.cast_unless("CAST(x AS TEXT)", "int", "int"),
|
||||
"CAST(CAST(x AS TEXT) AS INT)",
|
||||
),
|
||||
(lambda: exp.cast("CAST(x AS INT)", "int"), "CAST(x AS INT)"),
|
||||
(lambda: exp.cast("CAST(x AS TEXT)", "int"), "CAST(CAST(x AS TEXT) AS INT)"),
|
||||
(
|
||||
lambda: exp.rename_column("table1", "c1", "c2", True),
|
||||
"ALTER TABLE table1 RENAME COLUMN IF EXISTS c1 TO c2",
|
||||
|
|
|
@ -634,6 +634,7 @@ class TestExpressions(unittest.TestCase):
|
|||
self.assertIsInstance(parse_one("MAX(a)"), exp.Max)
|
||||
self.assertIsInstance(parse_one("MIN(a)"), exp.Min)
|
||||
self.assertIsInstance(parse_one("MONTH(a)"), exp.Month)
|
||||
self.assertIsInstance(parse_one("QUARTER(a)"), exp.Quarter)
|
||||
self.assertIsInstance(parse_one("POSITION(' ' IN a)"), exp.StrPosition)
|
||||
self.assertIsInstance(parse_one("POW(a, 2)"), exp.Pow)
|
||||
self.assertIsInstance(parse_one("POWER(a, 2)"), exp.Pow)
|
||||
|
@ -716,6 +717,9 @@ class TestExpressions(unittest.TestCase):
|
|||
self.assertIsInstance(dot, exp.Dot)
|
||||
self.assertEqual(dot.sql(), "a.b.c.d.e.f")
|
||||
|
||||
dot = exp.column("d", "c", "b", "a", fields=["e", "f"], quoted=True)
|
||||
self.assertEqual(dot.sql(), '"a"."b"."c"."d"."e"."f"')
|
||||
|
||||
def test_text(self):
|
||||
column = parse_one("a.b.c.d.e")
|
||||
self.assertEqual(column.text("expression"), "e")
|
||||
|
@ -893,8 +897,6 @@ FROM foo""",
|
|||
self.assertEqual(catalog_db_and_table.name, "table_name")
|
||||
self.assertEqual(catalog_db_and_table.args.get("db"), exp.to_identifier("db"))
|
||||
self.assertEqual(catalog_db_and_table.args.get("catalog"), exp.to_identifier("catalog"))
|
||||
with self.assertRaises(ValueError):
|
||||
exp.to_table(1)
|
||||
|
||||
def test_to_column(self):
|
||||
column_only = exp.to_column("column_name")
|
||||
|
@ -903,8 +905,14 @@ FROM foo""",
|
|||
table_and_column = exp.to_column("table_name.column_name")
|
||||
self.assertEqual(table_and_column.name, "column_name")
|
||||
self.assertEqual(table_and_column.args.get("table"), exp.to_identifier("table_name"))
|
||||
with self.assertRaises(ValueError):
|
||||
exp.to_column(1)
|
||||
|
||||
self.assertEqual(exp.to_column("foo bar").sql(), '"foo bar"')
|
||||
self.assertEqual(exp.to_column("`column_name`", dialect="spark").sql(), '"column_name"')
|
||||
self.assertEqual(exp.to_column("column_name", quoted=True).sql(), '"column_name"')
|
||||
self.assertEqual(
|
||||
exp.to_column("column_name", table=exp.to_identifier("table_name")).sql(),
|
||||
"table_name.column_name",
|
||||
)
|
||||
|
||||
def test_union(self):
|
||||
expression = parse_one("SELECT cola, colb UNION SELECT colx, coly")
|
||||
|
@ -996,6 +1004,13 @@ FROM foo""",
|
|||
"ALTER TABLE t1 RENAME TO t2",
|
||||
)
|
||||
|
||||
def test_is_negative(self):
|
||||
self.assertTrue(parse_one("-1").is_negative)
|
||||
self.assertTrue(parse_one("- 1.0").is_negative)
|
||||
self.assertTrue(exp.Literal.number("-1").is_negative)
|
||||
self.assertFalse(parse_one("1").is_negative)
|
||||
self.assertFalse(parse_one("x").is_negative)
|
||||
|
||||
def test_is_star(self):
|
||||
assert parse_one("*").is_star
|
||||
assert parse_one("foo.*").is_star
|
||||
|
|
|
@ -228,6 +228,17 @@ class TestOptimizer(unittest.TestCase):
|
|||
|
||||
@patch("sqlglot.generator.logger")
|
||||
def test_qualify_columns(self, logger):
|
||||
self.assertEqual(
|
||||
optimizer.qualify_columns.qualify_columns(
|
||||
parse_one(
|
||||
"WITH RECURSIVE t AS (SELECT 1 AS x UNION ALL SELECT x + 1 FROM t AS child WHERE x < 10) SELECT * FROM t"
|
||||
),
|
||||
schema={},
|
||||
infer_schema=False,
|
||||
).sql(),
|
||||
"WITH RECURSIVE t AS (SELECT 1 AS x UNION ALL SELECT child.x + 1 AS _col_0 FROM t AS child WHERE child.x < 10) SELECT t.x AS x FROM t",
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
optimizer.qualify_columns.qualify_columns(
|
||||
parse_one("WITH x AS (SELECT a FROM db.y) SELECT * FROM db.x"),
|
||||
|
@ -617,53 +628,16 @@ FROM READ_CSV('tests/fixtures/optimizer/tpc-h/nation.csv.gz', 'delimiter', '|')
|
|||
level="warning",
|
||||
)
|
||||
|
||||
def test_struct_type_annotation(self):
|
||||
tests = {
|
||||
("SELECT STRUCT(1 AS col)", "spark"): "STRUCT<col INT>",
|
||||
("SELECT STRUCT(1 AS col, 2.5 AS row)", "spark"): "STRUCT<col INT, row DOUBLE>",
|
||||
("SELECT STRUCT(1)", "bigquery"): "STRUCT<INT>",
|
||||
(
|
||||
"SELECT STRUCT(1 AS col, 2.5 AS row, struct(3.5 AS inner_col, 4 AS inner_row) AS nested_struct)",
|
||||
"spark",
|
||||
): "STRUCT<col INT, row DOUBLE, nested_struct STRUCT<inner_col DOUBLE, inner_row INT>>",
|
||||
(
|
||||
"SELECT STRUCT(1 AS col, 2.5, ARRAY[1, 2, 3] AS nested_array, 'foo')",
|
||||
"bigquery",
|
||||
): "STRUCT<col INT, DOUBLE, nested_array ARRAY<INT>, VARCHAR>",
|
||||
("SELECT STRUCT(1, 2.5, 'bar')", "spark"): "STRUCT<INT, DOUBLE, VARCHAR>",
|
||||
('SELECT STRUCT(1 AS "CaseSensitive")', "spark"): 'STRUCT<"CaseSensitive" INT>',
|
||||
("SELECT STRUCT_PACK(a := 1, b := 2.5)", "duckdb"): "STRUCT<a INT, b DOUBLE>",
|
||||
("SELECT ROW(1, 2.5, 'foo')", "presto"): "STRUCT<INT, DOUBLE, VARCHAR>",
|
||||
}
|
||||
def test_annotate_types(self):
|
||||
for i, (meta, sql, expected) in enumerate(
|
||||
load_sql_fixture_pairs("optimizer/annotate_types.sql"), start=1
|
||||
):
|
||||
title = meta.get("title") or f"{i}, {sql}"
|
||||
dialect = meta.get("dialect")
|
||||
result = parse_and_optimize(annotate_types, sql, dialect)
|
||||
|
||||
for (sql, dialect), target_type in tests.items():
|
||||
with self.subTest(sql):
|
||||
expression = annotate_types(parse_one(sql, read=dialect))
|
||||
assert expression.expressions[0].is_type(target_type)
|
||||
|
||||
def test_literal_type_annotation(self):
|
||||
tests = {
|
||||
"SELECT 5": exp.DataType.Type.INT,
|
||||
"SELECT 5.3": exp.DataType.Type.DOUBLE,
|
||||
"SELECT 'bla'": exp.DataType.Type.VARCHAR,
|
||||
"5": exp.DataType.Type.INT,
|
||||
"5.3": exp.DataType.Type.DOUBLE,
|
||||
"'bla'": exp.DataType.Type.VARCHAR,
|
||||
}
|
||||
|
||||
for sql, target_type in tests.items():
|
||||
expression = annotate_types(parse_one(sql))
|
||||
self.assertEqual(expression.find(exp.Literal).type.this, target_type)
|
||||
|
||||
def test_boolean_type_annotation(self):
|
||||
tests = {
|
||||
"SELECT TRUE": exp.DataType.Type.BOOLEAN,
|
||||
"FALSE": exp.DataType.Type.BOOLEAN,
|
||||
}
|
||||
|
||||
for sql, target_type in tests.items():
|
||||
expression = annotate_types(parse_one(sql))
|
||||
self.assertEqual(expression.find(exp.Boolean).type.this, target_type)
|
||||
with self.subTest(title):
|
||||
self.assertEqual(result.type.sql(), exp.DataType.build(expected).sql())
|
||||
|
||||
def test_cast_type_annotation(self):
|
||||
expression = annotate_types(parse_one("CAST('2020-01-01' AS TIMESTAMPTZ(9))"))
|
||||
|
|
|
@ -69,12 +69,12 @@ class TestTranspile(unittest.TestCase):
|
|||
self.validate(
|
||||
"SELECT a, b, c FROM (SELECT a, b, c FROM t)",
|
||||
"SELECT\n"
|
||||
" a\n"
|
||||
" a\n"
|
||||
" , b\n"
|
||||
" , c\n"
|
||||
"FROM (\n"
|
||||
" SELECT\n"
|
||||
" a\n"
|
||||
" a\n"
|
||||
" , b\n"
|
||||
" , c\n"
|
||||
" FROM t\n"
|
||||
|
@ -86,13 +86,13 @@ class TestTranspile(unittest.TestCase):
|
|||
)
|
||||
self.validate(
|
||||
"SELECT FOO, BAR, BAZ",
|
||||
"SELECT\n FOO\n , BAR\n , BAZ",
|
||||
"SELECT\n FOO\n , BAR\n , BAZ",
|
||||
leading_comma=True,
|
||||
pretty=True,
|
||||
)
|
||||
self.validate(
|
||||
"SELECT FOO, /*x*/\nBAR, /*y*/\nBAZ",
|
||||
"SELECT\n FOO /* x */\n , BAR /* y */\n , BAZ",
|
||||
"SELECT\n FOO /* x */\n , BAR /* y */\n , BAZ",
|
||||
leading_comma=True,
|
||||
pretty=True,
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue